Ext.ns("feyaSoft.home"); feyaSoft.home.Login = function(config) { this.activeId = 0; this.normalLogin = new feyaSoft.home.NormalLogin(config); this.authenticateLogin = new feyaSoft.home.AuthenticateLogin(config); feyaSoft.home.Login.superclass.constructor.call(this, { title : feyaSoft.lang.profile.sessionExp, width : 550, height : 150, bodyStyle : "padding:10px;", buttonAlign : "center", closable : true, resizable : false, modal : true, layout : "card", border : true, activeItem : 0, layoutConfig : { animate : false, deferredRender : true }, items : [this.normalLogin, this.authenticateLogin], keys : { key : [13], fn : this.loginFn, scope : this }, buttons : [{ text : "Cancel", handler : function() { this.close() }, scope : this }, { text : "Login", handler : this.loginFn, scope : this }] }); this.show(); this.on("afterlayout", this.onAfterlayoutFn, this, { single : true }) }; Ext.extend(feyaSoft.home.Login, Ext.Window, { onAfterlayoutFn : function() { Ext.Ajax.request({ url : "systemSetting/loadSetting", success : function(result, options) { var jsonData = Ext.util.JSON .decode(result.responseText); if (jsonData.success == "true" && jsonData.data.isRadius) { this.activeId = 1; this .getLayout() .setActiveItem(this.authenticateLogin) } if (Ext.util.Common.readCookie("crb") != null && Ext.util.Common.readCookie("crb") == "1") { this.username.setValue(Ext.util.Common .readCookie("cur")) } }, failure : function(response, options) { }, scope : this }) }, loginFn : function() { if (this.activeId == 0) { this.normalLogin.loginFn() } else { this.authenticateLogin.loginFn() } } }); feyaSoft.home.NormalLogin = function(config) { var hideValue = new Ext.form.Hidden({ id : "spring-security-redirect", value : "/login/ajaxSuccess" }); var username = new Ext.form.TextField({ name : "j_username", allowBlank : false, fieldLabel : "Username", blankText : "Please enter your username", emptyText : "Please enter your username", minLength : 4, anchor : "90%" }); var password = new Ext.form.TextField({ fieldLabel : "Password", allowBlank : false, inputType : "password", name : "j_password", minLength : 2, anchor : "90%" }); feyaSoft.home.NormalLogin.superclass.constructor.call(this, { baseCls : "x-plain", width : 450, frame : false, defaultType : "textfield", url : "login", items : [hideValue, username, password] }) }; Ext.extend(feyaSoft.home.NormalLogin, Ext.form.FormPanel, { loginFn : function() { if (this.form.isValid()) { this.form.submit({ waitMsg : "In processing", method : "POST", failure : function(form, action) { Ext.Msg .alert( feyaSoft.lang.common.error, feyaSoft.lang.profile.userPassNotMatch) }, success : function(form, action) { if (action.result.success == "true") { Ext.Msg .alert( feyaSoft.lang.common.ok, feyaSoft.lang.profile.loginOkRetry); this.ownerCt.close() } else { Ext.Msg .alert( feyaSoft.lang.common.error, feyaSoft.lang.profile.userPassNotMatch) } }, scope : this }) } else { Ext.MessageBox.alert("Errors", "Please fix the errors noted.") } } }); feyaSoft.home.AuthenticateLogin = function(config) { var hideValue = new Ext.form.Hidden({ id : "returnType", value : "ajaxCall" }); this.username = new Ext.form.TextField({ name : "j_username", allowBlank : false, fieldLabel : "Username", blankText : "Please enter centralized authentication user name", emptyText : "Please enter centralized authentication user name", minLength : 2, anchor : "90%" }); var password = new Ext.form.TextField({ fieldLabel : "Password", allowBlank : false, inputType : "password", name : "j_password", minLength : 2, anchor : "90%" }); feyaSoft.home.AuthenticateLogin.superclass.constructor.call(this, { baseCls : "x-plain", frame : false, defaultType : "textfield", url : "login/radiusAuthenticate", items : [hideValue, this.username, password] }) }; Ext.extend(feyaSoft.home.AuthenticateLogin, Ext.form.FormPanel, { loginFn : function() { if (this.form.isValid()) { this.form.submit({ waitMsg : "In processing", method : "POST", failure : function(form, action) { Ext.Msg .alert( feyaSoft.lang.common.error, feyaSoft.lang.profile.userPassNotMatch) }, success : function(form, action) { if (action.result.success == "true") { Ext.Msg .alert( feyaSoft.lang.common.ok, feyaSoft.lang.profile.loginOkRetry); this.ownerCt.close() } else { Ext.Msg .alert( feyaSoft.lang.common.error, feyaSoft.lang.profile.userPassNotMatch) } }, scope : this }) } else { Ext.MessageBox.alert("Errors", "Please fix the errors noted.") } } }); feyaSoft.home.LoginCheck = function(callBackFn, scope) { callBackFn.call(scope); /**Ext.Ajax.request({ url : feyaSoft.home.CONST.common.userAccess, success : function(result, request) { var jsonData = Ext.util.JSON.decode(result.responseText); if (jsonData.success == "true") { callBackFn.call(scope) } else { new feyaSoft.home.Login() } }, failure : function(result, request) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.common.errorInternal) }, scope : scope })**/ }; Ext.ns("feyaSoft.home.common"); feyaSoft.home.common.SecureAuthWin = Ext.extend(Ext.Window, { title : feyaSoft.lang.common.additionalAccess, width : 550, height : 250, layout : "fit", initComponent : function() { this.username = new Ext.form.TextField({ name : "username", allowBlank : false, fieldLabel : feyaSoft.lang.profile.username, blankText : feyaSoft.lang.common.enterUsername, emptyText : feyaSoft.lang.common.enterUsername, minLength : 4, anchor : "90%" }); this.password = new Ext.form.TextField({ fieldLabel : feyaSoft.lang.profile.password, allowBlank : false, inputType : "password", name : "passwd", minLength : 2, anchor : "90%" }); this.formPanel = new Ext.form.FormPanel({ bodyStyle : "padding:15px;", baseCls : "x-plain", labelWidth : 90, defaultType : "textfield", items : [this.username, this.password] }); this.itemPanel = new Ext.Panel({ layout : "border", autoScroll : true, border : false, items : [{ region : "north", autoHeight : true, border : false, bodyStyle : "background:white;border-bottom:1px solid #bfbfbf;padding:5px;", html : '' + feyaSoft.lang.common.needAddtionalAuth + '" }, { region : "center", baseCls : "x-plain", border : false, layout : "fit", items : [this.formPanel] }] }); this.buttons = [{ handler : this.continueAuth, scope : this, text : feyaSoft.lang.common["continue"] }]; this.keys = { key : [13], fn : this.continueAuth, scope : this }; this.items = [this.itemPanel]; feyaSoft.home.common.SecureAuthWin.superclass.initComponent.call(this) }, continueAuth : function() { if (this.formPanel.form.isValid()) { Ext.Ajax.request({ url : "myProfile/secureDocValidate", params : { username : this.username.getValue(), passwd : this.password.getValue() }, method : "POST", success : function(result, request) { var jsonData = Ext.decode(result.responseText); if (jsonData.success == "true") { if (this.authSuccessCallback) { this.authSuccessCallback.call(this.scope) } this.close() } else { Ext.MessageBox.alert( feyaSoft.lang.common.error, jsonData.info) } }, failure : function(result, request) { Ext.MessageBox.alert(feyaSoft.lang.common.failed, feyaSoft.lang.common.errorInternal) }, scope : this }) } else { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.common.pleaseFixError) } } }); Ext.ns("feyaSoft.home.common"); feyaSoft.home.common.InviteWindow = function(config) { this.config = config; this.url = "contact/invite"; if (this.config && this.config.groupId != null) { this.url = "locationUserPending/invite?groupId=" + this.config.groupId } this.email = new Ext.form.TextField({ fieldLabel : feyaSoft.lang.profile.email, name : "email", allowBlank : true, plugins : [Ext.ux.FieldReplicator, Ext.ux.FieldLabeler] }); var personalMessage = new Ext.form.TextArea({ xtype : "textarea", name : "inviteMsg", hideLabel : true, flex : 1 }); this.formPanel = new Ext.FormPanel({ labelWidth : 50, url : this.url, frame : true, border : false, bodyStyle : "padding:5px 5px 0 0", layout : { type : "vbox", align : "stretch" }, items : [this.email, personalMessage] }); feyaSoft.home.common.InviteWindow.superclass.constructor.call(this, { title : feyaSoft.lang.contact.inviteFriend, width : 500, height : 280, shim : false, constrainHeader : true, modal : true, border : false, layout : "fit", buttonAlign : "right", items : [this.formPanel], buttons : [{ text : feyaSoft.lang.common.cancel, handler : this.cancelFn, scope : this }, { text : feyaSoft.lang.common.send, handler : this.sendFn, scope : this }] }); this.show() }; Ext.extend(feyaSoft.home.common.InviteWindow, Ext.Window, { sendFn : function() { if (this.formPanel.form.isValid()) { if (this.email.getValue() == null || this.email.getValue() == "") { Ext.MessageBox.alert(feyaSoft.lang.common.error, "Please enter at least one email"); return } this.formPanel.form.submit({ waitMsg : "Sending Invitations...", failure : function(form, action) { Ext.MessageBox.alert( feyaSoft.lang.common.error, feyaSoft.lang.common.errorInternal) }, success : function(form, action) { if (action.result.success == "true") { Ext.Message.msgStay( feyaSoft.lang.common.confirm, action.result.info, 2000); this.close() } else { Ext.MessageBox.alert( feyaSoft.lang.common.error, action.result.info) } }, scope : this }) } }, cancelFn : function() { this.close() } }); Ext.ns("feyaSoft.home.common"); feyaSoft.home.common.AddContactWin = function(config) { var searchInvitePanel = new feyaSoft.home.common.SearchInvitePanel(config || {}); feyaSoft.home.common.AddContactWin.superclass.constructor.call(this, { title : feyaSoft.lang.file.addFriend, width : 600, height : 400, shim : false, constrainHeader : true, modal : true, border : true, buttonAlign : "right", layout : "fit", items : [searchInvitePanel], buttons : [{ text : feyaSoft.lang.common.cancel, handler : this.cancelFn, scope : this }] }); this.show() }; Ext.extend(feyaSoft.home.common.AddContactWin, Ext.Window, { cancelFn : function() { this.close() } }); feyaSoft.home.common.SearchInvitePanel = Ext.extend(Ext.Panel, { border : false, autoScroll : true, initComponent : function() { var addFriendGroup = feyaSoft.lang.contact.addAsFriend; this.addUrl = "contact/inviteContact"; if (this.groupId != null) { addFriendGroup = feyaSoft.lang.group.invite2group; this.addUrl = "locationUserPending/inviteFriend" } this.dataStore = new Ext.data.JsonStore({ url : "userAccess/listForContact", fields : [] }); this.dataStore.baseParams = { excludeMe : "yes", start : 0, limit : 10, searchForFriend : true }; this.inviteBtn = new Ext.Button({ text : '' + feyaSoft.lang.file.invite + "", iconCls : "email", handler : this.inviteFn, minWidth : 80, pressed : true, scope : this }); this.dataView = new feyaSoft.home.common.ContactGroupDataView({ store : this.dataStore, emptyText : '
' + feyaSoft.lang.contact.inviteMsg + "
", applyText : addFriendGroup, applyCallback : this.addFriend, applyScope : this }); this.tbar = [feyaSoft.lang.common.search, "", new Ext.ux.form.SearchField({ autoShow : true, store : this.dataStore, width : 300, emptyText : feyaSoft.lang.common.atleast4char }), "->", this.inviteBtn]; this.bbar = new Ext.PagingToolbar({ pageSize : 10, store : this.dataStore, displayInfo : true, displayMsg : "{0} - {1} of {2}" }); this.items = [this.dataView]; feyaSoft.home.common.SearchInvitePanel.superclass.initComponent .call(this); this.reload() }, addFriend : function(id) { var params = { userId : id }; if (this.groupId != null) { params = { userId : id, groupId : this.groupId } } Ext.Ajax.request({ url : this.addUrl, params : params, success : function(result, request) { var backObj = Ext.util.JSON.decode(result.responseText); if (backObj.success == "true") { Ext.Message.msgStay(feyaSoft.lang.common.confirm, backObj.info, 2000); this.reload() } else { Ext.MessageBox.alert(feyaSoft.lang.common.error, backObj.info) } }, failure : function() { Ext.MessageBox.alert(feyaSoft.lang.common.error, "Fail to connect!") }, scope : this }) }, reload : function() { this.dataStore.load({ params : { start : 0, limit : 10 } }) }, inviteFn : function() { new feyaSoft.home.common.InviteWindow(this.initialConfig) } }); Ext.ns("feyaSoft.home.common"); feyaSoft.home.common.ContactGroupDataView = Ext.extend(Ext.DataView, { cls : "x-publicgroup-list", applyText : "Apply", defaultLogo : feyaSoft.home.CONST.userLogo, overClass : "x-view-over", itemSelector : "div.x-group-preview", singleSelect : true, emptyText : '
' + feyaSoft.lang.common.noResultDisplay + "
", initComponent : function() { var arr = [ '', '
', "", '", "", "
', '', "", '
{[values.firstname?values.firstname+" "+values.lastname:values.name]}
', '
{[values.description?values.description:"(', feyaSoft.lang.contact.noDescriptionForUser, ')"]}
']; if (!this.hideApply) { arr = arr.concat(['"]) } arr = arr.concat(["
", "
", "
", '
']); this.tpl = new Ext.XTemplate(arr.join("")).compile(); feyaSoft.home.common.ContactGroupDataView.superclass.initComponent .call(this); this.on("click", this.onClickFn, this) }, onClickFn : function(dv, index, node, e) { var target = e.getTarget(); if ("apply" == target.name) { if (this.applyCallback) { var rd = dv.getRecord(node); var id = rd.data.id || rd.data.contactUserId; this.applyCallback.call(this.applyScope || this, id, rd, node, dv) } } } }); Ext.ns("feyaSoft.home.common"); feyaSoft.home.common.ListRevisionsWin = function(config) { var listRevision = new feyaSoft.home.common.ListRevisions(config); feyaSoft.home.common.ListRevisionsWin.superclass.constructor.call(this, { title : feyaSoft.lang.common.historyRevision + " - " + config.name, width : 650, height : 380, shim : false, constrainHeader : true, modal : true, border : false, buttonAlign : "right", layout : "border", items : [listRevision], buttons : [{ text : feyaSoft.lang.common.cancel, handler : this.cancelFn, scope : this }] }); this.show() }; Ext.extend(feyaSoft.home.common.ListRevisionsWin, Ext.Window, { cancelFn : function() { this.close() } }); feyaSoft.home.common.ListRevisions = function(config) { Ext.apply(this, config); this.myOwnerCt = config.myOwnerCt; this.compareBtn = new Ext.Button({ text : feyaSoft.lang.common.compare, tooltip : "Highlight one or two items and click this button to compare", iconCls : "compare", disabled : true, documentId : config.fileId, handler : this.compareFn, scope : this }); this.revisionBtn = new Ext.Button({ text : feyaSoft.lang.common.revertToVersion, handler : this.revert, iconCls : "history", disabled : true, scope : this }); this.refreshBtn = new Ext.Button({ text : feyaSoft.lang.common.refresh, iconCls : "refresh", handler : function() { this.dataStore.reload() }, scope : this }); this.saveAsBtn = new Ext.Button({ text : feyaSoft.lang.common.saveAs, iconCls : "save", disabled : true, handler : function() { this.saveAsNewFile() }, scope : this }); var tbar = [this.refreshBtn, "-", this.revisionBtn, "-", this.saveAsBtn]; if (config.exname == "myDoc") { tbar = [this.refreshBtn, "-", this.revisionBtn, "-", this.compareBtn, "-", this.saveAsBtn] } var selectBoxModel = new Ext.grid.CheckboxSelectionModel({ singleSelect : false }); var itemCM = new Ext.grid.ColumnModel([selectBoxModel, { id : "id", header : "Identify", dataIndex : "id", width : 100, hidden : true }, { header : feyaSoft.lang.common.name, dataIndex : "name", width : 100 }, { header : feyaSoft.lang.common.author, dataIndex : "author", width : 100 }, { header : feyaSoft.lang.common.dateModified, dataIndex : "createTime", width : 100 }]); itemCM.defaultSortable = false; this.dataStore = new Ext.data.JsonStore({ url : "documentHistory?id=" + config.fileId, remoteSort : true, fields : [] }); this.dataStore.load(); feyaSoft.home.common.ListRevisions.superclass.constructor.call(this, { ds : this.dataStore, cm : itemCM, sm : selectBoxModel, tbar : tbar, viewConfig : { forceFit : true }, loadMask : { msg : "loading data ..." }, layout : "fit", enableColumnHide : false, autoScroll : true, region : "center" }); this.addListener("rowcontextmenu", this.onContextMenu, this); selectBoxModel.on("selectionchange", this.onSelectionChangeFn, this) }; Ext.extend(feyaSoft.home.common.ListRevisions, Ext.grid.GridPanel, { revertURL : "documentHistory/revert", onSelectionChangeFn : function(sm) { if (1 == sm.getSelections().length) { this.revisionBtn.enable(); this.compareBtn.enable(); this.saveAsBtn.enable() } else { if (2 == sm.getSelections().length) { this.revisionBtn.disable(); this.compareBtn.enable(); this.saveAsBtn.disable() } else { this.revisionBtn.disable(); this.compareBtn.disable(); this.saveAsBtn.disable() } } }, onContextMenu : function(e) { if (!this.menu) { this.menu = new Ext.menu.Menu({ id : "menus", items : [{ id : "revert", iconCls : "history", text : feyaSoft.lang.common.revertToVersion, scope : this, handler : this.revert }] }) } var record = this.getSelectionModel().getSelected(); this.menu.items.get("revert")[(record == null) ? "disable" : "enable"](); e.stopEvent(); this.menu.showAt(e.getXY()) }, revert : function() { var record = this.getSelectionModel().getSelected(); if (record == null || record.data == null || record.data.id == null) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.common.pleaseSelectOne); return } var revertInfo = feyaSoft.lang.common.revertToVersion + "?"; Ext.MessageBox.confirm(revertInfo, feyaSoft.lang.common.revertToVersionDesc, function(btn) { if (btn == "yes") { Ext.Ajax.request({ url : this.revertURL, params : { id : record.data.id }, method : "GET", success : function(result, request) { var jsonData = Ext.util.JSON .decode(result.responseText); if (jsonData.success == "true") { this.ownerCt.cancelFn(); if (this.myOwnerCt) { this.myOwnerCt.reload() } } else { Ext.MessageBox.alert( feyaSoft.lang.common.error, jsonData.info) } }, failure : function(result, request) { }, scope : this }) } }, this) }, compareFn : function(btn) { var selectedIds = []; var records = this.getSelectionModel().getSelections(); for (var r = 0; r < records.length; r++) { if (r > 1) { break } selectedIds.push(records[r].get("id")) } if (selectedIds.length == 0) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.common.pleaseSelectOne) } else { var param = { documentId : btn.documentId, selectedIds : selectedIds }; new feyaSoft.home.common.CompareWindow(param) } }, saveAsNewFile : function() { var record = this.getSelectionModel().getSelected(); if (record == null || record.data == null || record.data.id == null) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.common.pleaseSelectOne); return } Ext.Msg.show({ title : feyaSoft.lang.common.saveAs, msg : feyaSoft.lang.file.enterNewName, width : 400, buttons : Ext.MessageBox.OKCANCEL, prompt : true, scope : this, animEl : Ext.getBody(), icon : Ext.MessageBox.INFO, fn : function(btn, text) { if (btn == "ok") { if (text.length > 0) { Ext.Ajax.request({ url : "documentHistory/saveRevisionAs", params : { name : text, revisonId : record.data.id }, method : "GET", success : function(result, request) { var jsonData = Ext.util.JSON .decode(result.responseText); if (jsonData.success == "true") { if (this.myOwnerCt) { this.myOwnerCt.reload() } Ext.MessageBox.alert( feyaSoft.lang.common.ok, jsonData.info) } else { Ext.MessageBox.alert( feyaSoft.lang.common.error, jsonData.info) } }, failure : function(result, request) { Ext.MessageBox .alert( feyaSoft.lang.common.failed, feyaSoft.lang.common.errorInternal) }, scope : this }) } else { Ext.MessageBox.alert(feyaSoft.lang.common.failed, feyaSoft.lang.common.nameNoEmpty) } } } }) } }); Ext.ns("feyaSoft.home.common.share"); feyaSoft.home.common.share.SharePanel = function(config) { this.myOwnerCt = null; this.listUsers = new feyaSoft.home.common.share.ListUsers(config); this.addUser = new feyaSoft.home.common.share.AddUser(config); feyaSoft.home.common.share.SharePanel.superclass.constructor.call(this, { title : feyaSoft.lang.file.peopleAccess, border : false, layout : "border", items : [this.listUsers, this.addUser] }) }; Ext.extend(feyaSoft.home.common.share.SharePanel, Ext.Panel, { initLoad : function(config) { this.myOwnerCt = config.myOwnerCt; this.listUsers.initLoad(config); this.addUser.initLoad(config) }, existedUsers : function() { return this.listUsers.existedUsers() }, reloadList : function() { this.listUsers.reload(); this.myOwnerCt.reload() } }); feyaSoft.home.common.share.ListUsers = function(config) { this.fileId = null; this.myOwnerCt = null; this.componentClass = "documentShareFile"; if (config.componentClass) { this.componentClass = config.componentClass } var selectBoxModel = new Ext.grid.CheckboxSelectionModel({ singleSelect : true }); function viewEditPermission(val) { var result = val; if (val == 1) { result = feyaSoft.lang.common.canView } else { if (val == 2) { result = feyaSoft.lang.common.canEdit } else { if (val == 7) { result = feyaSoft.lang.common.canEdit } } } return result } function infoAction(val, p) { return '' } var shareCM = new Ext.grid.ColumnModel([selectBoxModel, { id : "id", header : "Identify", dataIndex : "id", width : 100, hidden : true }, { header : feyaSoft.lang.common.user, width : 190, dataIndex : "shareUser" }, { header : feyaSoft.lang.common.permission, width : 110, dataIndex : "permission", scope : this, renderer : viewEditPermission }, { header : feyaSoft.lang.common.date, width : 140, dataIndex : "updateDate", renderer : Ext.util.Common.formatDateHour }, { header : "Info", width : 40, sortable : false, dataIndex : "note", renderer : infoAction }]); this.shareStore = new Ext.data.JsonStore({ url : this.componentClass + "/list", remoteSort : true, fields : [] }); this.deleteBtn = new Ext.Button({ disabled : true, text : feyaSoft.lang.common.remove, id : "delete-share-file-action", tooltip : "Highlight the item and click this button to remove this shared user", iconCls : "delete", handler : function() { var record = this.getSelectionModel().getSelected(); if (record.data.id == 0) { Ext.MessageBox.alert(feyaSoft.lang.common.permissionDeny, "Not allowed to delete Owner share") } else { this.deleteItem(record) } }, scope : this }); this.changePermit = new Ext.Button({ disabled : true, text : feyaSoft.lang.common.changePermission, tooltip : "Highlight the item and click this button to change this shared user permission", iconCls : "editItem", handler : function() { var record = this.getSelectionModel().getSelected(); if (record.data.id == 0) { Ext.MessageBox.alert(feyaSoft.lang.common.permissionDeny, "Not allowed to change owner permission") } else { this.changeItem(record) } }, scope : this }); feyaSoft.home.common.share.ListUsers.superclass.constructor.call(this, { region : "center", border : true, store : this.shareStore, cm : shareCM, sm : selectBoxModel, width : 600, height : 300, viewConfig : { forceFit : true }, loadMask : { msg : feyaSoft.lang.common.loadingData }, tbar : [this.deleteBtn, this.changePermit], autoScroll : true }); selectBoxModel.on("selectionchange", this.onSelectionChangeFn, this) }; Ext.extend(feyaSoft.home.common.share.ListUsers, Ext.grid.GridPanel, { initLoad : function(config) { this.fileId = config.fileId; this.myOwnerCt = config.myOwnerCt; this.shareStore.baseParams = { fileId : this.fileId }; this.shareStore.load() }, existedUsers : function() { return this.shareStore.data.items }, onSelectionChangeFn : function(sm) { if (0 < sm.getSelections().length) { this.deleteBtn.enable(); if (this.componentClass == "myPhotoShare" || this.componentClass == "myPhotoFolderShare") { this.changePermit.disable() } else { this.changePermit.enable() } } else { this.deleteBtn.disable(); this.changePermit.disable() } }, deleteItem : function(rd) { Ext.Msg.show({ title : feyaSoft.lang.common.confirmDelete, msg : feyaSoft.lang.common.confirmDeleteDesc, icon : Ext.Msg.QUESTION, buttons : Ext.Msg.YESNO, fn : this.onDeleteConfirm, scope : this, record : rd }) }, onDeleteConfirm : function(button_id, text, options) { if (button_id == "yes") { Ext.Ajax.request({ url : this.componentClass + "/delete", params : { id : options.record.data.id }, success : function(result, request) { this.reload(); this.myOwnerCt.reload() }, failure : function(result, request) { Ext.MessageBox.alert("Failed", "Internal Error, please try again") }, scope : this }) } }, changeItem : function(rd) { var changedPermit = feyaSoft.lang.common.canView; if (rd.data.permission == 1) { changedPermit = feyaSoft.lang.common.canEdit } Ext.Msg.show({ title : feyaSoft.lang.common.confirm, msg : feyaSoft.lang.common.confirmChangePermit + changedPermit, icon : Ext.Msg.QUESTION, buttons : Ext.Msg.YESNO, fn : this.onChangeConfirm, scope : this, record : rd }) }, onChangeConfirm : function(button_id, text, options) { if (button_id == "yes") { Ext.Ajax.request({ url : this.componentClass + "/changePermit", params : { id : options.record.data.id }, success : function(result, request) { this.reload(); this.myOwnerCt.reload() }, failure : function(result, request) { Ext.MessageBox.alert("Failed", "Internal Error, please try again") }, scope : this }) } }, reload : function() { this.shareStore.reload() }, disableDelete : function() { Ext.getCmp("delete-share-file-action").setDisabled(true) } }); feyaSoft.home.common.share.AddUser = function(config) { Ext.QuickTips.init(); Ext.form.Field.prototype.msgTarget = "side"; this.fileId = null; this.myOwnerCt = null; this.componentClass = "documentShareFile"; if (config.componentClass) { this.componentClass = config.componentClass } var permissionStore = [["1", feyaSoft.lang.common.canView], ["2", feyaSoft.lang.common.canEdit]]; if (this.componentClass == "myPhotoShare" || this.componentClass == "myPhotoFolderShare") { permissionStore = [["1", feyaSoft.lang.common.canView]] } var permission_data = new Ext.data.SimpleStore({ fields : ["id", "name"], data : permissionStore }); var userStore = new Ext.data.JsonStore({ url : "contact/list", remoteSort : true, fields : [] }); userStore.setDefaultSort("name", "ASC"); this.contactName = new Ext.ux.form.LovCombo({ fieldLabel : feyaSoft.lang.common.user, forceSelection : true, allowBlank : false, typeAhead : true, minChars : 2, triggerAction : "all", store : userStore, displayField : "name", hiddenName : "sharedUserId", valueField : "contactUserId", loadingText : feyaSoft.lang.common.loadingData, pageSize : 15, anchor : "93%", listeners : { select : this.onUserSelectFn, scope : this } }); this.permission = new Ext.form.ComboBox({ fieldLabel : feyaSoft.lang.common.permission, forceSelection : true, allowBlank : false, typeAhead : true, triggerAction : "all", store : permission_data, displayField : "name", hiddenName : "permission", mode : "local", valueField : "id", anchor : "93%", listeners : { select : this.onPermissionSelectFn, scope : this } }); this.allowInvite = new Ext.form.Checkbox({ hideLabel : true, boxLabel : feyaSoft.lang.file.allowViewEdit, name : "allowInvite", disabled : true }); this.note = new Ext.form.HtmlEditor({ hideLabel : true, name : "note", height : 150, anchor : "93%" }); var emailNotify = new Ext.form.Checkbox({ hideLabel : true, boxLabel : feyaSoft.lang.file.sendEmail, name : "emailNotify", checked : true }); this.addMoreBtn = new Ext.Button({ text : feyaSoft.lang.file.addFriend, handler : function() { new feyaSoft.home.common.AddContactWin() }, minWidth : 90, iconCls : "addItem", scope : this }); this.saveBtn = new Ext.Button({ minWidth : 75, text : feyaSoft.lang.common.save, tooltip : "Save the result to the system", iconCls : "save", handler : this.doSaveFn, scope : this }); feyaSoft.home.common.share.AddUser.superclass.constructor.call(this, { region : "east", width : 350, split : true, baseCls : "x-plain", labelWidth : 65, bodyStyle : "padding: 20px 10px 10px 10px", url : this.componentClass + "/create", items : [this.contactName, this.permission, this.allowInvite, this.note, emailNotify], buttons : [this.addMoreBtn, this.saveBtn] }) }; Ext.extend(feyaSoft.home.common.share.AddUser, Ext.form.FormPanel, { initLoad : function(config) { this.fileId = config.fileId; this.myOwnerCt = config.myOwnerCt; this.permission.setValue("1") }, onUserSelectFn : function(obj) { var name = null; var existedUser = false; var existedUsers = this.ownerCt.existedUsers(); for (var i = 0; i < existedUsers.length; i++) { if (obj.value == existedUsers[i].data.shareUserId) { existedUser = true; name = existedUsers[i].data.shareUser } } if (existedUser) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.file.itemShared + ": " + name); this.contactName.setValue(null) } }, onPermissionSelectFn : function(obj) { if (obj && obj.value == 2) { this.allowInvite.setDisabled(false) } else { this.allowInvite.setDisabled(true); this.allowInvite.setValue(false) } }, doSaveFn : function() { if (this.form.isValid()) { this.form.submit({ params : { fileId : this.fileId }, waitMsg : "In processing", failure : function(form, action) { Ext.MessageBox.alert("Error Message", action.result.errorInfo) }, success : function(form, action) { if (action.result.success == "true") { Ext.Message.msgStay( feyaSoft.lang.common.confirm, action.result.info, 2000); this.ownerCt.reloadList(); this.contactName.reset() } else { Ext.MessageBox.alert("Error Message", action.result.info) } }, scope : this }) } else { Ext.MessageBox.alert("Errors", "Please fix the errors noted.") } } }); Ext.ns("feyaSoft.home.common.share"); feyaSoft.home.common.share.GroupSharePanel = function(config) { this.listGroups = new feyaSoft.home.common.share.ListGroups(config); this.addGroup = new feyaSoft.home.common.share.AddGroup(config); feyaSoft.home.common.share.GroupSharePanel.superclass.constructor.call( this, { title : feyaSoft.lang.file.groupAccess, border : false, layout : "border", items : [this.listGroups, this.addGroup] }) }; Ext.extend(feyaSoft.home.common.share.GroupSharePanel, Ext.Panel, { initLoad : function(config) { this.listGroups.initLoad(config); this.addGroup.initLoad(config) }, existedGroups : function() { return this.listGroups.existedGroups() }, reloadListGroup : function() { this.listGroups.reload() } }); feyaSoft.home.common.share.ListGroups = function(config) { this.fileId = null; this.myOwnerCt = null; this.componentClass = "locationFile"; if (config.componentClass == "myPhotoFolderShare") { this.componentClass = "locationPhotoFolder" } else { if (config.componentClass == "myPhotoShare") { this.componentClass = "locationPhoto" } else { if (config.componentClass == "browserBookmarkShare") { this.componentClass = "locationBookmark" } } } var selectBoxModel = new Ext.grid.CheckboxSelectionModel({ singleSelect : true }); function viewEditPermission(val) { var result = val; if (val == 1) { result = feyaSoft.lang.common.canView } else { if (val == 2) { result = feyaSoft.lang.common.canEdit } else { if (val == 7) { result = feyaSoft.lang.common.canEdit } } } return result } var shareCM = new Ext.grid.ColumnModel([selectBoxModel, { id : "id", header : "Identify", dataIndex : "id", width : 100, hidden : true }, { header : feyaSoft.lang.common.name, width : 200, dataIndex : "name" }, { header : feyaSoft.lang.common.permission, width : 100, dataIndex : "permission", scope : this, renderer : viewEditPermission }, { header : feyaSoft.lang.common.date, width : 150, dataIndex : "shareDate", renderer : Ext.util.Common.formatDateHour }]); this.shareStore = new Ext.data.JsonStore({ url : this.componentClass + "/sharedGroups", remoteSort : true, fields : [] }); this.deleteBtn = new Ext.Button({ text : feyaSoft.lang.common.remove, tooltip : "Highlight the item and click this button to remove this shared user", iconCls : "delete", disabled : true, handler : this.deleteItem, scope : this }); this.changePermit = new Ext.Button({ disabled : true, text : feyaSoft.lang.common.changePermission, tooltip : "Highlight the item and click this button to change this shared user permission", iconCls : "editItem", handler : this.changeItem, scope : this }); feyaSoft.home.common.share.ListGroups.superclass.constructor.call(this, { region : "center", store : this.shareStore, cm : shareCM, sm : selectBoxModel, viewConfig : { forceFit : true }, loadMask : { msg : feyaSoft.lang.common.loadingData }, tbar : [this.deleteBtn, this.changePermit], autoScroll : true }); selectBoxModel.on("selectionchange", this.onSelectionChangeFn, this) }; Ext.extend(feyaSoft.home.common.share.ListGroups, Ext.grid.GridPanel, { initLoad : function(config) { this.fileId = config.fileId; this.myOwnerCt = config.myOwnerCt; this.shareStore.baseParams = { fileId : this.fileId }; this.shareStore.load() }, existedGroups : function() { return this.shareStore.data.items }, onSelectionChangeFn : function(sm) { if (0 < sm.getSelections().length) { this.deleteBtn.enable(); if (this.componentClass == "locationPhoto" || this.componentClass == "locationPhotoFolder") { this.changePermit.disable() } else { this.changePermit.enable() } } else { this.deleteBtn.disable(); this.changePermit.disable() } }, deleteItem : function() { var record = this.getSelectionModel().getSelected(); if (record == null || record.data == null || record.data.id == null) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.common.pleaseSelectOne); return } var deleteInfo = feyaSoft.lang.common.confirmDelete + ": " + record.data.name; Ext.MessageBox.confirm(deleteInfo, feyaSoft.lang.common.confirmDeleteDesc, function(btn) { if (btn == "yes") { Ext.Ajax.request({ url : this.componentClass + "/remove", params : { groupId : record.data.id, fileId : this.fileId }, method : "GET", success : function(result, request) { var jsonData = Ext.util.JSON .decode(result.responseText); if (jsonData.success == "true") { this.reload(); this.myOwnerCt.reload() } else { Ext.MessageBox .alert( feyaSoft.lang.common.error, jsonData.info) } }, failure : function(result, request) { }, scope : this }) } }, this) }, changeItem : function() { var record = this.getSelectionModel().getSelected(); if (record == null || record.data == null || record.data.id == null) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.common.pleaseSelectOne); return } var changedPermit = feyaSoft.lang.common.canView; if (record.data.permission == 1) { changedPermit = feyaSoft.lang.common.canEdit } Ext.Msg.show({ title : feyaSoft.lang.common.confirm, msg : feyaSoft.lang.common.confirmChangePermit + changedPermit, icon : Ext.Msg.QUESTION, buttons : Ext.Msg.YESNO, fn : this.onChangeConfirm, scope : this, record : record }) }, onChangeConfirm : function(button_id, text, options) { if (button_id == "yes") { Ext.Ajax.request({ url : this.componentClass + "/changePermit", params : { groupId : options.record.data.id, fileId : this.fileId }, success : function(result, request) { this.reload(); this.myOwnerCt.reload() }, failure : function(result, request) { Ext.MessageBox.alert("Failed", "Internal Error, please try again") }, scope : this }) } }, reload : function() { this.shareStore.reload() }, disableDelete : function() { Ext.getCmp("delete-share-file-action").setDisabled(true) } }); feyaSoft.home.common.share.AddGroup = function(config) { Ext.QuickTips.init(); Ext.form.Field.prototype.msgTarget = "side"; this.fileId = null; this.myOwnerCt = null; this.componentClass = "locationFile"; if (config.componentClass == "myPhotoFolderShare") { this.componentClass = "locationPhotoFolder" } else { if (config.componentClass == "myPhotoShare") { this.componentClass = "locationPhoto" } else { if (config.componentClass == "browserBookmarkShare") { this.componentClass = "locationBookmark" } } } var groupStore = new Ext.data.JsonStore({ url : "locationUser/list", remoteSort : true, fields : [] }); groupStore.setDefaultSort("name", "ASC"); this.group = new Ext.form.ComboBox({ fieldLabel : feyaSoft.lang.group.group, forceSelection : true, allowBlank : false, typeAhead : true, minChars : 2, triggerAction : "all", store : groupStore, displayField : "name", hiddenName : "groupId", valueField : "id", emptyText : feyaSoft.lang.common.pleaseSelectOne, loadingText : feyaSoft.lang.common.loadingData, pageSize : 15, anchor : "93%", listeners : { select : this.onGroupSelectFn, scope : this } }); var permissionStore = [["1", feyaSoft.lang.common.canView], ["2", feyaSoft.lang.common.canEdit]]; if (config.componentClass == "myPhotoShare" || config.componentClass == "myPhotoFolderShare") { permissionStore = [["1", feyaSoft.lang.common.canView]] } var permission_data = new Ext.data.SimpleStore({ fields : ["id", "name"], data : permissionStore }); this.permission = new Ext.form.ComboBox({ fieldLabel : feyaSoft.lang.common.permission, forceSelection : true, allowBlank : false, typeAhead : true, triggerAction : "all", store : permission_data, displayField : "name", hiddenName : "permission", mode : "local", valueField : "id", anchor : "93%" }); this.note = new Ext.form.HtmlEditor({ hideLabel : true, name : "note", height : 150, anchor : "93%" }); this.posting = new Ext.form.Checkbox({ hideLabel : true, boxLabel : feyaSoft.lang.file.groupShareMsg, name : "doPosting", checked : true }); this.saveBtn = new Ext.Button({ minWidth : 75, text : feyaSoft.lang.common.save, tooltip : "Save the result to the system", iconCls : "save", handler : this.doSaveFn, scope : this }); feyaSoft.home.common.share.AddGroup.superclass.constructor.call(this, { region : "east", width : 350, split : true, baseCls : "x-plain", labelWidth : 70, bodyStyle : "padding: 20px 10px 10px 10px", url : this.componentClass + "/createUpdate", items : [this.group, this.permission, this.note, this.posting], buttons : [this.saveBtn] }) }; Ext.extend(feyaSoft.home.common.share.AddGroup, Ext.form.FormPanel, { initLoad : function(config) { this.fileId = config.fileId; this.myOwnerCt = config.myOwnerCt; this.permission.setValue("1") }, onGroupSelectFn : function(obj) { var allowPosting = true; var name = null; var items = obj.store.data.items; for (var i = 0; i < items.length; i++) { if (obj.value == items[i].data.id) { allowPosting = items[i].data.allowPosting; name = items[i].data.name } } if (!allowPosting) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.group.notAllowPosting + ": " + name); this.group.setValue(null) } var existedGroup = false; var existedGroups = this.ownerCt.existedGroups(); for (var i = 0; i < existedGroups.length; i++) { if (obj.value == existedGroups[i].data.id) { existedGroup = true; name = existedGroups[i].data.name } } if (existedGroup) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.group.groupShared + ": " + name); this.group.setValue(null) } }, doSaveFn : function() { if (this.form.isValid()) { this.form.submit({ params : { fileId : this.fileId }, waitMsg : "In processing", failure : function(form, action) { Ext.MessageBox.alert("Error Message", action.result.errorInfo) }, success : function(form, action) { if (action.result.success == "true") { Ext.Message.msgStay( feyaSoft.lang.common.confirm, action.result.info, 2000); this.ownerCt.reloadListGroup(); this.group.reset() } else { Ext.MessageBox.alert( feyaSoft.lang.common.error, action.result.info) } }, scope : this }) } else { Ext.MessageBox.alert(feyaSoft.lang.common.error, "Please fix the errors noted.") } } }); Ext.ns("feyaSoft.home.common.share"); feyaSoft.home.common.share.ContactSharePanel = function(config) { this.myOwnerCt = config.myOwnerCt; this.listContact = new feyaSoft.home.common.share.ListContacts(config); this.addContact = new feyaSoft.home.common.share.AddContact(config); feyaSoft.home.common.share.ContactSharePanel.superclass.constructor.call( this, { title : feyaSoft.lang.file.contactAccess, border : false, layout : "border", items : [this.listContact, this.addContact] }) }; Ext.extend(feyaSoft.home.common.share.ContactSharePanel, Ext.Panel, { initLoad : function(config) { this.listContact.initLoad(config); this.addContact.initLoad(config) }, existedItems : function() { return this.listContact.existedItem() }, reloadList : function() { this.listContact.reload() } }); feyaSoft.home.common.share.ListContacts = function(config) { this.fileId = null; this.myOwnerCt = null; this.componentClass = "contactShareFile"; if (config.componentClass == "myPhotoFolderShare") { this.componentClass = "contactSharePhotoFolder" } else { if (config.componentClass == "myPhotoShare") { this.componentClass = "contactSharePhoto" } else { if (config.componentClass == "browserBookmarkShare") { this.componentClass = "contactShareBookmark" } } } var selectBoxModel = new Ext.grid.CheckboxSelectionModel({ singleSelect : true }); function viewEditPermission(val) { var result = val; if (val == 1) { result = feyaSoft.lang.common.canView } else { if (val == 2) { result = feyaSoft.lang.common.canEdit } else { if (val == 7) { result = feyaSoft.lang.common.canEdit } } } return result } var shareCM = new Ext.grid.ColumnModel([selectBoxModel, { id : "id", header : "Identify", dataIndex : "id", width : 100, hidden : true }, { header : feyaSoft.lang.common.contactCategory, width : 200, dataIndex : "shareCategory" }, { header : feyaSoft.lang.common.permission, width : 90, dataIndex : "permission", scope : this, renderer : viewEditPermission }, { header : feyaSoft.lang.common.date, width : 140, dataIndex : "updateDate", renderer : Ext.util.Common.formatDateHour }]); this.shareStore = new Ext.data.JsonStore({ url : this.componentClass + "/list", remoteSort : true, fields : [] }); this.deleteBtn = new Ext.Button({ disabled : true, text : feyaSoft.lang.common.remove, id : "delete-contact-file-action", tooltip : "Highlight the item and click this button to remove this item", iconCls : "delete", handler : function() { var record = this.getSelectionModel().getSelected(); if (record) { this.deleteItem(record) } }, scope : this }); this.changePermit = new Ext.Button({ disabled : true, text : feyaSoft.lang.common.changePermission, tooltip : "Highlight the item and click this button to change this shared user permission", iconCls : "editItem", handler : function() { var record = this.getSelectionModel().getSelected(); if (record) { this.changeItem(record) } }, scope : this }); feyaSoft.home.common.share.ListContacts.superclass.constructor.call(this, { region : "center", border : true, store : this.shareStore, cm : shareCM, sm : selectBoxModel, width : 600, height : 300, viewConfig : { forceFit : true }, loadMask : { msg : feyaSoft.lang.common.loadingData }, tbar : [this.deleteBtn, this.changePermit], autoScroll : true }); selectBoxModel.on("selectionchange", this.onSelectionChangeFn, this) }; Ext.extend(feyaSoft.home.common.share.ListContacts, Ext.grid.GridPanel, { initLoad : function(config) { this.fileId = config.fileId; this.myOwnerCt = config.myOwnerCt; this.shareStore.baseParams = { fileId : this.fileId }; this.shareStore.load() }, existedItem : function() { return this.shareStore.data.items }, onSelectionChangeFn : function(sm) { if (0 < sm.getSelections().length) { this.deleteBtn.enable(); if (this.componentClass == "contactSharePhotoFolder" || this.componentClass == "contactSharePhoto") { this.changePermit.disable() } else { this.changePermit.enable() } } else { this.deleteBtn.disable(); this.changePermit.disable() } }, deleteItem : function(rd) { Ext.Msg.show({ title : feyaSoft.lang.common.confirmDelete, msg : feyaSoft.lang.common.confirmDeleteDesc, icon : Ext.Msg.QUESTION, buttons : Ext.Msg.YESNO, fn : this.onDeleteConfirm, scope : this, record : rd }) }, onDeleteConfirm : function(button_id, text, options) { if (button_id == "yes") { Ext.Ajax.request({ url : this.componentClass + "/delete", params : { id : options.record.data.id }, success : function(result, request) { this.reload() }, failure : function(result, request) { Ext.MessageBox.alert("Failed", "Internal Error, please try again") }, scope : this }) } }, changeItem : function(rd) { var changedPermit = feyaSoft.lang.common.canView; if (rd.data.permission == 1) { changedPermit = feyaSoft.lang.common.canEdit } Ext.Msg.show({ title : feyaSoft.lang.common.confirm, msg : feyaSoft.lang.common.confirmChangePermit + changedPermit, icon : Ext.Msg.QUESTION, buttons : Ext.Msg.YESNO, fn : this.onChangeConfirm, scope : this, record : rd }) }, onChangeConfirm : function(button_id, text, options) { if (button_id == "yes") { Ext.Ajax.request({ url : this.componentClass + "/changePermit", params : { id : options.record.data.id }, success : function(result, request) { this.reload(); this.myOwnerCt.reload() }, failure : function(result, request) { Ext.MessageBox.alert("Failed", "Internal Error, please try again") }, scope : this }) } }, reload : function() { this.shareStore.reload() }, disableDelete : function() { Ext.getCmp("delete-contact-file-action").setDisabled(true) } }); feyaSoft.home.common.share.AddContact = function(config, myOwnerCt) { Ext.QuickTips.init(); Ext.form.Field.prototype.msgTarget = "side"; this.fileId = null; this.myOwnerCt = null; this.componentClass = "contactShareFile"; if (config.componentClass == "myPhotoFolderShare") { this.componentClass = "contactSharePhotoFolder" } else { if (config.componentClass == "myPhotoShare") { this.componentClass = "contactSharePhoto" } else { if (config.componentClass == "browserBookmarkShare") { this.componentClass = "contactShareBookmark" } } } var permissionStore = [["1", feyaSoft.lang.common.canView], ["2", feyaSoft.lang.common.canEdit]]; if (config.componentClass == "myPhotoShare" || config.componentClass == "myPhotoFolderShare") { permissionStore = [["1", feyaSoft.lang.common.canView]] } var permission_data = new Ext.data.SimpleStore({ fields : ["id", "name"], data : permissionStore }); var categoryStore = new Ext.data.JsonStore({ url : "contactCategory/list", remoteSort : true, fields : [] }); categoryStore.setDefaultSort("name", "ASC"); this.categoryName = new Ext.form.ComboBox({ fieldLabel : feyaSoft.lang.common.category, forceSelection : true, allowBlank : false, typeAhead : true, minChars : 2, triggerAction : "all", store : categoryStore, displayField : "name", hiddenName : "categoryId", valueField : "id", emptyText : feyaSoft.lang.common.pleaseSelectOne, loadingText : feyaSoft.lang.common.loadingData, pageSize : 15, anchor : "93%", listeners : { select : this.onCategorySelectFn, scope : this } }); this.permission = new Ext.form.ComboBox({ fieldLabel : feyaSoft.lang.common.permission, forceSelection : true, allowBlank : false, typeAhead : true, triggerAction : "all", store : permission_data, displayField : "name", hiddenName : "permission", mode : "local", valueField : "id", allowBlank : false, anchor : "93%" }); this.note = new Ext.form.HtmlEditor({ hideLabel : true, name : "note", height : 150, anchor : "93%" }); this.posting = new Ext.form.Checkbox({ hideLabel : true, boxLabel : feyaSoft.lang.file.contactShareMsg, name : "doPosting", checked : true }); this.saveBtn = new Ext.Button({ minWidth : 75, text : feyaSoft.lang.common.save, tooltip : "Save the result to the system", iconCls : "save", handler : this.doSaveFn, scope : this }); feyaSoft.home.common.share.AddContact.superclass.constructor.call(this, { region : "east", width : 350, split : true, baseCls : "x-plain", labelWidth : 65, bodyStyle : "padding: 20px 10px 10px 10px", url : this.componentClass + "/createUpdate", items : [this.categoryName, this.permission, this.note, this.posting], buttons : [this.saveBtn] }) }; Ext.extend(feyaSoft.home.common.share.AddContact, Ext.form.FormPanel, { initLoad : function(config) { this.fileId = config.fileId; this.myOwnerCt = config.myOwnerCt; this.permission.setValue("1") }, onCategorySelectFn : function(obj) { var name = null; var existedItem = false; var existedItems = this.ownerCt.existedItems(); for (var i = 0; i < existedItems.length; i++) { if (obj.value == existedItems[i].data.categoryId) { existedItem = true; name = existedItems[i].data.shareCategory } } if (existedItem) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.file.itemShared + ": " + name); this.categoryName.setValue(null) } }, doSaveFn : function() { if (this.form.isValid()) { this.form.submit({ params : { fileId : this.fileId }, waitMsg : "In processing", failure : function(form, action) { Ext.MessageBox.alert("Error Message", action.result.errorInfo) }, success : function(form, action) { if (action.result.success == "true") { Ext.Message.msgStay( feyaSoft.lang.common.confirm, action.result.info, 2000); this.ownerCt.reloadList(); this.categoryName.reset(); this.note.reset() } else { Ext.MessageBox.alert("Error Message", action.result.info) } }, scope : this }) } else { Ext.MessageBox.alert("Errors", "Please fix the errors noted.") } } }); Ext.ns("feyaSoft.home.common.share"); feyaSoft.home.common.share.OrganizationSharePanel = function(config) { this.listOrganizations = new feyaSoft.home.common.share.ListOrganizations(config); this.addOrganization = new feyaSoft.home.common.share.AddOrganization(config); feyaSoft.home.common.share.OrganizationSharePanel.superclass.constructor .call(this, { title : feyaSoft.lang.file.organizationAccess, border : false, layout : "border", items : [this.listOrganizations, this.addOrganization] }) }; Ext.extend(feyaSoft.home.common.share.OrganizationSharePanel, Ext.Panel, { initLoad : function(config) { this.listOrganizations.initLoad(config); this.addOrganization.initLoad(config) }, existedOrganizations : function() { return this.listOrganizations.existedOrganizations() }, reloadListOrganization : function() { this.listOrganizations.reload() } }); feyaSoft.home.common.share.ListOrganizations = function(config) { this.fileId = null; this.myOwnerCt = null; this.componentClass = "organizationFile"; if (config.componentClass == "myPhotoFolderShare") { this.componentClass = "organizationPhotoFolder" } else { if (config.componentClass == "myPhotoShare") { this.componentClass = "organizationPhoto" } else { if (config.componentClass == "browserBookmarkShare") { this.componentClass = "organizationBookmark" } } } var selectBoxModel = new Ext.grid.CheckboxSelectionModel({ singleSelect : true }); function viewEditPermission(val) { var result = val; if (val == 1) { result = feyaSoft.lang.common.canView } else { if (val == 2) { result = feyaSoft.lang.common.canEdit } else { if (val == 7) { result = feyaSoft.lang.common.canEdit } } } return result } var shareCM = new Ext.grid.ColumnModel([selectBoxModel, { id : "id", header : "Identify", dataIndex : "id", width : 100, hidden : true }, { header : feyaSoft.lang.common.name, width : 200, dataIndex : "name" }, { header : feyaSoft.lang.common.permission, width : 100, dataIndex : "permission", scope : this, renderer : viewEditPermission }, { header : feyaSoft.lang.common.date, width : 150, dataIndex : "shareDate", renderer : Ext.util.Common.formatDateHour }]); this.shareStore = new Ext.data.JsonStore({ url : this.componentClass + "/sharedOrganizations", remoteSort : true, fields : [] }); this.deleteBtn = new Ext.Button({ text : feyaSoft.lang.common.remove, tooltip : "Highlight the item and click this button to remove this shared user", iconCls : "delete", disabled : true, handler : function() { this.deleteItem() }, scope : this }); this.changePermit = new Ext.Button({ disabled : true, text : feyaSoft.lang.common.changePermission, tooltip : "Highlight the item and click this button to change this shared organization permission", iconCls : "editItem", handler : this.changeItem, scope : this }); feyaSoft.home.common.share.ListOrganizations.superclass.constructor.call( this, { region : "center", store : this.shareStore, cm : shareCM, sm : selectBoxModel, viewConfig : { forceFit : true }, loadMask : { msg : feyaSoft.lang.common.loadingData }, tbar : [this.deleteBtn, this.changePermit], autoScroll : true }); selectBoxModel.on("selectionchange", this.onSelectionChangeFn, this) }; Ext.extend(feyaSoft.home.common.share.ListOrganizations, Ext.grid.GridPanel, { initLoad : function(config) { this.fileId = config.fileId; this.myOwnerCt = config.myOwnerCt; this.shareStore.baseParams = { fileId : this.fileId }; this.shareStore.load() }, existedOrganizations : function() { return this.shareStore.data.items }, onSelectionChangeFn : function(sm) { if (0 < sm.getSelections().length) { this.deleteBtn.enable(); if (this.componentClass == "organizationPhotoFolder" || this.componentClass == "organizationPhoto") { this.changePermit.disable() } else { this.changePermit.enable() } } else { this.deleteBtn.disable(); this.changePermit.disable() } }, deleteItem : function(rd) { var record = this.getSelectionModel().getSelected(); if (record == null || record.data == null || record.data.id == null) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.common.pleaseSelectOne); return } var deleteInfo = feyaSoft.lang.common.confirmDelete + ": " + record.data.name; Ext.MessageBox.confirm(deleteInfo, feyaSoft.lang.common.confirmDeleteDesc, function(btn) { if (btn == "yes") { Ext.Ajax.request({ url : this.componentClass + "/remove", params : { organizationId : record.data.id, fileId : this.fileId }, method : "GET", success : function(result, request) { var jsonData = Ext.util.JSON .decode(result.responseText); if (jsonData.success == "true") { this.reload(); this.myOwnerCt.reload() } else { Ext.MessageBox .alert( feyaSoft.lang.common.error, jsonData.info) } }, failure : function(result, request) { }, scope : this }) } }, this) }, changeItem : function() { var record = this.getSelectionModel().getSelected(); if (record == null || record.data == null || record.data.id == null) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.common.pleaseSelectOne); return } var changedPermit = feyaSoft.lang.common.canView; if (record.data.permission == 1) { changedPermit = feyaSoft.lang.common.canEdit } Ext.Msg.show({ title : feyaSoft.lang.common.confirm, msg : feyaSoft.lang.common.confirmChangePermit + changedPermit, icon : Ext.Msg.QUESTION, buttons : Ext.Msg.YESNO, fn : this.onChangeConfirm, scope : this, record : record }) }, onChangeConfirm : function(button_id, text, options) { if (button_id == "yes") { Ext.Ajax.request({ url : this.componentClass + "/changePermit", params : { organizationId : options.record.data.id, fileId : this.fileId }, success : function(result, request) { this.reload(); this.myOwnerCt.reload() }, failure : function(result, request) { Ext.MessageBox.alert("Failed", "Internal Error, please try again") }, scope : this }) } }, reload : function() { this.shareStore.reload() }, disableDelete : function() { Ext.getCmp("delete-share-file-action").setDisabled(true) } }); feyaSoft.home.common.share.AddOrganization = function(config) { Ext.QuickTips.init(); Ext.form.Field.prototype.msgTarget = "side"; this.fileId = null; this.myOwnerCt = null; this.componentClass = "organizationFile"; if (config.componentClass == "myPhotoFolderShare") { this.componentClass = "organizationPhotoFolder" } else { if (config.componentClass == "myPhotoShare") { this.componentClass = "organizationPhoto" } else { if (config.componentClass == "browserBookmarkShare") { this.componentClass = "organizationBookmark" } } } var organizationStore = new Ext.data.JsonStore({ url : "organizationUser/list", remoteSort : true, fields : [] }); organizationStore.setDefaultSort("name", "ASC"); this.organization = new Ext.form.ComboBox({ fieldLabel : feyaSoft.lang.organization.organization, forceSelection : true, allowBlank : false, typeAhead : true, minChars : 2, triggerAction : "all", store : organizationStore, displayField : "name", hiddenName : "itemId", valueField : "id", emptyText : feyaSoft.lang.common.pleaseSelectOne, loadingText : feyaSoft.lang.common.loadingData, pageSize : 15, anchor : "93%", listeners : { select : this.onOrganizationSelectFn, scope : this } }); this.permissionStore = [["1", feyaSoft.lang.common.canView], ["2", feyaSoft.lang.common.canEdit]]; if (this.componentClass == "organizationPhotoFolder" || this.componentClass == "organizationPhoto") { this.permissionStore = [["1", feyaSoft.lang.common.canView]] } this.permission_data = new Ext.data.SimpleStore({ fields : ["id", "name"], data : this.permissionStore }); this.permission = new Ext.form.ComboBox({ fieldLabel : feyaSoft.lang.common.permission, forceSelection : true, allowBlank : false, typeAhead : true, triggerAction : "all", store : this.permission_data, displayField : "name", hiddenName : "permission", mode : "local", valueField : "id", anchor : "93%" }); this.note = new Ext.form.HtmlEditor({ hideLabel : true, name : "note", height : 150, anchor : "93%" }); this.posting = new Ext.form.Checkbox({ hideLabel : true, boxLabel : feyaSoft.lang.file.organizationShareMsg, name : "doPosting", checked : true }); this.saveBtn = new Ext.Button({ minWidth : 75, text : feyaSoft.lang.common.save, tooltip : "Save the result to the system", iconCls : "save", handler : this.doSaveFn, scope : this }); feyaSoft.home.common.share.AddOrganization.superclass.constructor.call( this, { region : "east", width : 350, split : true, baseCls : "x-plain", labelWidth : 70, bodyStyle : "padding: 20px 10px 10px 10px", url : this.componentClass + "/createUpdate", items : [this.organization, this.permission, this.note, this.posting], buttons : [this.saveBtn] }) }; Ext.extend(feyaSoft.home.common.share.AddOrganization, Ext.form.FormPanel, { onOrgAfterRenderFn : function() { this.permission_data.on("load", function() { this.permission.setValue("1") }, this) }, initLoad : function(config) { this.fileId = config.fileId; this.myOwnerCt = config.myOwnerCt; this.permission.setValue("1") }, onOrganizationSelectFn : function(obj) { var allowPosting = true; var name = null; var items = obj.store.data.items; for (var i = 0; i < items.length; i++) { if (obj.value == items[i].data.id) { allowPosting = items[i].data.allowPosting; name = items[i].data.name } } if (!allowPosting) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.group.notAllowPosting + ": " + name); this.organization.setValue(null) } var existedOrganization = false; var existedOrganizations = this.ownerCt.existedOrganizations(); for (var i = 0; i < existedOrganizations.length; i++) { if (obj.value == existedOrganizations[i].data.id) { existedOrganization = true; name = existedOrganizations[i].data.name } } if (existedOrganization) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.group.groupShared + ": " + name); this.organization.setValue(null) } }, doSaveFn : function() { if (this.form.isValid()) { this.form.submit({ params : { fileId : this.fileId }, waitMsg : "In processing", failure : function(form, action) { Ext.MessageBox.alert("Error Message", action.result.errorInfo) }, success : function(form, action) { if (action.result.success == "true") { Ext.Message.msgStay( feyaSoft.lang.common.confirm, action.result.info, 2000); this.ownerCt.reloadListOrganization(); this.organization.reset() } else { Ext.MessageBox.alert( feyaSoft.lang.common.error, action.result.info) } }, scope : this }) } else { Ext.MessageBox.alert(feyaSoft.lang.common.error, "Please fix the errors noted.") } } }); Ext.ns("feyaSoft.home.common.share"); feyaSoft.home.common.share.ShareWin = function(config) { this.config = config; this.myOwnerCt = config.myOwnerCt; this.componentClass = "documentShareFile"; if (config.componentClass) { this.componentClass = config.componentClass } this.sharePanel = new feyaSoft.home.common.share.SharePanel(config); this.contactPanel = new feyaSoft.home.common.share.ContactSharePanel(config); this.groupSharePanel = new feyaSoft.home.common.share.GroupSharePanel(config); this.organizationPanel = new feyaSoft.home.common.share.OrganizationSharePanel(config); this.mainTabPanel = new Ext.TabPanel({ loadMask : true, border : false, activeTab : 0, bodyStyle : "padding:5px;background:none;", deferredRender : false, enableTabScroll : true, monitorResize : true, resizeTabs : true, tabWidth : 200, minTabWidth : 120, plugins : new Ext.ux.TabCloseMenu(), layoutOnTabChange : true, items : [this.sharePanel, this.contactPanel, this.groupSharePanel, this.organizationPanel] }); feyaSoft.home.common.share.ShareWin.superclass.constructor.call(this, { title : feyaSoft.lang.common.share + " [ " + config.name + " ]", width : 800, height : 450, layout : "fit", shim : false, animCollapse : false, constrainHeader : true, modal : true, buttonAlign : "center", items : [this.mainTabPanel] }); this.mainTabPanel.on("afterrender", this.onTabAfterRenderFn, this, { single : true }); this.mainTabPanel.on("tabchange", this.onTabChangeFn, this); this.show() }; Ext.extend(feyaSoft.home.common.share.ShareWin, Ext.Window, { onTabChangeFn : function(tabs, atab) { atab.initLoad(this.config) }, onTabAfterRenderFn : function(tabs, atab) { Ext.Ajax.request({ url : this.componentClass + "/allowInviteAndPermission", params : { fileId : this.config.fileId }, method : "GET", success : function(result, request) { var jsonData = Ext.util.JSON .decode(result.responseText); if (jsonData.allowInvite) { this.sharePanel.setDisabled(false) } if (jsonData.permission < 2) { this.sharePanel.setDisabled(true) } if (jsonData.permission < 7) { this.contactPanel.setDisabled(true); this.groupSharePanel.setDisabled(true); this.organizationPanel.setDisabled(true) } }, failure : function(result, request) { Ext.MessageBox .alert("Failed", "Internal Error") }, scope : this }) }, activeReloadTab : function() { this.sharePanel.reload(); try { this.myOwnerCt.reload() } catch (e) { } } }); Ext.ns("feyaSoft.home.common.document"); feyaSoft.home.common.document.EditingCommentList = Ext.extend(Ext.Panel, { cls : "x-contactgroup-posting doc-msg", displayInfo : false, loadUrl : "documentTrack/list", createUpdateUrl : "documentTrack/createUpdate", layout : "card", activeItem : 0, myPageSize : 5, initComponent : function() { this.rawTitle = this.title; this.topicStore = new Ext.data.JsonStore({ url : this.loadUrl, remoteSort : true, fields : [] }); this.topicStore.setDefaultSort("updateTime", "DESC"); var me = this; this.topicTpl = this.topicTpl || new Ext.XTemplate( [ '', '
', '', '{author}', '{creationDateString}', "{description}", '', '", '
', "
", "
", "
", '
'].join(""), { isTopic : function() { return me.isTopicList() } }).compile(); this.topicPageBar = new Ext.PagingToolbar({ pageSize : this.myPageSize, store : this.topicStore, displayInfo : false }); this.topicView = new Ext.DataView({ store : this.topicStore, tpl : this.topicTpl, deferEmptyText : false, emptyText : '
' + feyaSoft.lang.common.noResultDisplay + "
", overClass : "x-view-over", itemSelector : "div.x-posting-detail", singleSelect : true }); this.messageTextArea = new Ext.form.TextArea({ emptyText : feyaSoft.lang.common.postMessageAboutFile, flex : 1, allowBlank : false }); this.topicCt = new Ext.Panel({ border : false, autoScroll : true, items : [this.topicView], bbar : this.topicPageBar, tbar : new Ext.Toolbar({ layout : { type : "hbox", align : "stretch" }, height : 65, items : [this.messageTextArea, { autoWidth : false, width : 30, iconCls : "addItem", handler : this.addTopic, scope : this }] }) }); this.commentTextArea = new Ext.form.TextArea({ emptyText : feyaSoft.lang.group.write_comment, grow : true, growMax : 100, allowBlank : false }); this.replyBtn = new Ext.Button({ iconCls : "icon_apply", minWidth : 70, text : feyaSoft.lang.group.reply, style : "padding-right:2px;", handler : this.onReplyTopic, scope : this }); this.clearBtn = new Ext.Button({ minWidth : 70, text : feyaSoft.lang.common.clear, handler : this.onClear, scope : this }); this.commentEditor = new Ext.form.FormPanel({ baseCls : "x-plain", border : false, layout : "fit", autoHeight : true, items : [this.commentTextArea], buttons : [this.clearBtn, this.replyBtn] }); this.items = [this.topicCt]; feyaSoft.home.common.document.EditingCommentList.superclass.initComponent .call(this); this.on("afterrender", this._onAfterRender, this); this.topicView.on("selectionchange", this.onTopicSelectionChange, this, { buffer : 50 }); this.topicView.on("click", this.onNodeClick, this); this.topicView.on("containerclick", this.onContainerClick, this); this.topicStore.on("load", this._onTopicLoad, this) }, _onTopicLoad : function(store, rds) { if (this.isTopicList()) { var total = 0; store.each(function(rd) { var updateDate = Date.parseDate(rd.data.updateDate, "H:i:s m/d Y"); if (updateDate.format("YmdHis") > this.timestamp .format("YmdHis")) { total++ } }, this); this.setTitle(this.rawTitle + ' : ' + total + " " + feyaSoft.lang.common.after + " " + this.timestamp.format("H:i:s")); this.messageTextArea.emptyText = feyaSoft.lang.common.postMessageAboutFile; this.messageTextArea.reset(); this.fireEvent("rednumberchange", total, this.timestamp, this) } else { if (this.topic) { this.topic.data.style = "background:rgb(243,248,252);border:1px solid #99BBE8;"; store.insert(0, this.topic) } var el = this.topicView.getEl(); if (el) { Ext.DomHelper.insertHtml("beforeBegin", el.dom.firstChild, '' + feyaSoft.lang.common.back2message + "

") } this.messageTextArea.emptyText = feyaSoft.lang.group.write_comment; this.messageTextArea.reset() } }, _onAfterRender : function() { this.loadMask = new Ext.LoadMask(this.body, { store : this.topicStore }) }, isTopicList : function() { return !this.topicStore.baseParams.parentId }, onNodeClick : function(dv, index, node, e) { var target = e.getTarget(); var tag = target.tagName.toUpperCase(); if ("A" == tag) { var tid = target.getAttribute("tid"); if (tid) { this.pending = true; this.showComments(tid); (function () { delete(this.pending) }).defer(100, this) } } }, onContainerClick : function(dv, e) { var target = e.getTarget(); var tag = target.tagName.toUpperCase(); if ("SPAN" == tag) { target = Ext.get(target); if (target.hasClass("back2topic")) { this.showTopics(this.fileId, this.topicPageBar.cursor) } } }, resizeInnerEditor : function() { if (this.commentEditor) { var el = this.commentEditor.getEl(); if (el) { var ctEl = el.parent(".x-posting-writecomment"); if (ctEl) { var w = ctEl.getWidth(); this.commentEditor.setWidth(w) } } } }, onTopicSelectionChange : function(dv, selection) { if (0 < selection.length && !this.pending && this.isTopicList()) { var s = Ext.get(selection[0]); if (s != this.lastSelectedNode) { this.lastSelectedNode = s; var f = Ext.get(dv.getNode(0)); var ft = f.getTop(); var st = s.getTop(); var sb = s.getBottom(); var body = this.topicCt.body; var bt = body.getTop(); if (st < bt || sb > body.getBottom()) { body.dom.scrollTop = st - ft } var ed = s.child(".x-posting-writecomment"); if (this.commentEditor.rendered) { if (Ext.isIE) { this.reNewCommentEditor(ed) } else { var commentEl = this.commentEditor.getEl(); ed.dom.appendChild(commentEl.dom); this.resizeInnerEditor() } } else { this.commentEditor.render(ed) } } } }, showTopics : function(fileId, pageNo, timestamp) { this.fileId = fileId; delete(this.topicId); delete(this.topic); this.loadMessage(pageNo, timestamp) }, showComments : function(topicId) { this.topicId = topicId; var index = this.topicStore.find("id", topicId); if (-1 != index) { this.topic = this.topicStore.getAt(index) } this.loadComment() }, fadeInTopic : function(duration) { var el = this.topicView.getEl(); if (el) { duration = duration || 2; el.show().fadeIn({ stopFx : true, duration : duration }) } }, loadMessage : function(pageNo, timestamp) { if (timestamp) { this.timestamp = timestamp } this.topicStore.baseParams = { documentId : this.fileId }; this.topicStore.removeAll(); this.topicPageBar.doLoad(pageNo || 0); this.fadeInTopic() }, loadComment : function() { this.topicStore.baseParams = { documentId : this.fileId, parentId : this.topicId }; this.topicStore.removeAll(); this.topicPageBar.doLoad(0); this.fadeInTopic() }, addTopic : function() { if (this.messageTextArea.isValid()) { var msg = this.messageTextArea.getValue(); var params = { documentId : this.fileId, description : msg }; if (!this.isTopicList()) { params.parentId = this.topicId } Ext.Ajax.request({ url : this.createUpdateUrl, params : params, success : function(response, options) { this.messageTextArea.reset(); if (this.isTopicList()) { this.loadMessage() } else { this.loadComment() } }, failure : function(response, options) { var json = Ext.decode(response.responseText); Ext.Msg .alert(feyaSoft.lang.common.error, json.info) }, scope : this }) } }, onClear : function() { this.commentTextArea.reset() }, onReplyTopic : function() { if (this.commentTextArea.isValid()) { var el = this.commentEditor.getEl(); var pEl = el.parent(".x-posting-writecomment"); if (pEl) { var tid = pEl.dom.getAttribute("tid"); this.replyTopic(tid, this.commentTextArea.getValue()) } } }, replyTopic : function(topicId, comment) { Ext.Ajax.request({ url : this.createUpdateUrl, params : { documentId : this.fileId, description : comment, parentId : topicId }, success : function(response, options) { this.commentTextArea.reset(); this.loadMessage(this.topicPageBar.cursor) }, failure : function(response, options) { var json = Ext.decode(response.responseText); Ext.Msg.alert(feyaSoft.lang.common.error, json.info) }, scope : this }) }, pullingComment : function() { var comment = this.commentTextArea.getValue(); var message = this.messageTextArea.getValue(); if ((!comment || !this.commentTextArea.isVisible()) && !message) { this.loadMessage() } } }); Ext.ns("feyaSoft.home.common.document"); feyaSoft.home.common.document.EditingUserList = Ext.extend(Ext.Panel, { pullInterval : 120000, initComponent : function() { this.rawTitle = this.title; this.userTpl = this.userTpl || new Ext.XTemplate([ "", '', "", '', '', "", "", "
"].join("")) .compile(); this.tpl = this.tpl || new Ext.XTemplate([ '
{latestUpdateInfo}
', "
", "", '', "", '', '', "", "", "
", "
"] .join("")).compile(); this.html = this.tpl.apply({ users : [] }); this.refreshBtn = new Ext.Button({ iconCls : "refresh", text : feyaSoft.lang.common.refresh2latest, handler : this.refreshFile, scope : this }); feyaSoft.home.common.document.EditingUserList.superclass.initComponent .call(this); this.addEvents("pullingcomment", "refreshfile"); this.on("afterrender", this._onAfterRender, this) }, _onAfterRender : function() { var refresh = Ext.get(this.body.dom.firstChild.lastChild); this.refreshBtn.render(refresh) }, startTask : function() { if (!this.task) { var me = this; this.task = { run : function() { me.loadByFile(me.fileId) }, interval : this.pullInterval }; Ext.TaskMgr.start(this.task) } }, showUsers : function(fileId) { this.fileId = fileId; this.startTask() }, loadByFile : function(fileId) { var params = { documentId : fileId }; if (this.lastCallingTime) { params.commentAfter = this.lastCallingTime } this.lastCallingTime = (new Date()).format("Y-m-d H:i:s"); Ext.Ajax.request({ url : "documentEditingUser/getUsers", params : params, success : function(response, options) { var json = Ext.decode(response.responseText); if ("true" == json.success) { this.updateHTML(json); if (0 < json.newCommentsNo) { this.fireEvent("pullingcomment", json.newCommentsNo, json, this) } this.fireEvent("rednumberchange", json.users.length, json, this) } }, scope : this }) }, updateHTML : function(json) { var num = json.users.length; this.setTitle(this.rawTitle + ' : ' + num + ""); if (this.body) { var users = this.userTpl.apply(json); var div = Ext.get(this.body.dom.lastChild); div.update(users); var info = Ext.get(this.body.dom.firstChild.firstChild); info.update(json.latestUpdateInfo); (function () { this.highlightDiff(json); this.syncSize() }).defer(500, this) } else { var html = this.tpl.apply(json); this.html = html } }, highlightDiff : function(json) { if (this.lastJson) { var last = this.lastJson, olds = last.users, users = json.users; for (var i = 0, len = users.length; i < len; i++) { var un = users[i].username; var j = 0, count = olds.length; for (; j < count; j++) { if (olds[j].username == un) { break } } if (j == count) { var tbody = this.body.dom.lastChild.firstChild.firstChild; var el = Ext.get(tbody.childNodes[i].lastChild); el.highlight() } } } this.lastJson = json }, refreshFile : function() { this.fireEvent("refreshfile", this.fileId, this) } }); Ext.ns("Ext.ux.dialog"); Ext.ux.dialog.DirectorySelector = Ext.extend(Ext.form.TriggerField, { resizable : true, expandOnFocus : true, minListWidth : 0, maxHeight : 300, editable : false, listAlign : "tl-bl?", initComponent : function() { Ext.ux.dialog.DirectorySelector.superclass.initComponent .call(this); this.addEvents("changedirectory"); this.on("expand", this._onExpandFn, this) }, _onExpandFn : function() { var path = this.getValue(); this.innerTree.selectPath(path, "text") }, onRender : function(ct, position) { Ext.ux.dialog.DirectorySelector.superclass.onRender.call(this, ct, position); if (!this.lazyInit) { this.initList() } else { this.on("focus", this.initList, this, { single : true }) } }, onFocus : function() { Ext.ux.dialog.DirectorySelector.superclass.onFocus.call(this); if (true == this.expandOnFocus) { this.expand() } }, initList : function() { if (!this.list) { var cls = "x-combo-list"; this.list = new Ext.Layer({ shadow : this.shadow, cls : [cls, this.listClass].join(" "), constrain : false }); var lw = this.listWidth || Math .max(this.wrap.getWidth(), this.minListWidth); this.list.setWidth(lw); this.list.swallowEvent("mousewheel"); this.assetHeight = 0; this.innerList = this.list.createChild({ cls : cls + "-inner" }); this.innerList.setWidth(lw - this.list.getFrameWidth("lr")); this.innerTree = new Ext.tree.TreePanel({ layout : "fit", useArrows : true, autoScroll : true, animate : true, rootVisible : this.rootVisible || false, border : false, root : this.root || new Ext.tree.AsyncTreeNode({ draggable : false, cls : "folder", leaf : false, expanded : true, expandable : true }), loader : this.urlLoader || new Ext.tree.TreeLoader({ dataUrl : this.url }), renderTo : this.innerList }); this.innerTree.on("click", this.onNodeClickFn, this); if (this.resizable) { this.resizer = new Ext.Resizable(this.list, { pinned : true, handles : "se" }); this.resizer.on("resize", function(r, w, h) { this.innerTree.setHeight(h); this.maxHeight = h - this.handleHeight - this.list.getFrameWidth("tb") - this.assetHeight; this.listWidth = w; this.innerList.setWidth(w - this.list.getFrameWidth("lr")); this.restrictHeight() }, this); this["innerList"].setStyle("margin-bottom", this.handleHeight + "px") } } }, onNodeClickFn : function(node, e) { this.collapse.defer(1, this); this.fireEvent("changedirectory", this, node, node.id) }, restrictHeight : function() { this.innerList.dom.style.height = ""; var inner = this.innerList.dom; var pad = this.list.getFrameWidth("tb") + (this.resizable ? this.handleHeight : 0) + this.assetHeight; var h = Math.max(inner.clientHeight, inner.offsetHeight, inner.scrollHeight); var ha = this.getPosition()[1] - Ext.getBody().getScroll().top; var hb = Ext.lib.Dom.getViewHeight() - ha - this.getSize().height; var space = Math.max(ha, hb, this.minHeight || 0) - this.list.shadowOffset - pad - 5; h = Math.min(h, space, this.maxHeight); this.innerList.setHeight(h); this.list.beginUpdate(); this.list.setHeight(h + pad); this.list.alignTo(this.wrap, this.listAlign); this.list.endUpdate() }, isExpanded : function() { return this.list && this.list.isVisible() }, collapse : function() { if (!this.isExpanded()) { return } this.list.hide(); Ext.getDoc().un("mousewheel", this.collapseIf, this); Ext.getDoc().un("mousedown", this.collapseIf, this); this.fireEvent("collapse", this) }, collapseIf : function(e) { if (!e.within(this.wrap) && !e.within(this.list)) { this.collapse() } }, expand : function() { if (this.isExpanded() || !this.hasFocus) { return } this.list.alignTo(this.wrap, this.listAlign); this.list.show(); this.innerList.setOverflow("auto"); Ext.getDoc().on("mousewheel", this.collapseIf, this); Ext.getDoc().on("mousedown", this.collapseIf, this); this.fireEvent("expand", this) }, onTriggerClick : function() { if (this.disabled) { return } if (this.isExpanded()) { this.collapse() } else { this.el.focus(); this.expand() } } }); Ext.ns("Ext.ux.dialog"); Ext.ux.dialog.getFileTypeStore = function() { var store = new Ext.data.SimpleStore({ fields : ["id", "text"], data : [["all", "All Types"], ["myXls", ".xls"], ["myDoc", ".doc"], ["myPpt", ".ppt"], ["myPMgr", ".pm"], ["myFlow", ".flow"]] }); return store }; //修改Window Ext.ux.dialog.FileDialog = Ext.extend(Ext.Window, { width : 700, height : 400, modal : true, closable : true, resizable : false, closeAction : "hide", listPageSize : 10, layout : "border", initComponent : function() { this.urlLoader = this.urlLoader || new Ext.tree.TreeLoader({ dataUrl : feyaSoft.home.CONST.documentUrl.listTree, baseParams : { id : "0" }, createNode : function(attr) { if (this.baseAttrs) { Ext.applyIf(attr, this.baseAttrs) } if (this.applyLoader !== false) { attr.loader = this } if (typeof attr.uiProvider == "string") { attr.uiProvider = this.uiProviders[attr.uiProvider] || eval(attr.uiProvider) } if (attr.nodeType) { return new Ext.tree.TreePanel.nodeTypes[attr.nodeType](attr) } else { return attr.leaf ? null : new Ext.tree.AsyncTreeNode(attr) } } }); this.directSelector = new Ext.ux.dialog.DirectorySelector({ width : 150, value : "/ROOT", lazyInit : true, rootVisible : true, urlLoader : this.urlLoader, root : new Ext.tree.AsyncTreeNode({ text : "ROOT", expandable : true, draggable : false, cls : "folder", expanded : true, id : "0" }) }); this.directSelector.on("changedirectory", this.onChangeDirectoryFn, this); this.upBtn = new Ext.Button({ iconCls : "arrow_up", handler : this.onUpFn, scope : this }); this.refreshBtn = new Ext.Button({ iconCls : "x-tbar-loading", handler : this.onRefreshFn, scope : this }); this.searchField = new Ext.ux.form.SearchField({ width : 150, onTrigger1Click : this.cancelSearchFn.createDelegate(this), onTrigger2Click : this.onSearchFn.createDelegate(this) }); this.deleteButton=new Ext.Button({ iconCls : "deletebtn", handler : this.onDeleteTemplateFn, text:'删除', tooltip:'删除模板', scope : this }); this.list = this.generateList(); this.tbar = new Ext.PagingToolbar({ pageSize : this.listPageSize, store : this.list.getStore(), displayInfo : false, listeners : { afterRender : { fn : function(pgBar) { pgBar.insert(0, feyaSoft.lang.common.directory + ": "); pgBar.insert(1, this.directSelector); pgBar.insert(2, " "); pgBar.insert(3, this.searchField); pgBar.insert(4, " "); pgBar.insert(5, this.deleteButton); pgBar.insert(6, "->") }, scope : this } } }); this.southPanel = this.generateSouthPanel(); this.items = [this.list, this.southPanel]; Ext.ux.dialog.FileDialog.superclass.initComponent.call(this); this.on("show", this.onRefreshFn, this) }, cancelSearchFn : function() { var sf = this.searchField; if (sf.hasSearch) { sf.reset(); this.loadFolder.defer(1, this, [""]); sf.triggers[0].hide(); sf.hasSearch = false } }, onSearchFn : function() { var sf = this.searchField; this.loadFolder.defer(1, this, [sf.getValue()]); sf.hasSearch = true; sf.triggers[0].show() }, onRefreshFn : function() { this.loadFolder() }, onDeleteTemplateFn : function(){ var me=this; var IdField=Ext.getCmp('Id'); if(IdField&&IdField.value){ Ext.Ajax.request({ url:feyaSoft.home.CONST.spreadSheetUrl.deleteTemplate, method:'POST', params:{ id:IdField.value }, success:function(response,options){ var rec=Ext.decode(response.responseText); if(rec.success){ Ext.Msg.alert('提示','删除成功!',me.onRefreshFn()); } }, failure:function(rsponse,options){ } }); } }, loadFolder : function(queryVal) { var store = this.list.getStore(); store.baseParams = { folderId : this.currentFolderId || 0, query : queryVal || "", exname : this.exname }; if (this.isTemplate) { Ext.apply(store.baseParams, { isTemplate : true }) } else { delete store.baseParams.isTemplate } store.load({ params : { start : 0, limit : this.listPageSize } }) }, onChangeDirectoryFn : function(directSelector, node, folderId) { this.currentFolderId = folderId }, showIcon : function(val, metaData, record, rowIndex, colIndex, store) { var result = ''; if (val == "myFolder") { result = '' } else { if (val == "myDoc") { result = '' } else { if (val == "myXls") { result = '' } else { if (val == "attach") { result = '' } else { if (val == "myPpt") { result = '' } else { if (val == "myNote") { result = '' } else { if (val == "myPMgr") { result = '' } else { if (val == "myFlow") { result = '' } } } } } } } } if (record.data.fileShield == "yes") { result = result + '' } return result }, showSharing : function(val) { if (val == undefined) { val = "me" } if (val.indexOf("MYSELF_REPLACE") == 0) { val = val.replace(/MYSELF_REPLACE/, 'me'); val = val + "" } else { if (val.indexOf("MYSELF_REPLACE") > 0) { val = val.replace(/MYSELF_REPLACE/, "me"); val = val.replace(/,/, ',') + "" } } return val }, generateList : function() { var sm = new Ext.grid.CheckboxSelectionModel({ singleSelect : true, header : "" }); var cm = new Ext.grid.ColumnModel([sm, { id : "et_id", header : "Id", dataIndex : "et_id", hidden : true }, { header : "模板名称", width : 180, dataIndex : "et_name" },{ header:"创建人", width:180, dataIndex:'et_authorname' },{ header:"创建时间", width:200, dataIndex:'et_createdate' }]); cm.defaultSortable = true; var store = new Ext.data.JsonStore({ url : feyaSoft.home.CONST.documentUrl.listFiles, remoteSort : true, fields: [] }); var grid = new Ext.grid.GridPanel({ region : "center", width : 500, sm : sm, store: store, cm: cm, columnLines:true, viewConfig : { forceFit : true }, loadMask : { msg : feyaSoft.lang.common.loadingData }, plugins : [new Ext.ux.GridKeyNav()] }); sm.on("rowselect", this.onRowSelectFn, this); grid.on("rowdblclick", this.onRowDblclickFn, this); return grid }, onRowSelectFn : Ext.emptyFn, onRowDblclickFn : function(grid, rowIndex, e) { var rd = grid.getStore().getAt(rowIndex); var exname = rd.data.et_name; Ext.getCmp('File Name').setValue(exname); if ("File Folder" == exname || "myFolder" == exname) { this.loadFolder(rd.data.id); this.directSelector.setValue(this.directSelector.getValue() + "/" + rd.data.name) } else { this.onApplyFn() } }, generateSouthPanel : function() { Ext.form.Field.prototype.msgTarget = "qtip"; this.nameField = new Ext.form.TextField({ fieldLabel : feyaSoft.lang.file.fileName, id:'File Name', anchor : "100%", allowBlank : false, msgTarget : "qtip" }); /**添加影藏的值*/ this.IdField = new Ext.form.TextField({ fieldLabel : "Id", name:'Id', id:'Id', anchor : "100%", hidden:true, }); this.applyBtn = new Ext.Button({ text : this.applyText || feyaSoft.lang.common.open, minWidth : 70, disabled : this.applyDisabled, handler : this.onApplyFn, scope : this }); this.typeCombo = new Ext.form.ComboBox({ fieldLabel : feyaSoft.lang.common.fileType, anchor : "100%", editable : false, typeAhead : true, mode : "local", store : Ext.ux.dialog.getFileTypeStore(), valueField : "id", displayField : "text", value : "all", disabled : true, triggerAction : "all", selectOnFocus : true, allowBlank : false, msgTarget : "qtip" }); this.cancelBtn = new Ext.Button({ text : feyaSoft.lang.common.cancel, minWidth : 70, handler : this.onCancelFn, scope : this }); var spanel = new Ext.Panel({ region : "south", border : false, height : 60, bodyStyle : "background:transparent;padding:5px 5px 5px 10px;", items : [{ border : false, layout : "column", bodyStyle : "background:transparent;", items : [{ border : false, columnWidth : 0.8, layout : "form", labelWidth : 75, bodyStyle : "background:transparent;", items : [this.nameField,this.IdField] }, { border : false, columnWidth : 0.2, bodyStyle : "background:transparent;padding:0px 0px 0px 10px;", layout : "form", items : [this.applyBtn] }] }, { border : false, layout : "column", bodyStyle : "background:transparent;", items : [{ border : false, columnWidth : 0.8, layout : "form", labelWidth : 75, bodyStyle : "background:transparent;", items : [this.typeCombo] }, { border : false, columnWidth : 0.2, bodyStyle : "background:transparent;padding:0px 0px 0px 10px;", layout : "form", items : [this.cancelBtn] }] }] }); return spanel }, onApplyFn : Ext.emptyFn, onUpFn : function() { }, onCancelFn : function() { this.hide() }, onResetSm : function() { this.nameField.reset(); this.list.getStore().reload() } }); Ext.ux.dialog.OpenDialog = new Ext.ux.dialog.FileDialog({ title : feyaSoft.lang.common.open, applyDisabled : true, popup : function(cb, scope, ename, isTemplate) { this.callback = cb.createDelegate(scope || this); this.typeCombo.setValue(ename); this.exname = ename; if (isTemplate) { this.setTitle("From Template"); this.isTemplate = isTemplate } else { this.setTitle(feyaSoft.lang.common.open); delete this.isTemplate } this.directSelector.setValue("/ROOT"); this.show() }, onRowSelectFn : function(sm, rowIndex, r) { var exname = r.data.exname; if ("File Folder" == exname || "myFolder" == exname) { this.applyBtn.disable() } else { this.nameField.setValue(r.data.et_name); this.IdField.setValue(r.data.et_id); Ext.getCmp('Id').setValue(r.data.et_id); this.applyBtn.enable() } }, onApplyFn : function() { var sm = this.list.getSelectionModel(); var srd = sm.getSelected(); var fileId = srd.data.id; this.callback.defer(1, this, [fileId, srd.data, this.isTemplate]); sm.clearSelections(); this.nameField.reset(); this.hide() } }); Ext.ux.dialog.SaveDialog = new Ext.ux.dialog.FileDialog({ title : feyaSoft.lang.common.saveAs, applyText : "Save", popup : function(cb, scope, ename, isTemplate) { this.callback = cb.createDelegate(scope || this); //this.typeCombo.setValue(ename); this.exname = ename; if (isTemplate) { this.setTitle(feyaSoft.lang.common.saveAs + " Template"); this.isTemplate = isTemplate } else { delete this.isTemplate; this.setTitle(feyaSoft.lang.common.saveAs) } //this.directSelector.setValue("/ROOT"); this.show() }, onRowSelectFn : function(sm, rowIndex, r) { var exname = r.data.exname; if ("File Folder" != exname && "myFolder" != exname) { this.nameField.setValue(r.data.et_name); this.applyBtn.enable() } }, onApplyFn : function() { if (this.nameField.isValid()) { var sm = this.list.getSelectionModel(); var name = this.nameField.getValue(); var st = this.list.getStore(); var fileId; for (var i = 0; i < st.getCount(); i++) { var r = st.getAt(i); if (r.get("name") == name) { fileId = r.get("id") } } var folderId = this.list.getStore().lastOptions.params.folderId; if (fileId) { Ext.Msg.show({ title : feyaSoft.lang.common.hint, msg : "[" + name + "] " + feyaSoft.lang.common.existNreplace, buttons : Ext.Msg.YESNO, fn : function(bid, text) { if ("yes" == bid) { this.callback.defer(1, this, [ folderId, name, fileId]); this.nameField.reset(); sm.clearSelections(); this.hide() } else { return } }, scope : this }) } else { this.callback.defer(1, this, [folderId, name]); this.nameField.reset(); sm.clearSelections(); this.hide() } } } }); Ext.ns("Ext.ux.dialog"); Ext.ux.dialog.ConflictDialog = Ext.extend(Ext.Window, { title : "Conflict", width : 360, height : 240, modal : true, closiable : true, bodyStyle : "padding:10px;", resizable : false, constrain : true, constrainHeader : true, minimizable : false, maximizable : false, stateful : false, plain : true, initComponent : function() { var username = this.conflict.username; this.cls = "x-window-dlg"; this.defaults = { style : "margin:5px;" }; var html = [ '
', '
', "There is another user [ " + username + " ] updated this file during your editing.

Please choose one of the actions below : ", "
"].join(""); this.items = [{ xtype : "label", style : "line-height:16px;", html : html }, { xtype : "container", layout : { type : "hbox", align : "stretchmax" }, items : [{ xtype : "button", scale : "large", text : feyaSoft.lang.conflict.overwrite, minWidth : 100, handler : this.onOverwrite, scope : this }, { xtype : "box", cls : "x-view-emtpytext", style : "padding:5px;margin:0;text-align:center;color:red;border-style:dashed;", margins : "0 0 0 5", flex : 1, html : feyaSoft.lang.conflict.overwrite_tip }] }, { xtype : "container", layout : { type : "hbox", align : "stretchmax" }, items : [{ xtype : "button", scale : "large", text : feyaSoft.lang.conflict.acceptChange, minWidth : 100, handler : this.onAcceptChange, scope : this }, { xtype : "box", cls : "x-view-emtpytext", style : "padding:5px;margin:0;text-align:center;color:red;border-style:dashed;", margins : "0 0 0 5", flex : 1, html : feyaSoft.lang.conflict.acceptChange_tip }] }, { xtype : "container", layout : { type : "hbox", align : "stretchmax" }, items : [{ xtype : "button", scale : "large", text : feyaSoft.lang.conflict.saveAs, minWidth : 100, handler : this.onSaveAs, scope : this }, { xtype : "box", cls : "x-view-emtpytext", style : "padding:5px;margin:0;text-align:center;color:blue;border-style:dashed;", margins : "0 0 0 5", flex : 1, html : feyaSoft.lang.conflict.saveAs_tip }] }]; Ext.ux.dialog.ConflictDialog.superclass.initComponent.call(this) }, onSaveAs : function() { if (this.saveAsCallback) { this.saveAsCallback.call(this.scope) } this.close() }, onOverwrite : function() { if (this.overwriteCallback) { this.overwriteCallback.call(this.scope) } this.close() }, onAcceptChange : function() { if (this.acceptChangeCallback) { this.acceptChangeCallback.call(this.scope) } this.close() } }); Ext.ns("Ext.ux.dialog"); Ext.ux.dialog.LookupWin = function(config) { var lan_common = feyaSoft.lang.common; this.searchpanel = new Ext.ux.dialog.SearchPanel(Ext.apply({ title : lan_common.find }, config)); this.replacepanel = new Ext.ux.dialog.SearchPanel(Ext.apply({ title : lan_common.replace, replaceFlag : true }, config)); this.tabpanel = new Ext.TabPanel({ border : false, activeTab : 0, deferredRender : false, resizeTabs : true, tabWidth : 100, minTabWidth : 0, layoutOnTabChange : true, hideMode : "offsets", items : [this.searchpanel, this.replacepanel] }); Ext.ux.dialog.LookupWin.superclass.constructor.call(this, { title : "Find and Replace", width : 400, height : 240, closeAction : "hide", layout : "fit", items : [this.tabpanel] }) }; Ext.extend(Ext.ux.dialog.LookupWin, Ext.Window, { manager : { register : Ext.emptyFn, unregister : Ext.emptyFn, bringToFront : Ext.emptyFn, sendToBack : Ext.emptyFn }, popup : function(config) { this.show() } }); Ext.ux.dialog.SearchPanel = function(config) { Ext.apply(this, config); var lan_common = feyaSoft.lang.common; this.findCombo = new Ext.form.ComboBox({ fieldLabel : lan_common.find_what, store : new Ext.data.SimpleStore({ fields : ["text"], data : [] }), displayField : "text", valueField : "text", typeAhead : true, mode : "local", triggerAction : "all", selectOnFocus : true, anchor : "95%", minChars : 1, allowBlank : false }); if (this.replaceFlag) { this.replaceCombo = new Ext.form.ComboBox({ fieldLabel : lan_common.replace_with, store : new Ext.data.SimpleStore({ fields : ["text"], data : [] }), displayField : "text", valueField : "text", typeAhead : true, mode : "local", triggerAction : "all", selectOnFocus : true, anchor : "95%", minChars : 1, allowBlank : false }); this.replaceBtn = new Ext.Button({ minWidth : 80, text : lan_common.replace, handler : this.onReplaceAllFn, scope : this }); this.replaceAllBtn = new Ext.Button({ minWidth : 80, text : lan_common.replace_all, handler : this.onReplaceAllFn, scope : this }) } this.upRadio = new Ext.form.Radio({ boxLabel : lan_common.up, name : "direction" }); this.downRadio = new Ext.form.Radio({ boxLabel : lan_common.down, checked : true, name : "direction" }); this.caseCB = new Ext.form.Checkbox({ boxLabel : lan_common.match_case }); this.findNextBtn = new Ext.Button({ minWidth : 80, text : lan_common.find_next, handler : this.onFindNextFn, scope : this }); this.closeBtn = new Ext.Button({ minWidth : 80, text : lan_common.close, handler : this.onCloseFn, scope : this }); var items = [this.findCombo]; var buttons = [this.findNextBtn]; if (this.replaceFlag) { items.push(this.replaceCombo); buttons.push(this.replaceBtn); buttons.push(this.replaceAllBtn) } buttons.push(this.closeBtn); items.push({ xtype : "radiogroup", fieldLabel : feyaSoft.lang.common.direction, items : [this.upRadio, this.downRadio] }); items.push(this.caseCB); this.formpanel = new Ext.form.FormPanel({ border : false, labelWidth : 100, hideMode : "offsets", style : "padding:10px", items : items, buttonAlign : "center", buttons : buttons }); this.sbar = new Ext.ux.StatusBar({ defaultText : "Ready", defaultIconCls : "x-status-valid", plugins : new Ext.ux.ValidationStatus({ showText : "Please input a target to find", validText : "Please click to find target!", form : this.formpanel.getId() }) }); Ext.ux.dialog.SearchPanel.superclass.constructor.call(this, { border : false, layout : "border", items : [{ border : false, region : "center", layout : "fit", items : [this.formpanel] }], bbar : this.sbar }) }; Ext.extend(Ext.ux.dialog.SearchPanel, Ext.Panel, { onReplaceAllFn : function() { if (this.formpanel.form.isValid()) { var target = this.findCombo.getValue(); var replace = this.replaceCombo.getValue(); var ret = this.replaceText(target, replace, { direction : this.upRadio.getValue(), matchcase : this.caseCB.getValue(), all : true }); var lan_common = feyaSoft.lang.common; if (ret) { this.sbar.setStatus({ iconCls : "x-status-valid", text : lan_common.all_replaced }) } else { this.sbar.setStatus({ iconCls : "x-status-error", text : lan_common.no_found }) } } }, onReplaceFn : function() { if (this.formpanel.form.isValid()) { var target = this.findCombo.getValue(); var replace = this.replaceCombo.getValue(); var ret = this.replaceText(target, replace, { direction : this.upRadio.getValue(), matchcase : this.caseCB.getValue() }); var lan_common = feyaSoft.lang.common; if (ret) { this.sbar.setStatus({ iconCls : "x-status-valid", text : lan_common.replaced }) } else { this.sbar.setStatus({ iconCls : "x-status-error", text : lan_common.no_found }) } } }, onFindNextFn : function() { if (this.formpanel.form.isValid()) { var target = this.findCombo.getValue(); var ret = this.findText(target, { direction : this.upRadio.getValue(), matchcase : this.caseCB.getValue() }); var lan_common = feyaSoft.lang.common; if (ret) { this.sbar.setStatus({ iconCls : "x-status-valid", text : lan_common.found }) } else { this.sbar.setStatus({ iconCls : "x-status-error", text : lan_common.no_found }) } } }, onCloseFn : function() { this.ownerCt.ownerCt.hide() } }); Ext.ns("Ext.ux.dialog"); Ext.ux.dialog.PublicLinkWin = function(config) { Ext.apply(this, config); this.fileId = new Ext.form.Hidden({ name : "fileId", hideLabel : true }); this.sender = new Ext.form.Hidden({ name : "sender", hideLabel : true }); this.linkField = new Ext.form.TextArea({ hideLabel : true, labelSeparator : "", allowBlank : false, anchor : "100%", readOnly : true, height : 50 }); this.fileStatusText = new Ext.form.DisplayField({ name : "statusText", hideLabel : true }); this.emailText = new Ext.form.DisplayField({ name : "emailText", value : feyaSoft.lang.common.enterEmailForNotif, hideLabel : true }); this.email = new Ext.form.TextField({ name : "email", width : 655, emptyText : feyaSoft.lang.profile.emailDesc, vtype : "email" }); this.emailBtn = new Ext.Button({ text : feyaSoft.lang.common.send, iconCls : "email", handler : this.emailNotify, disabled : true, scope : this }); this.emailCompositeField = new Ext.form.CompositeField({ hideLabel : true, labelSeparator : "", anchor : "100%", items : [this.email, this.emailBtn] }); this.goOnlineBtn = new Ext.Button({ text : feyaSoft.lang.common.publicFile, handler : this.goOnOfflineFn, disabled : true, scope : this }); this.goOfflineBtn = new Ext.Button({ text : feyaSoft.lang.common.keepPrivate, handler : this.goOnOfflineFn, disabled : true, scope : this }); this.previewBtn = new Ext.Button({ text : feyaSoft.lang.common.preview, minWidth : 75, handler : this.onPreviewFn, scope : this }); Ext.ux.dialog.PublicLinkWin.superclass.constructor.call(this, { title : feyaSoft.lang.common.getLinkToShare, width : 750, height : 230, closeAction : "hide", modal : true, items : [{ border : false, layout : "form", style : "padding:10px;", bodyStyle : "background:transparent;", items : [this.fileId, this.sender, this.fileStatusText, this.linkField, { border : false, bodyStyle : "padding: 5px 0 5px 0; background:transparent;", html : "
" }, this.emailText, this.emailCompositeField] }], buttons : [this.goOfflineBtn, this.goOnlineBtn, this.previewBtn] }) }; Ext.extend(Ext.ux.dialog.PublicLinkWin, Ext.Window, { onPreviewFn : function() { window.open(this.linkField.getValue()); this.hide() }, popup : function(config) { this.linkField.setValue(config.link); this.fileId.setValue(config.id); this.sender.setValue(config.sender); var statusText = "" + feyaSoft.lang.common.privateView + ""; if (config.isPublic) { statusText = "" + feyaSoft.lang.common.allowPublicView + "" } this.linkField.setDisabled(!config.isPublic); this.fileStatusText.setValue(statusText); this.emailCompositeField.setDisabled(!config.isPublic); this.enableButtons(config.isPublic); this.show() }, enableButtons : function(status) { if (status) { this.goOfflineBtn.enable(); this.goOnlineBtn.disable(); this.emailBtn.enable(); this.previewBtn.enable() } else { this.goOnlineBtn.enable(); this.goOfflineBtn.disable(); this.previewBtn.disable(); this.emailBtn.disable() } }, goOnOfflineFn : function() { Ext.Ajax.request({ url : "documentFile/onOffPublicFile", method : "POST", params : { id : this.fileId.getValue() }, success : function(result, request) { var jsonData = Ext.util.JSON .decode(result.responseText); if (jsonData.success == "true") { var isOnline = false; var statusText = "" + feyaSoft.lang.common.privateView + ""; if (jsonData.isPublic) { isOnline = true; statusText = "" + feyaSoft.lang.common.allowPublicView + "" } this.linkField.setDisabled(!isOnline); this.fileStatusText.setValue(statusText); this.emailCompositeField .setDisabled(!isOnline); this.enableButtons(isOnline) } }, failure : function(result, request) { Ext.MessageBox.alert( feyaSoft.lang.common.failed, "Internal Error, please try again") }, scope : this }) }, emailNotify : function() { var email = this.email.getValue(); var fileId = this.fileId.getValue(); var sender = this.sender.getValue(); if (email) { Ext.Ajax.request({ url : "documentFile/emailPublicFile", method : "POST", params : { id : fileId, email : email, sender : sender }, success : function(result, request) { var jsonData = Ext.util.JSON .decode(result.responseText); if (jsonData.success == "true") { Ext.Message.msgStay("Success", "Notification sent", 2000); this.email.reset(); this.fileId.setValue(null) } }, failure : function(result, request) { Ext.MessageBox.alert( feyaSoft.lang.common.failed, "Internal Error, please try again") }, scope : this }) } else { Ext.MessageBox.alert(feyaSoft.lang.common.failed, "Please check email address") } } }); Ext.ns("feyaSoft.home.program.documentFile"); FPROXY = feyaSoft.home.program.documentFile.Proxy = (function() { return { open : function() { }, save : function(exname, config) { var fn = function(folderId, name, fileId) { if (config.beforeSaveFn) { config.beforeSaveFn.call(config.scope, folderId, name, fileId, config); } Ext.Ajax.request({ url : config.url, params : config.params, success : function(response, options) { var jsonData = Ext.decode(response.responseText); if (jsonData.conflict) { var username = jsonData.conflict.username; (new Ext.ux.dialog.ConflictDialog({ conflict : jsonData.conflict, saveAsCallback : function() { if (config.saveAsCallback) { config.saveAsCallback .call(config.scope); } }, overwriteCallback : function() { config.params.conflict = "overwrite"; this.save(exname, config); }, acceptChangeCallback : function() { FPROXY.load({ fileId : config.params.id, successFn : config.acceptChangeCallback, scope : config.scope }); }, scope : this })).show(); } if (config.successFn) { config.successFn.call(config.scope, jsonData); } }, failure : function(response, options) { if (config.failureFn) { config.failureFn.call(config.scope, response); } }, scope : this }); }; if (config.saveAsFlag) { Ext.ux.dialog.SaveDialog.popup(fn, this, exname); } else { fn.call(this); } }, load : function(config) { Ext.Ajax.request({ url : feyaSoft.home.CONST.documentUrl.loadFile, params : { id : config.fileId }, success : function(response, options) { if (config.successFn) { config.successFn.call(config.scope, response); } }, failure : function(response, options) { if (config.failureFn) { config.failureFn.call(config.scope, response); } }, scope : this }); }, lock : function(config) { Ext.Ajax.request({ url : feyaSoft.home.CONST.documentUrl.lockFile, params : config.params, success : function(response, options) { var jsonData = Ext.util.JSON .decode(response.responseText); if (jsonData.success == "true") { if (config.successFn) { config.successFn.call(config.scope, response); } } else { if (jsonData.success == "relogin") { new feyaSoft.home.Login; } else { Ext.MessageBox.alert( feyaSoft.lang.common.error, jsonData.info); } } }, failure : function(response, options) { if (config.failureFn) { config.failureFn.call(config.scope, response); } }, scope : this }); }, unlock : function(config) { Ext.Ajax.request({ url : feyaSoft.home.CONST.documentUrl.unlockFile, params : config.params, success : function(response, options) { var jsonData = Ext.util.JSON .decode(response.responseText); if (jsonData.success == "true") { if (config.successFn) { config.successFn.call(config.scope, response); } } else { if (jsonData.success == "relogin") { new feyaSoft.home.Login; } else { Ext.MessageBox.alert( feyaSoft.lang.common.error, jsonData.info); } } }, failure : function(response, options) { if (config.failureFn) { config.failureFn.call(config.scope, response); } }, scope : this }); }, isLockedForMe : function(file) { if (file && file.id) { if (file.lockedBy && !file.isLockedBySelf) { return true; } } return false; }, isLocked : function(file) { if (file && file.id) { if (file.lockedBy) { return true; } } return false; }, checkLockStatus : function(fileId, callback, scope) { Ext.Ajax.request({ url : feyaSoft.home.CONST.documentUrl.checkLockStatus, params : { id : fileId }, success : function(response, options) { var jsonData = Ext.util.JSON .decode(response.responseText); if (jsonData.success == "true") { if (callback) { callback.call(scope, this.isLockedForMe(jsonData.data), jsonData.data); } } else { if (jsonData.success == "relogin") { new feyaSoft.home.Login; } else { Ext.MessageBox.alert( feyaSoft.lang.common.error, jsonData.info); } if (callback) { callback.call(scope, null, null); } } }, failure : function(response, options) { if (config && config.failureFn) { config.failureFn.call(config.scope, response); } }, scope : this }); }, isEditable : function(file) { if (file) { if (file.isOwner == null) { return true; } else { return file.isOwner || 2 <= file.permission; } } return true; }, canChangeLockStatus : function(file) { if (file) { if (file.lockedBy) { return file.isOwner || file.isLockedBySelf; } else { return FPROXY.isEditable(); } } else { return true; } }, prepareTitle : function(title, file) { var lanLock = feyaSoft.lang.lock; if (file && file.id) { title = title || file.name; var readOnlyView = !FPROXY.isEditable(file); if (!readOnlyView) { if (file.lockedBy) { if (!file.isLockedBySelf) { title = title + "Notice : " + lanLock.lockedBy + " [ " + file.lockedBy + " ], " + lanLock.notChange + ""; } else { title = title + "" + lanLock.lockedByMe + ""; } } } else { title = title + "" + lanLock.canViewOnly + ""; } } return title; } }; })(); Ext.ns("feyaSoft.home.program.photo"); feyaSoft.home.program.photo.ImageDetailPanel = function(config) { this.config = config || {}; Ext.apply(this, config); this.eastPanel = new feyaSoft.home.program.photo.ImageView(); this.centerPanel = new feyaSoft.home.program.photo.ImageListPanel(config); if (config && config.eastPanelShow && config.eastPanelShow == "not") { feyaSoft.home.program.photo.ImageDetailPanel.superclass.constructor .call(this, { region : "center", style : "padding:5px 5px 5px 0px;", border : false, layout : "border", items : [this.centerPanel] }) } else { feyaSoft.home.program.photo.ImageDetailPanel.superclass.constructor .call(this, { region : "center", style : "padding:5px 5px 5px 0px;", border : false, layout : "border", items : [this.eastPanel, this.centerPanel] }) } }; Ext.extend(feyaSoft.home.program.photo.ImageDetailPanel, Ext.Panel, { doSelectImage : function() { if (this.centerPanel.getSelectedImage) { var selNode = this.centerPanel.getSelectedImage(); this.config.whoPopMe.doAssignImage(selNode.id); this.ownerCt.close() } } }); feyaSoft.home.program.photo.ImageListPanel = function(config) { config = config || {}; Ext.apply(this, config); this.dataStore = new Ext.data.JsonStore({ root : "results", totalProperty : "totalCount", fields : [{ name : "imagepath" }, { name : "name" }, { name : "description" }, { name : "create_date" }, { name : "size" }, { name : "id" }], proxy : new Ext.data.HttpProxy({ url : feyaSoft.home.CONST.photoUrl.listPhoto }) }); var tpl = new Ext.XTemplate( '', '
', '
', "{shortName}", "
", "
", '
'); this.uploadButton = new Ext.Button({ text : feyaSoft.lang.common.upload, tooltip : "Upload a new image", iconCls : "addItem", handler : function() { var node = Ext.getCmp("image-win-west-folder-panel").fileTree.selModel.selNode; if (node == null) { Ext.MessageBox.alert(feyaSoft.lang.common.failed, "Please select one of folders to process.") } else { new feyaSoft.home.program.photo.CreateEditImage({ myOwner : this }) } }, scope : this }); this.deleteButton = new Ext.Button({ text : feyaSoft.lang.common["delete"], tooltip : "Delete the selected image", iconCls : "delete", handler : function() { var selNode = this.view.getSelectedNodes()[0]; if (selNode) { this.deleteImage(selNode) } else { Ext.MessageBox.alert(feyaSoft.lang.common.failed, feyaSoft.lang.common.pleaseSelectOne) } }, scope : this }); this.menubar = [this.uploadButton, { text : feyaSoft.lang.common.download, tooltip : "Download the selected image", iconCls : "download", handler : function() { var selNode = this.view.getSelectedNodes()[0]; if (selNode) { this.downloadImage(selNode) } else { Ext.MessageBox.alert(feyaSoft.lang.common.failed, feyaSoft.lang.common.pleaseSelectOne) } }, scope : this }, "-", this.deleteButton]; this.view = new Ext.DataView({ store : this.dataStore, tpl : tpl, autoHeight : true, singleSelect : true, overClass : "x-view-over-thumb", itemSelector : "div.thumb-wrap", emptyText : '
' + feyaSoft.lang.photo.notImage + "
", prepareData : function(data) { data.shortName = Ext.util.Format.ellipsis(data.name, 20); return data } }); feyaSoft.home.program.photo.ImageListPanel.superclass.constructor.call( this, { id : "image-win-list-images-panel", region : "center", border : true, layout : "fit", tbar : this.menubar, bbar : ["->", "-", feyaSoft.lang.common.search, "", new Ext.ux.form.SearchField({ autoShow : true, store : this.dataStore }), "-"], autoScroll : true, cls : "feyasoft-myPhoto-view", items : [this.view] }); this.view.on("dblclick", this.onViewImageClickFn, this); this.view.on("afterrender", this.onAfterrenderFn, this) }; Ext.extend(feyaSoft.home.program.photo.ImageListPanel, Ext.Panel, { onAfterrenderFn : function() { new Ext.dd.DragZone(this.view.getEl(), { scroll : false, ddGroup : "folderTreeDD", parentCom : this, getDragData : function(e) { return this.parentCom.getDragData(e) }, getRepairXY : function(e, data) { this.parentCom.getRepairXY(this) } }) }, getDragData : function(e) { var target = e.getTarget(".x-view-over-thumb"); if (target) { var view = this.view; if (!view.isSelected(target)) { view.onClick(e) } var selNodes = view.getSelectedNodes(); if (selNodes.length > 0) { var dragData = { selectelements : selNodes, selections : view.getSelectedRecords() }; var divtmp = document.createElement("div"); divtmp.appendChild(selNodes[0].firstChild .cloneNode(true)); dragData.ddel = divtmp; dragData.single = true; return dragData } else { return false } } return false }, getRepairXY : function(dragzone) { if (!dragzone.dragData.multi) { var xy = Ext.Element.fly(dragzone.dragData.ddel).getXY(); xy[0] += 3; xy[1] += 3; return xy } return false }, getSelectedImage : function() { var selNode = this.view.getSelectedNodes()[0]; return selNode }, reload : function() { this.dataStore.reload() }, loadImages : function(folderId) { this.folderid = folderId; this.dataStore.baseParams = { folderId : folderId }; this.dataStore.load(); this.uploadButton.setDisabled(false); this.deleteButton.setDisabled(false) }, onImageEditor : function() { var selNode = this.view.getSelectedNodes()[0]; var selIdx = this.view.getSelectedIndexes()[0]; if (selNode) { var newWindow = window.open( feyaSoft.home.CONST.photoUrl.myPhotoShow + "?folderId=" + this.folderid + "&index=" + selIdx, "_blank"); newWindow.focus() } else { Ext.MessageBox.alert(feyaSoft.lang.common.failed, feyaSoft.lang.common.pleaseSelectOne) } }, onViewImageClickFn : function(dv, index, node, e) { var rd = dv.store.getAt(index); var owner = this.ownerCt.ownerCt.ownerCt; if (owner) { try { if (typeof(owner.selectImage) == "function") { owner.selectImage("imgAttach?id=" + rd.data.id) } else { Ext.getCmp("image-win-view-detail-image-panel") .showDetailView(rd.data) } } catch (e) { Ext.getCmp("image-win-view-detail-image-panel") .showDetailView(rd.data) } } else { Ext.getCmp("image-win-view-detail-image-panel") .showDetailView(rd.data) } }, deleteImage : function(selNode) { Ext.Msg.show({ title : feyaSoft.lang.common.confirmDelete, msg : feyaSoft.lang.common.confirmDeleteDesc, icon : Ext.Msg.QUESTION, buttons : Ext.Msg.YESNO, fn : this.onDeleteConfirm, scope : this, record : selNode }) }, onDeleteConfirm : function(button_id, text, options) { if (button_id == "yes") { Ext.Ajax.request({ url : feyaSoft.home.CONST.photoUrl.deletePhoto, method : "POST", params : { id : options.record.id }, success : function(result, request) { var jsonData = Ext.util.JSON .decode(result.responseText); if (jsonData.success == "true") { this.dataStore.load() } else { Ext.MessageBox.alert( feyaSoft.lang.common.failed, jsonData.info) } }, failure : function(result, request) { Ext.MessageBox.alert( feyaSoft.lang.common.failed, feyaSoft.lang.common.errorInternal) }, scope : this }) } }, downloadImage : function(selNode) { var url = "imgAttach?id=" + selNode.id; window.open(url, "Download") } }); feyaSoft.home.program.photo.ImageView = function() { this.detailsTemplate = new Ext.XTemplate( '
', '', '
', "" + feyaSoft.lang.common.image + ":", "{name}", "" + feyaSoft.lang.common.size + ":", "{size} KB", "" + feyaSoft.lang.common.dateModified + ":", "{createDate}", "" + feyaSoft.lang.common.description + ":", "{description}
", "
", "
"); this.detailsTemplate.compile(); feyaSoft.home.program.photo.ImageView.superclass.constructor.call(this, { id : "image-win-view-detail-image-panel", layout : "fit", region : "east", autoScroll : true, split : true, width : 525, html : "" }) }; Ext.extend(feyaSoft.home.program.photo.ImageView, Ext.Panel, { showDetailView : function(data) { this.detailsTemplate.overwrite(this.body, data) }, reload : function() { this.fileTree.root.reload({ delay : 750 }) } }); feyaSoft.home.program.photo.CreateEditFolder = function(config) { Ext.QuickTips.init(); Ext.form.Field.prototype.msgTarget = "side"; this.myOwner = config.myOwner; this.config = config; this.name = new Ext.form.TextField({ fieldLabel : feyaSoft.lang.common.name, allowBlank : false, name : "name", anchor : "95%" }); this.formPanel = new Ext.form.FormPanel({ id : "formPanel", baseCls : "x-plain", labelWidth : 100, url : feyaSoft.home.CONST.photoUrl.createUpdateFolder, defaultType : "textfield", items : [this.name] }); var title = feyaSoft.lang.common.addFolder; if (config.node) { title = feyaSoft.lang.common.editFolder } feyaSoft.home.program.photo.CreateEditFolder.superclass.constructor.call( this, { title : title, width : 550, height : 120, minWidth : 400, minHeight : 100, layout : "fit", bodyStyle : "padding:10px;", buttonAlign : "center", shim : false, animCollapse : false, constrainHeader : true, modal : true, items : this.formPanel, resizable : false, keys : { key : [13], fn : function() { this.saveClose() }, scope : this }, buttons : [{ text : feyaSoft.lang.common.cancel, handler : function() { this.close() }, scope : this }, { text : feyaSoft.lang.common.saveClose, handler : function() { this.saveClose() }, scope : this }] }); this.on("afterlayout", function() { if (config.node) { this.name.setValue(config.node.text) } }, this, { single : true }); this.show() }; Ext.extend(feyaSoft.home.program.photo.CreateEditFolder, Ext.Window, { saveClose : function() { if (this.formPanel.form.isValid()) { var params = {}; if (this.config.parentId) { params = { parentId : this.config.parentId } } else { if (this.config.node) { params = { id : this.config.node.id } } } this.formPanel.form.submit({ waitMsg : "In processing", params : params, failure : function(form, action) { Ext.MessageBox.alert( feyaSoft.lang.common.error, action.result.errorInfo) }, success : function(form, action) { if (action.result.success == "true") { if (this.config.parentId) { var newNode = new Ext.tree.AsyncTreeNode( { id : action.result.id, text : this.name .getValue(), expandable : true, cls : "folder", iconCls : "folder_file", parentId : this.config.parentId }); this.myOwner.appendChild( this.config.parentId, newNode) } else { if (this.config.node) { this.config.node .setText(this.name .getValue()) } } this.close() } else { Ext.MessageBox.alert( feyaSoft.lang.common.error, action.result.info) } }, scope : this }) } else { Ext.MessageBox.alert(feyaSoft.lang.common.error, "Please fix the errors noted.") } } }); Ext.ns("feyaSoft.home.program.photo"); feyaSoft.home.program.photo.CreateEditImage = function(config) { Ext.QuickTips.init(); Ext.form.Field.prototype.msgTarget = "side"; this.myOwner = config.myOwner; this.name = new Ext.form.TextField({ fieldLabel : feyaSoft.lang.photo.changeNewName, allowBlank : true, name : "name", anchor : "95%" }); this.imagepath = new Ext.form.FileUploadField({ allowBlank : false, emptyText : feyaSoft.lang.common.selectImage, fieldLabel : feyaSoft.lang.common.photo, name : "imagepath", anchor : "95%", buttonText : "", buttonCfg : { iconCls : "upload-icon" } }); this.note = new Ext.form.TextArea({ fieldLabel : feyaSoft.lang.common.description, name : "description", height : 100, anchor : "95%" }); var formPanel = new Ext.form.FormPanel({ id : "formPanel", fileUpload : true, baseCls : "x-plain", labelWidth : 80, url : feyaSoft.home.CONST.photoUrl.createUpdatePhoto, defaultType : "textfield", items : [this.imagepath, this.note] }); feyaSoft.home.program.photo.CreateEditImage.superclass.constructor.call( this, { title : feyaSoft.lang.common.upload, width : 550, height : 220, minWidth : 400, minHeight : 100, layout : "fit", bodyStyle : "padding:10px;", buttonAlign : "center", shim : false, animCollapse : false, constrainHeader : true, modal : true, items : formPanel, resizable : false, buttons : [{ text : feyaSoft.lang.common.close, handler : function() { this.close() }, scope : this }, { text : feyaSoft.lang.common.saveClose, handler : function() { var node = Ext .getCmp("image-win-west-folder-panel").fileTree.selModel.selNode; if (formPanel.form.isValid()) { var params = { folderId : node.id }; formPanel.form.submit({ waitMsg : "In processing", params : params, failure : function(form, action) { Ext.MessageBox.alert( feyaSoft.lang.common.error, action.result.info) }, success : function(form, action) { var jsonData = action.result; if (jsonData.success == "true") { Ext.Message .msgStay( feyaSoft.lang.common.confirm, jsonData.info, 2000); config.myOwner.reload(); this.close() } else { Ext.MessageBox .alert( feyaSoft.lang.common.error, jsonData.info) } }, scope : this }) } else { Ext.MessageBox .alert( feyaSoft.lang.common.error, feyaSoft.lang.common.pleaseFixError) } }, scope : this }] }); this.on("afterlayout", function() { if (config.node) { this.name.setValue(config.node.text); this.isPublic.setValue(config.node.attributes.description) } }, this, { single : true }); this.show() }; Ext.extend(feyaSoft.home.program.photo.CreateEditImage, Ext.Window, {}); Ext.ns("feyaSoft.home.program.photo"); feyaSoft.home.program.photo.PhotoWin = Ext.extend(Ext.Window, { initComponent : function() { var westPanel = new feyaSoft.home.program.photo.WestPanel(); var imageDetail = new feyaSoft.home.program.photo.ImageDetailPanel(); feyaSoft.home.program.photo.PhotoWin.superclass.initComponent .call(Ext.apply(this, { layout : "border", autoScroll : true, items : [westPanel, imageDetail] })); this.on("show", this._onShowFn, this, { delay : 200, single : true }) }, _onShowFn : function(p) { p.setHeight(p.getSize().height + 1) } }); Ext.ns("feyaSoft.home.program.photo"); feyaSoft.home.program.photo.PrivateFolder = function() { this.menubar = [{ text : feyaSoft.lang.common.add, iconCls : "folder_add", handler : this.createFolder, scope : this }, "->", { tooltip : feyaSoft.lang.common.refresh, iconCls : "refresh", handler : function() { this.reloadTree() }, scope : this }]; this.urlLoader = new Ext.tree.TreeLoader({ dataUrl : feyaSoft.home.CONST.photoUrl.listTree, baseParams : { id : "0" } }); this.fileTree = new Ext.tree.TreePanel({ loader : this.urlLoader, rootVisible : false, lines : false, border : false, autoScroll : true, containerScroll : true, enableDD : true, root : new Ext.tree.AsyncTreeNode({ text : "ROOT", expandable : true, draggable : false, cls : "folder", expanded : true, id : "0" }), ddGroup : "folderTreeDD", listeners : { contextmenu : { fn : this.onContextMenu, scope : this }, click : { fn : this.onClickHandler, scope : this }, nodedragover : { fn : this.onNodedragoverFn, scope : this }, beforenodedrop : { fn : this.onBeforenodedropFn, scope : this } } }); feyaSoft.home.program.photo.PrivateFolder.superclass.constructor.call(this, { id : "image-win-west-folder-panel", region : "center", layout : "fit", tbar : this.menubar, items : [this.fileTree] }); this.fileTree.getLoader().on("load", function() { var root = this.fileTree.getRootNode(); if (root.firstChild) { root.firstChild.select(); var folderId = root.firstChild.id; Ext.getCmp("image-win-list-images-panel") .loadImages(folderId); root.firstChild.expand() } }, this, { single : true }) }; Ext.extend(feyaSoft.home.program.photo.PrivateFolder, Ext.Panel, { onNodedragoverFn : function(dropEvent) { var point = dropEvent.point; var target = dropEvent.target; var dd = dropEvent.source; var dropnode = dropEvent.dropNode; var root = this.fileTree.getRootNode(); var firstFolder = root.firstChild; if (dd.tree) { if (point == "above" && target.attributes.id == firstFolder.attributes.id) { dd.dragging = false; return false } else { if (point == "append" && target.attributes.id == dropnode.attributes.id) { dd.dragging = false; return false } else { dd.dragging = true; return true } } } else { if (point == "append") { return true } else { dd.dragging = false; return false } } }, onBeforenodedropFn : function(dropEvent) { var target = dropEvent.target; var data = dropEvent.data; var point = dropEvent.point; var dropnode = dropEvent.dropNode; var dd = dropEvent.source; if (dd.tree) { var root = target.parentNode; if (point == "above") { var enod = target; root.insertBefore(dropnode, target); this.resetGroupSort(root) } else { if (point == "below") { root.insertBefore(dropnode, target.nextSibling); this.resetGroupSort(root) } else { if (point == "append") { var tid = target.attributes.id; var dpid = dropnode.attributes.parentId; if (tid != dpid) { Ext.Ajax.request({ url : feyaSoft.home.CONST.photoUrl.dragDrop, params : { targetFolderId : tid, dragNodeId : dropnode.attributes.id }, method : "POST", success : function(result, request) { root.removeChild(dropnode); target.appendChild(dropnode); target.ui.expand() }, failure : function(result, request) { dropEvent.cancel = true; Ext.MessageBox .alert( feyaSoft.lang.common.failed, "Internal Error") }, scope : this }) } } } } } else { var rd = (data.selections)[0]; var tid = target.attributes.id; Ext.Ajax.request({ url : feyaSoft.home.CONST.photoUrl.dragDropToTree, params : { folderId : tid, photoId : rd.data.id }, method : "POST", success : function(result, request) { target.select(); this.onClickHandler(target) }, failure : function(result, request) { dropEvent.cancel = true; Ext.MessageBox.alert(feyaSoft.lang.common.failed, "Internal Error") }, scope : this }) } }, resetGroupSort : function(root) { var cs = root.childNodes; var pid = root.attributes.id; var arys = []; for (var i = 0, len = cs.length; i < len; i++) { var node = cs[i]; var fid = node.attributes.id; node.attributes.parentId = pid; arys.push({ id : fid, orderIn : i, parentId : pid }) } Ext.Ajax.request({ url : feyaSoft.home.CONST.photoUrl.resetOrderIn, params : { arys : Ext.encode(arys) }, method : "POST", success : function(response, request) { var backdata = Ext.util.JSON .decode(response.responseText); if (backdata.success == "true") { } }, scope : this }) }, createFolder : function() { var node = this.fileTree.selModel.selNode; var parentId = "0"; if (null != node) { parentId = node.id } new feyaSoft.home.program.photo.CreateEditFolder({ myOwner : this, parentId : parentId }) }, onClickHandler : function(node, obj, options) { Ext.getCmp("image-win-list-images-panel").loadImages(node.id) }, getTree : function() { return this.fileTree }, editFolder : function() { var node = this.fileTree.selModel.selNode; if (node == null) { Ext.MessageBox.alert(feyaSoft.lang.common.failed, feyaSoft.lang.common.pleaseSelectOne) } else { new feyaSoft.home.program.photo.CreateEditFolder({ myOwner : this, node : node }) } }, deleteFolder : function() { var node = this.fileTree.selModel.selNode; if (node == null) { Ext.MessageBox.alert(feyaSoft.lang.common.failed, feyaSoft.lang.common.pleaseSelectOne); return } Ext.Msg.show({ title : feyaSoft.lang.common.confirmDelete, msg : feyaSoft.lang.common.confirmDeleteDesc, icon : Ext.Msg.QUESTION, buttons : Ext.Msg.YESNO, fn : this.onDeleteConfirm, scope : this, node : node }) }, onDeleteConfirm : function(button_id, text, options) { if (button_id == "yes") { Ext.Ajax.request({ url : feyaSoft.home.CONST.photoUrl.deleteFolder, method : "POST", params : { id : options.node.id }, success : function(result, request) { var jsonData = Ext.util.JSON .decode(result.responseText); if (jsonData.success == "true") { var parentNode = options.node.parentNode; parentNode.removeChild(options.node) } else { Ext.MessageBox.alert("Error", jsonData.info) } }, failure : function(result, request) { Ext.MessageBox.alert(feyaSoft.lang.common.failed, "Internal Error, please try again") }, scope : this }) } }, onContextMenu : function(node, e) { node.expand(); if (!this.meun) { this.menu = new Ext.menu.Menu({ items : [{ iconCls : "folder_add", text : feyaSoft.lang.common.addFolder, scope : this, handler : this.createFolder }, { iconCls : "editItem", text : feyaSoft.lang.common.edit, scope : this, handler : this.editFolder }, { iconCls : "delete", text : feyaSoft.lang.common["delete"], scope : this, handler : this.deleteFolder }] }) } node.select(); var addBtn = this.menu.items.get(2); var selNode = this.fileTree.getSelectionModel().getSelectedNode(); var root = this.fileTree.getRootNode(); var cs = root.childNodes; var firstFolder = root.firstChild; if (cs.length == 1 && selNode.attributes.id == firstFolder.attributes.id) { addBtn.setDisabled(true) } else { addBtn.setDisabled(false) } e.stopEvent(); this.menu.showAt(e.getXY()) }, reload : function() { this.fileTree.root.reload({ delay : 750 }); if (this.fileTree.getRootNode().firstChild) { this.fileTree.getRootNode().firstChild.select(); var folderId = this.fileTree.getRootNode().firstChild.id; Ext.getCmp("image-win-list-images-panel").loadImages(folderId); this.fileTree.getRootNode().firstChild.expand() } }, reloadTree : function() { this.fileTree.root.reload({ delay : 750 }) }, reloadTreeFolder : function(folderId) { this.fileTree.root.reload({ delay : 750 }); this.fileTree.getLoader().on("load", function() { if (this.fileTree.getNodeById(folderId) != null) { this.fileTree.getNodeById(folderId).select() } }, this, { single : true }) }, appendChild : function(parentId, newNode) { if (this.fileTree.getNodeById(parentId) != null) { this.fileTree.getNodeById(parentId).appendChild(newNode); this.fileTree.getNodeById(parentId).select() } else { this.reloadTreeFolder(parentId) } }, cleanSelect : function() { this.fileTree.getRootNode().eachChild(function(child) { if (child.isSelected()) { child.unselect(true) } }, this) } }); Ext.ns("feyaSoft.home.program.photo"); feyaSoft.home.program.photo.WestPanel = function(config) { config = config || {}; this.privateFolder = new feyaSoft.home.program.photo.PrivateFolder(); feyaSoft.home.program.photo.WestPanel.superclass.constructor.call(this, { style : "padding:5px 0px 5px 5px;", layout : "border", region : "west", split : true, width : 220, minSize : 150, maxSize : 300, border : false, items : [this.privateFolder] }) }; Ext.extend(feyaSoft.home.program.photo.WestPanel, Ext.Panel, { clearPrivateSelect : function() { this.privateFolder.cleanSelect() }, clearShareSelect : function() { this.sharedFolder.cleanSelect() } }); Ext.ns("Ext.ss"); Ext.BLANK_IMAGE_URL = "js/extjs/resources/images/default/s.gif"; Ext.ss.CONST = { DEFAULT_DATE_FROMAT : "m/d/Y", DEFAULT_TIME_FROMAT : "H:i:s", MAIN_PATH : "js/feyaSoft/home/program/ss/", IMAGE_PATH : "js/feyaSoft/home/program/ss/resources/img", GADGETS_CONTAINER_PATH : "js/feyaSoft/home/program/ss/gadgets/container.html", posReg : /(([\'\"a-z0-9\s]+!)?[0-9]+:[0-9]+)|(([\'\"a-z0-9\s]+!)?\$[a-z]+\$[0-9]+(:\$[a-z]+\$[0-9]+)?)|(([\'\"a-z0-9\s]+!)?[a-z]+\$[0-9]+(:[a-z]+\$[0-9]+)?)|(([\'\"a-z0-9\s]+!)?\$[a-z]+[0-9]+(:\$[a-z]+[0-9]+)?)|(([\'\"a-z0-9\s]+!)?\$[a-z]+:\$[a-z]+)|(([\'\"a-z0-9\s]+!)?\$[0-9]+:\$[0-9]+)|(([\'\"a-z0-9\s]+!)?[a-z]+[0-9]+(:[a-z]+[0-9]+)?)|(([\'\"a-z0-9\s]+!)?[a-z]+:[a-z]+)/gi, ISIF_URL : "spreadsheetCell/calISFormula", ISIF_URL : "feyaSoft/home/program/ss/resources/fake.json", ROW_AB : 1, COL_AB : 2, JS_RESERVED_WORD : ["do", "for", "while", "var", "extend", "Date", "true", "false", "const", "break", "int", "string", "x", "y", "ds", "sheetIndex"], cssHash : { 3 : "x-spreadsheet-comment-cell", 4 : "x-spreadsheet-hyperlink-cell" }, copySourceID : "i4DA0mP5O1tGQ7H4hq", Comment : { ADD : 0, EDIT : 1 }, MAX_LEN_OF_HSTACK : 100, letters : { '0' : "A", '1' : "B", '2' : "C", '3' : "D", '4' : "E", '5' : "F", '6' : "G", '7' : "H", '8' : "I", '9' : "J", a : "K", b : "L", c : "M", d : "N", e : "O", f : "P", g : "Q", h : "R", i : "S", j : "T", k : "U", l : "V", m : "W", n : "X", o : "Y", p : "Z" }, letters0 : { '1' : "A", '2' : "B", '3' : "C", '4' : "D", '5' : "E", '6' : "F", '7' : "G", '8' : "H", '9' : "I", a : "J", b : "K", c : "L", d : "M", e : "N", f : "O", g : "P", h : "Q", i : "R", j : "S", k : "T", l : "U", m : "V", n : "W", o : "X", p : "Y", q : "Z" }, full2Short : { 'font-size' : "fs", 'font-family' : "ff", 'text-align' : "ta", 'word-wrap' : "ww", data : "d", color : "c", align : "a", display : "dp", tdcss : "td", format : "fm", 'x-spreadsheet-bottom-silver' : "b-s", 'x-spreadsheet-right-silver' : "r-s", 'x-spreadsheet-bottom-black' : "b-b", 'x-spreadsheet-right-black' : "r-b", 'x-spreadsheet-bottom-none' : "b-n", 'x-spreadsheet-right-none' : "r-n" }, short2Full : { fs : "font-size", ff : "font-family", ta : "text-align", ww : "word-wrap", d : "data", c : "color", a : "align", dp : "display", td : "tdcss", fm : "format", 'b-s' : "x-spreadsheet-bottom-silver", 'r-s' : "x-spreadsheet-right-silver", 'b-b' : "x-spreadsheet-bottom-black", 'r-b' : "x-spreadsheet-right-black", 'b-n' : "x-spreadsheet-bottom-none", 'r-n' : "x-spreadsheet-right-none" } }; Ext.ns("Ext.ss.common"); Ext.ss.common.Helper = { getNumFormat : function(digital) { var numFormat = "0,0"; if (digital && Ext.isNumber(digital)) { numFormat += "."; for (var i = 0; i < digital; i++) { numFormat += "0"; } } return numFormat; }, getDigitalLen : function(num) { var str = num.toString(); var parts = str.split("."); if (str.indexOf("e") == -1 && 2 == parts.length) { return parts[1].length; } return 0; }, fmFormatWithQuote : function(inStr) { var formatOk = true; if (this.startEndWith(inStr, "'")) { return false; } var arrItems = this.getArrFromMathOper(inStr, "all"); for (var j = 0; j < arrItems.length; j++) { if (this.startEndWith(arrItems[j], "'")) { return false; } } return formatOk; }, getArrFromMathOper : function(inStr, separator) { var arrItems = []; var tempStr = ""; for (var i = 0; i < inStr.length; i++) { var chartAtI = inStr.charAt(i); if (separator == "plus") { if (chartAtI == "+") { arrItems.push(tempStr); tempStr = ""; } else { tempStr = tempStr.concat(chartAtI); } } else { if (chartAtI == "+" || chartAtI == "-" || chartAtI == "*" || chartAtI == "/") { arrItems.push(tempStr); tempStr = ""; } else { tempStr = tempStr.concat(chartAtI); } } } if (tempStr.length > 0) { arrItems.push(tempStr); } return arrItems; }, separatedByMathOperObj : function(inStr) { inStr = this.strTrim(inStr); var firstItem = ""; var operator = null; var remindItem = null; var meetDoubleQuote = false; var countParenthese = 0; var ignoreCount = 0; for (var i = 0; i < inStr.length; i++) { var chartAtI = inStr.charAt(i); if (chartAtI == "\"") { meetDoubleQuote = !meetDoubleQuote; } else if (chartAtI == "[" || chartAtI == "{") { ignoreCount = ignoreCount + 1; } else if (chartAtI == "]" || chartAtI == "}") { ignoreCount = ignoreCount - 1; } else if (chartAtI == "(") { countParenthese = countParenthese + 1; } else if (chartAtI == ")") { countParenthese = countParenthese - 1; } if (!meetDoubleQuote && ignoreCount == 0 && countParenthese == 0) { if (chartAtI == "+" || chartAtI == "-" || chartAtI == "*" || chartAtI == "/") { operator = chartAtI; remindItem = inStr.substring(i + 1); break; } } firstItem = firstItem.concat(chartAtI); } return { firstItem : firstItem, operator : operator, remindItem : remindItem }; }, startEndWith : function(inStr, startEndStr) { var result = false; inStr = this.strTrim(inStr); if (this.startWith(inStr, startEndStr) && this.endWith(inStr, startEndStr)) { result = true; } return result; }, startWith : function(inStr, startStr) { return inStr.substring(0, startStr.length) === startStr; }, endWith : function(inStr, endStr) { return inStr.substring(inStr.length - endStr.length, inStr.length) === endStr; }, strTrim : function(inStr) { var result = inStr; if (inStr != null) { result = inStr.replace(/^\s+|\s+$/g, ""); } return result; }, isNumber : function(inStr) { var numPart1 = Number(inStr); if (Ext.isNumber(numPart1)) { return true; } else { return false; } }, isBoolean : function(inStr) { if (typeof inStr == "boolean") { return true; } if (typeof inStr == "string") { if (inStr.toLowerCase() == "true" || inStr.toLowerCase() == "false") { return true; } } return false; }, convertDateToNum : function(inDate) { var one_day = 86400000; var oneNine00 = (new Date(1900, 0, 0)).clearTime(true); var escpaeDays = Math .ceil((inDate.clearTime(true).getTime() - oneNine00.getTime()) / one_day) + 1; return escpaeDays; }, isMdyDate : function(inStr) { if (inStr == null || inStr == "NaN" || inStr.length < 9) { return false; } var j = new RegExp("^[0-1][0-9]/[0-9]{2}/[0-9]{4}$"); if (j.test(inStr)) { return true; } else { return false; } }, calculateDate : function(inStr, num, oper) { var inDate = new Date(Date.parse(inStr, "MM/dd/yyyy")); if (oper == "+") { inDate = this.addDate(inDate, num); } else if (oper == "-") { inDate = this.addDate(inDate, 0 - num); } else { return "ERROR"; } return inDate.format("m/d/Y"); }, calculateDateByNum : function(inStr, num, oper) { var inDate = new Date(Date.parse(inStr, "MM/dd/yyyy")); if (oper == "*") { return this.convertDateToNum(inDate) * num; } else if (oper == "/") { return this.convertDateToNum(inDate) / num; } else { return "ERROR"; } }, calculateDateByNum2 : function(num, inStr, oper) { var inDate = new Date(Date.parse(inStr, "MM/dd/yyyy")); if (oper == "*") { return this.convertDateToNum(inDate) * num; } else if (oper == "/") { return num / this.convertDateToNum(inDate); } else if (oper == "-") { return num - this.convertDateToNum(inDate); } else { return "ERROR"; } }, calculate2Date : function(inStr1, inStr2, oper) { var result = null; var inDate1 = new Date(Date.parse(inStr1, "MM/dd/yyyy")); var inDate2 = new Date(Date.parse(inStr2, "MM/dd/yyyy")); if (oper == "+") { inDate1 = this.addDate(inDate1, this.convertDateToNum(inDate2)); result = inDate1.format("m/d/Y"); } else if (oper == "-") { inDate1 = this.addDate(inDate1, 0 - this.convertDateToNum(inDate2)); result = inDate1.format("m/d/Y"); } else if (oper == "*") { result = this.convertDateToNum(inDate2) * this.convertDateToNum(inDate1); } else if (oper == "/") { result = this.convertDateToNum(inDate1) / this.convertDateToNum(inDate2); } return result; }, addDate : function(inDate, num) { inDate.setDate(inDate.getDate() + num); return inDate; }, includeBasicMathOper : function(inStr) { var result = false; var j = new RegExp; j.compile("\\+|-|\\*|\\/"); if (j.test(inStr)) { result = true; } return result; }, removeParentheses : function(inStr) { var result = this.strTrim(inStr); if (this.startWith(result, "(") && this.endWith(result, ")")) { result = result.substring(1, result.length - 1); } return result; }, trimAndIncludeQuote : function(inStr) { var result = false; if (Ext.isString(inStr)) { inStr = inStr.replace(/^\s+|\s+$/g, ""); if (inStr.charAt(inStr.length - 1) == "\"" && inStr.charAt(0) == "\"" || inStr.charAt(inStr.length - 1) == "'" && inStr.charAt(0) == "'") { result = true; } } return result; }, trimAndRemoveQuote : function(inStr) { var result; if (Ext.isString(inStr)) { result = inStr.replace(/^\s+|\s+$/g, ""); result = result.replace(/^"|"$/g, ""); result = result.replace(/^'|'$/g, ""); } return result; }, whetherInQuote : function(str, index) { var sqNum = 0, dqNum = 0; for (var i = 0, len = index; i < index; i++) { var chr = str.charAt(i); if ("\"" == chr) { dqNum++; } if ("'" == chr) { sqNum++; } } return 1 == sqNum % 2 || 1 == dqNum % 2; }, whetherInFun : function(str, index) { var inFunFlg = false, emb = 0; for (var i = index - 1; 0 <= i; i--) { var chr = str.charAt(i); if ("(" == chr) { emb++; } else if (")" == chr) { emb--; } if (0 < emb && "]" == str.charAt(i - 1)) { var fname = ""; for (var j = i - 3; j >= 0; j--) { var ch = str.charAt(j); if ("\"" == ch) { break; } fname = ch + fname; } if ("condition" === fname) { inFunFlg = false; } else { inFunFlg = true; } break; } } return inFunFlg; }, validateURL : function(url) { if (url) { url = url.toString(); var myURL = url.trim(); if (myURL.length != 0) { var j = new RegExp; j.compile(/^[a-z]+:\/\/[a-z0-9-]+\.[a-z0-9]+/gi); if (j.test(myURL)) { return true; } } } return false; }, validateURLWithErrorMsg : function(url) { if (url) { var myURL = url.toString().trim(); if (myURL.length > 0 && /\S+\.\S+$/i.test(myURL)) { var j = new RegExp("^(((ht|f)tp(s?))://)?(www.|[a-zA-Z0-9-.@]+)(com|edu|gov|mil|net|org|biz|info|name|museum|asia|[a-zA-Z]{2})(:[0-9]+)*(/($|[a-zA-Z0-9.,;?'\\+&%$#=~_-]+))*$"); if (j.test(myURL)) { return true; } } } return "URL should be in format: \"http://www.example.com\""; }, generateHyperlink : function(html, obj) { if (Ext.ss.common.Helper.validateURLWithErrorMsg(html) == true) { var css = obj.css || ""; obj.hyperlink = html; if (css && css.indexOf(Ext.ss.CONST.cssHash[4]) == -1 || !css) { css += " " + Ext.ss.CONST.cssHash[4]; obj.css = css; } } }, getlastday : function(date) { var tmpdate = new Date(date.getYear(), date.getMonth() + 1, 1); var tmpdate = new Date(tmpdate - 86400000); return tmpdate.getDate(); }, convertPercent2num : function(inStr) { inStr = inStr.replace(/[0-9]+(\.)?[0-9]*%/g, function(w) { var matchPos = arguments[arguments.length - 2]; if (Ext.ss.common.Helper.whetherInQuote(inStr, matchPos + w.length - 1)) { return w; } var r = w.replace("%", ""); return Number(r) / 100; }); return inStr; }, unwrapLink : function(url) { var flag = false; if (url) { var myURL = url.toString().trim(); if (Ext.ss.common.Mask.isLink(myURL)) { flag = true; var parts = myURL.split(">", 1); url = parts[0].slice(9, -1); } } return { url : url, flag : flag }; } }; Ext.ns("Ext.ss.common"); Ext.ss.common.DataSourceHelper = { getSheetIndexByName : function(sheets, name, fuzzy) { if (name) { name = name.toUpperCase().trim(); } for (var i = 0, len = sheets.length; i < len; i++) { var sheet = sheets[i]; var sname = sheet.name.toUpperCase().trim(); if (sname == name) { return i; } else if (fuzzy) { var strLen = name.length; if ("\"" == name.charAt(0) && "\"" == name.charAt(strLen - 1) || "'" == name.charAt(0) && "'" == name.charAt(strLen - 1)) { name = name.slice(1, strLen - 1); name = name.trim(); } if (sname == name) { return i; } } } return -1; }, getLetter : function(index) { var idx = 1; var len = 1; while (idx <= index) { idx += Math.pow(26, len); len++; } len--; var num = 1; var olen = index.toString(26).length; for (var i = 1; i < olen - 1; i++) { num += Math.pow(26, i); } var str = (index - num).toString(26); len = str.length; var flag = true; if (len < olen || 1 == len) { flag = false; } var arr = []; for (var i = 0; i < len; i++) { var c; if (0 == i && flag) { c = Ext.ss.CONST.letters0[str.charAt(i)]; } else { c = Ext.ss.CONST.letters[str.charAt(i)]; } arr.push(c); } return arr.join(""); }, encodeFormula : function(x, y, txt) { try { var parts = txt.split("("); var f = parts[0]; parts = parts[1].split(")"); parts = parts[0].split(","); var minx = parseInt(parts[0].split(":")[1]); var miny = parseInt(parts[1].split(":")[1].split("}")[0]); var maxx = parseInt(parts[2].split(":")[1]); var maxy = parseInt(parts[3].split(":")[1].split("}")[0]); minx += x; miny += y; maxx += x; maxy += y; var str = f + "(" + this.getLetter(miny) + minx + ":" + this.getLetter(maxy) + maxx + ")"; return str; } catch (e) { return txt; } }, convertNameMgr2Str : function(nameRanges, inStr, x, y) { var nrStr = ""; for (var i = 0, len = nameRanges.length; i < len; i++) { var it = nameRanges[i]; if (it != null && it.coordArr != null && it.name != null && inStr.indexOf(it.name) != -1) { var coordArr = []; for (var j = 0, size = it.coordArr.length; j < size; j++) { var cit = it.coordArr[j]; var tmp = { ab : false, sheetIndex : cit.sheetIndex, ox : cit.x - x, oex : cit.ex - x, oy : cit.y - y, oey : cit.ey - y }; coordArr.push(tmp); } if (coordArr && coordArr.length > 0) { nrStr += "var " + it.name + "=" + Ext.encode(coordArr[0]) + ";"; } } } return nrStr + inStr; }, isInNameManager : function(nameRanges, name) { for (var i = 0, len = nameRanges.length; i < len; i++) { var it = nameRanges[i]; if (it.name == name) { return true; } } }, reCheckDoubleQuote : function(inStr) { var needReCal = false; var arrItems = Ext.ss.common.Helper.getArrFromMathOper(inStr, "plus"); for (var j = 0; j < arrItems.length; j++) { var temp = Ext.ss.common.Helper.strTrim(arrItems[j]); if (Ext.ss.common.Helper.startEndWith(temp, "\"")) { var tempNumStr = temp.substring(1, temp.length - 1); var tempNum = Number(tempNumStr); if (Ext.isNumber(tempNum)) { arrItems[j] = tempNum; needReCal = true; } } } if (!needReCal) { return inStr; } return arrItems.join("+"); }, calculateSeparatedObjs : function(separatedObjs, dsObj) { for (var i = 0; i < separatedObjs.length; i++) { var firstObj = separatedObjs[i]; var firstStr = firstObj.firstItem; var operator = firstObj.operator; if (operator && (operator == "*" || operator == "/")) { if (!Ext.ss.common.Helper.isNumber(firstStr)) { firstStr = dsObj.ds.convert(dsObj.x, dsObj.y, "=" + firstStr, firstStr, dsObj.sheetIndex); } if (i + 1 < separatedObjs.length) { var nextObj = separatedObjs[i + 1]; var nextStr = nextObj.firstItem; if (!Ext.ss.common.Helper.isNumber(nextStr)) { nextStr = dsObj.ds.convert(dsObj.x, dsObj.y, "=" + nextStr, nextStr, dsObj.sheetIndex); } separatedObjs[i] = null; separatedObjs[i + 1].firstItem = Ext.ss.common.DataSourceHelper .calculateByOper(firstStr, nextStr, operator); } } } var operResult = null, operator = null; for (var i = 0; i < separatedObjs.length; i++) { var tempObj = separatedObjs[i]; if (tempObj != null) { var tempStr = tempObj.firstItem; if (!Ext.ss.common.Helper.isNumber(tempObj.firstItem)) { tempStr = dsObj.ds.convert(dsObj.x, dsObj.y, "=" + tempStr, tempStr, dsObj.sheetIndex); } operResult = Ext.ss.common.DataSourceHelper.calculateByOper( operResult, tempStr, operator); operator = tempObj.operator; } } return operResult; }, recursiveMathOpers : function(str, arrObj) { var checkQuoteFormat = Ext.ss.common.Helper.fmFormatWithQuote(str); if (checkQuoteFormat == false) { throw "SS_ERROR_REF"; } var separatedObj = this.seperatedByMathOper(str); if (separatedObj) { arrObj.push(separatedObj); if (separatedObj.remindItem) { this.recursiveMathOpers(separatedObj.remindItem, arrObj); } } }, seperatedByMathOper : function(str) { str = Ext.ss.common.Helper.removeParentheses(str); var separatedObj = Ext.ss.common.Helper.separatedByMathOperObj(str); if (separatedObj.firstItem == null) { return null; } return separatedObj; }, calculateByOper : function(part1, part2, oper) { if (part1 == "#REF!" || part1 == "#REF!") { throw "SS_ERROR_REF"; } if (part1 == null) { return part2; } if (oper == null) { return part1; } var numPart1 = Number(part1); var numPart2 = Number(part2); var result = null; if (Ext.ss.common.Helper.isMdyDate(part1)) { if (Ext.isNumber(numPart2)) { if (oper == "-" || oper == "+") { result = Ext.ss.common.Helper.calculateDate(part1, numPart2, oper); } else { result = Ext.ss.common.Helper.calculateDateByNum(part1, numPart2, oper); } } else if (Ext.ss.common.Helper.isMdyDate(part2)) { result = Ext.ss.common.Helper .calculate2Date(part1, part2, oper); } else { throw "SS_ERROR_VALUE"; } return result; } if (Ext.ss.common.Helper.isMdyDate(part2)) { if (Ext.isNumber(numPart1)) { if (oper == "+") { result = Ext.ss.common.Helper.calculateDate(part2, numPart1, oper); } else { result = Ext.ss.common.Helper.calculateDateByNum2(numPart1, part2, oper); } } else { throw "SS_ERROR_VALUE"; } return result; } if (Ext.isNumber(numPart1) && Ext.isNumber(numPart2)) { return eval(part1 + oper + part2); } throw "SS_ERROR_VALUE"; }, calFormulaTextWithAnd : function(data, dsObj) { var result = new Array; var fmAndStrArr = data.substring(1).split("&"); for (var i = 0; i < fmAndStrArr.length; i++) { var temp = fmAndStrArr[i]; if (temp.indexOf("FBox[") != -1) { temp = dsObj.ds.convert(dsObj.x, dsObj.y, "=" + temp, temp, dsObj.sheetIndex); } else if (Ext.ss.common.Helper.trimAndIncludeQuote(temp)) { temp = Ext.ss.common.Helper.trimAndRemoveQuote(temp); } else { throw "SS_ERROR"; } result.push(temp); } return result.join(""); }, checkMathOperatorsFormat : function(str, r) { var result = null; var isResultNum = false; var num = Number(r); if (Ext.isNumber(num) && false != Ext.type(r)) { isResultNum = true; } str = Ext.ss.common.Helper.strTrim(str); if (str.length < 3) { return result; } var checkQuoteFormat = Ext.ss.common.Helper.fmFormatWithQuote(str); if (checkQuoteFormat == false) { return "REF"; } if (isResultNum) { return result; } var strArrByFBox = str.split("FBox["); if (strArrByFBox.length > 0) { for (var k = 0; k < strArrByFBox.length; k++) { var subStr = strArrByFBox[k]; var hgh1 = 1; if (k == 0) { hgh1 = 0; } for (var i = 0; i < subStr.length; i++) { var chartAtI = subStr.charAt(i); if (k == 0) { if (chartAtI == "[" || chartAtI == "{") { hgh1 = hgh1 + 1; } else if (chartAtI == "]" || chartAtI == "}") { hgh1 = hgh1 - 1; } else if (hgh1 == 0) { if (chartAtI == "+" || chartAtI == "-" || chartAtI == "*" || chartAtI == "/") { return "ERROR"; } } } else { if (chartAtI == "[" || chartAtI == "{" || chartAtI == "(") { hgh1 = hgh1 + 1; } else if (chartAtI == "]" || chartAtI == "}" || chartAtI == ")") { hgh1 = hgh1 - 1; } else if (hgh1 == 0) { if (chartAtI == "+" || chartAtI == "-" || chartAtI == "*" || chartAtI == "/") { return "ERROR"; } } } } } } return result; }, parseSpan2Pos : function(span) { var col = 0, row, i, len = span.length; var firstChar = span.charAt(0); var sepNum = 0; var isAbsolute; span = span.replace(/\$/gi, function(w) { sepNum++; return ""; }); if (2 == sepNum) { isAbsolute = true; } else if ("$" == firstChar) { isAbsolute = Ext.ss.CONST.COL_AB; } else if (1 == sepNum) { isAbsolute = Ext.ss.CONST.ROW_AB; } len = span.length; for (i = 0; i < len; i++) { var c = span.charCodeAt(i); if (65 <= c && c <= 90) { col = col * Math.pow(26, i) + (c - 64); } else { break; } } row = parseInt(span.slice(i, len)) || 0; col = col || 0; var pos = { x : row, y : col, ab : isAbsolute }; if (65536 < row || 256 < col) { throw "#PARSE_ERROR"; } return pos; }, compareStr : function(a, b, flag) { if (!a && !b) { return 0; } if (!a) { return flag; } if (!b) { return -1 * flag; } a = Ext.num(a, a); b = Ext.num(b, b); var fa = Ext.isNumber(a), fb = Ext.isNumber(b); if (fa && !fb) { return -1; } else if (!fa && fb) { return 1; } if (a > b) { return 1; } if (b > a) { return -1; } return 0; }, guessTextAlign : function(txt) { if (false !== Ext.num(txt, false)) { return "right"; } }, formatNumber : function(data) { data = Number(data); data = data.toString(); var idx = data.indexOf("."); if (idx > 11 || idx < 0 && data.length > 11) { data = Number(data); return data.toExponential(5); } else if (idx > 0 && data.length > 11) { data = data.substring(0, 12); var len = 12 - idx - 2; if (len < 0) { len = 0; } var lastNum = 0, cardinal = 1; if (data.substr(idx + len + 1, 1) >= 5) { lastNum = 1; } var cardinal = Math.pow(10, len); return Number((Math.floor(data * cardinal) + lastNum) / cardinal); } else { return Number(data); } }, reCheckComma : function(str) { if (str.indexOf("FBox[") > -1) { str = str.replace(/(\s*,\s*){2,}/g, function(v) { var cLen = v.split(",").length; var tmp = []; for (var k = 0; k < cLen - 2; k++) { tmp.push(0); } return "," + tmp.join(",") + ","; }); str = str.replace(/\(\s*,/g, "(0,"); str = str.replace(/,\s*\)/g, ",0)"); } return str; }, reCheckBraces : function(str) { if (str.indexOf("FBox[\"sum\"](") != -1 || str.indexOf("FBox[\"sumproduct\"](") != -1 || str.indexOf("FBox[\"sumx2py2\"](") != -1 || str.indexOf("FBox[\"sumx2my2\"](") != -1 || str.indexOf("FBox[\"sumxmy2\"](") != -1) { str = str.replace(/\'([^ \']+)\'|\"([^ \"]+)\"|(\{)|(\})/g, function(v, m) { var start = arguments[5]; if (v == "{") { var itm = str.substring(start + 1, start + 20); itm = itm.trim(); if (itm.indexOf("{") == 0 || itm.indexOf("{") != -1 || itm.indexOf("sheetIndex:") == -1) { v = "["; } } else if (v == "}") { var itm = str.substring(start - 20, start); if (itm.indexOf("ab:") == -1 || itm.indexOf("}") != -1 && itm.indexOf("ab:") != -1) { v = "]"; } } return v; }); str = str.replace(/\'([^ \']+)\'|\"([^ \"]+)\"|(\;)/g, function(v, m) { var start = arguments[5]; if (v == ";") { v = ","; } return v; }); } return str; } }; Ext.ns("Ext.ss.common"); Ext.ss.common.SpreadSheetHelper = {}; Ext.ns("Ext.ss.common"); Ext.ss.common.FunctionBoxHelper = { statisticalCommon : function(args, option) { var len = args.length; var ds, x, y, sheetIndex; ds = args[len - 1]; y = args[len - 2]; x = args[len - 3]; sheetIndex = args[len - 4]; len -= 4; if (len != 1) { throw "SS_ERROR_NA"; } var val = args[0]; if (Ext.isObject(val)) { ds.fireEvent("project", ds, { x : x, y : y }, { ox : val.ox, oy : val.oy }, { ox : val.oex, oy : val.oey }); var minx = parseInt(val.ox) + x, maxx = parseInt(val.oex) + x, miny = parseInt(val.oy) + y, maxy = parseInt(val.oey) + y; ds.checkSheetIndexValid(val.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(val.sheetIndex)) { curSheetIndex = val.sheetIndex; } if (minx == maxx && miny == maxy) { val = ds.getCellValue(minx, miny, curSheetIndex); if (val === undefined || val === "" || Ext.ss.common.Mask.isEmptyStr(val)) { if (option == "istext" || option == "isnumber" || option == "islogical") { return false; } else if (option == "isblank") { return true; } else if (option == "n") { return 0; } } } else { throw "SS_ERROR_VALUE"; } } else { if (val === undefined || val === "" || Ext.ss.common.Mask.isEmptyStr(val)) { if (option == "istext" || option == "isnumber" || option == "islogical") { return false; } else if (option == "isblank") { return true; } else if (option == "n") { return 0; } } } if (option == "isblank") { return false; } if (Ext.ss.common.Helper.isBoolean(val)) { if (option == "islogical") { return true; } else if (option == "istext" || option == "isnumber") { return false; } else if (option == "n") { if (val.toLowerCase() == "false") { return 0; } else { return 1; } } } var checkDate = ds.prepareDate(val); if (checkDate) { val = Ext.ss.common.Helper.convertDateToNum(checkDate); } var num = Number(val); if (!Ext.isNumber(num)) { if (option == "n") { if (val == "#DIV/0!") { throw "SS_ERROR_INFINITY"; } else if (val == "#N/A") { throw "SS_ERROR_NA"; } else if (val == "#VALUE!") { throw "SS_ERROR_VALUE"; } else if (val == "#NUM!") { throw "SS_ERROR_NUM"; } else { return 0; } } if (option == "istext") { return true; } } else { if (option == "n") { return num; } if (option == "isnumber") { return true; } } return false; }, aMathCommon : function(args, option) { var len = args.length; var ds, x, y, sheetIndex; ds = args[len - 1]; y = args[len - 2]; x = args[len - 3]; sheetIndex = args[len - 4]; len -= 4; if (len != 1) { throw "SS_ERROR_NA"; } var val = args[0]; if (Ext.isObject(val)) { ds.fireEvent("project", ds, { x : x, y : y }, { ox : val.ox, oy : val.oy }, { ox : val.oex, oy : val.oey }); var minx = parseInt(val.ox) + x, maxx = parseInt(val.oex) + x, miny = parseInt(val.oy) + y, maxy = parseInt(val.oey) + y; ds.checkSheetIndexValid(val.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(val.sheetIndex)) { curSheetIndex = val.sheetIndex; } if (minx == maxx && miny == maxy) { val = ds.getCellValue(minx, miny, curSheetIndex); if (val && val == "#N/A") { throw "SS_ERROR_VALUE"; } if (val === undefined || Ext.ss.common.Mask.isEmptyStr(val)) { val = 0; } var checkDate = ds.prepareDate(val); if (checkDate) { val = Ext.ss.common.Helper.convertDateToNum(checkDate); } } else { throw "SS_ERROR_VALUE"; } } else { if (val === undefined || val === "" || Ext.ss.common.Mask.isEmptyStr(val)) { val = 0; } } var num = Number(val); if (!Ext.isNumber(num)) { throw "SS_ERROR_VALUE"; } if (option == "acos") { num = Math.acos(num); } else if (option == "asin") { num = Math.asin(num); } else if (option == "atan") { num = Math.atan(num); } else if (option == "sin") { num = Math.sin(num); } else if (option == "cos") { num = Math.cos(num); } else if (option == "tan") { num = Math.tan(num); } return num; }, aMathCommon2 : function(args, option) { var len = args.length; var ds, x, y, sheetIndex; ds = args[len - 1]; y = args[len - 2]; x = args[len - 3]; sheetIndex = args[len - 4]; len -= 4; if (len != 1) { throw "SS_ERROR_NA"; } var val = args[0]; if (Ext.isObject(val)) { ds.fireEvent("project", ds, { x : x, y : y }, { ox : val.ox, oy : val.oy }, { ox : val.oex, oy : val.oey }); var minx = parseInt(val.ox) + x, maxx = parseInt(val.oex) + x, miny = parseInt(val.oy) + y, maxy = parseInt(val.oey) + y; ds.checkSheetIndexValid(val.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(val.sheetIndex)) { curSheetIndex = val.sheetIndex; } if (minx == maxx && miny == maxy) { val = ds.getCellValue(minx, miny, curSheetIndex); if (val && val == "#N/A") { throw "SS_ERROR_VALUE"; } var checkDate = ds.prepareDate(val); if (checkDate) { val = Ext.ss.common.Helper.convertDateToNum(checkDate); } } else { throw "SS_ERROR_VALUE"; } } else { if (val === undefined || val === "" || Ext.ss.common.Mask.isEmptyStr(val)) { throw "SS_ERROR_VALUE"; } } var num = Number(val); if (!Ext.isNumber(num)) { throw "SS_ERROR_VALUE"; } if (option == "even") { if (num < 0) { num = Math.ceil(Math.abs(num)); if (num % 2 > 0) { num = num + (2 - num % 2); } num = -num; } else { num = Math.ceil(num); if (num % 2 > 0) { num = num + (2 - num % 2); } } } else if (option == "odd") { if (num < 0) { num = Math.ceil(Math.abs(num)); if (num % 2 == 0) { num = num + 1; } num = -num; } else { num = Math.ceil(num); if (num % 2 == 0) { num = num + 1; } } } else if (option == "fact") { if (num < 0) { throw "SS_ERROR_VALUE"; } var fact = 1; num = Math.floor(num); for (var i = 1; i <= num; i++) { fact = fact * i; } num = fact; } else if (option == "iseven") { num = num > 0 ? Math.floor(num) : Math.ceil(num); if (num % 2 == 0) { return true; } else { return false; } } else if (option == "isodd") { num = num > 0 ? Math.floor(num) : Math.ceil(num); if (num % 2 == 0) { return false; } else { return true; } } else if (option == "sign") { if (num > 0) { num = 1; } else if (num < 0) { num = -1; } else { num = 0; } } else if (option == "sqrtpi") { if (num < 0) { throw "SS_ERROR_NUM"; } num = Math.sqrt(num * Math.PI); } else if (option == "sqrt") { if (num < 0) { throw "SS_ERROR_NUM"; } num = Math.sqrt(num); } else if (option == "degrees") { num = 180 * (num / Math.PI); } else if (option == "exp") { num = Math.exp(num); } else if (option == "abs") { num = Math.abs(num); } else if (option == "int") { num = Math.floor(num); } else if (option == "radians") { num = Math.PI * (num / 180); } return num; }, aMathCommon3 : function(args, option) { var len = args.length; var ds, x, y, sheetIndex; ds = args[len - 1]; y = args[len - 2]; x = args[len - 3]; sheetIndex = args[len - 4]; len -= 4; if (len == 0) { throw "SS_ERROR_NA"; } var res = 0; for (var k = 0; k < len; k++) { var posOffset = args[k]; if (Ext.isObject(posOffset)) { ds.fireEvent("project", ds, { x : x, y : y }, { ox : posOffset.ox, oy : posOffset.oy }, { ox : posOffset.oex, oy : posOffset.oey }); var minx = parseInt(posOffset.ox) + x, maxx = parseInt(posOffset.oex) + x, miny = parseInt(posOffset.oy) + y, maxy = parseInt(posOffset.oey) + y; ds.checkSheetIndexValid(posOffset.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(posOffset.sheetIndex)) { curSheetIndex = posOffset.sheetIndex; } for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= maxy; j++) { try { var cell = ds.getCellValue(i, j, curSheetIndex); if (option == "counta") { if (cell != undefined && cell != "") { res++; } } else if (cell === undefined || cell === "") { if (option == "countblank") { res++; } } else if (Ext.ss.common.Mask.isNumber(cell) || ds.prepareDate(cell)) { if (option == "count") { res++; } } } catch (e) { alert("something wrong"); } } } } else { if (option == "counta") { if (cell != undefined && cell != "") { res++; } } else if (posOffset === undefined || posOffset === "") { if (option == "countblank") { res++; } } else if (Ext.ss.common.Mask.isNumber(posOffset)) { if (option == "count") { res++; } } } } return res; }, aMathCommon4 : function(args, option) { var len = args.length; var ds, x, y, sheetIndex; ds = args[len - 1]; y = args[len - 2]; x = args[len - 3]; sheetIndex = args[len - 4]; len -= 4; if (len != 2) { throw "SS_ERROR_NA"; } var val = args[0]; var val2 = args[1]; if (Ext.isObject(val)) { ds.fireEvent("project", ds, { x : x, y : y }, { ox : val.ox, oy : val.oy }, { ox : val.oex, oy : val.oey }); var minx = parseInt(val.ox) + x, maxx = parseInt(val.oex) + x, miny = parseInt(val.oy) + y, maxy = parseInt(val.oey) + y; ds.checkSheetIndexValid(val.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(val.sheetIndex)) { curSheetIndex = val.sheetIndex; } if (minx == maxx && miny == maxy) { val = ds.getCellValue(minx, miny, curSheetIndex); if (val && val == "#N/A") { throw "SS_ERROR_NA"; } } else { throw "SS_ERROR_VALUE"; } } if (Ext.isObject(val2)) { ds.fireEvent("project", ds, { x : x, y : y }, { ox : val2.ox, oy : val2.oy }, { ox : val2.oex, oy : val2.oey }); var minx = parseInt(val2.ox) + x, maxx = parseInt(val2.oex) + x, miny = parseInt(val2.oy) + y, maxy = parseInt(val2.oey) + y; ds.checkSheetIndexValid(val2.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(val2.sheetIndex)) { curSheetIndex = val2.sheetIndex; } if (minx == maxx && miny == maxy) { val2 = ds.getCellValue(minx, miny, curSheetIndex); if (val2 && val2 == "#N/A") { throw "SS_ERROR_NA"; } } else { throw "SS_ERROR_VALUE"; } } var num = Number(val); var num2 = Number(val2); if (!Ext.isNumber(num)) { throw "SS_ERROR_VALUE"; } if (!Ext.isNumber(num2)) { throw "SS_ERROR_VALUE"; } if (option == "ceiling") { if (num2 == 0) { throw "SS_ERROR_INFINITY"; } if (num * num2 < 0) { throw "SS_ERROR_NUM"; } var snum2 = num2 + ""; var times = 1; if (snum2.indexOf(".") > 0) { snum2 = snum2.substring(snum2.indexOf(".") + 1, snum2.length); times = Math.pow(10, snum2.length); } num = Math.ceil(num * times); num2 = num2 * times; if (num % num2 > 0) { num = num + (num2 - num % num2); } } else if (option == "floor") { if (num2 == 0) { throw "SS_ERROR_INFINITY"; } if (num * num2 < 0) { throw "SS_ERROR_NUM"; } var snum2 = num2 + ""; var times = 1; if (snum2.indexOf(".") > 0) { snum2 = snum2.substring(snum2.indexOf(".") + 1, snum2.length); times = Math.pow(10, snum2.length); } num = num * times; num2 = num % (num2 * times); num = (num - num2) / times; } else if (option == "mod") { if (num2 == 0) { throw "SS_ERROR_INFINITY"; } num = num % num2; } else if (option == "randbetween") { if (num > num2) { throw "SS_ERROR_NUM"; } num = Math.floor(Math.random() * (num2 - num + 1)) + num; } else if (option == "randbetween") { if (num > num2) { throw "SS_ERROR_NUM"; } num = Math.floor(Math.random() * (num2 - num + 1)) + num; } else if (option == "quotient") { if (num2 == 0) { throw "SS_ERROR_INFINITY"; } num = num / num2; num = num > 0 ? Math.floor(num) : Math.ceil(num); } else if (option == "atan2") { if (num2 == 0 && num == 0) { throw "SS_ERROR_INFINITY"; } num = Math.atan2(num2, num); } return num; }, aMathRound : function(args, option) { var len = args.length; var ds, x, y, sheetIndex; ds = args[len - 1]; y = args[len - 2]; x = args[len - 3]; sheetIndex = args[len - 4]; len -= 4; if (len != 2 && len != 1) { throw "SS_ERROR_NA"; } var digital = 0; if (2 == len) { digital = args[1]; } if (Ext.isObject(digital)) { ds.fireEvent("project", ds, { x : x, y : y }, { ox : digital.ox, oy : digital.oy }, { ox : digital.oex, oy : digital.oey }); ds.checkSheetIndexValid(digital.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(digital.sheetIndex)) { curSheetIndex = digital.sheetIndex; } var i = parseInt(digital.ox) + x, j = parseInt(digital.oy) + y; digital = ds.getCellValue(i, j, curSheetIndex); } if (digital === undefined || digital === "") { throw "SS_ERROR_VALUE"; } digital = Number(digital); if (Ext.isNumber(digital)) { digital = Ext.ss.common.Mask.getCeilFloor(digital); } else { throw "SS_ERROR_VALUE"; } var posOffset = args[0]; if (Ext.isObject(posOffset)) { ds.fireEvent("project", ds, { x : x, y : y }, { ox : posOffset.ox, oy : posOffset.oy }, { ox : posOffset.oex, oy : posOffset.oey }); ds.checkSheetIndexValid(posOffset.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(posOffset.sheetIndex)) { curSheetIndex = posOffset.sheetIndex; } var i = parseInt(posOffset.ox) + x, j = parseInt(posOffset.oy) + y; posOffset = ds.getCellValue(i, j, curSheetIndex); } if (posOffset === undefined || posOffset === "") { throw "SS_ERROR_VALUE"; } var num = Number(posOffset); if (Ext.isNumber(num)) { var base = Math.pow(10, digital); var result = num; if (option == "round") { result = Math.round(num * base) / base; } else if (option == "rounddown") { if (num > 0) { result = Math.floor(num * base) / base; } else { result = -Math.floor(Math.abs(num) * base) / base; } } else if (option == "roundup") { result = Math.ceil(num * base) / base; } return result; } else { throw "SS_ERROR_VALUE"; } }, stringComm1 : function(args, option) { var len = args.length; var ds, x, y, sheetIndex; ds = args[len - 1]; y = args[len - 2]; x = args[len - 3]; sheetIndex = args[len - 4]; len -= 4; if (len != 1) { throw "SS_ERROR_NA"; } var val = args[0]; if (Ext.isObject(val)) { ds.fireEvent("project", ds, { x : x, y : y }, { ox : val.ox, oy : val.oy }, { ox : val.oex, oy : val.oey }); var minx = parseInt(val.ox) + x, maxx = parseInt(val.oex) + x, miny = parseInt(val.oy) + y, maxy = parseInt(val.oey) + y; ds.checkSheetIndexValid(val.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(val.sheetIndex)) { curSheetIndex = val.sheetIndex; } if (minx == maxx && miny == maxy) { val = ds.getCellValue(minx, miny, curSheetIndex); } else { throw "SS_ERROR_VALUE"; } } if (val == "#DIV/0!") { throw "SS_ERROR_INFINITY"; } else if (val == "#N/A") { throw "SS_ERROR_NA"; } else if (val == "#VALUE!") { throw "SS_ERROR_VALUE"; } else if (val == "#NUM!") { throw "SS_ERROR_NUM"; } else if (val == "#ERROR") { throw "SS_ERROR"; } if (option == "upper") { if (Ext.isBoolean(val) || Ext.isNumber(val)) { return val; } return val.toUpperCase(); } else if (option == "lower") { if (Ext.isBoolean(val) || Ext.isNumber(val)) { return val; } return val.toLowerCase(); } else if (option == "len") { return val.toString().length; } }, getNumObjValue : function(ds, x, y, sheetIndex, numberObj) { if (Ext.isObject(numberObj)) { ds.fireEvent("project", ds, { x : x, y : y }, { ox : numberObj.ox, oy : numberObj.oy }, { ox : numberObj.oex, oy : numberObj.oey }); var minx = parseInt(numberObj.ox) + x, maxx = parseInt(numberObj.oex) + x, miny = parseInt(numberObj.oy) + y, maxy = parseInt(numberObj.oey) + y; ds.checkSheetIndexValid(numberObj.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(numberObj.sheetIndex)) { curSheetIndex = numberObj.sheetIndex; } if (minx == maxx && miny == maxy) { numberObj = ds.getCellValue(minx, miny, curSheetIndex); if (numberObj === undefined || Ext.ss.common.Mask.isEmptyStr(numberObj)) { throw "SS_ERROR_NUM"; } } else { throw "SS_ERROR_VALUE"; } } if (numberObj == "true" || numberObj == "TRUE") { numberObj = 1; } else if (numberObj == "false" || numberObj == "FALSE") { numberObj = 0; } numberObj = Number(numberObj); if (!Ext.isNumber(numberObj)) { throw "SS_ERROR_VALUE"; } return numberObj; }, getDateObjValue : function(ds, x, y, sheetIndex, dateObj) { if (Ext.isObject(dateObj)) { ds.fireEvent("project", ds, { x : x, y : y }, { ox : dateObj.ox, oy : dateObj.oy }, { ox : dateObj.oex, oy : dateObj.oey }); var minx = parseInt(dateObj.ox) + x, maxx = parseInt(dateObj.oex) + x, miny = parseInt(dateObj.oy) + y, maxy = parseInt(dateObj.oey) + y; ds.checkSheetIndexValid(dateObj.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(dateObj.sheetIndex)) { curSheetIndex = dateObj.sheetIndex; } if (minx == maxx && miny == maxy) { dateObj = ds.getCellValue(minx, miny, curSheetIndex); dateObj = ds.prepareDate(dateObj); if (!dateObj) { throw "SS_ERROR_VALUE"; } } else { throw "SS_ERROR_VALUE"; } } else { dateObj = ds.transfer2Date(dateObj); } return dateObj; }, getObjVal : function(ds, x, y, sheetIndex, passObj) { if (Ext.isObject(passObj)) { ds.fireEvent("project", ds, { x : x, y : y }, { ox : passObj.ox, oy : passObj.oy }, { ox : passObj.oex, oy : passObj.oey }); var minx = parseInt(passObj.ox) + x, maxx = parseInt(passObj.oex) + x, miny = parseInt(passObj.oy) + y, maxy = parseInt(passObj.oey) + y; ds.checkSheetIndexValid(passObj.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(passObj.sheetIndex)) { curSheetIndex = passObj.sheetIndex; } if (minx == maxx && miny == maxy) { passObj = ds.getCellValue(minx, miny, curSheetIndex); } else { throw "SS_ERROR_VALUE"; } } return passObj; }, getRangeVal : function(ds, x, y, sheetIndex, passObj) { var arrObj = new Array; if (Ext.isObject(passObj)) { ds.fireEvent("project", ds, { x : x, y : y }, { ox : passObj.ox, oy : passObj.oy }, { ox : passObj.oex, oy : passObj.oey }); var minx = parseInt(passObj.ox) + x, maxx = parseInt(passObj.oex) + x, miny = parseInt(passObj.oy) + y, maxy = parseInt(passObj.oey) + y; ds.checkSheetIndexValid(passObj.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(passObj.sheetIndex)) { curSheetIndex = passObj.sheetIndex; } for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= maxy; j++) { var val = ds.getCellValue(i, j, curSheetIndex); arrObj.push(val); } } } else { arrObj.push(passObj); } return arrObj; }, getNumRangeVal : function(ds, x, y, sheetIndex, passObj) { var arrObj = new Array; if (Ext.isObject(passObj)) { ds.fireEvent("project", ds, { x : x, y : y }, { ox : passObj.ox, oy : passObj.oy }, { ox : passObj.oex, oy : passObj.oey }); var minx = parseInt(passObj.ox) + x, maxx = parseInt(passObj.oex) + x, miny = parseInt(passObj.oy) + y, maxy = parseInt(passObj.oey) + y; ds.checkSheetIndexValid(passObj.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(passObj.sheetIndex)) { curSheetIndex = passObj.sheetIndex; } for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= maxy; j++) { var num = ds.getCellValue(i, j, curSheetIndex); num = Number(num); arrObj.push(num); } } } else { var num = Number(passObj); if (Ext.isNumber(num)) { arrObj.push(num); } else { arrObj.push(0); } } return arrObj; }, sumHelper : function(x, y, sheetIndex, ds, arrObj1, arrObj2, option) { var xArrary = [], yArrary = []; if (Ext.isObject(arrObj1)) { xArrary = [arrObj1]; xArrary = Ext.ss.common.FunctionBoxHelper.restructureArray(xArrary, x, y, sheetIndex, ds); } else if (Ext.isArray(arrObj1)) { xArrary = Ext.ss.common.FunctionBoxHelper.restructureArray(arrObj1, x, y, sheetIndex, ds); } if (Ext.isObject(arrObj2)) { yArrary = [arrObj2]; yArrary = Ext.ss.common.FunctionBoxHelper.restructureArray(yArrary, x, y, sheetIndex, ds); } else if (Ext.isArray(arrObj2)) { yArrary = Ext.ss.common.FunctionBoxHelper.restructureArray(arrObj2, x, y, sheetIndex, ds); } if (xArrary.length == yArrary.length && xArrary.length > 0) { var result = 0; for (var i = 0; i < xArrary.length; i++) { var xVal = Number(xArrary[i]); if (!Ext.isNumber(xVal)) { xVal = 0; } var yVal = Number(yArrary[i]); if (!Ext.isNumber(yVal)) { yVal = 0; } if (option == "sumxmy2") { result += Math.pow(xVal - yVal, 2); } if (option == "sumx2py2") { result += Math.pow(xVal, 2) + Math.pow(yVal, 2); } if (option == "sumx2my2") { result += Math.pow(xVal, 2) - Math.pow(yVal, 2); } } xArrary = []; yArrary = []; return result; } xArrary = []; yArrary = []; throw "SS_ERROR_NA"; }, getnpv : function(rate, values, ds, x, y, sheetIndex) { var npv = 0; var len = values.length; for (var k = 0; k < len; k++) { var posOffset = values[k]; var num; if (Ext.isObject(posOffset)) { ds.fireEvent("project", ds, { x : x, y : y }, posOffset, posOffset); var cx = posOffset.ox + x, cy = posOffset.oy + y; ds.checkSheetIndexValid(posOffset.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(posOffset.sheetIndex)) { curSheetIndex = posOffset.sheetIndex; } num = Number(ds.getCellValue(cx, cy, curSheetIndex)); } else { num = Number(posOffset); } if (Ext.isNumber(num)) { npv = npv + num / Math.pow(1 + rate, k + 1); } } return npv; }, restructureArray : function(ary, x, y, sheetIndex, ds) { var tmpAry = new Array; if (typeof ary == "string" || ary instanceof String) { tmpAry.push(ary); return tmpAry; } for (var c = 0; c < ary.length; c++) { var posOffset = ary[c]; if (Ext.isObject(posOffset)) { ds.fireEvent("project", ds, { x : x, y : y }, { ox : posOffset.ox, oy : posOffset.oy }, { ox : posOffset.oex, oy : posOffset.oey }); var minx = parseInt(posOffset.ox) + x, maxx = parseInt(posOffset.oex) + x, miny = parseInt(posOffset.oy) + y, maxy = parseInt(posOffset.oey) + y; ds.checkSheetIndexValid(posOffset.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(posOffset.sheetIndex)) { curSheetIndex = posOffset.sheetIndex; } for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= maxy; j++) { tmpAry.push(ds.getCellValue(i, j, curSheetIndex)); } } } else { tmpAry.push(posOffset); } } return tmpAry; }, __format : function(pattern, num, z) { var j = pattern.length >= num.length ? pattern.length : num.length; var p = pattern.split(""); var n = num.split(""); var bool = true, nn = ""; for (var i = 0; i < j; i++) { var x = n[n.length - j + i]; var y = p[p.length - j + i]; if (z == 0) { if (bool) { if (x && y && (x != "0" || y == "0") || x && x != "0" && !y || y && y == "0" && !x) { nn += x ? x : "0"; bool = false; } } else { nn += x ? x : "0"; } } else { if (y && (y == "0" || y == "#" && x)) { nn += x ? x : "0"; } } } return nn; }, __formatNumber : function(numChar, pattern) { var patterns = pattern.split("."); var numChars = numChar.split("."); var z = patterns[0].indexOf(",") == -1 ? -1 : patterns[0].length - patterns[0].indexOf(","); var num1 = this.__format(patterns[0].replace(",", ""), numChars[0], 0); var num2 = this.__format(patterns[1] ? patterns[1].split("").reverse() .join("") : "", numChars[1] ? numChars[1].split("") .reverse().join("") : "", 1); num1 = num1.split("").reverse().join(""); var reCat = eval("/[0-9]{" + (z - 1) + "," + (z - 1) + "}/gi"); var arrdata = z > -1 ? num1.match(reCat) : undefined; if (arrdata && arrdata.length > 0) { var w = num1.replace(arrdata.join(""), ""); num1 = arrdata.join(",") + (w == "" ? "" : ",") + w; } num1 = num1.split("").reverse().join(""); var result = (num1 == "" ? "0" : num1) + (num2 != "" ? "." + num2.split("").reverse().join("") : ""); return result; }, formatNumber : function(num, opt) { var reCat = /[0#?,.]{1,}/gi; var zeroExc = opt.zeroExc == undefined ? true : opt.zeroExc; var pattern = opt.match(reCat)[0]; var numChar = num.toString(); var fmun = this.__formatNumber(numChar, pattern); return !(zeroExc && numChar == 0) ? opt.replace(pattern, fmun) : opt .replace(pattern, "0"); }, checkErrorCode : function(val) { var errorCode = Ext.ss.common.Mask.ERROR_CODE; for (var ec in errorCode) { if (val == errorCode[ec]) { throw ec; } } }, checkInfinitieError : function(val) { var errorCode = Ext.ss.common.Mask.ERROR_CODE; if (val == errorCode.SS_ERROR_INFINITY) { throw "SS_ERROR_INFINITY"; } } }; Ext.ns("Ext.ss.common"); /**定义规则 函数*/ Ext.ss.common.Mask = { CALLING_FUNCTION : {}, version : "2.1.8.0", ERROR_CODE : { SS_ERROR : "#ERROR!", SS_ERROR_REF : "#REF!", SS_ERROR_LOOP : "#REF!Circular", SS_ERROR_INFINITY : "#DIV/0!", SS_ERROR_NA : "#N/A", SS_ERROR_VALUE : "#VALUE!", SS_ERROR_NUM : "#NUM!", SS_ERROR_BRACKET : "#ERROR:Brackets not match" }, week_set : { mon : 1, tue : 2, wed : 3, thu : 4, fri : 5, sat : 6, sun : 7, 1 : "mon", 2 : "tue", 3 : "wed", 4 : "thu", 5 : "fri", 6 : "sat", 7 : "sun" }, Week_Set : { Monday : 1, Tuesday : 2, Wednesday : 3, Thursday : 4, Friday : 5, Saturday : 6, Sunday : 7, 1 : "Monday", 2 : "Tuesday", 3 : "Wednesday", 4 : "Thursday", 5 : "Friday", 6 : "Saturday", 7 : "Sunday" }, week_full_set : { monday : 1, tuesday : 2, wednesday : 3, thursday : 4, friday : 5, saturday : 6, sunday : 7, 1 : "monday", 2 : "tuesday", 3 : "wednesday", 4 : "thursday", 5 : "friday", 6 : "saturday", 7 : "sunday" }, month_set : { jan : 1, feb : 2, mar : 3, apr : 4, may : 5, jun : 6, jul : 7, aug : 8, sep : 9, oct : 10, nov : 11, dec : 12, 1 : "jan", 2 : "feb", 3 : "mar", 4 : "apr", 5 : "may", 6 : "jun", 7 : "jul", 8 : "aug", 9 : "sep", 10 : "oct", 11 : "nov", 12 : "dec" }, month_full_set : { january : 1, february : 2, march : 3, april : 4, may : 5, june : 6, july : 7, august : 8, september : 9, october : 10, november : 11, december : 12, 1 : "january", 2 : "february", 3 : "march", 4 : "april", 5 : "may", 6 : "june", 7 : "july", 8 : "august", 9 : "september", 10 : "october", 11 : "november", 12 : "december" }, dateFormats : ["Y/m/d", "y/m/d", "Y/M/d", "y/M/d", "Y/n/d", "y/n/d", "Y/m/j", "y/m/j", "Y/M/j", "y/M/j", "Y/n/j", "y/n/j", "Y/F/d", "y/F/d", "Y/F/j", "y/F/j", "m/d/Y", "m/d/y", "M/d/Y", "M/d/y", "n/d/Y", "n/d/y", "m/j/Y", "m/j/y", "M/j/Y", "M/j/y", "n/j/Y", "n/j/y", "F/d/Y", "F/d/y", "F/j/Y", "F/j/y", "d/m/Y", "d/m/y", "d/M/Y", "d/M/y", "d/n/Y", "d/n/y", "j/m/Y", "j/m/y", "j/M/Y", "j/M/y", "j/n/Y", "j/n/y", "d/F/Y", "d/F/y", "j/F/Y", "j/F/y", "Y-m-d", "y-m-d", "Y-M-d", "y-M-d", "Y-n-d", "y-n-d", "Y-m-j", "y-m-j", "Y-M-j", "y-M-j", "Y-n-j", "y-n-j", "Y-F-d", "y-F-d", "Y-F-j", "y-F-j", "m-d-Y", "m-d-y", "M-d-Y", "M-d-y", "n-d-Y", "n-d-y", "m-j-Y", "m-j-y", "M-j-Y", "M-j-y", "n-j-Y", "n-j-y", "F-d-Y", "F-d-y", "F-j-Y", "F-j-y", "d-m-Y", "d-m-y", "d-M-Y", "d-M-y", "d-n-Y", "d-n-y", "j-m-Y", "j-m-y", "j-M-Y", "j-M-y", "j-n-Y", "j-n-y", "d-F-Y", "d-F-y", "j-F-Y", "j-F-y", "Y.m.d", "y.m.d", "Y.M.d", "y.M.d", "Y.n.d", "y.n.d", "Y.m.j", "y.m.j", "Y.M.j", "y.M.j", "Y.n.j", "y.n.j", "Y.F.d", "y.F.d", "Y.F.j", "y.F.j", "m.d.Y", "m.d.y", "M.d.Y", "M.d.y", "n.d.Y", "n.d.y", "m.j.Y", "m.j.y", "M.j.Y", "M.j.y", "n.j.Y", "n.j.y", "F.d.Y", "F.d.y", "F.j.Y", "F.j.y", "d.m.Y", "d.m.y", "d.M.Y", "d.M.y", "d.n.Y", "d.n.y", "j.m.Y", "j.m.y", "j.M.Y", "j.M.y", "j.n.Y", "j.n.y", "d.F.Y", "d.F.y", "j.F.Y", "j.F.y", "Y,m,d", "y,m,d", "Y,M,d", "y,M,d", "Y,n,d", "y,n,d", "Y,m,j", "y,m,j", "Y,M,j", "y,M,j", "Y,n,j", "y,n,j", "Y,F,d", "y,F,d", "Y,F,j", "y,F,j", "m,d,Y", "m,d,y", "M,d,Y", "M,d,y", "n,d,Y", "n,d,y", "m,j,Y", "m,j,y", "M,j,Y", "M,j,y", "n,j,Y", "n,j,y", "F,d,Y", "F,d,y", "F,j,Y", "F,j,y", "d,m,Y", "d,m,y", "d,M,Y", "d,M,y", "d,n,Y", "d,n,y", "j,m,Y", "j,m,y", "j,M,Y", "j,M,y", "j,n,Y", "j,n,y", "d,F,Y", "d,F,y", "j,F,Y", "j,F,y", "m,d Y", "m,d y", "M,d Y", "M,d y", "n,d Y", "n,d y", "m,j Y", "m,j y", "M,j Y", "M,j y", "n,j Y", "n,j y", "d,F Y", "d,F y", "j,F Y", "j,F y", "d,m Y", "d,m y", "d,M Y", "d,M y", "d,n Y", "d,n y", "j,m Y", "j,m y", "j,M Y", "j,M y", "j,n Y", "j,n y", "d,F Y", "d,F y", "j,F Y", "j,F y", "M d, Y", "m d, Y", "F d, Y", "m/d Y", "m/d y", "M/d Y", "M/d y", "n/d Y", "n/d y", "m/j Y", "m/j y", "M/j Y", "M/j y", "n/j Y", "n/j y", "d/F Y", "d/F y", "j/F Y", "j/F y", "d/m Y", "d/m y", "d/M Y", "d/M y", "d/n Y", "d/n y", "j/m Y", "j/m y", "j/M Y", "j/M y", "j/n Y", "j/n y", "F/d Y", "F/d y", "F/j Y", "F/j y", "Y m d", "y m d", "Y M d", "y M d", "Y n d", "y n d", "Y m j", "y m j", "Y M j", "y M j", "Y n j", "y n j", "Y F d", "y F d", "Y F j", "y F j", "m d Y", "m d y", "M d Y", "M d y", "n d Y", "n d y", "m j Y", "m j y", "M j Y", "M j y", "n j Y", "n j y", "F d Y", "F d y", "F j Y", "F j y", "d m Y", "d m y", "d M Y", "d M y", "d n Y", "d n y", "j m Y", "j m y", "j M Y", "j M y", "j n Y", "j n y", "d F Y", "d F y", "j F Y", "j F y"], timeFormats : ["H:i:s", "h:i:s", "h:i:s a", "h:i:s A", "G:i:s", "g:i:s", "g:i:s a", "g:i:s A", "H:i", "h:i", "h:i a", "h:i A", "G:i", "g:i", "g:i a", "g:i A", "H", "h", "h a", "h A", "G", "g", "g a", "g A"], getObjSize : function(o) { var size = 0; for (var p in o) { if (o.hasOwnProperty(p)) { size++; } } return size; }, getErrorCode : function(formula, e) { var errCode = Ext.ss.common.Mask.ERROR_CODE[e]; if (!errCode) { if (formula && Ext.ss.common.Mask.checkEmbrace(formula) === true) { var str = ""; if (e) { if (Ext.isIE) { if (e.name) { str = e.name; } else { str = e; } } else { str = e.toString(); } } if (-1 != str.indexOf("ReferenceError") || -1 != str.indexOf("TypeError") || -1 != str.indexOf("#PARAM_ERROR")) { errCode = "#REF!"; } else { errCode = "#ERROR"; } } else { errCode = Ext.ss.common.Mask.ERROR_CODE.SS_ERROR_BRACKET; } } return errCode; }, /**校验formula*/ checkEmbrace : function(formula) { var stack = []; formula = formula.slice(1); formula.replace(/[\(\)]/g, function(w) { if ("(" == w) { stack.push(w); } else { if ("(" == stack[stack.length - 1]) { stack.pop(); } else { stack.push(w); } } return ""; }); if (0 == stack.length) { return true; } else { for (var i = 0, len = stack.length; i < len; i++) { if ("(" == stack[i]) { formula += ")"; } else { formula = "(" + formula; } } return "=" + formula; } }, isLink : function(url) { if (url) { var myURL = url.toString().trim(); var j = new RegExp; j.compile(/.+<\/a>/gi); return j.test(myURL); } return false; }, isImage : function(url) { if (url) { var myURL = url.toString().trim(); if (myURL.length != 0) { var j = new RegExp; j.compile(/(|.+<\/img>)/gi); if (j.test(myURL)) { return true; } } else { return true; } } return false; }, isFullImage : function(url) { if (url) { var myURL = url.toString().trim(); if (myURL.length != 0) { var j = new RegExp; j .compile(/(|.*<\/img>)/gi); if (j.test(myURL)) { return true; } } else { return true; } } return false; }, isFormula : function(txt) { var j = new RegExp; j.compile(/^=/gi); return j.test(txt); }, isNumber : function(txt) { return Ext.isNumber(Ext.num(txt, false)); }, isFunction : function(txt) { var j = new RegExp; j.compile(/^=[a-z]+\([^\(\)=]+\)$/gi); return j.test(txt); }, dataRangeValidator : function(v) { var posReg = Ext.ss.CONST.posReg; var match = false; if (Ext.isString(v)) { v.replace(posReg, function(w) { if (w == v) { match = true; } }); } return match || "The format should like: \"Sheet1!$A$1:$B$10\""; }, localDataRangeValidator : function(v) { var j = new RegExp; j.compile(/[a-z]+[0-9]+:[a-z]+[0-9]+/gi); return j.test(v) || "The format should like: \"A1:B10\""; }, get3DLookStore : function(config) { var store = new Ext.data.SimpleStore({ fields : ["id", "text"], data : [["simple", "Simple"]] }); return store; }, getSharpStore : function(config) { var store = new Ext.data.SimpleStore({ fields : ["id", "text"], data : [["box", "Box"]] }); return store; }, getTargetStore : function(config) { var store = new Ext.data.SimpleStore({ fields : ["text"], data : [] }); return store; }, getFontFamilyStore : function(config) { var store = new Ext.data.SimpleStore({ fields : ["id", "text"], data : [["Arial", "Arial"], ["Courier New", "Courier New"], ["Tahoma", "Tahoma"], ["Times New Roman", "Times New Roman"], ["Verdana", "Verdana"]] }); return store; }, getConditionStore : function(config) { var lang = feyaSoft.ss.lang; var store = new Ext.data.SimpleStore({ fields : ["id", "text"], data : [["include", lang.textContains], ["exclude", lang.textNotContains], ["exact", lang.textExactly], ["empty", lang.cellEmpty], ["gt", lang.greaterThan], ["lt", lang.lessThan], ["eq", lang.isEqualTo], ["ne", lang.isNotEqualTo], ["bw", lang.isBetween], ["nbw", lang.isNotBetween]] }); return store; }, getCeilFloor : function(number) { if (number >= 0) { return Math.floor(number); } else { return Math.ceil(number); } }, getFontSizeStore : function(config) { var store = new Ext.data.SimpleStore({ fields : ["id", "id"], data : [["6pt"], ["7pt"], ["8pt"], ["9pt"], ["10pt"], ["12pt"], ["14pt"], ["16pt"], ["18pt"], ["20pt"], ["24pt"], ["36pt"], ["48pt"], ["72pt"]] }); return store; }, cleanTag : function(str) { if ("string" == Ext.type(str)) { return str.replace(/<\/?.+?>/g, ""); } return str; }, getFormatStore : function() { var getStr = function(str) { var lan_ss = feyaSoft.ss.lang; return lan_ss[str] || str; }; var store = new Ext.data.SimpleStore({ fields : ["id", "text", "preview"], data : [["regular", getStr("regular")], ["number", getStr("number")], ["money", getStr("money")], ["date", getStr("date")], ["time", getStr("time")], ["percent", getStr("percent")], ["science", getStr("science")], ["text", getStr("text")]] }); return store; }, setCaretPosition : function(ctrl, spos, epos) { try { if (ctrl.setSelectionRange) { ctrl.focus(); ctrl.setSelectionRange(spos, epos); } else if (ctrl.createTextRange) { var range = ctrl.createTextRange(); range.collapse(true); range.moveEnd("character", epos); range.moveStart("character", spos); range.select(); } } catch (e) { } }, setCaretPosition2End : function(elem) { var caretPos = elem.value.length; if (elem != null) { if (elem.createTextRange) { var range = elem.createTextRange(); range.move("character", caretPos); range.select(); } else { elem.setSelectionRange(caretPos, caretPos); elem.focus(); var evt = document.createEvent("KeyboardEvent"); evt.initKeyEvent("keypress", true, true, null, false, false, false, false, 0, 32); elem.dispatchEvent(evt); evt = document.createEvent("KeyboardEvent"); evt.initKeyEvent("keypress", true, true, null, false, false, false, false, 8, 0); elem.dispatchEvent(evt); } } }, getCursorPos : function(obj) { if (document.selection) { var sel = document.selection.createRange(); try { var pct = sel.parentElement(); var dup = sel.duplicate(); dup.moveToElementText(pct); dup.setEndPoint("EndToEnd", sel); return startOffset = dup.text.length - sel.text.length; } catch (e) { obj.focus(); var sel = document.selection.createRange(); sel.moveStart("character", -obj.value.length); return sel.text.length; } } else { return obj.selectionStart; } }, addOnPos : function(obj, str) { obj.focus(); if (document.selection) { var objValue = obj.value; var idx = objValue.indexOf("("); var tmValue, start = 0, end = 0; if (idx > 0) { tmValue = objValue.substring(0, idx + 1); var rt = objValue.match(/:/); if (rt) { var st = str.match(/:/); if (st) { tmValue += str; start = idx + 1; end = tmValue.length; } else { var c1 = objValue.substring(idx + 1, rt.index); var ldx = objValue.indexOf(")"); ldx = ldx > 0 ? ldx : objValue.length; var c2 = objValue.substring(rt.index + 1, ldx); if (c1 >= str) { tmValue += str + ":" + c2; start = idx + 1; end = rt.index; } else if (c2 >= str) { tmValue += c1 + ":" + str; start = rt.index + 1; end = ldx; } else { tmValue += c1 + ":" + str; start = rt.index + 1; end = ldx; } } } else { tmValue += str; start = idx + 1; end = tmValue.length; } } else { tmValue = objValue + "(" + str; start = idx + 2; end = tmValue.length; } obj.value = tmValue; var range = obj.createTextRange(); range.collapse(true); range.moveStart("character", start); range.moveEnd("character", end); range.select(); } else { var oldValue = obj.value; var prefix, suffix; prefix = obj.value.substring(0, obj.selectionStart); suffix = obj.value.substring(obj.selectionEnd); var spos = prefix.length; str = prefix + str; var epos = str.length; str += suffix; obj.value = str; var len = obj.value.length; this.setCaretPosition(obj, len, len); } return str; }, getSelectText : function(obj) { if (document.selection) { var sel = document.selection.createRange(); return sel.text; } else { return obj.value.substring(obj.selectionStart, obj.selectionEnd); } }, isEmptyObject : function(o) { var f = false; for (var p in o) { f = true; break; } if (!f) { return true; } return false; }, copy : function(o) { return "object" == Ext.type(o) ? Ext.apply({}, o) : o; }, obj2arr : function(o) { var arr = []; for (var p in o) { arr.push([p, o[p]]); } return arr; }, mergeRange : function(r1, r2) { if (r1.minPos.x == r2.minPos.x && r1.maxPos.x == r2.maxPos.x) { if (r1.maxPos.y + 1 == r2.minPos.y) { return { minPos : { x : r1.minPos.x, y : r1.minPos.y }, maxPos : { x : r1.maxPos.x, y : r2.maxPos.y } }; } else if (r2.maxPos.y + 1 == r1.minPos.y) { return { minPos : { x : r1.minPos.x, y : r2.minPos.y }, maxPos : { x : r1.maxPos.x, y : r1.maxPos.y } }; } } else if (r1.minPos.y == r2.minPos.y && r1.maxPos.y == r2.maxPos.y) { if (r1.maxPos.x + 1 == r2.minPos.x) { return { minPos : { x : r1.minPos.x, y : r1.minPos.y }, maxPos : { x : r2.maxPos.x, y : r1.maxPos.y } }; } else if (r2.maxPos.x + 1 == r1.minPos.x) { return { minPos : { x : r2.minPos.x, y : r1.minPos.y }, maxPos : { x : r1.maxPos.x, y : r1.maxPos.y } }; } } }, shExpMatch_KMP : function(str, exp, matchCase) { if (exp == "") { return 0; } if (exp == "*") { return 1; } if (!matchCase) { str = str.toLowerCase(); exp = exp.toLowerCase(); } if (str === exp) { return 1; } var n = str.length; var i = 0, j = 0, strChar, expChar, k, next = []; strChar = str.charAt(0); k = buildNext(exp); if (n - i < k) { return -1; } for (j = 0; j < k;) { expChar = exp.charAt(j); if (j == -1 || expChar == "?" || expChar == strChar) { i++; j++; if (i == n) { break; } strChar = str.charAt(i); } else { return -1; } } if (exp.charAt(k) == "*") { exp = exp.substr(++j); if (exp == "") { return 1; } } else { if (i == n) { return 1; } return -1; } var pi = n - 1; strChar = str.charAt(pi); k = buildPrevious(exp); var m = exp.length; if (n - i < m - k - 1) { return -1; } for (j = m - 1; j > k;) { expChar = exp.charAt(j); if (j == m || expChar == "?" || expChar == strChar) { pi--; j--; strChar = str.charAt(pi); } else { return -1; } } exp = exp.substr(0, j); n = pi + 1; for (strChar = str.charAt(i); i < n && exp != "";) { k = buildNext(exp); if (n - i < k) { return -1; } for (j = 0; j < k;) { expChar = exp.charAt(j); if (j == -1 || expChar == "?" || expChar == strChar) { i++; j++; if (i == n) { break; } strChar = str.charAt(i); } else { j = next[j]; } } if (j == k) { exp = exp.substr(++j); } else { return -1; } } if (exp == "") { return 1; } else { for (i = 0; exp.charAt(i) != "*"; i++) { return -1; } return 1; } function buildNext(str) { var n = str.length - 1; next = [-1]; var iChar = str.charAt(0), jChar; if (iChar == "*") { return 0; } for (var i = 0, j = -1; i < n;) { if (j == -1 || jChar == "?" || iChar == jChar) { i++; j++; iChar = str.charAt(i); if (iChar == "*") { return i; } jChar = str.charAt(j); if (iChar == jChar) { next[i] = next[j]; } else { next[i] = j; } } else { j = next[j]; jChar = str.charAt(j); } } if (str.charAt(n) == "*") { return n; } return n + 1; } function buildPrevious(str) { var n = str.length, last = n - 1; next = [n]; next[last] = n; var iChar = str.charAt(last), jChar; if (iChar == "*") { return last; } for (var i = last, j = n; i > 0;) { if (j == n || jChar == "?" || iChar == jChar) { i--; j--; iChar = str.charAt(i); if (iChar == "*") { return i; } jChar = str.charAt(j); if (iChar == jChar) { next[i] = next[j]; } else { next[i] = j; } } else { j = next[j]; jChar = str.charAt(j); } } if (str.charAt(0) == "*") { return 0; } return -1; } }, isEmptyStr : function(inStr) { var blankRE = /^[\s]+$/; if (inStr === "" || blankRE.test(inStr)) { return true; } return false; }, getFormulaStore : function() { var getStr = function(str) { var lan_ss = feyaSoft.ss.lang; return lan_ss[str] || str; }; var store = new Ext.data.SimpleStore({ fields : ["id", "formula", "details", "isVar"], data : Ext.ss.common.Mask.formulaData }); return store; }, getFieldStore :function(){ var getStr = function(str) { var lan_ss = feyaSoft.ss.lang; return lan_ss[str] || str; }; var store = new Ext.data.SimpleStore({ fields : ["dsd_id", "dsd_field", "dsd_caption"], data:[] }); return store; }, getFnStore:function(){ var getStr = function(str) { var lan_ss = feyaSoft.ss.lang; return lan_ss[str] || str; }; var store = new Ext.data.SimpleStore({ fields : ["ef_id", "ef_fullname", "ef_description"], data:[] }); return store; }, formulaData : [ [ "ABS", "ABS(number)", "Syntax: ABS(number)

Returns the absolute value of the given number", "numeric"], [ "ACOS", "ACOS(number)", "Syntax: ACOS(number)

Returns the arccosine, or inverse cosine, of a number. The arccosine is the angle whose cosine is number. The returned angle is given in radians in the range 0 (zero) to pi. Number is the cosine of the angle and must be from -1 to 1.", "numeric"], [ "ADDRESS", "ADDRESS(row, column, [abs], [ref], [sheet])", "Syntax: ADDRESS(row, column, [abs], [ref], [sheet])

Returns a cell address (reference) as text, according to the specified row and column numbers. Optionally, whether the address is interpreted as an absolute address (for example, $A$1) or as a relative address (as A1) or in a mixed form (A$1 or $A1) can be determined. The name of the sheet can also be specified.

Abs determines the type of reference: 1 for column/row absolute; 2 for column relative, row absolute; 3 for column absolute, row relative; 4 for column/row relative. Ref is a Boolean value: true for A1 notation; FALSE for R1C1 notation. Sheet is the name of the sheet.", "lookup"], [ "AND", "AND(logical1,logical2,...)", "Syntax: AND(logical1, logical2, ...)

Returns TRUE if all of its arguments are TRUE", "logic"], [ "AREAS", "AREAS(reference)", "Syntax: AREAS(reference)

This function returns the number of ranges in a reference. Reference is a range of cells.", "lookup"], [ "ASC", "ASC(string)", "Syntax: ASC(string)

Returns the ASCII value of a character or the first character in a string.

string is the specified character to retrieve the AscII value for. If there is more than one character, the function will return the AscII value for the first character and ignore all of the characters after the first.", "string"], [ "ASIN", "ASIN(number)", "Syntax: ASIN(number)

Returns the arcsine, or inverse sine, of a number. The arcsine is the angle whose sine is number. The returned angle is given in radians in the range -pi/2 to pi/2. Number is the sine of the angle and must be from -1 to 1.", "numeric"], [ "ATAN", "ATAN(number)", "Syntax: ATAN(number)

Returns the arctangent, or inverse tangent, of a number. The arctangent is the angle whose tangent is number. The returned angle is given in radians in the range -pi/2 to pi/2. Number is the tangent of the angle and must be from -1 to 1.", "numeric"], [ "ATAN2", "ATAN2(x_num, y_num)", "Syntax: ATAN2(x_num, y_num)

Returns the arctangent, or inverse tangent, of the specified x- and y-coordinates.", "numeric"], [ "AVERAGE", "AVERAGE(number1, number2, ...)", "Syntax: AVERAGE(number1, number2, ...)

Returns the average of the arguments. Number1, number2, ... are numerical values or ranges. Text is ignored.", "numeric"], [ "CEILING", "CEILING(number, significance)", "Syntax: CEILING(number, significance)

Returns number rounded up, away from zero, to the nearest multiple of significance.", "numeric"], [ "CHAR", "CHAR(ascii_value)", "Syntax: CHAR(ascii_value)

CHAR function returns the character based on the ASCII value.

ascii_value is the ASCII value used to retrieve the character.", "string"], [ "CHOOSE", "CHOOSE(position, value1, value2, ...)", "Syntax: Choose(position, value1, value2, ...)

Choose a value from a list of values. Position is position number in the list of values to return. It must be a number between 1 and 29.", "lookup"], [ "COLUMN", "COLUMN(reference)", "Syntax: COLUMN(reference)

Column function returns the column number of a cell reference.", "lookup"], [ "COLUMNS", "COLUMNS(reference)", "Syntax: COLUMNS(reference)

Columns function returns the number of columns in a cell reference.", "lookup"], [ "COMBIN", "COMBIN(number, CHOOSE)", "Syntax: COMBIN(number, CHOOSE)

Returns the number of combinations for a given number of items. Use COMBIN to determine the total possible number of groups for a given number of items.

Number is the number of items.

Number_chosen is the number of items in each combination.", "numeric"], [ "CONCATENATE", "CONCATENATE(arg1,arg2,...)", "Syntax: CONCATENATE(text1, text2, ...)

Combines several text strings into one string. Text_1, text_2, ... are text passages that are to be combined into one string.", "string"], [ "COS", "COS(number)", "Syntax: COS(number)

Returns a Double specifying the cosine of an angle. Number is a Double or any valid numeric expression that expresses an angle in radians.", "numeric"], [ "COUNT", "COUNT(value1, [value2], ...)", "Syntax: COUNT(value1, value2, ...)

Counts how many numbers are in the list of arguments. Text entries are ignored. Value1, value2, ... value30 are values or ranges which are to be counted.", "statistical"], [ "COUNTA", "COUNTA(value1, [value2], ...)", "Syntax: COUNTA(value1, [value2], ...)

Counts the number of cells that are not empty in a range.", "statistical"], [ "COUNTIF", "COUNTIF(range,criteria)", "Syntax: COUNTIF(range,criteria)

Counts the number of cells within a range that meet the given criteria.

range is the range of cells that you want to count based on the criteria.

criteria is used to determine which cells to count.", "statistical"], [ "COUNTBLANK", "COUNTBLANK(range)", "Syntax: COUNTBLANK(range)

Counts empty cells in a specified range of cells.", "numeric"], [ "DATE", "DATE(year, month, day)", "Syntax: DATE(year, month, day)

Converts a date written as year, month, day to an internal serial number and displays it in the cell's formatting. Year is an integer between 1583 and 9956 or 0 and 99. Month is an integer between 1 and 12. Day is an integer between 1 and 31.", "date"], [ "DAY", "DAY(date_value)", "Syntax: DAY(date_value)

This function returns the day of the month (a number from 1 to 31) given a date value.", "date"], [ "DAYS360", "DAYS360(start_date, end_date, [method])", "Syntax: DAYS360(start_date, end_date, [method])

This function returns the number of days between two dates based on a 360-day year.

start_date and end_date are the two dates to calculate the difference between.

method is optional. It is a boolean value - either TRUE or FALSE. If TRUE is entered, the DAYS360 function will use the US method. If FALSE is entered, the DAYS360 function will use the European method.", "date"], [ "DB", "DB(cost, salvage, life, period, [number_months])", "Syntax: DB(cost, salvage, life, period, [number_months])

Returns the depreciation of an asset for a given time period based on the fixed-declining balance method.

cost is the original cost of the asset.

salvage is the salvage value after the asset has been fully depreciated.

life is the useful life of the asset or the number of periods that you will be depreciating the asset.

period is the period that you wish to calculate the depreciation for. Use the same units as for the life.

number_months is optional. It is the number of months in the first year of depreciation. If this parameter is omitted, the DB function will assume that there are 12 months in the first year.", "finicial"], [ "DDB", "DDB(cost, salvage, life, period, [factor])", "Syntax: DDB(cost, salvage, life, period, [factor])

Returns the depreciation of an asset for a given time period based on the fixed-declining balance method.

cost is the original cost of the asset.

salvage is the salvage value after the asset has been fully depreciated.

life is the useful life of the asset or the number of periods that you will be depreciating the asset.

period is the period that you wish to calculate the depreciation for. Use the same units as for the life.

factor is optional. It is the rate at which the balance declines. If this parameter is omitted, the DDB function will assume the factor to be 2.", "finicial"], [ "DEGREES", "DEGREES(number)", "Syntax: DEGREES(number)

This function converts radians into degrees.", "numeric"], [ "EXP", "EXP(number)", "Syntax: EXP(number)

Returns a Double specifying e (the base of natural logarithms) raised to a power.", "numeric"], [ "EVEN", "EVEN(number)", "Syntax: EVEN(number)

Returns number rounded up to the nearest even integer.", "numeric"], [ "FACT", "FACT(number)", "Syntax: FACT(number)

Returns the factorial of a number. The factorial of a number is equal to 1*2*3*...* number.", "numeric"], [ "FALSE", "FALSE()", "Syntax: FALSE()

Returns the logical value FALSE", "logic"], [ "FIND", "FIND(find_text, within_text, [start_num])", "Syntax: FIND(find_text, within_text, [start_num])

This function returns the location of a substring in a string. The search is case-sensitive.

Find_text is the text you want to find.

Within_text is the text containing the text you want to find.

Start_num(Optional) Specifies the character at which to start the search. The first character in within_text is character number 1. If you omit start_num, it is assumed to be 1.", "string"], [ "FLOOR", "FLOOR(number, significance)", "Syntax: FLOOR(number, significance)

Rounds number down, toward zero, to the nearest multiple of significance.", "numeric"], [ "FV", "FV(interest_rate, number_payments, payment, [PV], [Type])", "Syntax: FV(interest_rate, number_payments, payment, [PV], [Type])

This function returns the future value of an investment based on an interest rate and a constant payment schedule.

interest_rate is the interest rate for the investment.

number_payments is the number of payments for the annuity.

payment is the amount of the payment for each period. This should be entered as a negative value.

PV is optional. It is the present value of the payments.

Type is optional. It indicates when the payments are due. Type can be one of the following values: 0 - Payments are due at the end of the period. (default), 1 - Payments are due at the beginning of the period.", "finicial"], [ "GCD", "GCD(arg1,arg2,...)", "Syntax: GCD(number1, number2, ...)

Returns the greatest common divisor of two or more integers. The greatest common divisor is the largest integer that divides both number1 and number2 without a remainder.", "numeric"], [ "HOUR", "HOUR(arg1)", "Syntax: Hour(serial_number)

This function returns the hour of a time value (from 0 to 23).", "date"], [ "IF", "IF(test, then_value, otherwise_value)", "Syntax: IF(test, then_value, otherwise_value)

Returns one value if a condition evaluates to TRUE and another value if it evaluates to FALSE.

Test is any value or expression that can be TRUE or FALSE.

Then_value is the value that is returned if the logical test is TRUE.

Otherwise_value is the value that is returned if the logical test is FALSE.", "logic"], [ "IFERROR", "IFERROR(test, value)", "Syntax: IFERROR(test, value)

If the first argument is an error, then the second argument will be returned. If the first argument is not an error, then it will be returned.", "logic"], [ "INDEX", "INDEX(arg1, arg2, arg3)", "Syntax: INDEX(reference, row, column)

This function returns either the value or the reference to a value from a table or range.

array is a range of cells or table.

row is the row number in the array to use to return the value.

column is optional. It is the column number in the array to use to return the value.", "lookup"], [ "INT", "INT(arg1)", "Syntax: INT(number)

Rounds a number down to the nearest integer", "numeric"], [ "IPMT", "IPMT(interest_rate, period, number_payments, PV, [FV], [Type])", "Syntax: IPMT(interest_rate, period, number_payments, PV, [FV], [type])

Returns the interest payment for an investment based on an interest rate and a constant payment schedule.

period is the period to calculate the interest rate. It must be a value between 1 and number_payments.

interest_rate is the interest rate for the loan.

number_payments is the number of payments for the loan.

PV is the present value or principal of the loan.

FV is optional. It is the future value or the loan amount outstanding after all payments have been made. If this parameter is omitted, the PMT function assumes a FV value of 0.

Type (optional) defines whether the payment is due at the beginning (1) or the end (0) of a period.", "finicial"], [ "IRR", "IRR(range, [estimated_irr])", "Syntax: IRR(range, [estimated_irr])

This function returns the internal rate of return for a series of cash flows represented by the numbers in values. The cash flows must occur at regular intervals, but do not have to be the same amounts for each interval.

range is a range of cells that represent the series of cash flows.

estimated_irr is optional. It is the your guess at the internal rate of return.", "finicial"], [ "ISBLANK", "ISBLANK(value)", "Syntax: ISBLANK(value)

This function is used to check for blank or null values.", "info"], [ "ISEVEN", "ISEVEN(number)", "Syntax: ISEVEN(number)

Returns TRUE if number is even, or FALSE if number is odd.", "info"], [ "ISLOGICAL", "ISLOGICAL(value)", "Syntax: ISLOGICAL(value)

This function is used to check for a logical value (ie: TRUE or FALSE).", "info"], [ "ISNUMBER", "ISNUMBER(value)", "Syntax: ISNUMBER(value)

Returns TRUE if value is number, or FALSE if value is not number.", "info"], [ "ISODD", "ISODD(number)", "Syntax: ISODD(number)

Returns TRUE if number is odd, or FALSE if number is even.", "info"], [ "ISTEXT", "ISTEXT(value)", "Syntax: ISTEXT(value)

Returns TRUE if value is a text value, or FALSE if value is not a text value.", "info"], [ "LARGE", "LARGE(array, nth_position)", "Syntax: LARGE(array, nth_position)

Returns the nth largest value from a set of values.", "statistical"], [ "LCM", "LCM(number1, number2, ...)", "Syntax: LCM(number1, number2, ...)

Calculate the Least Common Multiple, which is the smallest number that can be divided by each of the given numbers", "numeric"], [ "LEN", "LEN(text)", "Syntax: LEN(text)

Len function returns the length of the specified string.", "string"], [ "LEFT", "LEFT(text, number)", "Syntax: LEFT(text, number)

Returns the first character or characters in a text string. Text is the text where the initial partial words are to be determined. Number (optional) is the number of characters for the start text. If this parameter is not defined, one character is returned.", "string"], [ "LOWER", "LOWER(text)", "Syntax: LOWER(text)

This function converts all letters in the specified string to lowercase. If there are characters in the string that are not letters, they are unaffected by this function.", "string"], [ "MEDIAN", "MEDIAN(number1, number2, ...)", "Syntax: MEDIAN(number1, number2, ...)

Median function returns the median of the numbers provided.", "statistical"], [ "MINUTE", "MINUTE(arg1)", "Syntax: MINUTE(serial_number)

This function returns the minute of a time value (from 0 to 59).", "date"], [ "MOD", "MOD(number,divisor)", "Syntax: MOD(number,divisor)

Mode returns the remainder after number is divided by divisor. The result has the same sign as divisor.", "numeric"], [ "MODE", "MODE(number1, number2, ...)", "Syntax: MODE(number1, number2, ...)

Mode return the most frequently occurring value in a list of numbers.", "statistical"], [ "MONTH", "MONTH(date_value)", "Syntax: MONTH(date_value)

This function returns the month (a number from 1 to 12) given a date value.", "date"], [ "MAX", "MAX(number1, number2, ...)", "Syntax: MAX(number1, number2, ...)

Returns the maximum value in a list of arguments. Ignores logic values and text.", "statistical"], [ "MID", "MID(arg1,arg2,arg3)", "Syntax: MID(text, start_position, number_of_characters)

This function extracts a substring from a string (starting at any position)", "string"], [ "MIN", "MIN(number1, number2, ...)", "Syntax: MIN(number1, number2, ...)

Returns the minimum value in a list of arguments. Ignores logic values and text.", "statistical"], [ "MIRR", "MIRR(range, finance_rate, reinvestment_rate)", "Syntax: MIRR(range, finance_rate, reinvestment_rate)

This function returns the modified internal rate of return for a series of cash flows. The internal rate of return is calculated by using both the cost of the investment and the interest received by reinvesting the cash.

range is a range of cells that represent the series of cash flows.

finance_rate is the interest rate that you pay on the cash flow amounts.

reinvestment_rate is the interest rate that you receive on the cash flow amounts as they are reinvested.", "finicial"], [ "N", "N(value)", "Syntax: N(value)

This function converts a value to a number.

If value is a date, the N function returns the date as a serial number.

If value is boolean - true/false, the N function returns 1/0.", "info"], [ "NOT", "NOT(arg1)", "Syntax: NOT(logical)

Reverses the logic of its argument", "logic"], [ "NPER", "NPER(interest_rate, payment, PV, [FV], [Type])", "Syntax: NPER(interest_rate, payment, PV, [FV], [Type])

This function returns the number of periods for an investment based on an interest rate and a constant payment schedule.

interest_rate is the interest rate for the investment.

payment is the amount of the payment for each period. This should be entered as a negative value.

PV is the present value of the payments.

FV is optional. It is the future value that you'd like the investment to be after all payments have been made. If this parameter is omitted, the NPER function will assume a FV of 0.

Type is optional. It indicates when the payments are due. Type can be one of the following values: 0 - Payments are due at the end of the period. (default), 1 - Payments are due at the beginning of the period.", "finicial"], [ "NPV", "NPV(discount_rate, value1, value2, ... value_n )", "Syntax: NPV(discount_rate, value1, value2, ... value_n)

This function returns the net present value of an investment.

discount_rate is the discount rate for the period.

value1, value2, ... value_n are the future payments and income for the investment (ie: cash flows).", "finicial"], [ "ODD", "ODD(number)", "Syntax: ODD(number)

Returns number rounded up to the nearest odd integer.", "numeric"], [ "OR", "OR(arg1,arg2,...)", "Syntax: OR(logical1, logical2, ...)

Returns TRUE if any argument is TRUE", "logic"], [ "PI", "PI()", "Syntax: PI()

Returns the value of Pi, 3.14159265358979.", "numeric"], [ "PMT", "PMT(interest_rate, number_payments, PV, [FV], [type])", "Syntax: PMT(interest_rate, number_payments, PV, [FV], [type])

Returns the payment amount for a loan based on an interest rate and a constant payment schedule.

interest_rate is the interest rate for the loan.

number_payments is the number of payments for the loan.

PV is the present value or principal of the loan.

FV is optional. It is the future value or the loan amount outstanding after all payments have been made. If this parameter is omitted, the PMT function assumes a FV value of 0.

Type (optional) defines whether the payment is due at the beginning (1) or the end (0) of a period.", "finicial"], [ "PPMT", "PPMT(interest_rate, period, number_payments, PV, [FV], [type])", "Syntax: PMT(interest_rate, period, number_payments, PV, [FV], [type])

Returns the payment on the principal for a particular payment based on an interest rate and a constant payment schedule.

interest_rate is the interest rate for the loan.

period is the period used to determine how much principal has been repaid. Period must be a value between 1 and number_payments.

number_payments is the number of payments for the loan.

PV is the present value or principal of the loan.

FV is optional. It is the future value or the loan amount outstanding after all payments have been made. If this parameter is omitted, the PPMT function assumes a FV value of 0.

Type (optional) defines whether the payment is due at the beginning (1) or the end (0) of a period.", "finicial"], [ "POWER", "POWER(base,power)", "Syntax: POWER(base, power)

Returns the result of a number raised to a power. Base is the number that is to be raised to the given power. Power is the exponent by which the base is to be raised.", "numeric"], [ "PRODUCT", "PRODUCT(number1, number2, ...)", "Syntax: PRODUCT(number1, number2, ...)

Multiplies its arguments", "numeric"], [ "PV", "PV(interest_rate, number_payments, payment, [FV], [Type])", "Syntax: PMT(interest_rate, number_payments, payment, [FV], [Type])

This function returns the present value of an investment based on an interest rate and a constant payment schedule.

interest_rate is the interest rate for the investment.

number_payments is the number of payments for the annuity.

payment is the amount of the payment made each period.

FV (optional) is the desired value (future value) to be reached at the end of the periodic payments.

Type (optional) defines whether the payment is due at the beginning (1) or the end (0) of a period.", "finicial"], [ "QUOTIENT", "QUOTIENT(numerator,denominator)", "Syntax: QUOTIENT(numerator,denominator)

Returns the integer portion of a division. Use this function when you want to discard the remainder of a division.", "numeric"], [ "RADIANS", "RADIANS(angle)", "Syntax: RADIANS(angle)

Converts degrees to radians.", "numeric"], [ "RAND", "RAND()", "Syntax: RAND()

Returns a random number between 0 and 1.", "numeric"], [ "RANDBETWEEN", "RANDBETWEEN(bottom,top)", "Syntax: RANDBETWEEN(bottom,top)

Returns a random number between the numbers you specify.", "numeric"], [ "RATE", "RATE(NPER, PMT, PV, [FV], [type], [guess])", "Syntax: RATE(NPER, PMT, PV, [FV], [type], [guess])

Returns the constant interest rate per period of an annuity.

NPER is the total number of periods, during which payments are made (payment period).

PMT is the constant payment (annuity) paid during each period.

PV is the cash value in the sequence of payments.

FV (optional) is the future value, which is reached at the end of the periodic payments.

Type (optional) defines whether the payment is due at the beginning (1) or the end (0) of a period.

Guess (optional) determines the estimated value of the interest with iterative calculation.", "finicial"], [ "REPT", "REPT(text, number)", "Syntax: REPT(text, number)

Repeats a character string by the given number of copies.", "string"], [ "RIGHT", "RIGHT(text, number)", "Syntax: RIGHT(text, number)

Defines the last character or characters in a text string. Text is the text of which the right part is to be determined. Number (optional) is the number of characters from the right part of the text.", "string"], [ "ROUND", "ROUND(number, count)", "Syntax: ROUND(number, count)

Rounds the given number to a certain number of decimal places according to valid mathematical criteria. Count (optional) is the number of the places to which the value is to be rounded. If the count parameter is negative, only the whole number portion is rounded. It is rounded to the place indicated by the count.", "numeric"], [ "ROUNDDOWN", "ROUNDDOWN(number, count)", "Syntax: ROUNDDOWN(number, count)

Rounds the given number to a certain number of decimal places according to valid mathematical criteria (toward zero). Count is the number of the places to which the value is to be rounded. ", "numeric"], [ "ROUNDUP", "ROUNDUP(number, count)", "Syntax: ROUNDUP(number, count)

Rounds the given number to a certain number of decimal places according to valid mathematical criteria (away zero). Count is the number of the places to which the value is to be rounded.", "numeric"], [ "ROW", "ROW(reference)", "Syntax: ROW(reference)

Row function returns the row number of a cell reference.", "lookup"], [ "ROWS", "ROWS(reference)", "Syntax: ROWS(reference)

Rows function returns the number of rows in a cell reference.", "lookup"], [ "SECOND", "SECOND(number)", "Syntax: SECOND(serial_number)

This function returns the second of a time value (from 0 to 59).", "date"], [ "SIGN", "SIGN(number)", "Syntax: SIGN(number)

Returns 1 if the number is positive, zero (0) if the number is 0, and -1 if the number is negative.", "numeric"], [ "SIN", "SIN(number)", "Syntax: SIN(number)

Returns a Double specifying the sine of an angle. Number is a Double or any valid numeric expression that expresses an angle in radians.", "numeric"], [ "SLN", "SLN(cost, salvage, life)", "Syntax: SLN(cost, salvage, life)

This function returns the depreciation of an asset for a period based on the straight-line depreciation method.

cost is the original cost of the asset.

salvage is the salvage value after the asset has been fully depreciated.

life is the useful life of the asset or the number of periods that you will be depreciating the asset.", "finicial"], [ "SMALL", "SMALL(array, nth_position)", "Syntax: SMALL(array, nth_position)

Returns the nth smallest value from a set of values.", "statistical"], [ "SQRT", "SQRT(number)", "Syntax: SQRT(number)

Returns a positive square root", "numeric"], [ "SQRTPI", "SQRTPI(number)", "Syntax: SQRTPI(number)

Returns a positive square root of (number * pi).", "numeric"], [ "SUM", "SUM(number1, number2, ...)", "Syntax: SUM(number1, number2, ...)

Returns the sum of corresponding array numbers", "numeric"], [ "SUMIF", "SUMIF(range, criteria, sum_range)", "Syntax: SUMIF(range, criteria, sum_range)

Adds all numbers in a range of cells, based on a given criteria. Range is the range of cells that you want to apply the criteria against. Criteria is used to determine which cells to add. Sum_range are the cells to sum.", "numeric"], [ "SUMPRODUCT", "SUMPRODUCT(array1,array2, ...)", "Syntax: SUMPRODUCT(array1, array2, ...)

Returns the sum of the products of corresponding array components", "numeric"], [ "SUMSQ", "SUMSQ(number1, number2, ...)", "Syntax: SUMSQ(number1, number2, ...)

Calculates the sum of the squares of numbers.", "numeric"], [ "SUMXMY2", "SUMXMY2(array1, array2)", "Syntax: SUMXMY2(array1, array2)

This function calculates the sum of the squares of the differences between values in two arrays and returns the sum of the results.

array1 and array2 are two ranges or arrays.", "numeric"], [ "SUMX2PY2", "SUMX2PY2(array1, array2)", "Syntax: SUMX2PY2(array1, array2)

This function calculates the sum of the squares of corresponding values in two arrays and returns the sum of the results.

array1 and array2 are two ranges or arrays.", "numeric"], [ "SUMX2MY2", "SUMX2MY2(array1, array2)", "Syntax: SUMX2MY2(array1, array2)

This function calculates the difference of squares of corresponding values in two arrays and returns the sum of the results.

array1 and array2 are two ranges or arrays.", "numeric"], [ "SYD", "SYD(cost, salvage, life, period)", "Syntax: SYD(cost, salvage, life, period)

This function returns the depreciation of an asset for a given time period based on the sum-of-years digits depreciation method.

cost is the original cost of the asset.

salvage is the salvage value after the asset has been fully depreciated.

life is the useful life of the asset or the number of periods that you will be depreciating the asset.

period is the period that you wish to calculate the depreciation for. Use the same units as for the life.", "finicial"], [ "TAN", "TAN(number)", "Syntax: TAN(number)

RReturns a Double specifying the tangent of an angle. The required number is a Double or any valid numeric expression that expresses an angle in radians.", "numeric"], [ "TEXT", "TEXT(value, format)", "Syntax: TEXT(value, format)

Text function returns a value converted to text with a specified format.", "string"], [ "TIME", "TIME(hour, minute, second)", "Syntax: TIME(hour, minute, second)

This function returns the decimal number for a particular time.", "date"], [ "TODAY", "TODAY()", "Syntax: TODAY()

Returns the current computer system date. TODAY is a function without arguments.", "date"], [ "TRIM", "TRIM(text)", "Syntax: TRIM(text)

Returns a text value with the leading and trailing spaces removed.", "string"], [ "TRUE", "TRUE()", "Syntax: TRUE()

Returns the logical value TRUE", "logic"], [ "TRUNC", "TRUNC(number)", "Syntax: TRUNC(number)

Truncates a number to an integer", "numeric"], [ "VALUE", "VALUE(text)", "Syntax: VALUE(text)

Converts a text string into a number. Text is the text to be converted to a number.", "string"], [ "WEEKDAY", "WEEKDAY(serial_number, [type])", "Syntax: WEEKDAY(serial_number, [type])

Returns the day of the week for the given serial_number (date value). The day is returned as an integer based on the type.

Type is option. It can be any of the following values:

type = 1 (default), the weekdays are counted starting from Sunday (Monday = 2).

type = 2, the weekdays are counted starting from Monday (Monday = 1).

type = 3, the weekdays are counted starting from Monday (Monday = 0).", "date"], [ "YEAR", "YEAR(date_value)", "Syntax: YEAR(date_value)

This function returns a four-digit year (a number from 1900 to 9999) given a date value.", "date"], [ "UPPER", "UPPER(text)", "Syntax: UPPER(text)

This function allows you to convert text to all uppercase. If there are characters in the string that are not letters, they are unaffected by this function.", "string"]] }; Ext.ns("feyaSoft.ss.popup"); feyaSoft.ss.popup.ImagePopup = function(callBackFn, scope) { this.westPanel = new feyaSoft.home.program.photo.WestPanel; this.imageDetail = new feyaSoft.home.program.photo.ImageDetailPanel({ eastPanelShow : "not" }); this.callback = callBackFn.createDelegate(scope || this); feyaSoft.ss.popup.ImagePopup.superclass.constructor.call(this, { title : feyaSoft.lang.photo.listImages, layout : "fit", resizable : false, loadMask : true, width : 1000, height : 500, y : 20, closeAction : "close", items : [{ layout : "border", items : [this.westPanel, this.imageDetail] }], modal : true, shim : false, animCollapse : false, border : false, constrainHeader : false, minimizable : false, maximizable : false }); this.show(); }; Ext.extend(feyaSoft.ss.popup.ImagePopup, Ext.Window, { selectImage : function(imgpath) { if (imgpath) { this.callback.defer(1, this, [imgpath]); this.close(); } } }); Ext.ns("Ext.ss.popup.chart"); Ext.ss.popup.chart.ChartElementPanel = function(config) { Ext.apply(this, config); this.titleField = new Ext.form.TextField({ fieldLabel : feyaSoft.ss.lang.title, msgTarget : "qtip", anchor : "95%" }); this.subtitleField = new Ext.form.TextField({ fieldLabel : feyaSoft.ss.lang.subtitle, msgTarget : "qtip", anchor : "95%" }); this.xField = new Ext.form.TextField({ fieldLabel : feyaSoft.ss.lang.xAixs, msgTarget : "qtip", anchor : "95%" }); this.yField = new Ext.form.TextField({ fieldLabel : feyaSoft.ss.lang.yAixs, msgTarget : "qtip", anchor : "95%" }); this.zField = new Ext.form.TextField({ disabled : true, fieldLabel : feyaSoft.ss.lang.zAixs, allowBlank : false, msgTarget : "qtip", anchor : "95%" }); this.legendLeftRd = new Ext.form.Radio({ name : "x-spreadsheet-legend-position", boxLabel : feyaSoft.ss.lang.left }); this.legendRightRd = new Ext.form.Radio({ name : "x-spreadsheet-legend-position", boxLabel : feyaSoft.ss.lang.right, checked : true }); this.legendTopRd = new Ext.form.Radio({ name : "x-spreadsheet-legend-position", boxLabel : feyaSoft.ss.lang.top }); this.legendBottomRd = new Ext.form.Radio({ name : "x-spreadsheet-legend-position", boxLabel : feyaSoft.ss.lang.bottom }); this.legendSet = new Ext.form.FieldSet({ title : feyaSoft.ss.lang.displayLegend, autoHeight : true, layout : "form", defaults : { labelSeparator : "" }, labelWidth : 20, items : [this.legendLeftRd, this.legendRightRd, this.legendTopRd, this.legendBottomRd] }); this.xCb = new Ext.form.Checkbox({ boxLabel : feyaSoft.ss.lang.xAixs }); this.yCb = new Ext.form.Checkbox({ boxLabel : feyaSoft.ss.lang.yAixs, checked : true }); this.zCb = new Ext.form.Checkbox({ boxLabel : feyaSoft.ss.lang.zAixs, disabled : true }); this.fontFamilyCombo = new Ext.form.ComboBox({ width : 180, fieldLabel : "Family", store : new Ext.ss.common.Mask.getFontFamilyStore, displayField : "text", valueField : "id", value : "Arial", typeAhead : true, mode : "local", triggerAction : "all", selectOnFocus : true, tpl : "
{text}
" }); this.fontSizeCombo = new Ext.form.ComboBox({ width : 180, fieldLabel : "Size ", store : new Ext.data.SimpleStore({ fields : ["id", "id"], data : [["8"], ["9"], ["10"], ["11"], ["12"], ["13"], ["14"], ["15"], ["16"], ["18"], ["20"], ["24"]] }), displayField : "id", valueField : "id", value : "11", typeAhead : true, mode : "local", triggerAction : "all", selectOnFocus : true, tpl : "
{id}
" }); this.fontColorPalette = new Ext.ColorPalette({ allowReselect : true }); this.fontColorPalette.on("select", this.onFontColorSelectFn, this); this.fontColorMenu = new Ext.menu.Menu({ items : [this.fontColorPalette] }); this.fontColorBtn = new Ext.SplitButton({ iconCls : "icon_font_color", colorValue : "000000", tooltip : "Font Color", menu : this.fontColorMenu, scope : this, listeners : { afterrender : { fn : this.onAfterRenderFn, scope : this } } }); this.fontStyle = new Ext.form.Checkbox({ hideLabel : true, boxLabel : " Bold" }); this.legendFontSet = new Ext.form.FieldSet({ title : "Legend Font", autoHeight : true, items : [{ border : false, bodyStyle : "background:transparent;padding-left: 50px;", defaults : { border : false, bodyStyle : "background:transparent;" }, layout : "column", height : 50, items : [{ layout : "form", labelWidth : 40, columnWidth : 0.52, items : [this.fontFamilyCombo, this.fontSizeCombo] }, { columnWidth : 0.48, labelWidth : 40, layout : "form", items : [this.fontColorBtn, { layout : "fit", style : "padding-top:5px;", baseCls : "x-plain", items : [this.fontStyle] }] }] }] }); Ext.ss.popup.chart.ChartElementPanel.superclass.constructor.call(this, { title : feyaSoft.ss.lang.chartElement, border : false, layout : "border", bodyStyle : "background:transparent;", defaults : { bodyStyle : "background:transparent;", border : false }, items : [{ region : "north", html : "
" + feyaSoft.ss.lang.chartTitle + "
" }, { region : "center", layout : "form", bodyStyle : "background:transparent;padding:10px 20px 10px 20px;", labelWidth : 75, items : [this.titleField, this.subtitleField, this.xField, this.yField, this.zField] }, { region : "east", width : 160, bodyStyle : "background:transparent;padding: 0px 20px 0px 0px;", items : [this.legendSet] }, { region : "south", height : 100, bodyStyle : "background:transparent;padding: 0px 20px 0px 20px;", items : [this.legendFontSet] }] }); }; Ext.extend(Ext.ss.popup.chart.ChartElementPanel, Ext.Panel, { reset : function() { if (this.rendered) { this.titleField.reset(); this.subtitleField.reset(); this.xField.reset(); this.yField.reset(); this.zField.reset(); this.legendLeftRd.reset(); this.legendRightRd.reset(); this.legendTopRd.reset(); this.legendBottomRd.reset(); this.fontColorBtn.colorValue = "000000"; this.onFontColorSelectFn(null, "transparent"); this.fontStyle.reset(); } }, saveChange : function() { var sender = this.sender; var setting = sender.setting || {}; if (this.xCb.getValue()) { setting.display_grid_x = true; } if (this.yCb.getValue()) { setting.display_grid_y = true; } if (!this.zCb.disabled && this.zCb.getValue()) { setting.display_grid_z = true; } setting.display_legend_pos = this.legendLeftRd.getValue() ? "left" : this.legendRightRd.getValue() ? "right" : this.legendTopRd.getValue() ? "top" : "bottom"; var title = this.titleField.getValue(); if (title) { setting.title = title; } else { setting.title = null; this.titleField.reset(); } var subtitle = this.subtitleField.getValue(); if (subtitle) { setting.subtitle = subtitle; } else { setting.subtitle = null; this.subtitleField.reset(); } var xFieldTitle = this.xField.getValue(); if (xFieldTitle) { setting.x_field_title = xFieldTitle; } else { setting.x_field_title = null; this.xField.reset(); } var yFieldTitle = this.yField.getValue(); if (yFieldTitle) { setting.y_field_title = yFieldTitle; } else { setting.y_field_title = null; this.yField.reset(); } var zFieldTitle = this.zField.getValue(); if (!this.zField.disabled && zFieldTitle) { setting.z_field_title = zFieldTitle; } else { setting.z_field_title = null; this.zField.reset(); } setting.fontfamily = this.fontFamilyCombo.getValue(); setting.fontsize = this.fontSizeCombo.getValue(); setting.fontcolor = this.fontColorBtn.colorValue; if (this.fontStyle.getValue()) { setting.fontstyle = "BOLD"; } else { setting.fontstyle = "PLAIN"; } sender.setting = setting; }, syncSetting : function(setting) { if (setting.title) { this.titleField.setValue(setting.title); } else { this.subtitleField.reset(); } if (setting.subtitle) { this.subtitleField.setValue(setting.subtitle); } else { this.subtitleField.reset(); } if (setting.x_field_title) { this.xField.setValue(setting.x_field_title); } else { this.xField.reset(); } if (setting.y_field_title) { this.yField.setValue(setting.y_field_title); } else { this.yField.reset(); } if (setting.z_field_title) { this.zField.setValue(setting.z_field_title); } else { this.zField.reset(); } var pos = setting.display_legend_pos; if (pos) { switch (pos) { case "left" : this.legendTopRd.setValue(true); break; case "right" : this.legendRightRd.setValue(true); break; case "top" : this.legendTopRd.setValue(true); break; case "bottom" : this.legendBottomRd.setValue(true); break; default : ; } } setting.fontfamily = this.fontFamilyCombo.getValue(); setting.fontsize = this.fontSizeCombo.getValue(); if (setting.fontstyle == "BOLD") { this.fontStyle.setValue(true); } this.fontFamilyCombo.setValue(setting.fontfamily); this.fontSizeCombo.setValue(setting.fontsize); this.onFontColorSelectFn(null, setting.fontcolor); this.fontColorBtn.colorValue = setting.fontcolor; }, onFontColorSelectFn : function(cp, color) { var El = this.fontColorBtn.getEl(); if (El) { var bEl = El.child("button"); if (bEl) { bEl.setStyle("background-color", color); this.fontColorBtn.colorValue = color; } this.fontColorMenu.hide(); } }, onAfterRenderFn : function(p) { var El = p.getEl(); var bEl = El.child("button"); if (bEl) { bEl.setStyle("background-color", this.fontColorBtn.colorValue); } } }); Ext.ns("Ext.ss.popup.chart"); Ext.ss.popup.chart.DataRangePanel = function(config) { Ext.apply(this, config); this.rangeField = new Ext.form.TextField({ hideLabel : true, labelSeparator : "", anchor : "99%", validator : Ext.ss.common.Mask.dataRangeValidator, allowBlank : false }); this.rowRd = new Ext.form.Radio({ name : "x-spreadsheet-series-position", hideLabel : true, labelSeparator : "", boxLabel : feyaSoft.ss.lang.dataSeriesRows }); this.colRd = new Ext.form.Radio({ name : "x-spreadsheet-series-position", hideLabel : true, checked : true, labelSeparator : "", handler : this.onColFn, boxLabel : feyaSoft.ss.lang.dataSeriesCols, scope : this }); this.rowLabelCb = new Ext.form.Checkbox({ hideLabel : true, checked : true, labelSeparator : "", boxLabel : feyaSoft.ss.lang.firstRowLabel, handler : this.onRowLabelFn, scope : this }); this.colLabelCb = new Ext.form.Checkbox({ hideLabel : true, checked : true, labelSeparator : "", boxLabel : feyaSoft.ss.lang.firstColumnLabel, handler : this.onColLabelFn, scope : this }); Ext.ss.popup.chart.DataRangePanel.superclass.constructor.call(this, { title : feyaSoft.ss.lang.dataRange, border : false, layout : "form", bodyStyle : "background:transparent;padding:5px 25px 10px 20px;", items : [ { xtype : "label", html : "" + feyaSoft.ss.lang.chooseDataRange + "" }, { border : false, bodyStyle : "background:transparent;margin-top:10px;", layout : "column", defaults : { border : false, bodyStyle : "background:transparent;" }, items : [{ columnWidth : 0.9, layout : "form", items : [this.rangeField] }, { columnWidth : 0.1, items : [{ xtype : "button", iconCls : "icon_window_popup", handler : this.popupDataRange, scope : this }] }] }, this.colRd, this.rowRd, this.rowLabelCb, this.colLabelCb] }); }; Ext.extend(Ext.ss.popup.chart.DataRangePanel, Ext.Panel, { popupDataRange : function() { var drSelector = this.sender.spreadsheet.dataRangeSelector; var sender = this.sender; sender.pushdown(); drSelector.popup(null, this.rangeField.getValue(), function( range) { var ss = sender.spreadsheet; var ds = ss.ds; var parts = range.split(","); var arr = []; for (var i = 0, len = parts.length; i < len; i++) { arr.push(ds.parseText2Pos(parts[i])); } this.rangeField.setValue(range); sender.show(); sender.initDataRange(arr); sender.showDataRangeBorder(true); }, this); }, onColFn : function(rd, checked) { if (!this.reseting) { var sender = this.sender; var setting = sender.setting; if (checked) { sender.showDataRangeBorder(); setting.series_position = "col"; sender.showDataRangeBorder(true); } else { sender.showDataRangeBorder(); setting.series_position = "row"; sender.showDataRangeBorder(true); } } }, onRowLabelFn : function(cb, checked) { if (!this.reseting) { var sender = this.sender; var setting = sender.setting; setting.row_label = checked; } }, onColLabelFn : function(cb, checked) { if (!this.reseting) { var sender = this.sender; var setting = sender.setting; setting.col_label = checked; } }, reset : function() { if (this.rendered) { this.reseting = true; this.colRd.setValue(true); this.rowLabelCb.setValue(true); this.colLabelCb.setValue(true); this.reseting = false; } }, syncSetting : function(setting, dataRangeStr) { this.rangeField.setValue(dataRangeStr); if (setting.row_label) { this.rowLabelCb.setValue(true); } else { this.rowLabelCb.setValue(false); } if (setting.col_label) { this.colLabelCb.setValue(true); } else { this.colLabelCb.setValue(false); } if (setting.series_position == "col") { this.colRd.setValue(true); this.rowRd.setValue(false); } else { this.colRd.setValue(false); this.rowRd.setValue(true); } } }); Ext.ns("Ext.ss.popup.chart"); Ext.ss.popup.chart.ChartTypePanel = function(config) { Ext.apply(this, config); var categoryStore = new Ext.data.JsonStore({ fields : ["text", "icon", "type"], data : Ext.ss.popup.chart.ChartCatalog }); var detailStore = new Ext.data.JsonStore({ fields : ["text", "icon", "type", "category"], data : Ext.ss.popup.chart.ChartType }); this.categoryView = new Ext.DataView({ singleSelect : true, itemSelector : "div.x-spreadsheet-chart-category", overClass : "x-spreadsheet-item-over", store : categoryStore, selectedClass : "x-spreadsheet-item-selected", tpl : new Ext.XTemplate("
" + "" + "
" + "{text}" + "
" + "
" + "
"), listeners : { selectionchange : { fn : this.onCategorySelectionChangeFn, scope : this } } }); this.westPanel = new Ext.Panel({ region : "west", width : 220, border : false, layout : "fit", bodyStyle : "background:transparent;padding:5px 5px 5px 20px;", items : [{ bodyStyle : "overflow:auto;", items : [this.categoryView] }] }); this.detailView = new Ext.DataView({ singleSelect : true, itemSelector : "div.x-spreadsheet-chart", overClass : "x-spreadsheet-item-over", store : detailStore, selectedClass : "x-spreadsheet-item-selected", tpl : new Ext.XTemplate("
" + "" + "
" + "" + "
" + "
" + "
" + "
"), listeners : { selectionchange : { fn : this.onDetailSelectionChangeFn, scope : this } } }); this.sharpView = new Ext.DataView({ singleSelect : true, itemSelector : "div.x-spreadsheet-item", overClass : "x-spreadsheet-item-over", store : Ext.ss.common.Mask.getSharpStore(), selectedClass : "x-spreadsheet-item-selected", tpl : new Ext.XTemplate("
{text}
"), listeners : { selectionchange : { fn : this.onSharpSelectionChangeFn, scope : this } } }); this.triDCombo = new Ext.form.ComboBox({ disabled : true, editable : false, displayField : "text", valueField : "id", typeAhead : true, mode : "local", triggerAction : "all", selectOnFocus : true, value : "simple", store : Ext.ss.common.Mask.get3DLookStore(), width : 172 }); this.triDCombo.on("select", this.onTriDComboSelectFn, this); this.triDLookCheckbox = new Ext.form.Checkbox({ boxLabel : feyaSoft.ss.lang['3DLook'], handler : this.on3DLookCheckFn, scope : this }); this.triDLookPanel = new Ext.Panel({ anchor : "95%", border : false, layout : "column", bodyStyle : "background:transparent;margin-bottom:3px;", defaults : { bodyStyle : "background:transparent;" }, items : [{ border : false, columnWidth : 0.25, items : [this.triDLookCheckbox] }, { border : false, columnWidth : 0.75, items : [this.triDCombo] }] }); this.sharpViewPanel = new Ext.Panel({ anchor : "75%", disabled : true, layout : "fit", items : [this.sharpView] }); this.sharpPanel = new Ext.Panel({ bodyStyle : "background:transparent;", border : false, layout : "form", anchor : "100%", items : [{ border : false, bodyStyle : "background:transparent;margin-bottom:5px;", html : "Shape" }, this.sharpViewPanel] }); this.numberOfLineField = new Ext.ux.form.SpinnerField({ fieldLabel : "Number of lines", minValue : 1, value : 1, maxValue : 10, allowBlank : false, width : 40 }); this.numberOfLinePanel = new Ext.Panel({ bodyStyle : "background:transparent;", border : false, layout : "form", anchor : "100%", items : [this.numberOfLineField] }); this.numberOfLineField.on("spin", this.onNumberOfLineChangeFn, this); this.topRd = new Ext.form.Radio({ name : "x-spreadsheet-chart-type-position", boxLabel : "On top", disabled : true, checked : true }); this.topRd.on("check", this.onTopRdCheckFn, this); this.percentRd = new Ext.form.Radio({ name : "x-spreadsheet-chart-type-position", disabled : true, boxLabel : "Percent" }); this.stackCheckbox = new Ext.form.Checkbox({ boxLabel : "Stack series", handler : this.onStackCheckFn, scope : this }); this.stackPanel = new Ext.Panel({ bodyStyle : "background:transparent;", border : false, anchor : "100%", items : [this.stackCheckbox, { bodyStyle : "background:transparent;padding-left:20px;", border : false, items : [this.topRd, this.percentRd] }] }); this.resolutionField = new Ext.ux.form.SpinnerField({ disabled : true, fieldLabel : "Resolution", minValue : 1, value : 20, maxValue : 100, allowBlank : false, width : 40 }); this.dataPointField = new Ext.ux.form.SpinnerField({ disabled : true, fieldLabel : "Data points order", minValue : 1, value : 3, maxValue : 10, allowBlank : false, width : 40 }); this.csplineRd = new Ext.form.Radio({ disabled : true, checked : true, name : "x-spreadsheet-chart-type-spline", boxLabel : "Cubic spline", handler : this.onCSplineCheckFn, scope : this }); this.bsplineRd = new Ext.form.Radio({ disabled : true, name : "x-spreadsheet-chart-type-spline", boxLabel : "B-spline", handler : this.onBSplineCheckFn, scope : this }); this.smoothCheckbox = new Ext.form.Checkbox({ boxLabel : feyaSoft.ss.lang.smoothlines, handler : this.onSmoothCheckFn, scope : this }); this.smoothPanel = new Ext.Panel({ bodyStyle : "background:transparent;", border : false, anchor : "100%", items : [this.smoothCheckbox, { border : false, bodyStyle : "background:transparent;padding-left:20px;", layout : "column", defaults : { bodyStyle : "background:transparent;margin-bottom:2px;", border : false }, items : [{ columnWidth : 0.3, items : [this.csplineRd] }, { columnWidth : 0.7, items : [this.resolutionField] }, { columnWidth : 0.3, items : [this.bsplineRd] }, { columnWidth : 0.7, items : [this.dataPointField] }] }] }); this.sortByCheckbox = new Ext.form.Checkbox({ boxLabel : "Sort by X values", handler : this.onSortCheckFn, scope : this }); this.sortPanel = new Ext.Panel({ bodyStyle : "background:transparent;", border : false, anchor : "100%", items : [this.sortByCheckbox] }); this.centerPanel = new Ext.Panel({ region : "center", border : false, layout : "form", bodyStyle : "background:transparent;padding:5px 20px 5px 15px;", items : [{ style : "margin-bottom:5px;", anchor : "100%", height : 100, layout : "fit", items : [this.detailView] }, this.numberOfLinePanel, this.triDLookPanel, this.sharpPanel] }); Ext.ss.popup.chart.ChartTypePanel.superclass.constructor.call(this, { title : feyaSoft.ss.lang.chartType, layout : "border", bodyStyle : "background:transparent;", items : [{ border : false, region : "north", autoHeight : true, bodyStyle : "background:transparent;", html : "
" + feyaSoft.ss.lang.chooseChartType + "
" }, this.westPanel, this.centerPanel] }); this.categoryView.on("afterrender", this.onCategoryViewAfterRenderFn, this); this.detailView.on("afterrender", this.onDetailViewAfterRenderFn, this); this.sharpView.on("afterrender", this.onSharpViewAfterRenderFn, this); }; Ext.extend(Ext.ss.popup.chart.ChartTypePanel, Ext.Panel, { onNumberOfLineChangeFn : function(f, n, o) { this.sender.setting.number_of_line = this.numberOfLineField.getValue(); }, onSortCheckFn : function(checkbox, checked) { if (checked) { this.sender.setting.sort_by_x = true; } else { delete this.sender.setting.sort_by_x; } }, onTopRdCheckFn : function(radio, checked) { if (this.sender.setting.stack) { this.sender.setting.stack.pos = checked ? "top" : "percent"; } }, onTriDComboSelectFn : function(combo, rd, index) { if (this.sender.setting.look3D) { this.sender.setting.look3D.type = rd.data.id; } }, onSharpViewAfterRenderFn : function(p) { if (0 == p.getSelectionCount()) { p.select(0); } }, onDetailViewAfterRenderFn : function(p) { if (0 == p.getSelectionCount()) { p.select(0); } }, onCategoryViewAfterRenderFn : function(p) { if (0 == p.getSelectionCount()) { p.select(0); } }, onCategorySelectionChangeFn : function(dv, nodes) { if (0 < nodes.length) { var node = nodes[0]; var rd = dv.getRecord(node); var type = rd.data.type; this.sender.setting.type = type; var detailview = this.detailView; var store = detailview.getStore(); store.filterBy(function(r, id) { if (r.data.category == type) { return true; } else { return false; } }); this.onDetailViewAfterRenderFn(detailview); this.showOption.defer(10, this, [type]); } }, onDetailSelectionChangeFn : function(dv, nodes) { if (0 < nodes.length) { var node = nodes[0]; var rd = dv.getRecord(node); this.sender.setting.subtype = rd.data.type; var footer = dv.getEl().child(".x-spreadsheet-chart-footer"); footer.dom.innerHTML = rd.data.text; } }, onSharpSelectionChangeFn : function(dv, nodes) { var rd = dv.getRecord(nodes[0]); if (this.sender.setting.look3D) { this.sender.setting.look3D.shape = rd.data.id; } }, on3DLookCheckFn : function(cb, checked) { if (checked) { this.triDCombo.enable(); this.sharpViewPanel.enable(); this.sender.setting.look3D = { type : this.triDCombo.getValue() }; if (this.sharpPanel.isVisible()) { this.sender.setting.look3D.shape = this.sharpView .getSelectedRecords()[0].data.id; } } else { this.triDCombo.disable(); this.sharpViewPanel.disable(); delete this.sender.setting.look3D; } }, showOption : function(type) { this.stackPanel.hide(); this.smoothPanel.hide(); this.numberOfLinePanel.hide(); this.triDLookPanel.hide(); this.sharpPanel.hide(); if ("column" == type || "bar" == type) { this.triDLookPanel.show(); this.sharpPanel.show(); delete this.sender.setting.smooth; delete this.sender.setting.stack; delete this.sender.setting.number_of_line; delete this.sender.setting.sort_by_x; } else if ("columnline" == type) { this.numberOfLinePanel.show(); delete this.sender.setting.smooth; delete this.sender.setting.stack; delete this.sender.setting.look3D; delete this.sender.setting.sort_by_x; } else if ("net" == type) { this.stackPanel.show(); delete this.sender.setting.smooth; delete this.sender.setting.look3D; delete this.sender.setting.number_of_line; delete this.sender.setting.sort_by_x; } else if ("pie" == type) { this.triDLookPanel.show(); if (this.sender.setting.look3D) { delete this.sender.setting.look3D.shape; } delete this.sender.setting.smooth; delete this.sender.setting.stack; delete this.sender.setting.number_of_line; delete this.sender.setting.sort_by_x; } else if ("area" == type) { delete this.sender.setting.smooth; delete this.sender.setting.stack; delete this.sender.setting.number_of_line; delete this.sender.setting.sort_by_x; } else if ("line" == type) { this.stackPanel.show(); this.smoothPanel.show(); delete this.sender.setting.look3D; delete this.sender.setting.number_of_line; delete this.sender.setting.sort_by_x; } else if ("scatter" == type) { this.smoothPanel.show(); delete this.sender.setting.look3D; delete this.sender.setting.stack; delete this.sender.setting.number_of_line; } this.fireEvent("aftershowoption", this); }, onStackCheckFn : function(cb, checked) { if (checked) { this.topRd.enable(); this.percentRd.enable(); this.sender.setting.stack = { pos : this.topRd.getValue() ? "top" : "percent" }; } else { this.topRd.disable(); this.percentRd.disable(); delete this.sender.setting.stack; } }, onSmoothCheckFn : function(cb, checked) { if (checked) { this.csplineRd.enable(); this.bsplineRd.enable(); if (this.csplineRd.getValue()) { this.resolutionField.enable(); } else { this.dataPointField.enable(); } this.sender.setting.smooth = {}; if (this.csplineRd.getValue()) { this.sender.setting.smooth.type = "cubic-spline"; this.sender.setting.smooth.value = this.resolutionField .getValue(); } else { this.sender.setting.smooth.type = "b-spline"; this.sender.setting.smooth.value = this.dataPointField .getValue(); } } else { this.csplineRd.disable(); this.bsplineRd.disable(); this.resolutionField.disable(); this.dataPointField.disable(); delete this.sender.setting.smooth; } }, onCSplineCheckFn : function(cb, checked) { if (checked) { this.resolutionField.enable(); this.sender.setting.smooth = { type : "cubic-spline", value : this.resolutionField.getValue() }; } else { this.resolutionField.disable(); this.sender.setting.smooth = { type : "b-spline", value : this.dataPointField.getValue() }; } }, onBSplineCheckFn : function(cb, checked) { if (checked) { this.dataPointField.enable(); } else { this.dataPointField.disable(); } }, reset : function() { try { this.categoryView.select(0); this.detailView.select(0); this.triDLookCheckbox.reset(); this.triDCombo.reset(); } catch (e) { } }, syncSetting : function(setting) { setting = Ext.apply({}, setting); var subType = setting.subtype; var subStore = this.detailView.store; var cateStore = this.categoryView.store; var subIndex = -1, sub; for (var i = 0, len = Ext.ss.popup.chart.ChartType.length; i < len; i++) { var it = Ext.ss.popup.chart.ChartType[i]; if (it.type == subType) { subIndex = i; sub = it; break; } } if (-1 != subIndex) { var index = cateStore.find("type", sub.category); try { this.on("aftershowoption", function() { if (setting.look3D) { this.triDLookCheckbox.setValue(true); var lookType = setting.look3D.type; var shape = setting.look3D.shape; if (Ext.isDefined(shape)) { var shapeIndex = this.sharpView.store.find("id", shape); this.sharpView.select(shapeIndex); } if (Ext.isDefined(lookType)) { this.triDCombo.setValue(lookType); } } if (setting.stack) { this.stackCheckbox.setValue(true); this.topRd.setValue("top" == setting.stack.pos); } if (setting.smooth) { this.smoothCheckbox.setValue(true); if ("cubic-spline" == setting.smooth.type) { this.csplineRd.setValue(true); this.resolutionField.setValue(setting.smooth.value); } else { this.csplineRd.setValue(false); this.dataPointField.setValue(setting.smooth.value); } } if (Ext.isDefined(setting.number_of_line)) { this.numberOfLineField.setValue(setting.number_of_line); } Ext.apply(this.sender.setting, setting); }, this, { single : true }); this.categoryView.on("selectionchange", function() { subIndex = subStore.find("type", sub.type); this.detailView.select(subIndex); }, this, { single : true }); this.categoryView.select(index); } catch (e) { } } } }); Ext.ns("Ext.ss.popup.chart"); Ext.ss.popup.chart.DataRangeSelector = function(config) { Ext.apply(this, config); Ext.form.Field.prototype.msgTarget = "under"; this.rangeField = new Ext.form.TextField({ hideLabel : true, labelSeparator : "", anchor : "99%", validator : this.validator || Ext.ss.common.Mask.dataRangeValidator, allowBlank : false }); Ext.ss.popup.chart.DataRangeSelector.superclass.constructor.call(this, { iconCls : "icon_datarange_area", title : feyaSoft.ss.lang.dataRange, closable : true, closeAction : "hide", autoHeight : true, width : 400, items : [{ border : false, bodyStyle : "background:transparent;margin:8px 10px 5px 10px;", layout : "column", defaults : { border : false, bodyStyle : "background:transparent;" }, items : [{ columnWidth : 0.9, layout : "form", items : [this.rangeField] }, { columnWidth : 0.1, items : [{ xtype : "button", iconCls : "icon_window_anchorin", handler : this.anchorDataRange, scope : this }] }] }] }); this.on("show", this.onShowFn, this); this.on("hide", this.onHideFn, this); }; Ext.extend(Ext.ss.popup.chart.DataRangeSelector, Ext.Window, { manager : { register : Ext.emptyFn, unregister : Ext.emptyFn, bringToFront : Ext.emptyFn, sendToBack : Ext.emptyFn }, onShowFn : function() { var ss = this.spreadsheet; var sm = ss.sm; delete this.holdCtrl; this.preVal = this.rangeField.getValue(); sm.on("selectionchanged", this.updateDataRange, this); sm.on("selectup", this.anchorDataRange, this); Ext.EventManager.on(Ext.getBody(), "keydown", this.onBodyKeyDown, this); Ext.EventManager.on(Ext.getBody(), "keyup", this.onBodyKeyUp, this); }, onHideFn : function() { var ss = this.spreadsheet; var sm = ss.sm; sm.un("selectionchanged", this.updateDataRange, this); sm.un("selectup", this.anchorDataRange, this); Ext.EventManager.un(Ext.getBody(), "keydown", this.onBodyKeyDown, this); Ext.EventManager.un(Ext.getBody(), "keyup", this.onBodyKeyUp, this); if (this.hideCallback) { this.dataRange = this.dataRange || sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); this.hideCallback(this.rangeField.getValue(), this.dataRange); } }, onBodyKeyDown : function(e) { this.holdCtrl = e.ctrlKey; }, onBodyKeyUp : function() { delete this.holdCtrl; }, popup : function(title, range, cb, scope, format) { this.rangeFormat = format; if ("local" == format) { this.rangeField.validator = Ext.ss.common.Mask.localDataRangeValidator; } else { this.rangeField.validator = Ext.ss.common.Mask.dataRangeValidator; } title = title || feyaSoft.ss.lang.dataRange; this.setTitle(title); this.rangeField.setValue(range); if (cb) { this.hideCallback = cb.createDelegate(scope); } this.show(); }, anchorDataRange : function() { if (this.rangeField.isValid()) { this.hide(); } }, updateDataRange : function() { var ss = this.spreadsheet; var sm = ss.sm; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); this.dataRange = rt; var val = this.spreadsheet.encodeDataRange(rt, this.rangeFormat); if (this.preVal && this.holdCtrl) { val = this.preVal + "," + val; } this.rangeField.setValue(val); } }); Ext.ns("Ext.ss.popup.chart"); Ext.ss.popup.chart.DataSeriesPanel = function(config) { Ext.apply(this, config); var seriesStore = new Ext.data.SimpleStore({ fields : ["text", "name_range", "value_range"], data : [] }); this.seriesView = new Ext.DataView({ singleSelect : true, itemSelector : "div.x-spreadsheet-item", overClass : "x-spreadsheet-item-over", store : seriesStore, selectedClass : "x-spreadsheet-item-selected", tpl : new Ext.XTemplate("
{text}
"), listeners : { selectionchange : { fn : this.onSeriesSelectionChangeFn, scope : this } } }); var rangeStore = new Ext.data.SimpleStore({ fields : ["id", "text"], data : [[0, "Name"], [1, "Y-Values"]] }); this.rangeView = new Ext.DataView({ singleSelect : true, itemSelector : "div.x-spreadsheet-item", overClass : "x-spreadsheet-item-over", store : rangeStore, selectedClass : "x-spreadsheet-item-selected", tpl : new Ext.XTemplate("
{text}
"), listeners : { selectionchange : { fn : this.onRangeSelectionChangeFn, scope : this } } }); this.nameRangeField = new Ext.form.TextField({ hideLabel : true, labelSeparator : "", anchor : "99%", msgTarget : "qtip", validator : Ext.ss.common.Mask.dataRangeValidator, allowBlank : false }); this.categoryRangeField = new Ext.form.TextField({ hideLabel : true, labelSeparator : "", anchor : "99%", msgTarget : "qtip", validator : Ext.ss.common.Mask.dataRangeValidator, allowBlank : false }); this.labelPanel = new Ext.Panel({ border : false, bodyStyle : "background:transparent;margin:5px 20px 0px 15px;", html : feyaSoft.ss.lang.rangeforName }); this.popNameBtn = new Ext.Button({ iconCls : "icon_window_popup", handler : this.popupNameRange, scope : this }); this.popCategoryBtn = new Ext.Button({ iconCls : "icon_window_popup", handler : this.popupCategoryRange, scope : this }); this.removeBtn = new Ext.Button({ minWidth : 150, text : feyaSoft.lang.common.remove, handler : this.onRemoveFn, scope : this }); this.moveUpBtn = new Ext.Button({ iconCls : "icon_move_up", handler : this.onMoveUpFn, scope : this }); this.moveDownBtn = new Ext.Button({ iconCls : "icon_move_down", handler : this.onMoveDownFn, scope : this }); Ext.ss.popup.chart.DataSeriesPanel.superclass.constructor.call(this, { title : feyaSoft.ss.lang.dataSeries, border : false, layout : "border", bodyStyle : "background:transparent;", defaults : { bodyStyle : "background:transparent;", border : false }, items : [{ region : "north", html : "
" + feyaSoft.ss.lang.customizeDataForseries + "
" }, { region : "west", width : 220, bodyStyle : "background:transparent;", layout : "border", items : [{ border : false, region : "north", bodyStyle : "background:transparent;", html : "
" + feyaSoft.ss.lang.dataSeries + "
" }, { border : false, region : "center", layout : "fit", bodyStyle : "background:transparent;padding:0px 5px 5px 20px;", items : [{ bodyStyle : "overflow:auto;", items : [this.seriesView] }] }, { border : false, region : "south", bodyStyle : "background:transparent;padding:0px 5px 5px 20px;", autoHeight : true, defaults : { bodyStyle : "background:transparent;", border : false }, items : [{ border : false, layout : "hbox", items : [{ xtype : "button", minWidth : 150, text : feyaSoft.lang.common.add, handler : this.onAddFn, scope : this }, { xtype : "spacer", flex : 1 }, this.moveUpBtn] }, { border : false, bodyStyle : "background:transparent;margin-top:3px;", layout : "hbox", items : [this.removeBtn, { xtype : "spacer", flex : 1 }, this.moveDownBtn] }] }] }, { region : "center", bodyStyle : "background:transparent;", layout : "border", items : [{ border : false, region : "north", bodyStyle : "background:transparent;", html : "
" + feyaSoft.ss.lang.dataRanges + "
" }, { border : false, region : "center", layout : "fit", bodyStyle : "background:transparent;padding:0px 20px 5px 15px;", items : [{ bodyStyle : "overflow:auto;", items : [this.rangeView] }] }, { border : false, region : "south", autoHeight : true, bodyStyle : "background:transparent;", items : [this.labelPanel, { border : false, bodyStyle : "background:transparent;margin:5px 20px 0px 15px;", layout : "column", defaults : { border : false, bodyStyle : "background:transparent;" }, items : [{ columnWidth : 0.9, layout : "form", items : [this.nameRangeField] }, { columnWidth : 0.1, items : [this.popNameBtn] }] }, { border : false, bodyStyle : "background:transparent;margin:5px 20px 0px 15px;", html : feyaSoft.ss.lang.categories }, { border : false, bodyStyle : "background:transparent;margin:5px 20px 0px 15px;", layout : "column", defaults : { border : false, bodyStyle : "background:transparent;" }, items : [{ columnWidth : 0.9, layout : "form", items : [this.categoryRangeField] }, { columnWidth : 0.1, items : [this.popCategoryBtn] }] }] }] }] }); this.on("activate", this.onActivateFn, this); }; Ext.extend(Ext.ss.popup.chart.DataSeriesPanel, Ext.Panel, { saveDataRange : function() { var sender = this.sender; var drp = sender.dataRangePanel; var s = this.seriesView.getStore(); var series = s.getRange(); if (drp.rowRd.getValue()) { sender.rowSeries = series; } else { sender.colSeries = series; } }, onActivateFn : function(p) { var sender = this.sender; var setting = sender.setting; var ss = sender.spreadsheet; var drp = sender.dataRangePanel; var s = this.seriesView.getStore(); s.removeAll(); if (drp.rowRd.getValue()) { s.add(sender.rowSeries); this.rangeView.getStore().getAt(1).set("text", "X-Values"); if (sender.rowCategories) { this.categoryRangeField .setValue(ss .encodeDataRange(sender.rowCategories.data.value_range)); } else { this.categoryRangeField.reset(); } } else { s.add(sender.colSeries); this.rangeView.getStore().getAt(1).set("text", "Y-Values"); if (sender.colCategories) { this.categoryRangeField .setValue(ss .encodeDataRange(sender.colCategories.data.value_range)); } else { this.categoryRangeField.reset(); } } if (0 == this.seriesView.getSelectionCount()) { this.seriesView.select(0); } }, onSeriesSelectionChangeFn : function(dv, nodes) { if (0 < nodes.length) { var node = nodes[0]; this.seriesRd = dv.getRecord(node); this.rangeView.select(0); this.popNameBtn.enable(); this.removeBtn.enable(); var index = dv.indexOf(node); if (0 == index) { this.moveUpBtn.disable(); } else { this.moveUpBtn.enable(); } if (dv.getStore().getCount() - 1 == index) { this.moveDownBtn.disable(); } else { this.moveDownBtn.enable(); } } else { delete this.seriesRd; this.moveUpBtn.disable(); this.moveDownBtn.disable(); this.popNameBtn.disable(); this.removeBtn.disable(); this.nameRangeField.reset(); } }, onRangeSelectionChangeFn : function(dv, nodes) { if (0 < nodes.length) { var sender = this.sender; var setting = sender.setting; var ss = sender.spreadsheet; var node = nodes[0]; var rd = dv.getRecord(node); if (dv.isSelected(0)) { this.labelPanel.body.update("Range for Name"); if ("col" == setting.series_position && setting.row_label && this.seriesRd) { this.nameRangeField.setValue(ss .encodeDataRange(this.seriesRd.data.name_range)); } else if ("row" == setting.series_position && setting.col_label && this.seriesRd) { this.nameRangeField.setValue(ss .encodeDataRange(this.seriesRd.data.name_range)); } else { this.nameRangeField.reset(); } } else { this.labelPanel.body.update("Range for " + rd.data.text); if (this.seriesRd) { this.nameRangeField.setValue(ss .encodeDataRange(this.seriesRd.data.value_range)); } } } }, popupNameRange : function() { var drSelector = this.sender.spreadsheet.dataRangeSelector; var sender = this.sender; var setting = sender.setting; var ss = sender.spreadsheet; var ds = ss.ds; sender.pushdown(true); var sm = sender.spreadsheet.sm; sm.fireEvent("formulaeditingchanged", false, true, true); drSelector.popup("Select Range for Name of " + this.seriesRd.data.text + ":Area", this.nameRangeField.getValue(), function( rangeStr, range) { sender.showDataRangeBorder(); this.nameRangeField.setValue(rangeStr); if (this.rangeView.isSelected(0)) { this.seriesRd.set("name_range", range); var cell = ds.getOrignCellObj(range.minPos.x, range.minPos.y) || {}; this.seriesRd .set("text", cell.data || "Unnamed Series"); } else { this.seriesRd.set("value_range", range); if ("col" == setting.series_position && !setting.row_label) { var cell = ds.getOrignCellObj(range.minPos.x, range.minPos.y) || {}; this.seriesRd.set("text", cell.data || "Column " + ds.getLetter(range.minPos.y)); } else if ("row" == setting.series_position && !setting.col_label) { var cell = ds.getOrignCellObj(range.minPos.x, range.minPos.y) || {}; this.seriesRd.set("text", cell.data || "Row " + range.minPos.x); } } this.saveDataRange(); sender.showDataRangeBorder(true); sender.show(); sm.fireEvent("formulaeditingchanged", true, false, true); }, this); }, popupCategoryRange : function() { var drSelector = this.sender.spreadsheet.dataRangeSelector; var sender = this.sender; this.sender.pushdown(true); var sm = sender.spreadsheet.sm; sm.fireEvent("formulaeditingchanged", false, true, true); drSelector.popup("Select Range for Categories: Area", this.categoryRangeField.getValue(), function(rangeStr, range) { this.categoryRangeField.setValue(rangeStr); sender.showDataRangeBorder(); if (sender.dataRangePanel.rowRd.getValue()) { sender.rowCategories = sender.rowCategories || new this.seriesView.store.recordType({}); sender.rowCategories.data.value_range = range; } else { sender.colCategories = sender.colCategories || new this.seriesView.store.recordType({}); sender.colCategories.data.value_range = range; } this.saveDataRange(); sender.showDataRangeBorder(true); sender.show(); sm.fireEvent("formulaeditingchanged", true, false, true); }, this); }, onAddFn : function() { var sv = this.seriesView; var store = sv.getStore(); var text = "Unnamed Series1"; var index = 1; while (true) { if (-1 != store.find("text", text)) { index++; text = "Unnamed Series" + index; } else { break; } } var nrd = new store.recordType({ text : text }); store.add(nrd); sv.select(store.getCount() - 1); this.saveDataRange(); }, onRemoveFn : function() { var sender = this.sender; var sm = sender.spreadsheet.sm; var sv = this.seriesView; var store = sv.getStore(); var srds = sv.getSelectedRecords(); if (0 < srds.length) { var srd = srds[0]; var index = store.indexOf(srd); store.remove(srd); if (index < store.getCount()) { sv.select(index); } else { index--; sv.select(index); } sender.showDataRangeBorder(); this.saveDataRange(); sender.showDataRangeBorder(true); } }, onMoveUpFn : function() { var sv = this.seriesView; var store = sv.getStore(); var srds = sv.getSelectedRecords(); if (0 < srds.length) { var srd = srds[0]; var index = store.indexOf(srd) - 1; store.remove(srd); store.insert(index, srd); sv.select(index); } }, onMoveDownFn : function() { var sv = this.seriesView; var store = sv.getStore(); var srds = sv.getSelectedRecords(); if (0 < srds.length) { var srd = srds[0]; var index = store.indexOf(srd) + 1; store.remove(srd); store.insert(index, srd); sv.select(index); } }, reset : function() { } }); Ext.ns("Ext.ss.popup.chart"); Ext.ss.popup.chart.ChartSelector = function(config) { Ext.apply(this, config); this.setting = this.setting || {}; this.chartTypePanel = new Ext.ss.popup.chart.ChartTypePanel({ sender : this }); this.dataRangePanel = new Ext.ss.popup.chart.DataRangePanel({ sender : this }); this.dataSeriesPanel = new Ext.ss.popup.chart.DataSeriesPanel({ sender : this }); this.chartElementPanel = new Ext.ss.popup.chart.ChartElementPanel({ sender : this }); this.tabPanel = new Ext.TabPanel({ border : false, activeTab : 0, tabWidth : 1000, minTabWidth : 0, resizeTabs : true, layoutOnTabChange : true, deferredRender : true, items : [this.chartTypePanel, this.dataRangePanel, this.chartElementPanel] }); this.insertBtn = new Ext.Button({ iconCls : "icon_accept", text : feyaSoft.lang.common.insert, handler : this.onInsertFn, scope : this }); this.closeBtn = new Ext.Button({ iconCls : "icon_no", text : feyaSoft.lang.common.cancel, handler : this.onCloseFn, scope : this }); Ext.ss.popup.chart.ChartSelector.superclass.constructor.call(this, { iconCls : "icon_insert_chart", cls : "x-spreadsheet-chart-wizard", title : feyaSoft.ss.lang.chartWizard, width : 620, height : 365, closeAction : "hide", modal : true, resizable : false, layout : "fit", items : [this.tabPanel], buttonAlign : "center", buttons : [this.insertBtn, this.closeBtn] }); this.on("show", this.onShowFn, this); this.on("hide", this.onHideFn, this); }; Ext.extend(Ext.ss.popup.chart.ChartSelector, Ext.Window, { onShowFn : function() { this.mask.setStyle("background", "none"); this.chartTypePanel.reset(); }, onHideFn : function() { if (!this.stopHideDataRange) { this.showDataRangeBorder(); this.spreadsheet.sm.fireEvent("renderborder"); } delete this.stopHideDataRange; }, popup : function(config, chartEl) { this.show(); this.reset(); if (config) { this.initDataRange(config.span); this.existedChartEl = chartEl; this.dataRange = config.span; this.setting = Ext.apply({}, config.setting); } else { delete this.existedChartEl; this.setting = { type : "column", subtype : "column-normal", series_position : "row", row_label : false, col_label : false }; this.initDataRange(); } this.chartTypePanel.syncSetting(this.setting); this.chartElementPanel.syncSetting(this.setting); var ss = this.spreadsheet; var arr = []; for (var i = 0, len = this.dataRange.length; i < len; i++) { var it = this.dataRange[i]; arr.push(ss.encodeDataRange({ minPos : { x : it.x, y : it.y }, maxPos : { x : it.ex, y : it.ey } })); } this.dataRangePanel.syncSetting(this.setting, arr.join(",")); this.tabPanel.setActiveTab(this.chartTypePanel); }, pushdown : function(stop) { this.stopHideDataRange = stop; this.hide(); }, initDataRange : function(rt) { var ss = this.spreadsheet; var setting = this.setting || {}; var sm = ss.sm; var ds = ss.ds; if (!rt) { var res = sm .getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); rt = [{ x : res.minPos.x, y : res.minPos.y, ex : res.maxPos.x, ey : res.maxPos.y, ab : true, sheetIndex : ds.activeSheet }]; } this.dataRange = rt; this.combineDir = "y"; this.dataMatrix = ss.combineRanges(rt, this.combineDir); }, showDataRangeBorder : function(flag, saveflag) { var obj = this.flushSetting(); this.spreadsheet.sm.showDataRangeBorder(this.dataRange, flag, saveflag); return obj; }, compareRow : function(a, b) { if (a && b) { var an = a.data.name_range || a.data.value_range, bn = b.data.name_range || b.data.value_range; if (an && bn) { var arow = an.minPos.x, brow = bn.minPos.x; return arow - brow; } else { if (!an && !bn) { return 0; } else if (!an) { return -1; } else { return 1; } } } else { return 1; } }, compareCol : function(a, b) { if (a && b) { var an = a.data.name_range || a.data.value_range, bn = b.data.name_range || b.data.value_range; if (an && bn) { var acol = an.minPos.y, bcol = bn.minPos.y; return acol - bcol; } else { if (!an && !bn) { return 0; } else if (!an) { return -1; } else { return 1; } } } else { return 1; } }, flushSetting : function() { var ss = this.spreadsheet, ds = ss.ds; var obj = ds.deepClone(this.setting); return obj; }, getSetting : function() { var ds = this.spreadsheet.ds; this.chartElementPanel.saveChange(); var obj = Ext.apply({ type : "column", subtype : "column-percent" }, this.setting); var ranges = this.dataRange; if ("row" == obj.series_position) { ranges = this.rowizeRange(ranges); if ("y" == this.combineDir) { var i = j = 0; if (obj.col_label) { i++; } if (obj.row_label) { j++; } if (obj.row_label) { var it = ranges[0]; var labels = []; for (var k = i, span = it.ey - it.y + 1; k < span; k++) { var y = k + it.y; labels.push({ tabId : ds.getSheetIdByIndex(it.sheetIndex), x : it.x, y : y }); } obj.labels = labels; } if (obj.col_label) { var categories = []; for (var k = j, len = ranges.length; k < len; k++) { var it = ranges[k]; var val = ds.getCellValue(it.x, it.y, it.sheetIndex, true); val = Ext.num(val, val) || ""; categories.push({ tabId : ds.getSheetIdByIndex(it.sheetIndex), x : it.x, y : it.y, val : val }); } obj.categories = categories; } var series = []; for (var k = j, len = ranges.length; k < len; k++) { var it = ranges[k], arr = []; for (var l = i, span = it.ey - it.y + 1; l < span; l++) { var y = it.y + l, x = it.x; arr.push({ tabId : ds.getSheetIdByIndex(it.sheetIndex), x : x, y : y }); } series.push(arr); } obj.series = series; } } else { ranges = this.colizeRange(ranges); if ("y" == this.combineDir) { var i = j = 0; if (obj.col_label) { i++; } if (obj.row_label) { j++; } if (obj.col_label) { var it = ranges[0]; var labels = []; for (var k = j, span = it.ex - it.x + 1; k < span; k++) { var x = k + it.x; labels.push({ tabId : ds.getSheetIdByIndex(it.sheetIndex), x : x, y : it.y }); } obj.labels = labels; } else { delete obj.labels; } if (obj.row_label) { var categories = []; for (var k = i, len = ranges.length; k < len; k++) { var it = ranges[k]; var val = ds.getCellValue(it.x, it.y, it.sheetIndex, true); val = Ext.num(val, val) || ""; categories.push({ tabId : ds.getSheetIdByIndex(it.sheetIndex), x : it.x, y : it.y, val : val }); } obj.categories = categories; } else { delete obj.categories; } var series = []; for (var k = i, len = ranges.length; k < len; k++) { var it = ranges[k], arr = []; for (var l = j, span = it.ex - it.x + 1; l < span; l++) { var y = it.y, x = it.x + l; arr.push({ tabId : ds.getSheetIdByIndex(it.sheetIndex), x : x, y : y }); } series.push(arr); } obj.series = series; } } return obj; }, rowizeRange : function(ranges) { var arr = []; for (var k = 0, len = ranges.length; k < len; k++) { var it = ranges[k]; for (var i = it.x; i <= it.ex; i++) { arr.push({ ab : it.ab, sheetIndex : it.sheetIndex, x : i, ex : i, y : it.y, ey : it.ey }); } } return arr; }, colizeRange : function(ranges) { var arr = []; for (var k = 0, len = ranges.length; k < len; k++) { var it = ranges[k]; for (var i = it.y; i <= it.ey; i++) { arr.push({ ab : it.ab, sheetIndex : it.sheetIndex, x : it.x, ex : it.ex, y : i, ey : i }); } } return arr; }, onInsertFn : function() { var dpRang = this.dataRangePanel.rangeField; if (dpRang.isValid()) { var ss = this.spreadsheet; var ds = ss.ds; var setting = this.getSetting(); setting.data = this.dataMatrix; this.onCloseFn(); ss.chartManager.addChart(undefined, setting, "chart", this.dataRange, this.existedChartEl); ds.saveActiveSheet(true); ds.saveExtraInfo(); } }, onCloseFn : function() { this.hide(); }, reset : function() { if (this.chartTypePanel.reset) { this.chartTypePanel.reset(); } if (this.dataRangePanel.reset) { this.dataRangePanel.reset(); } if (this.chartElementPanel.reset) { this.chartElementPanel.reset(); } } }); Ext.ss.popup.chart.ChartCatalog = [{ text : feyaSoft.ss.lang.column, type : "column", icon : "column.png" }, { text : feyaSoft.ss.lang.bar, type : "bar", icon : "bar.png" }, { text : feyaSoft.ss.lang.pie, type : "pie", icon : "pie.png" }, { text : feyaSoft.ss.lang.area, type : "area", icon : "area.png" }, { text : feyaSoft.ss.lang.line, type : "line", icon : "line.png" }, { text : feyaSoft.ss.lang.xyscatter, type : "scatter", icon : "scatter.png" }]; Ext.ss.popup.chart.ChartType = [{ text : feyaSoft.ss.lang.normal, type : "column-normal", category : "column", icon : "Column - Normal.png" }, { text : feyaSoft.ss.lang.percentStacked, type : "column-percent", category : "column", icon : "Column - Percent Stacked.png" }, { text : feyaSoft.ss.lang.stacked, type : "column-stacked", category : "column", icon : "Column - Stacked.png" }, { text : feyaSoft.ss.lang.normal, type : "bar-normal", category : "bar", icon : "Bar - Normal.png" }, { text : feyaSoft.ss.lang.percentStacked, type : "bar-percent", category : "bar", icon : "Bar - Percent Stacked.png" }, { text : feyaSoft.ss.lang.stacked, type : "bar-stacked", category : "bar", icon : "Bar - Stacked.png" }, { text : feyaSoft.ss.lang.normal, type : "pie-normal", category : "pie", icon : "Pie - Normal.png" }, { text : feyaSoft.ss.lang.exploded, type : "pie-exploded-pie", category : "pie", icon : "Pie - Exploded Pie Chart.png" }, { text : feyaSoft.ss.lang.donut, type : "pie-donut", category : "pie", icon : "Pie - Donut.png" }, { text : feyaSoft.ss.lang.explodedDonut, type : "pie-exploded-donut", category : "pie", icon : "Pie - Exploded Donut Chart.png" }, { text : feyaSoft.ss.lang.normal, type : "area-normal", category : "area", icon : "Area - Normal.png" }, { text : feyaSoft.ss.lang.stacked, type : "area-stacked", category : "area", icon : "Area - Stacked.png" }, { text : feyaSoft.ss.lang.percentStacked, type : "area-percent", category : "area", icon : "Area - Percent Stacked.png" }, { text : feyaSoft.ss.lang.normal, type : "line-normal", category : "line", icon : "Line - Points and Lines.png" }, { text : feyaSoft.ss.lang.lineOnly, type : "line-lineonly", category : "line", icon : "Line - Lines Only.png" }, { text : feyaSoft.ss.lang.pointOnly, type : "line-pointonly", category : "line", icon : "Line - Points Only.png" }, { text : feyaSoft.ss.lang['3D'], type : "line-3d", category : "line", icon : "Line - 3D Lines.png" }, { text : feyaSoft.ss.lang.normal, type : "scatter-pointonly", category : "scatter", icon : "XY - Points Only.png" }, { text : feyaSoft.ss.lang.pointLine, type : "scatter-pointline", category : "scatter", icon : "XY - Points and Lines.png" }, { text : feyaSoft.ss.lang.lineOnly, type : "scatter-lineonly", category : "scatter", icon : "XY - Lines Only.png" }, { text : feyaSoft.ss.lang['3D'], type : "scatter-3d", category : "scatter", icon : "XY - 3D Lines.png" }, { text : feyaSoft.ss.lang.normal, type : "bubble-normal", category : "bubble", icon : "Bubble - Bubble Chart.png" }, { text : feyaSoft.ss.lang.normal, type : "net-normal", category : "net", icon : "Net - Points and Lines.png" }, { text : feyaSoft.ss.lang.lineOnly, type : "net-lineonly", category : "net", icon : "Net - Lines Only.png" }, { text : feyaSoft.ss.lang.pointOnly, type : "net-pointonly", category : "net", icon : "Net - Points Only.png" }, { text : "Stock 1", type : "stock-1", category : "stock", icon : "Stock - Stock Chart 1.png" }, { text : "Stock 2", type : "stock-2", category : "stock", icon : "Stock - Stock Chart 2.png" }, { text : "Stock 3", type : "stock-3", category : "stock", icon : "Stock - Stock Chart 3.png" }, { text : "Stock 4", type : "stock-4", category : "stock", icon : "Stock - Stock Chart 4.png" }, { text : feyaSoft.ss.lang.normal, type : "columnline-normal", category : "columnline", icon : "Column and Line - Columns and Lines.png" }, { text : feyaSoft.ss.lang.stacked, type : "columnline-stacked", category : "columnline", icon : "Column and Line - Stacked Columns and Lines.png" }]; Ext.ns("Ext.ss.popup"); Ext.ss.popup.CommentTip = Ext.extend(Ext.Tip, { initComponent : function() { Ext.ss.popup.CommentTip.superclass.initComponent.call(this); this.elements += ",header"; }, onMouseMove : function(e) { var ss = this.spreadsheet; var ds = ss.ds; var xy = e.getXY(); var pos = ds.getPosFromXY(xy[0], xy[1]); if (pos) { var sflag = false; var x = pos.x, y = pos.y; if (0 < pos.x && 0 < pos.y) { var cell = ds.getCell(pos.x, pos.y); if (cell.wrap) { x = cell.wrap.minx; y = cell.wrap.miny; cell = ds.getCell(x, y); } if (cell.comment && "" != cell.comment) { var title = ds.getHeadText(y).data + x; var text = "
" + cell.comment + "
"; this.setTitle(title); if (this.rendered) { this.body.update(text); } else { this.html = text; } xy[0] += 10; xy[1] += 10; this.showAt(xy); sflag = true; } } if (!sflag) { this.hide(); } } } }); Ext.ss.CommentEditor = function(config) { Ext.apply(this, config); this.commentArea = new Ext.form.TextArea({ style : "white-space:normal;line-height:13px;", allowBlank : false }); this.cancelBtn = new Ext.Button({ iconCls : "icon_no", text : "Cancel", minWidth : 80, handler : this.onCancelFn, scope : this }); this.applyBtn = new Ext.Button({ iconCls : "icon_accept", text : "OK", minWidth : 80, handler : this.onApplyFn, scope : this }); Ext.ss.CommentEditor.superclass.constructor.call(this, { border : false, width : 300, height : 200, modal : true, closeAction : "hide", layout : "fit", items : [this.commentArea], buttons : [this.applyBtn, this.cancelBtn] }); }; Ext.extend(Ext.ss.CommentEditor, Ext.Window, { show : function(type) { var ss = this.spreadsheet; var sm = ss.sm; var ds = ss.ds; var focusCell = sm.focusCell; var x = focusCell.x, y = focusCell.y; var title = ds.getHeadText(y).data + x; if (Ext.ss.CONST.Comment.ADD === type) { this.setTitle(title + ": add comment"); this.commentArea.reset(); } else if (Ext.ss.CONST.Comment.EDIT === type) { this.setTitle(title + ": edit comment"); this.commentArea .setValue(ss.ds.getCell(x, y).comment || ""); } Ext.ss.CommentEditor.superclass.show.call(this); }, onApplyFn : function() { if (this.commentArea.isValid()) { var ss = this.spreadsheet; var ds = ss.ds; var sm = ss.sm; var focusCell = sm.focusCell; var x = focusCell.x, y = focusCell.y; var cels = ss.getCellHEls(x, y); if (cels) { for (var i = 0, len = cels.length; i < len; i++) { var cEl = Ext.get(cels[i]); cEl.addClass("x-spreadsheet-comment-cell"); } } ds.addCommentFn(x, y, this.commentArea.getValue()); ds.trace(feyaSoft.ss.lang.action_comment(ds .getNameFromPos(focusCell))); this.hide(); } }, onCancelFn : function() { this.hide(); } }); Ext.ns("Ext.ss.popup"); Ext.ss.popup.LookupWin = function(config) { this.searchpanel = new Ext.ss.SearchPanel(config); this.replacepanel = new Ext.ss.ReplacePanel(config); this.tabpanel = new Ext.TabPanel({ border : false, activeTab : 0, deferredRender : false, resizeTabs : true, tabWidth : 200, minTabWidth : 0, layoutOnTabChange : true, hideMode : "offsets", items : [this.searchpanel, this.replacepanel] }); Ext.ss.popup.LookupWin.superclass.constructor.call(this, { title : "Find and Replace", width : 400, height : 200, closeAction : "hide", layout : "fit", items : [this.tabpanel] }); this.on("show", this._onShow, this); }; Ext.extend(Ext.ss.popup.LookupWin, Ext.Window, { manager : { register : Ext.emptyFn, unregister : Ext.emptyFn, bringToFront : Ext.emptyFn, sendToBack : Ext.emptyFn }, _onShow : function() { var tab = this.tabpanel.getActiveTab(); if (tab) { tab.focus(); } } }); Ext.ss.SearchPanel = function(config) { var lanss = feyaSoft.ss.lang; Ext.apply(this, config); this.targetCombo = new Ext.form.ComboBox({ fieldLabel : lanss.target, store : Ext.ss.common.Mask.getTargetStore(config), displayField : "text", valueField : "text", typeAhead : true, mode : "local", triggerAction : "all", selectOnFocus : true, msgTarget : "qtip", anchor : "95%", minChars : 1, allowBlank : false }); this.findAllBtn = new Ext.Button({ iconCls : "icon_search", minWidth : 80, text : lanss.findAll, handler : this.onFindAllFn, scope : this }); this.findLastBtn = new Ext.Button({ iconCls : "icon_search", minWidth : 80, text : lanss.findLast, handler : this.onFindLastFn, scope : this }); this.findNextBtn = new Ext.Button({ iconCls : "icon_search", minWidth : 80, text : lanss.findNext, handler : this.onFindNextFn, scope : this }); this.closeBtn = new Ext.Button({ iconCls : "icon_close", minWidth : 80, text : "Close", handler : this.onCloseFn, scope : this }); this.buttons = [this.findLastBtn, this.findNextBtn, this.closeBtn]; Ext.ss.SearchPanel.superclass.constructor.call(this, { border : false, labelWidth : 50, bodyStyle : "padding:10px", title : lanss.find, layout : "form", items : [this.targetCombo] }); }; Ext.extend(Ext.ss.SearchPanel, Ext.Panel, { focus : function() { this.targetCombo.focus(); }, onFindAllFn : function() { }, onFindLastFn : function() { if (this.targetCombo.isValid()) { var target = this.targetCombo.getRawValue(); if (!this.target || this.target !== target || this.activeSheet != this.spreadsheet.ds.activeSheet) { this.target = target; this.targetLinks = this.findTargets(target); this.cursor = this.targetLinks.length; } if (0 === this.targetLinks.length) { this.setTitle(feyaSoft.ss.lang.find + " [" + feyaSoft.word.lang.nomatch + "]"); } else { this.setTitle(feyaSoft.ss.lang.find); if (0 <= this.cursor) { this.cursor--; if (0 > this.cursor) { this.cursor = this.targetLinks.length - 1; } var link = this.targetLinks[this.cursor]; this.spreadsheet.sm.setFocusCell(link.x, link.y); } } } }, onFindNextFn : function() { if (this.targetCombo.isValid()) { var target = this.targetCombo.getRawValue(); if (!this.target || this.target !== target || this.activeSheet != this.spreadsheet.ds.activeSheet) { this.target = target; this.cursor = -1; this.targetLinks = this.findTargets(target); } if (0 === this.targetLinks.length) { this.setTitle(feyaSoft.ss.lang.find + " [" + feyaSoft.word.lang.nomatch + "]"); } else { this.setTitle(feyaSoft.ss.lang.find); if (this.cursor < this.targetLinks.length) { this.cursor++; if (this.cursor == this.targetLinks.length) { this.cursor = 0; } var link = this.targetLinks[this.cursor]; this.spreadsheet.sm.setFocusCell(link.x, link.y); } } } }, findTargets : function(target) { var ss = this.spreadsheet; var ds = ss.ds; this.activeSheet = ds.activeSheet; return ds.findTargets(target); }, onCloseFn : function() { this.ownerCt.ownerCt.hide(); } }); Ext.ss.ReplacePanel = function(config) { var lanss = feyaSoft.ss.lang; Ext.apply(this, config); this.targetCombo = new Ext.form.ComboBox({ fieldLabel : lanss.target, store : Ext.ss.common.Mask.getTargetStore(config), displayField : "text", valueField : "text", typeAhead : true, mode : "local", triggerAction : "all", selectOnFocus : true, anchor : "95%", minChars : 1, allowBlank : false }); this.replaceField = new Ext.form.TextField({ fieldLabel : lanss.replaceWith, anchor : "95%" }); this.replaceAllBtn = new Ext.Button({ minWidth : 80, text : lanss.replaceAll, handler : this.onReplaceAllFn, scope : this }); this.replaceBtn = new Ext.Button({ minWidth : 80, text : lanss.replaceNext, handler : this.onReplaceNextFn, scope : this }); this.closeBtn = new Ext.Button({ iconCls : "icon_close", minWidth : 80, text : "Close", handler : this.onCloseFn, scope : this }); this.buttons = [this.replaceAllBtn, this.replaceBtn, this.closeBtn]; Ext.ss.ReplacePanel.superclass.constructor.call(this, { border : false, labelWidth : 100, bodyStyle : "padding:10px", title : lanss.replace, layout : "form", items : [this.targetCombo, this.replaceField] }); }; Ext.extend(Ext.ss.ReplacePanel, Ext.Panel, { focus : function() { this.targetCombo.focus(); }, onReplaceAllFn : function() { if (this.targetCombo.isValid()) { var lanss = feyaSoft.ss.lang; var retext = this.replaceField.getValue() || ""; var ss = this.spreadsheet, ds = ss.ds; var target = this.targetCombo.getRawValue(); if (!this.target || this.target !== target) { this.target = target; this.cursor = -1; this.targetLinks = this.findTargets(target); } var link; var len = this.targetLinks.length; while (this.cursor < len - 1) { this.cursor++; link = this.targetLinks[this.cursor]; var data = link.data; var re = new RegExp(Ext.escapeRe(target), "gi"); data = data.replace(re, retext); ss.setInnerText(data, link.x, link.y); } if (0 < len) { link = this.targetLinks[len - 1]; ss.sm.setFocusCell(link.x, link.y); var sheet = ds.sheets[ds.activeSheet]; ds.trace(lanss.replace + " " + lanss.all + " \"" + target + "\" " + lanss['with'] + " \"" + retext + "\" " + lanss['in'] + " \"" + sheet.name + "\""); } } }, onReplaceNextFn : function() { if (this.targetCombo.isValid()) { var lanss = feyaSoft.ss.lang; var retext = this.replaceField.getValue() || ""; var ss = this.spreadsheet, ds = ss.ds; var target = this.targetCombo.getRawValue(); if (!this.target || this.target !== target) { this.target = target; this.cursor = -1; this.targetLinks = this.findTargets(target); } var len = this.targetLinks.length; if (0 < len && this.cursor < len) { this.cursor++; if (this.cursor == len) { this.cursor = 0; } var link = this.targetLinks[this.cursor]; ss.sm.setFocusCell(link.x, link.y); var data = link.data; var re = new RegExp(Ext.escapeRe(target), "gi"); data = data.replace(re, retext); ss.setInnerText(data, link.x, link.y); ds.trace(lanss.replace + " \"" + target + "\" " + lanss['with'] + " \"" + retext + "\" " + lanss.at + " " + ds.getNameFromPos(link)); } } }, findTargets : function(target) { var ss = this.spreadsheet; var ds = ss.ds; return ds.findTargets(target); }, onCloseFn : function() { this.ownerCt.ownerCt.hide(); } }); Ext.ns("Ext.ss.popup"); Ext.ss.popup.AddSheetWin = function(config) { Ext.apply(this, config); this.nameField = new Ext.form.TextField({ fieldLabel : "名称", allowBlank : false, anchor : "95%", ss : this.spreadsheet, validator : this.sheetNameValidator }); this.firstRadio = new Ext.form.Radio({ name : "insert-position", boxLabel : "作为第一个表格插入", anchor : "95%" }); this.beforeRadio = new Ext.form.Radio({ name : "insert-position", boxLabel : "插入活动表格之前", anchor : "95%" }); this.afterRadio = new Ext.form.Radio({ name : "insert-position", boxLabel : "插入活动表格之后", anchor : "95%" }); this.lastRadio = new Ext.form.Radio({ name : "insert-position", boxLabel : "作为最后表格插入", checked : true, anchor : "95%" }); this.formPanel = new Ext.form.FormPanel({ border : false, frame : true, labelWidth : 60, style : "background:transparent;padding:10px;", items : [this.nameField, this.firstRadio, this.beforeRadio, this.afterRadio, this.lastRadio] }); this.applyBtn = new Ext.Button({ iconCls : "icon_accept", text : "确认", minWidth : 75, handler : this.onApplyFn, scope : this }); this.closeBtn = new Ext.Button({ iconCls : "icon_no", text : "取消", minWidth : 75, handler : this.onCloseFn, scope : this }); Ext.ss.popup.AddSheetWin.superclass.constructor.call(this, { title : "添加新表", width : 400, height : 250, closeAction : "hide", modal : true, layout : "fit", items : [this.formPanel], buttons : [this.applyBtn, this.closeBtn] }); }; Ext.extend(Ext.ss.popup.AddSheetWin, Ext.Window, { sheetNameValidator : function(v) { var ds = this.ss.ds; if (ds.findSheetName(v)) { return feyaSoft.ss.lang.nameDuplicated; } else { if (/[\+\-\*\/\%\)\(\{\}\[\]\\]+/gi.test(v)) { return feyaSoft.ss.lang.nameInvalid; } return true; } }, onApplyFn : function() { if (this.formPanel.getForm().isValid()) { var name = this.nameField.getValue(); var pos; if (this.firstRadio.getValue()) { pos = "first"; } else if (this.beforeRadio.getValue()) { pos = "before"; } else if (this.afterRadio.getValue()) { pos = "after"; } else { pos = "last"; } var ss = this.spreadsheet; if (this.bindSheet) { ss.copySheet(name, pos, this.bindSheet.index); } else { ss.addSheet(name, pos); } this.onCloseFn(); } }, onCloseFn : function() { this.hide(); }, popup : function(config) { var ss = this.spreadsheet; var ds = ss.ds; if (config) { if (config.title) { this.setTitle(config.title); } this.bindSheet = config.bindSheet; } else { delete this.bindSheet; } var name; if (this.bindSheet) { var oldName = this.bindSheet.name; name = oldName + "_1"; var index = 1; while (true) { if (ds.findSheetName(name)) { index++; name = oldName + "_" + index; } else { break; } } } else { name = "Sheet1"; var index = 1; while (true) { if (ds.findSheetName(name)) { index++; name = "Sheet" + index; } else { break; } } } this.nameField.setValue(name); this.show(); } }); Ext.ns("Ext.ss.popup"); Ext.ss.popup.NameRangeWin = Ext.extend(Ext.Window, { layout : "border", initComponent : function() { this.nameField = new Ext.form.TextField({ hideLabel : true, msgTarget : "qtip", allowBlank : false, anchor : "100%" }); this.grid = new Ext.grid.GridPanel({ hideHeaders : true, bodyStyle : "border-left:none;border-right:none;", region : "center", store : new Ext.data.ArrayStore({ fields : ["name", "coord", "coordArr"], data : [] }), columns : [{ dataIndex : "name" }, { dataIndex : "coord" }], viewConfig : { forceFit : true } }); this.rangeField = new Ext.form.TextField({ hideLabel : true, labelSeparator : "", anchor : "100%", flex : 1, validator : Ext.ss.common.Mask.dataRangeValidator, allowBlank : false }); this.items = [{ xtype : "container", region : "north", autoHeight : true, style : "padding:10px 20px 15px 20px;", layout : "form", items : [{ xtype : "box", html : feyaSoft.ss.lang.nameRange, height : 25 }, this.nameField] }, this.grid, { xtype : "container", region : "south", autoHeight : true, style : "padding:10px 20px;", layout : "hbox", items : [this.rangeField, { xtype : "box", width : 5 }, { xtype : "button", iconCls : "icon_window_popup", handler : this.popupDataRange, scope : this }] }]; this.deleteBtn = new Ext.Button({ text : feyaSoft.ss.lang['delete'], disabled : true, handler : this.onDelete, scope : this }); this.buttons = [{ text : feyaSoft.ss.lang.add, handler : this.onAdd, scope : this }, this.deleteBtn, { text : feyaSoft.ss.lang.close, handler : this._onClose, scope : this }]; Ext.ss.popup.NameRangeWin.superclass.initComponent.call(this); var sm = this.grid.getSelectionModel(); this.mon(sm, { scope : this, selectionchange : this.onSelectionChange }); }, parseStr2Coord : function(str) { var ds = this.spreadsheet.ds; var parts = str.split(","); var arr = []; for (var i = 0, len = parts.length; i < len; i++) { arr.push(ds.parseText2Pos(parts[i])); } return arr; }, popupDataRange : function() { var me = this; var ss = this.spreadsheet; var ds = ss.ds; var drSelector = ss.dataRangeSelector; me.hide(); drSelector.popup(null, this.rangeField.getValue(), function(range) { this.rangeField.setValue(range); var arr = me.parseStr2Coord(range); me.initDataRange(arr); me.show(); }, this); }, initDataRange : function(rt) { var ss = this.spreadsheet; var sm = ss.sm; var ds = ss.ds; if (!rt) { var res = sm .getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); rt = [{ x : res.minPos.x, y : res.minPos.y, ex : res.maxPos.x, ey : res.maxPos.y, ab : true, sheetIndex : ds.activeSheet }]; } for (var i = 0, len = rt.length; i < len; i++) { rt[i].ab = true; } this.dataRange = rt; }, popup : function() { this.nameChanged = false; var ss = this.spreadsheet; var sm = ss.sm, ds = ss.ds; var nameRanges = ds.fileExtraInfo.nameRanges; this.initNameRanges(nameRanges); var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); this.initDataRange(); var val = ss.encodeDataRange(rt, this.rangeFormat); this.nameField.reset(); this.rangeField.setValue(val); this.show(); }, initNameRanges : function(nameRanges) { var store = this.grid.getStore(); store.removeAll(); if (nameRanges) { for (var i = 0, len = nameRanges.length; i < len; i++) { var it = nameRanges[i]; var rec = new store.recordType(it); store.add(rec); } } }, onAdd : function() { var ss = this.spreadsheet; var ds = ss.ds; if (this.nameField.isValid() && this.rangeField.isValid()) { var name = this.nameField.getValue(); if (!this.checkNameValid(name)) { return; } var coord = this.rangeField.getValue(); var arr = this.parseStr2Coord(coord); this.initDataRange(arr); var store = this.grid.getStore(); var rec = new store.recordType({ name : name, coord : coord, coordArr : ds.deepClone(this.dataRange) }); store.add([rec]); this.nameChanged = true; this.nameField.reset(); } }, checkNameValid : function(name) { var upper = name.toUpperCase(); var ds = this.spreadsheet.ds; var fbox = Ext.ss.FunctionBox; if (!/[a-zA-Z0-9_]+/gi.test(name) || /^[0-9]/gi.test(name) || /\s/gi.test(name)) { Ext.Msg.alert(feyaSoft.ss.lang.hint, feyaSoft.ss.lang.letterNumber); return false; } if (name.length > 250) { Ext.Msg.alert(feyaSoft.ss.lang.hint, feyaSoft.ss.lang.long250); return false; } if (fbox[name]) { Ext.Msg.alert(feyaSoft.ss.lang.hint, feyaSoft.ss.lang.reservedWord); return false; } else { var consts = Ext.ss.CONST.JS_RESERVED_WORD; var reservedFlag = false; for (var i = 0, len = consts.length; i < len; i++) { if (name == consts[i]) { reservedFlag = true; break; } } if (!reservedFlag) { try { reservedFlag = eval("var " + name + "=false;"); } catch (e) { reservedFlag = true; } } if (reservedFlag) { Ext.Msg.alert(feyaSoft.ss.lang.hint, feyaSoft.ss.lang.reservedWord); return false; } } var reg = ds.posReg; var newName = name.replace(reg, function(w) { if (w == name) { try { var pos = ds.parseText2Pos(w); if (pos.x == pos.ex && pos.y == pos.ey) { if (pos.y <= 256) { return ""; } } else { return ""; } } catch (e) { return w; } } return w; }); if (name != newName) { Ext.Msg.alert(feyaSoft.ss.lang.hint, feyaSoft.ss.lang.likeReferenceRange); return false; } var store = this.grid.getStore(); var existed = false; store.each(function(rd) { var text = rd.data.name.toUpperCase(); if (text == upper) { existed = true; return false; } }); if (existed) { Ext.Msg.alert(feyaSoft.ss.lang.hint, feyaSoft.ss.lang.nameExisted); return false; } return true; }, _onClose : function() { if (this.nameChanged) { var ss = this.spreadsheet, ds = ss.ds; var store = this.grid.getStore(); var recs = store.getRange(); var arr = []; for (var i = 0, len = recs.length; i < len; i++) { var rec = recs[i]; arr.push(Ext.apply({}, rec.data)); } ds.fileExtraInfo.nameRanges = arr; if (!ds.disableCallingBackEnd) { try { ds.saveFileExtraInfo(function() { delete ds.formulaRelatedMap; ds.onCheckFormulaFn(); }); } catch (err) { Ext.MessageBox.alert(feyaSoft.ss.lang.hint, "Save name to the backend server failed."); } } } this.hide(); }, onSelectionChange : function(sm) { var sels = sm.getSelections(); if (0 < sels.length) { this.deleteBtn.enable(); } else { this.deleteBtn.disable(); } }, onDelete : function() { var sm = this.grid.getSelectionModel(); var store = this.grid.getStore(); var sels = sm.getSelections(); if (0 < sels.length) { store.remove(sels); this.nameChanged = true; } } }); Ext.ns("Ext.ss.popup"); Ext.ss.popup.HyperlinkTip = Ext.extend(Ext.Tip, { initComponent : function() { Ext.apply(this, { style : "z-index:5000", tools : [{ id : "close", handler : this.hideLinkFn, scope : this }] }); Ext.ss.popup.HyperlinkTip.superclass.initComponent.call(this); this.elements += ",header"; this.on("show", function() { this.body.on("mousedown", this.__onMousedownFn, this); }, this, { single : true }); }, showLink : function(e) { var self = this, ss = self.spreadsheet, ds = ss.ds, sm = ss.sm, sview = ss.sview; var sviewBox = sview.getBox(); var flag = true; if (e) { var pageXY = e.getXY(); flag = (pageXY[0] > 40 && pageXY[0] < sviewBox.right - 17) && pageXY[1] > sviewBox.y + 20 && pageXY[1] < sviewBox.bottom - 20; } var focusCell = sm.focusCell; var x = focusCell.x, y = focusCell.y; var cell = ds.getCell(x, y); var hyperlink = cell.hyperlink; if (hyperlink && flag) { var cels = ss.getCellHEls(x, y); if (cels) { self.setTitle("Go to link:"); var cEl = Ext.get(cels[0]); var cBox = cEl.getBox(); var text = "
"; if (self.rendered) { self.body.update(text); } else { self.html = text; } this.showAt([cBox.x, cBox.y + cBox.height + 3]); } } else { this.hide(); } }, __onMousedownFn : function(e) { var target = e.getTarget(); if (target.tagName == "SPAN") { var self = this, ss = self.spreadsheet, ds = ss.ds, sm = ss.sm; var focusX = target.getAttribute("focusx"), focusY = target .getAttribute("focusy"); if (target.parentNode.className == "x-spreadsheet-hyperlink-url") { var hyperlink = target.getAttribute("hyperlink") || target.innerHTML; hyperlink = hyperlink.replace(/\$/g, ""); if (/[a-z]+[0-9]+$/i.test(hyperlink) == true) { var sheets = ds.sheets; var hks = hyperlink.match(/(.*)!(.*):{0,1}(.*)*/i); for (var i = 0, len = sheets.length; i < len; i++) { var sheet = sheets[i]; if (hks[1] == sheet.name || hks[1] == "'" + sheet.name + "'") { var pos = ds.parseText2Pos(hks[2]); if (ds.activeSheet != i) { ss.changeSheet(i); } (function () { sm.setFocusCell(pos.x, pos.y, true); }).defer(30); break; } } } else { if (hyperlink.indexOf("http://") == -1) { hyperlink = "http://" + hyperlink; } window.open(hyperlink); } } else { var cels = ss.getCellHEls(focusX, focusY); if (cels) { for (var i = 0, len = cels.length; i < len; i++) { var td = cels[i]; var cEl = Ext.get(td); cEl.removeClass(Ext.ss.CONST.cssHash[4]); var ctd = cEl.child("td." + Ext.ss.CONST.cssHash[4], true); if (ctd) { ctd.className = ctd.className.replace( Ext.ss.CONST.cssHash[4], ""); } } } ds.deleteHyperlinkFn(focusX, focusY); ds.trace(feyaSoft.ss.lang.action_delete_hyperlink(ds .getLetter(focusY) + focusX)); } self.hide(); } }, hideLinkFn : function() { this.hide(); } }); Ext.ss.HyperlinkWin = function(config) { Ext.apply(this, config); var sl = feyaSoft.ss.lang; this.displayText = new Ext.form.TextField({ fieldLabel : sl.displayText, style : "margin-bottom:5px;", anchor : "100%" }); this.typeRadioGroup = new Ext.form.RadioGroup({ hideLabel : true, style : "height:22px;padding:0px;", items : [{ boxLabel : sl.webPage, name : "type-radio", checked : true, inputValue : "web" }, { boxLabel : sl.documentLocation, name : "type-radio", inputValue : "doc" }], listeners : { change : { fn : this.typeRadioChangeFn, scope : this } } }); this.webpageUrl = new Ext.form.TextField({ hideLabel : true, allowBlank : false, msgTarget : "title", validator : Ext.ss.common.Helper.validateURLWithErrorMsg, anchor : "100%" }); this.rangeField = new Ext.form.TextField({ hideLabel : true, msgTarget : "under", validator : function(v) { return /\!(\$)?[a-z]+(\$)?[0-9]+/gi.test(v) || "The format should like: \"A1:B10\" or \"A1\""; }, allowBlank : false, width : 310 }); this.cancelBtn = new Ext.Button({ iconCls : "icon_no", text : sl.cancel, minWidth : 80, handler : this.onCancelFn, scope : this }); this.applyBtn = new Ext.Button({ iconCls : "icon_accept", text : sl.ok, minWidth : 80, handler : this.onApplyFn, scope : this }); this.rangeContainer = new Ext.Container({ anchor : "100%", autoHeight : true, style : "margin:8px 0px 8px 0px;", layout : "hbox", items : [this.rangeField, { xtype : "box", width : 5 }, { xtype : "button", iconCls : "icon_window_popup", handler : this.popupDataRange, scope : this }] }); this.noteLabel = new Ext.form.Label; Ext.ss.HyperlinkWin.superclass.constructor.call(this, { title : feyaSoft.ss.lang.hyperlink, border : false, width : 420, height : 227, modal : true, closeAction : "hide", iconCls : "icon_link", layout : "fit", items : [{ layout : "form", labelAlign : "top", frame : true, bodyStyle : "padding:5px 5px 5px 5px;", items : [this.displayText, this.typeRadioGroup, this.webpageUrl, this.rangeContainer, this.noteLabel] }], buttons : [this.applyBtn, this.cancelBtn] }); }; Ext.extend(Ext.ss.HyperlinkWin, Ext.Window, { popup : function(type) { var ss = this.spreadsheet; var sm = ss.sm; var ds = ss.ds; var focusCell = sm.focusCell; var x = focusCell.x, y = focusCell.y; var title = ds.getHeadText(y).data + x; this.setTitle(feyaSoft.ss.lang.hyperlink + "(" + title + ")"); var cell = ds.getCell(x, y); var hyperlink = cell.hyperlink; var isFormula = Ext.ss.common.Mask.isFormula(cell['origin-data']); this.displayText.setValue(Ext.util.Format.htmlDecode(ss.getInnerText(x, y))); if (isFormula) { this.displayText.setDisabled(true); } else { this.displayText.setDisabled(false); } this.webpageUrl.reset(); this.rangeField.reset(); if (/\!(\$)?[a-z]+(\$)?[0-9]+/gi.test(hyperlink) == true) { this.typeRadioGroup.setValue("doc"); this.typeRadioChangeFn(this.typeRadioGroup, { inputValue : "doc" }); this.rangeField.setValue(hyperlink); } else { this.typeRadioGroup.setValue("web"); this.typeRadioChangeFn(this.typeRadioGroup, { inputValue : "web" }); this.webpageUrl.setValue(hyperlink || "http://"); } Ext.ss.HyperlinkWin.superclass.show.call(this); }, onApplyFn : function() { var box = this.typeRadioGroup.getValue(); var valueFiled = this.webpageUrl; if (box.inputValue == "doc") { valueFiled = this.rangeField; } if (valueFiled.isValid()) { var ss = this.spreadsheet; var ds = ss.ds; var sm = ss.sm; var focusCell = sm.focusCell; var x = focusCell.x, y = focusCell.y; var data = Ext.util.Format.htmlEncode(this.displayText.getValue() || valueFiled.getValue()); var cels = ss.getCellHEls(x, y); if (cels) { for (var i = 0, len = cels.length; i < len; i++) { var td = cels[i]; var cEl = Ext.get(td); cEl.addClass(Ext.ss.CONST.cssHash[4]); td.innerHTML = data; } ds.addHyperlinkFn(x, y, valueFiled.getValue(), data); ds.trace(feyaSoft.ss.lang.action_hyperlink(ds .getNameFromPos(focusCell))); } this.hide(); ss.hyperlinktip.showLink(); } }, onCancelFn : function() { this.hide(); }, typeRadioChangeFn : function(g, box) { if (box.inputValue == "web") { this.webpageUrl.show(); this.rangeContainer.hide(); this.noteLabel .setText( "
URL should be with format: http://www.example.com
", false); } else { this.webpageUrl.hide(); this.rangeContainer.show(); this.noteLabel .setText( "
The format should be like: \"Sheet1!$A$1:$B$10\"
", false); } }, popupDataRange : function() { var me = this; var ss = this.spreadsheet; var ds = ss.ds; var sm = ss.sm; var focusCell = sm.focusCell; var x = focusCell.x, y = focusCell.y, oldIndex = ds.activeSheet; var drSelector = ss.dataRangeSelector; me.hide(); drSelector.popup(null, this.rangeField.getValue(), function(range) { me.rangeField.setValue(range); me.show(); if (oldIndex != ds.activeSheet) { ss.changeSheet(oldIndex); (function () { sm.setFocusCell(x, y, true); }).defer(30); } else { sm.setFocusCell(x, y, true); } }, this); } }); Ext.ns("Ext.ss.popup"); Ext.ss.popup.FormulaFunctionWin = Ext.extend(Ext.Window, { initComponent : function() { this.functionTypeCombo = new Ext.form.ComboBox({ editable : false, store : new Ext.data.SimpleStore({ fields : ["type", "text"] }), listeners : { select : { fn : this.__onFunctionTypeComboSelectFn, scope : this } }, displayField : "text", valueField : "type", mode : "local", triggerAction : "all", width : 150, selectOnFocus : true }); this.listView = new Ext.list.ListView({ hideHeaders : true, region : "center", store : new Ext.data.ArrayStore({ fields : ["name", "example", "description", "type"], sortInfo : { field : "name", direction : "ASC" }, data : [] }), multiSelect : true, emptyText : "No result to display", reserveScrollOffset : true, columns : [{ dataIndex : "name", flex : 1 }, { dataIndex : "type", flex : 2, tpl : new Ext.XTemplate(["{type:this.renderType()}"] .join(""), { renderType : function(v) { return "" + (feyaSoft.ss.lang[v] || v) + ""; } }) }], tpl : new Ext.XTemplate( "", "
#f2edf2;\" >
", "", "
", " class=\"{cls}\">", "   {[values.tpl.apply(parent)]}", "
", "
", "
", "
", "
") }); this.descriptionPanel = new Ext.Panel({ autoScroll : true, frame : true }); Ext.apply(this, { width : 350, height : 400, layout : "border", resizable : false, bodyStyle : "background:#ffffff;", tbar : [this.functionTypeCombo, "->", { text : feyaSoft.lang.common.help, handler : function() { var newWindow = window .open( "http://www.cubedrive.com/wordPublic?id=8XrMMXO3fXk_&viewStatus=publicView", "_blank"); newWindow.focus(); } }], items : [this.listView, { xtype : "container", region : "south", height : 80, style : "padding:1px;", items : [this.descriptionPanel], layout : "fit" }], buttonAlign : "right", buttons : [{ iconCls : "icon_no", text : feyaSoft.lang.common.cancel, handler : this.__onClose, scope : this }] }); Ext.ss.popup.FormulaFunctionWin.superclass.initComponent.call(this); this.listView.on("mouseenter", this.__onMouseenterFn, this); this.listView.on("click", this.__onSelectionchangeFn, this); }, popup : function() { this.nameChanged = false; var ss = this.spreadsheet; var sm = ss.sm, ds = ss.ds; this.show(); if (this.listView.store.getCount() == 0) { this.__initData(); } }, __initData : function() { var formulaData = Ext.ss.common.Mask.formulaData; var typeBoxData = [], tmpAry = []; for (var i = 0; i < formulaData.length; i++) { var typeValue = formulaData[i][3]; if (!this.__arrayContain(tmpAry, typeValue)) { tmpAry.push(typeValue); typeBoxData.push([typeValue, feyaSoft.ss.lang[typeValue]]); } } typeBoxData = [["all", feyaSoft.ss.lang.all]].concat(typeBoxData); this.functionTypeCombo.getStore().loadData(typeBoxData); this.listView.store.loadData(Ext.ss.common.Mask.formulaData); this.functionTypeCombo.setValue("all"); }, __arrayContain : function(array, item) { var i, ln; for (i = 0, ln = array.length; i < ln; i++) { if (array[i] === item) { return true; } } return false; }, __onFunctionTypeComboSelectFn : function(combo, rd, index) { var resultData = this.__filterFormulaData(combo.getValue()); this.listView.store.loadData(resultData); }, __filterFormulaData : function(type) { var formulaData = Ext.ss.common.Mask.formulaData; if (type == "all") { return formulaData; } var resultData = []; for (var i = 0; i < formulaData.length; i++) { var tmpDta = formulaData[i]; if (tmpDta[3] == type) { resultData.push(tmpDta); } } return resultData; }, __onMouseenterFn : function(grid, index, item, e) { var rd = this.listView.store.getAt(index); this.descriptionPanel.body.update(rd.data.description); }, __onSelectionchangeFn : function(view, index, item, e) { var ss = this.spreadsheet; var editor = ss.editor; var rd = this.listView.store.getAt(index); editor.movingFormulaFlag = true; editor.startEditing(ss.sm.focusCell, "=" + rd.data.name + "("); this.__onClose(); }, __onClose : function() { this.hide(); } }); Ext.ns("Ext.ss.popup.about"); Ext.ss.popup.about.AboutSS = function(config) { Ext.apply(this, config); var myHtml = "
" + "
" + " EnterpriseSheet.com
A Spreadsheet Solution
" + " Version " + Ext.ss.common.Mask.version + "" + "

" + " Copyright © 2012 Feyasoft Inc. All right reserved.
" + "
" + "
" + " EnterpriseSheet and EnterpriseSheet logos are the trademarks of the Feyasoft Inc. All right reserved.

" + " Want to run Spreadsheet in your server and maximize your Performance, Productivity and Security, " + " please send the email to:
info@enterpriseSheet.com. For more detail, please visit: www.enterpriseSheet.com" + "


" + " Warning: This computer program is protected by the copyright law and international treaties. Unauthorized " + " reproduction or distribution this program, or any portion of it, maybe result in severe civil and " + " criminal penalties, and will be prosecuted to the maximum extent possible under the law."; this.aboutPanel = new Ext.Panel({ baseCls : "x-plain", html : myHtml }); this.activeId = 0; this.releasePanel = new Ext.Panel({ layout : "fit", autoScroll : true, border : false, autoLoad : { url : "static/_release.html", scripts : true } }); Ext.ss.popup.about.AboutSS.superclass.constructor.call(this, { iconCls : "icon_enterpriseSheet", title : "About EnterpriseSheet.com [ " + Ext.ss.common.Mask.version + " ]", width : 600, height : 350, closable : true, resizable : false, modal : true, layout : "card", border : true, activeItem : 0, layoutConfig : { animate : false, deferredRender : true }, items : [this.aboutPanel, this.releasePanel], buttons : [{ text : "   Release Notes   ", handler : function() { this.getLayout() .setActiveItem(this.releasePanel); this.activeId = 1; }, scope : this }, { text : "Ok", handler : function() { if (this.activeId == 0) { this.close(); } else { this.activeId = 0; this.getLayout() .setActiveItem(this.aboutPanel); } }, scope : this }] }); this.show(); }; Ext.extend(Ext.ss.popup.about.AboutSS, Ext.Window, {}); Ext.ns("feyaSoft.word.popup"); feyaSoft.word.popup.HeadFootWin = Ext.extend(Ext.Window, { layout : "form", bodyStyle : "padding: 10px;background: white;", buttonAlign : "center", initComponent : function() { this.headField = new Ext.form.TextArea({ emptyText : feyaSoft.word.lang.leftHead, flex : 1, hideLabel : true }); this.headLeftField = new Ext.form.TextArea({ emptyText : feyaSoft.word.lang.centerHead, flex : 1, hideLabel : true }); this.headRightField = new Ext.form.TextArea({ emptyText : feyaSoft.word.lang.rightHead, flex : 1, hideLabel : true }); this.footLeftField = new Ext.form.TextArea({ emptyText : feyaSoft.word.lang.leftFoot, flex : 1, hideLabel : true }); this.footField = new Ext.form.TextArea({ emptyText : feyaSoft.word.lang.centerFoot, flex : 1, hideLabel : true }); this.footRightField = new Ext.form.TextArea({ emptyText : feyaSoft.word.lang.rightFoot, flex : 1, hideLabel : true }); this.items = [{ xtype : "fieldset", title : feyaSoft.word.lang.head, height : 150, layout : { type : "hbox", align : "stretch" }, items : [this.headLeftField, { xtype : "box", width : 10 }, this.headField, { xtype : "box", width : 10 }, this.headRightField] }, { xtype : "fieldset", title : feyaSoft.word.lang.foot, height : 150, layout : { type : "hbox", align : "stretch" }, items : [this.footLeftField, { xtype : "box", width : 10 }, this.footField, { xtype : "box", width : 10 }, this.footRightField] }]; this.buttons = [{ text : feyaSoft.lang.common.clear, handler : this.onClear, scope : this }, { text : feyaSoft.lang.common.ok, handler : this.onApply, scope : this }, { text : feyaSoft.lang.common.cancel, handler : this.onClose, scope : this }]; feyaSoft.word.popup.HeadFootWin.superclass.initComponent .call(this); }, popup : function(info) { if (info) { this.headLeftField.setValue(info.headLeft); this.headRightField.setValue(info.headRight); this.footLeftField.setValue(info.footLeft); this.footRightField.setValue(info.footRight); this.headField.reset(); this.footField.reset(); if ("left" == info.headAlign) { this.headLeftField.setValue(info.head); this.footLeftField.setValue(info.foot); } else if ("right" == info.headAlign) { this.headRightField.setValue(info.head); this.footRightField.setValue(info.foot); } else { this.headField.setValue(info.head); this.footField.setValue(info.foot); } } else { this.headField.reset(); this.headLeftField.reset(); this.headRightField.reset(); this.footField.reset(); this.footLeftField.reset(); this.footRightField.reset(); } this.show(); }, onClose : function() { this.hide(); }, onApply : function() { var head = this.headField.getValue(); var headLeft = this.headLeftField.getValue(); var headRight = this.headRightField.getValue(); var foot = this.footField.getValue(); var footLeft = this.footLeftField.getValue(); var footRight = this.footRightField.getValue(); if (this.applyCallback) { this.applyCallback.call(this.scope, { head : head, headLeft : headLeft, headRight : headRight, foot : foot, footLeft : footLeft, footRight : footRight }); } this.onClose(); }, onClear : function() { this.headLeftField.setValue(""); this.headField.setValue(""); this.headRightField.setValue(""); this.footLeftField.setValue(""); this.footField.setValue(""); this.footRightField.setValue(""); } }); Ext.ns("Ext.ss.popup"); Ext.ss.popup.PrintSettingWin = function(config) { this.config = config || {}; Ext.form.Field.prototype.msgTarget = "side"; this.noGrid = new Ext.form.Checkbox({ hideLabel : true, boxLabel : feyaSoft.ss.lang.notGridLine, name : "noGrid", checked : false }); this.optionsSet = new Ext.form.FieldSet({ title : feyaSoft.lang.common.options, collapsible : true, autoHeight : true, items : [this.noGrid] }); this.landRadio = new Ext.form.Radio({ columnWidth : 0.05, hideLabel : true, listeners : { check : { fn : this.onChangeFn, scope : this } }, inputValue : "land", name : "printway" }); this.portraitRadio = new Ext.form.Radio({ columnWidth : 0.05, hideLabel : true, listeners : { check : { fn : this.onChangeFn, scope : this } }, inputValue : "portrait", checked : true, name : "printway" }); this.htmlWay = new Ext.form.Radio({ columnWidth : 0.05, hideLabel : true, listeners : { check : { fn : this.onChangeFn, scope : this } }, inputValue : "htmlway", name : "printway" }); this.outPutSet = new Ext.form.FieldSet({ title : feyaSoft.lang.common.outputWays, collapsible : true, autoHeight : true, layout : "column", items : [this.landRadio, { columnWidth : 0.26, html : "
" + feyaSoft.lang.ss.landscape + "
" + feyaSoft.lang.ss.landscape + "
", style : "margin-right:30px;", height : 91 }, this.portraitRadio, { columnWidth : 0.26, html : "
" + feyaSoft.lang.ss.portrait + "
" + feyaSoft.lang.ss.portrait + "
", style : "margin-right:30px;", height : 91 }, this.htmlWay, { columnWidth : 0.26, html : "
" + feyaSoft.lang.ss.HTMLformat + "
" + feyaSoft.lang.ss.HTMLformat + "
", style : "margin-right:30px;", height : 91 }] }); this.formPanel = new Ext.form.FormPanel({ bodyStyle : "padding:10px;", baseCls : "x-plain", labelWidth : 80, defaultType : "textfield", items : [this.optionsSet, this.outPutSet] }); this.printerPanel = new Ext.Panel({ layout : "border", autoScroll : true, border : false, items : [{ region : "north", autoHeight : true, border : false, bodyStyle : "background:white;border-bottom:1px solid #bfbfbf;padding:5px;", html : feyaSoft.ss.lang.printDesc }, { region : "center", baseCls : "x-plain", border : false, items : [this.formPanel] }] }); Ext.ss.popup.PrintSettingWin.superclass.constructor.call(this, { title : feyaSoft.ss.lang.printSheet, width : 550, height : 350, layout : "fit", buttonAlign : "right", shim : false, animCollapse : false, constrainHeader : true, modal : true, items : this.printerPanel, resizable : false, buttons : [{ iconCls : "icon_no", text : feyaSoft.lang.common.cancel, handler : function() { this.close(); }, scope : this }, { text : feyaSoft.lang.common.print, handler : function() { var printWay = "portrait"; if (this.landRadio.getValue()) { printWay = "landscape"; } else if (this.htmlWay.getValue()) { printWay = "html"; } var noGrid = this.noGrid.getValue(); var exportPDF = feyaSoft.home.CONST.spreadSheetUrl.exportPDF; var url = exportPDF + "?noGrid=" + noGrid + "&printWay=" + printWay + "&id=" + this.config.fileId; if (this.config.callback) { this.config.callback.call(this.config.scope, url, this); } this.close(); }, scope : this }] }); this.show(); this.outPutSet.body.on("click", this.outputClickFn, this); }; Ext.extend(Ext.ss.popup.PrintSettingWin, Ext.Window, { onChangeFn : function(ro, nval, oval) { if (nval) { this.chanageTableCss(ro.inputValue); } }, chanageTableCss : function(inputVal) { var doms = Ext.query("table[radiotype*=x-radiocss-]", this.outPutSet.body.dom); for (var i = 0; i < doms.length; i++) { var radiotype = doms[i].getAttribute("radiotype"); var tmary = radiotype.split("x-radiocss-"); if (tmary[1] == inputVal) { doms[i].style.background = "#8ace28"; } else { doms[i].style.background = "none"; } } }, outputClickFn : function(e) { var target = e.getTarget(); var tgEl = Ext.get(target); var evtEl; if (tgEl.hasClass("x-radiocss")) { evtEl = tgEl; } else { evtEl = tgEl.parent(".x-radiocss"); } if (evtEl) { var radiotype = evtEl.getAttribute("radiotype"); var tmary = radiotype.split("x-radiocss-"); var inputVal = tmary[1]; if (inputVal == "land") { this.landRadio.setValue(true); } else if (inputVal == "portrait") { this.portraitRadio.setValue(true); } else if (inputVal == "htmlway") { this.htmlWay.setValue(true); } this.chanageTableCss(inputVal); } } }); /**上传Excel*/ Ext.ns("Ext.ss.popup"); Ext.ss.popup.ImportFileWin = function(config) { Ext.apply(this, config); var maxExcelImportSize = Ext.get("maxExcelImportSize") .getAttribute("value"); Ext.form.Field.prototype.msgTarget = "side"; this.filePath = new Ext.form.FileUploadField({ emptyText : feyaSoft.lang.file.supportFormat, fieldLabel : feyaSoft.lang.file.fileName, name : "file", allowBlank : false, style : "margin-bottom:50px;", anchor : "95%", buttonCfg : { text : " ", iconCls : "upload-icon" } }); this.tipLabel = new Ext.form.DisplayField({ hideLabel : true, labelSeparator : "", value : feyaSoft.lang.file.uploadHint, anchor : "95%" }); this.formPanel = new Ext.form.FormPanel({ bodyStyle : "padding:10px;", fileUpload : true, baseCls : "x-plain", labelWidth : 80, url : feyaSoft.home.CONST.spreadSheetUrl.importExcelUpload, defaultType : "textfield", items : [this.filePath, this.tipLabel] }); this.importPanel = new Ext.Panel({ layout : "border", autoScroll : true, border : false, items : [{ region : "north", autoHeight : true, border : false, bodyStyle : "background:white;border-bottom:1px solid #bfbfbf;padding:5px;", html : "" + feyaSoft.lang.file.importExcel + "" + "" }, { region : "center", baseCls : "x-plain", border : false, layout : "fit", items : [this.formPanel] }] }); Ext.ss.popup.ImportFileWin.superclass.constructor.call(this, { title : feyaSoft.lang.common.fileImport, width : 500, height : 280, minWidth : 500, layout : "fit", buttonAlign : "right", shim : false, animCollapse : false, constrainHeader : true, modal : true, items : this.importPanel, resizable : false, buttons : [{ iconCls : "icon_no", text : feyaSoft.lang.common.cancel, handler : function() { this.close(); }, scope : this }, { text : feyaSoft.lang.common['import'], handler : function() { if (this.formPanel.form.isValid()) { this.formPanel.form.submit({ waitMsg : "In processing", failure : function(form, action) { Ext.MessageBox.alert( "Error Message", action.result.info); }, success : function(form, action) { var jsonData = action.result; if (jsonData.success) { var fileId = jsonData.filepath; config.parentView .openExcelFile(fileId); this.close(); } else { Ext.MessageBox.alert( "Failed", jsonData.info); } }, scope : this }); } }, scope : this }] }); this.show(); }; Ext.extend(Ext.ss.popup.ImportFileWin, Ext.Window, {}); Ext.ns("Ext.ss.popup"); Ext.ss.popup.ConditionFormatWin = Ext.extend(Ext.Window, { width : 800, autoHeight : true, maxHeight : 300, bodyStyle : "min-height:60px;", autoScroll : true, closeAction : "hide", title : feyaSoft.ss.lang.conditionFormat, initComponent : function() { this.colorPalette = new Ext.ColorPalette({ allowReselect : true }); this.colorMenu = new Ext.menu.Menu({ items : [this.colorPalette] }); this.buttons = [{ text : feyaSoft.lang.common.add, minWidth : 80, handler : this.onAddFn, scope : this }, { text : feyaSoft.lang.common.ok, minWidth : 80, handler : this.onApply, scope : this }, { iconCls : "icon_no", text : feyaSoft.lang.common.cancel, minWidth : 80, handler : function() { this.hide(); }, scope : this }]; this.items = [this.createConditionFormat(true)]; Ext.ss.popup.ConditionFormatWin.superclass.initComponent.call(this); this.colorPalette.on("select", this.onColorSelectFn, this); this.on("hide", this.onHideFn, this); }, createConditionFormat : function(hideDelete) { var rangeField = new Ext.form.TextField({ hideLabel : true, labelSeparator : "", validator : this.validator || Ext.ss.common.Mask.dataRangeValidator, allowBlank : false }); var combo = new Ext.form.ComboBox({ typeAhead : true, triggerAction : "all", lazyRender : true, mode : "local", margins : "0 0 0 10", store : Ext.ss.common.Mask.getConditionStore(), valueField : "id", displayField : "text", value : "include" }); this.mon(combo, { scope : this, select : this.onSelectOption }); var numField = new Ext.form.NumberField({ hidden : true, width : 110, margins : "0 0 0 10", allowBlank : false }); var textField = new Ext.form.TextField({ width : 110, margins : "0 0 0 10", allowBlank : false }); var minField = new Ext.form.NumberField({ hidden : true, width : 50, margins : "0 0 0 10", allowBlank : false }); var maxField = new Ext.form.NumberField({ hidden : true, width : 50, margins : "0 0 0 10", allowBlank : false }); var textCb = new Ext.form.Checkbox({ boxLabel : "文本", margins : "0 0 0 20", listeners : { check : { fn : function(cb, checked) { if (false === checked) { var ct = cb.ownerCt; var index = ct.items.indexOf(cb); var box = ct.items.get(index + 1); box.getEl() .setStyle("background-color", ""); } }, scope : this } } }); var textBox = new Ext.BoxComponent({ cls : "x-condition-text-box", margins : "0 0 0 10", listeners : { afterrender : { fn : function(box) { var el = box.getEl(); el.on("click", function() { var ct = box.ownerCt; var index = ct.items.indexOf(box); var checkBox = ct.items.get(index - 1); this.colorPalette.sender = box; this.colorPalette.checkbox = checkBox; this.colorMenu.show(el, "tl-bl?"); }, this); }, scope : this } } }); var backgroundCb = new Ext.form.Checkbox({ boxLabel : "背景", margins : "0 0 0 10", listeners : { check : { fn : function(cb, checked) { if (false === checked) { var ct = cb.ownerCt; var index = ct.items.indexOf(cb); var box = ct.items.get(index + 1); box.getEl() .setStyle("background-color", ""); } }, scope : this } } }); var backgroundBox = new Ext.BoxComponent({ cls : "x-condition-text-box", margins : "0 0 0 10", listeners : { afterrender : { fn : function(box) { var el = box.getEl(); el.on("click", function() { var ct = box.ownerCt; var index = ct.items.indexOf(box); var checkBox = ct.items.get(index - 1); this.colorPalette.sender = box; this.colorPalette.checkbox = checkBox; this.colorMenu.show(el, "tl-bl?"); }, this); }, scope : this } } }); var deleteBtn = new Ext.Button({ iconCls : "delete", hidden : hideDelete, handler : this.onDeleteConditionFormat, scope : this }); var ct = new Ext.Container({ style : "padding:10px;", layout : { type : "hbox" }, items : [rangeField, { xtype : "button", margins : "0 0 0 5", iconCls : "icon_window_anchorin", handler : this.popupDataRange, scope : this }, combo, textField, numField, minField, maxField, textCb, textBox, backgroundCb, backgroundBox, { xtype : "box", flex : 1 }, deleteBtn], isValid : function() { var flag = true; this.items.each(function(it) { if (it.isValid && it.isVisible()) { if (!it.isValid()) { flag = false; return false; } } }); return flag; } }); ct.rangeField = rangeField; ct.optionCombo = combo; ct.targetField = textField; ct.numField = numField; ct.minField = minField; ct.maxField = maxField; ct.textCb = textCb; ct.textBox = textBox; ct.backgroundCb = backgroundCb; ct.backgroundBox = backgroundBox; return ct; }, onSelectOption : function(combo, rec) { var ct = combo.ownerCt; var id = rec.data.id; if ("empty" == id) { ct.targetField.disable(); ct.numField.disable(); } else { ct.targetField.enable(); ct.numField.enable(); } if ("bw" == id || "nbw" == id) { ct.minField.show(); ct.maxField.show(); ct.targetField.hide(); ct.numField.hide(); } else if ("gt" == id || "lt" == id || "eq" == id || "ne" == id) { ct.minField.hide(); ct.maxField.hide(); ct.targetField.hide(); ct.numField.show(); } else { ct.minField.hide(); ct.maxField.hide(); ct.targetField.show(); ct.numField.hide(); } ct.doLayout(); }, showDataRangeBorder : function(flag, saveflag) { if (this.dataRange) { this.spreadsheet.sm.showDataRangeBorder(this.dataRange, flag, saveflag); } }, pushdown : function(stop) { this.stopHideDataRange = stop; this.hide(); }, onHideFn : function() { if (!this.stopHideDataRange) { this.showDataRangeBorder(); this.spreadsheet.sm.fireEvent("renderborder"); } delete this.stopHideDataRange; }, popupDataRange : function(btn) { var rangeField = btn.ownerCt.items.first(); var ss = this.spreadsheet; var ds = ss.ds; var drSelector = ss.dataRangeSelector; var sender = this; sender.pushdown(); drSelector.popup(null, rangeField.getValue(), function(range) { var parts = range.split(","); var arr = []; for (var i = 0, len = parts.length; i < len; i++) { arr.push(ds.parseText2Pos(parts[i])); } rangeField.setValue(range); sender.show(); sender.initDataRange(arr); sender.showDataRangeBorder(true); }, this); }, onColorSelectFn : function(cp, color) { var sender = this.colorPalette.sender; var checkBox = this.colorPalette.checkbox; var el = sender.getEl(); checkBox.setValue(true); el.setStyle("background-color", "#" + color); this.colorMenu.hide(); }, addCondtionFormat : function() { var ct = this.createConditionFormat(); var count = this.items.getCount(); if (0 == count) { this.body.update(""); } if (count) { var first = this.items.get(0); } else { } this.add(ct); this.doLayout(); var rangeField = ct.items.get(0); rangeField.setValue(this.getDataRangeStr()); this.syncShadow(); }, onDeleteConditionFormat : function(btn) { var ct = btn.ownerCt; var len = this.items.getCount(); if (1 <= len) { this.remove(ct); if (2 == len) { var first = this.items.get(0); } this.doLayout(); this.syncShadow(); if (1 == len) { this.body.update("
" + feyaSoft.ss.lang.noConditionFormat + "
"); } } }, getConditionFormatInfo : function() { var json = []; var ss = this.spreadsheet; var ds = ss.ds; this.items.each(function(it) { var refStr = it.rangeField.getValue(); var pos = ds.parseText2Pos(refStr); var o = { pos : pos, opt : it.optionCombo.getValue(), color : it.textBox.getEl().getStyle("background-color"), bgc : it.backgroundBox.getEl() .getStyle("background-color") }; var opt = o.opt; if ("empty" != opt) { if ("bw" == opt || "nbw" == opt) { o.min = it.minField.getValue(); o.max = it.maxField.getValue(); } else if ("gt" == opt || "lt" == opt || "eq" == opt || "ne" == opt) { o.tgt = it.numField.getValue(); } else { o.tgt = it.targetField.getValue(); } } json.push(o); }, this); return json; }, onApply : function() { var valid = true; this.items.each(function(it) { if (!it.isValid()) { valid = false; } }); if (valid) { var json = this.getConditionFormatInfo(); this.spreadsheet.updateConditionFormat(json); this.hide(); } else { Ext.Msg.alert(feyaSoft.ss.lang.hint, feyaSoft.ss.lang.fixInvalid); } }, onAddFn : function() { this.addCondtionFormat(); }, initDataRange : function(rt) { var ss = this.spreadsheet; var setting = this.setting || {}; var sm = ss.sm; var ds = ss.ds; if (!rt) { var res = sm .getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); rt = [{ x : res.minPos.x, y : res.minPos.y, ex : res.maxPos.x, ey : res.maxPos.y, ab : true, sheetIndex : ds.activeSheet }]; } this.dataRange = rt; this.combineDir = "y"; this.dataMatrix = ss.combineRanges(rt, this.combineDir); }, getDataRangeStr : function() { var ss = this.spreadsheet; if (this.dataRange) { var arr = []; for (var i = 0, len = this.dataRange.length; i < len; i++) { var it = this.dataRange[i]; arr.push(ss.encodeDataRange({ minPos : { x : it.x, y : it.y }, maxPos : { x : it.ex, y : it.ey } })); } return arr.join(","); } else { return ""; } }, popup : function(config) { config = config || {}; var ss = this.spreadsheet; var cfm = config.cfm; if (cfm && 0 < cfm.length) { for (var i = 0, count = this.items.getCount(); i < count; i++) { var it = this.items.get(0); this.remove(it); } if (this.body) { this.body.update(""); } for (var i = 0, len = cfm.length; i < len; i++) { var it = cfm[i], pos = it.pos; var ct = this.createConditionFormat(); this.add(ct); var posStr = ss.encodeDataRange({ minPos : { x : pos.x, y : pos.y }, maxPos : { x : pos.ex, y : pos.ey } }); ct.rangeField.setValue(posStr); ct.optionCombo.setValue(it.opt); if ("empty" == it.opt) { ct.targetField.disable(); } else { ct.targetField.enable(); } var opt = it.opt; if ("gt" == opt || "lt" == opt || "eq" == opt || "ne" == opt) { ct.numField.setValue(it.tgt); } else { ct.targetField.setValue(it.tgt); } ct.minField.setValue(it.min); ct.maxField.setValue(it.max); if ("bw" == opt || "nbw" == opt) { ct.minField.show(); ct.maxField.show(); ct.targetField.hide(); ct.numField.hide(); } else if ("gt" == opt || "lt" == opt || "eq" == opt || "ne" == opt) { ct.minField.hide(); ct.maxField.hide(); ct.targetField.hide(); ct.numField.show(); } else { ct.minField.hide(); ct.maxField.hide(); ct.targetField.show(); ct.numField.hide(); } if (it.color) { ct.textCb.setValue("transparent" !== it.color); var el = ct.textBox.getEl(); if (el) { el.setStyle("background-color", it.color); } else { ct.textBox.style = "background-color:" + it.color + ";"; } } else { ct.textCb.setValue(false); var el = ct.textBox.getEl(); if (el) { el.setStyle("background-color", "transparent"); } else { ct.textBox.style = "background-color:transparent;"; } } if (it.bgc) { ct.backgroundCb.setValue("transparent" !== it.bgc); var el = ct.backgroundBox.getEl(); if (el) { el.setStyle("background-color", it.bgc); } else { ct.backgroundBox.style = "background-color:" + it.bgc + ";"; } } else { ct.backgroundCb.setValue(false); var el = ct.backgroundBox.getEl(); if (el) { el.setStyle("background-color", "transparent"); } else { ct.backgroundBox.style = "background-color:transparent;"; } } } if (1 == this.items.getCount()) { } this.show(); } else { var count = this.items.getCount(); if (0 < count) { for (var i = 1; i < count; i++) { var it = this.items.get(1); this.remove(it); } if (this.body) { this.body.update(""); } } else { if (this.body) { this.body.update(""); } var ct = this.createConditionFormat(); this.add(ct); } this.initDataRange(); var str = this.getDataRangeStr(); var ct = this.items.get(0); ct.rangeField.setValue(str); ct.optionCombo.setValue("include"); ct.targetField.reset(); this.show(); } } }); Ext.ns("Ext.ss"); Ext.ss.FormulaDropList = Ext.extend(Ext.Container, { width : 250, height : 180, layout : "fit", initComponent : function() { this.cls = this.cls || ""; this.cls += " x-spreadsheet-fromula-drop-list "; this.renderTo = Ext.getBody(); var tpl = new Ext.XTemplate("", "
", "{formula}", "
", "
"); this.store = Ext.ss.common.Mask.getFormulaStore(); this.view = new Ext.DataView({ cls : "x-spreadsheet-formula-listview", store : this.store, tpl : tpl, autoScroll : true, singleSelect : true, overClass : "x-view-over", itemSelector : "div.x-spreadsheet-formula-item" }); this.items = [this.view]; this.detailsCt = new Ext.Container({ cls : "x-spreadsheet-formula-details", hidden : true, width : 250, height : 220, layout : "fit", autoScroll : true, renderTo : Ext.getBody() }); Ext.ss.FormulaDropList.superclass.initComponent.call(this); this.view.on("click", this.onNodeClick, this); this.view.on("mouseenter", this.onMouseEnter, this); this.on("hide", function() { this.view.clearSelections(); this.detailsCt.hide(); }, this); }, searchMatch : function(name, textCoverEl, textVal) { var ss = this.spreadsheet, ds = ss.ds; name = name.toUpperCase(); var details; this.store.removeAll(); var nameRanges = ds.fileExtraInfo.nameRanges; var data = ds.deepClone(Ext.ss.common.Mask.formulaData); if (nameRanges) { for (var i = 0, len = nameRanges.length; i < len; i++) { var it = nameRanges[i]; data.unshift([ it.name, " " + it.name, it.coord, true]); } } this.store.loadData(data); this.store.filterBy(function(rec) { var fname = rec.data.id; fname = fname.toUpperCase(); if (0 == fname.indexOf(name)) { if (!details) { details = rec.data.details; } return true; } return false; }, this); if (0 < this.store.getCount()) { var el = this.getEl(); var dEl = this.detailsCt.getEl(); this.detailsCt.show(); dEl.update(details); this.show(); el.alignTo(textCoverEl); dEl.alignTo(el, "tl-tr?"); } else { this.hide(); } }, onNodeClick : function(dataView, index, node) { var rec = this.view.getRecord(node); var formula = rec.data.id; this.fireEvent("selectformula", formula, rec.data.isVar, this); this.hide(); }, selectFormula : function() { var recs = this.view.getSelectedRecords(); if (recs.length) { var rec = recs[0]; var formula = rec.data.id; this.fireEvent("selectformula", formula, rec.data.isVar, this); this.hide(); } }, selectField : function() { var recs = this.view.getSelectedRecords(); if (recs.length) { var rec = recs[0]; var field = rec.data.dsd_field; this.fireEvent("selectField", field, rec.data.isVar, this); this.hide(); } }, onMouseEnter : function(dataView, index, node) { var rec = dataView.getRecord(node); var dEl = this.detailsCt.getEl(); if (dEl) { dEl.update(rec.data.details); } }, selectDown : function() { var indexs = this.view.getSelectedIndexes(); var index = 0; if (0 < indexs.length) { index = indexs[0]; index++; } var count = this.store.getCount() - 1; if (index > count) { index = count; } this.view.select(index); var dEl = this.detailsCt.getEl(); if (dEl) { var rec = this.store.getAt(index); if (rec != null) { dEl.update(rec.data.details); } } }, selectUp : function() { var indexs = this.view.getSelectedIndexes(); var index = this.store.getCount() - 1; if (0 < indexs.length) { index = indexs[0]; index--; } if (0 > index) { index = 0; } this.view.select(index); var dEl = this.detailsCt.getEl(); if (dEl) { var rec = this.store.getAt(index); if (rec != null) { dEl.update(rec.data.details); } } }, isSelected : function() { var indexs = this.view.getSelectedIndexes(); return 0 < indexs.length; } }); /**定义字段列表*/ Ext.ns("Ext.ss"); Ext.ss.FieldDropList = Ext.extend(Ext.Container, { width : 250, height : 180, layout : "fit", initComponent : function() { this.cls = this.cls || ""; this.cls += " x-spreadsheet-fromula-drop-list "; this.renderTo = Ext.getBody(); var tpl = new Ext.XTemplate("", "
", "{dsd_field}", "
", "
"); this.store = Ext.ss.common.Mask.getFieldStore(); this.view = new Ext.DataView({ cls : "x-spreadsheet-formula-listview", store : this.store, tpl : tpl, autoScroll : true, singleSelect : true, overClass : "x-view-over", itemSelector : "div.x-spreadsheet-formula-item" }); this.items = [this.view]; this.detailsCt = new Ext.Container({ cls : "x-spreadsheet-formula-details", hidden : true, width : 250, height : 220, layout : "fit", autoScroll : true, renderTo : Ext.getBody() }); Ext.ss.FieldDropList.superclass.initComponent.call(this); this.view.on("click", this.onNodeClick, this); this.view.on("mouseenter", this.onMouseEnter, this); this.on("hide", function() { this.view.clearSelections(); this.detailsCt.hide(); }, this); }, searchMatch : function(name, textCoverEl, textVal) { console.log(this.spreadsheet); var ss = this.spreadsheet, ds = ss.ds; name = name.toUpperCase(); var details; this.store.removeAll(); var nameRanges = ds.fileExtraInfo.nameRanges; var data = ds.deepClone(Ext.decode(FieldData.replace(/{/g,"[").replace(/}/,"]"))); if (nameRanges) { for (var i = 0, len = nameRanges.length; i < len; i++) { var it = nameRanges[i]; data.unshift([ it.name, " " + it.name, it.coord, true]); } } this.store.loadData(data); this.store.filterBy(function(rec) { var fname = rec.data.dsd_field; fname = fname.toUpperCase(); if (0 == fname.indexOf(name)) { if (!details) { details = rec.data.dsd_caption; } return true; } return false; }, this); if (0 < this.store.getCount()) { var el = this.getEl(); var dEl = this.detailsCt.getEl(); this.detailsCt.show(); dEl.update(details); this.show(); el.alignTo(textCoverEl); dEl.alignTo(el, "tl-tr?"); } else { this.hide(); } }, /**选中一个字段*/ onNodeClick : function(dataView, index, node) { var rec = this.view.getRecord(node); var field =rec.data.dsd_field; this.fireEvent("selectfield", field, rec.data.dsd_caption, this); this.hide(); }, selectField : function() { var recs = this.view.getSelectedRecords(); if (recs.length) { var rec = recs[0]; var formula = rec.data.dsd_id; this.fireEvent("selectfield", formula, rec.data.isVar, this); this.hide(); } }, onMouseEnter : function(dataView, index, node) { var rec = dataView.getRecord(node); var dEl = this.detailsCt.getEl(); if (dEl) { dEl.update(rec.data.dsd_caption); } }, selectDown : function() { var indexs = this.view.getSelectedIndexes(); var index = 0; if (0 < indexs.length) { index = indexs[0]; index++; } var count = this.store.getCount() - 1; if (index > count) { index = count; } this.view.select(index); var dEl = this.detailsCt.getEl(); if (dEl) { var rec = this.store.getAt(index); if (rec != null) { dEl.update(rec.data.dsd_caption); } } }, selectUp : function() { var indexs = this.view.getSelectedIndexes(); var index = this.store.getCount() - 1; if (0 < indexs.length) { index = indexs[0]; index--; } if (0 > index) { index = 0; } this.view.select(index); var dEl = this.detailsCt.getEl(); if (dEl) { var rec = this.store.getAt(index); if (rec != null) { dEl.update(rec.data.dsd_caption); } } }, isSelected : function() { var indexs = this.view.getSelectedIndexes(); return 0 < indexs.length; } }); //定义函数列表 Ext.ns("Ext.ss"); Ext.ss.FnDropList = Ext.extend(Ext.Container, { width : 250, height : 180, layout : "fit", initComponent : function() { this.cls = this.cls || ""; this.cls += " x-spreadsheet-fromula-drop-list "; this.renderTo = Ext.getBody(); var tpl = new Ext.XTemplate("", "
", "{ef_fullname}", "
", "
"); this.store = Ext.ss.common.Mask.getFnStore(); this.view = new Ext.DataView({ cls : "x-spreadsheet-formula-listview", store : this.store, tpl : tpl, autoScroll : true, singleSelect : true, overClass : "x-view-over", itemSelector : "div.x-spreadsheet-formula-item" }); this.items = [this.view]; this.detailsCt = new Ext.Container({ cls : "x-spreadsheet-formula-details", hidden : true, width : 250, height : 220, layout : "fit", autoScroll : true, renderTo : Ext.getBody() }); Ext.ss.FnDropList.superclass.initComponent.call(this); this.view.on("click", this.onNodeClick, this); this.view.on("mouseenter", this.onMouseEnter, this); this.on("hide", function() { this.view.clearSelections(); this.detailsCt.hide(); }, this); }, searchMatch : function(name, textCoverEl, textVal) { var ss = this.spreadsheet, ds = ss.ds; name = name.toUpperCase(); var details; this.store.removeAll(); var nameRanges = ds.fileExtraInfo.nameRanges; var data = ds.deepClone(Ext.decode(FnData.replace(/{/g,"[").replace(/}/,"]"))); if (nameRanges) { for (var i = 0, len = nameRanges.length; i < len; i++) { var it = nameRanges[i]; data.unshift([ it.name, " " + it.name, it.coord, true]); } } this.store.loadData(data); this.store.filterBy(function(rec) { var fname = rec.data.ef_fullname; fname = fname.toUpperCase(); if (0 == fname.indexOf(name)) { if (!details) { details = rec.data.ef_description; } return true; } return false; }, this); if (0 < this.store.getCount()) { var el = this.getEl(); var dEl = this.detailsCt.getEl(); this.detailsCt.show(); dEl.update(details); this.show(); el.alignTo(textCoverEl); dEl.alignTo(el, "tl-tr?"); } else { this.hide(); } }, /**选中一个字段*/ onNodeClick : function(dataView, index, node) { var rec = this.view.getRecord(node); var fn =rec.data.ef_fullname; this.fireEvent("selectfn", fn, rec.data.ef_description, this); this.hide(); }, selectFn : function() { var recs = this.view.getSelectedRecords(); if (recs.length) { var rec = recs[0]; var formula = rec.data.dsd_id; this.fireEvent("selectfield", formula, rec.data.isVar, this); this.hide(); } }, onMouseEnter : function(dataView, index, node) { var rec = dataView.getRecord(node); var dEl = this.detailsCt.getEl(); if (dEl) { dEl.update(rec.data.ef_description); } }, selectDown : function() { var indexs = this.view.getSelectedIndexes(); var index = 0; if (0 < indexs.length) { index = indexs[0]; index++; } var count = this.store.getCount() - 1; if (index > count) { index = count; } this.view.select(index); var dEl = this.detailsCt.getEl(); if (dEl) { var rec = this.store.getAt(index); if (rec != null) { dEl.update(rec.data.ef_description); } } }, selectUp : function() { var indexs = this.view.getSelectedIndexes(); var index = this.store.getCount() - 1; if (0 < indexs.length) { index = indexs[0]; index--; } if (0 > index) { index = 0; } this.view.select(index); var dEl = this.detailsCt.getEl(); if (dEl) { var rec = this.store.getAt(index); if (rec != null) { dEl.update(rec.data.ef_description); } } }, isSelected : function() { var indexs = this.view.getSelectedIndexes(); return 0 < indexs.length; } }); Ext.ns("Ext.ss.company"); Ext.ss.company.FormulaDropList = Ext.extend(Ext.ss.FormulaDropList, { searchMatch : function(name, textCoverEl, partVal) { if (/^['"]/.test(name)) { if (/ISIF\([^\(\)]*$/i.test(partVal)) { name = name.slice(1, name.length); if (name && 1 < name.length) { this.searchCompanyMatch(name, textCoverEl) } return } } Ext.ss.company.FormulaDropList.superclass.searchMatch.apply( this, arguments) }, searchCompanyMatch : function(name, textCoverEl) { if (5 <= name.length) { feyaSoft.api.JsonP.searchCompanyName(name, function(data, response) { if (response && 200 == response.status) { var data = response.data; var items = data.items; var len = items.length; if (15 < len) { len = 15 } var companies = []; for (var i = 0; i < len; i++) { var it = items[i]; var id = Number(it.company); if (Ext.isNumber(id)) { id = '"' + id + '"' } companies .push([id, it.name, null, true]) } this.store.removeAll(); this.store.loadData(companies); name = name.toUpperCase(); this.store.filterBy(function(rec) { var fname = rec.data.formula; fname = fname.toUpperCase(); if (0 == fname.indexOf(name)) { return true } return false }, this); if (0 < this.store.getCount()) { var el = this.getEl(); this.show(); el.alignTo(textCoverEl) } else { this.hide() } } }, this) } } }); Ext.ns("Ext.ss.field"); /**创建FieldList*/ Ext.ss.field.FieldDropList = Ext.extend(Ext.ss.FieldDropList, { searchMatch : function(name, textCoverEl, partVal) { if (/^['"]/.test(name)) { if (/ISIF\([^\(\)]*$/i.test(partVal)) { name = name.slice(1, name.length); if (name && 1 < name.length) { this.searchCompanyMatch(name, textCoverEl) } return } } Ext.ss.field.FieldDropList.superclass.searchMatch.apply( this, arguments) }, searchCompanyMatch : function(name, textCoverEl) { if (5 <= name.length) { feyaSoft.api.JsonP.searchCompanyName(name, function(data, response) { if (response && 200 == response.status) { var data = response.data; var items = data.items; var len = items.length; if (15 < len) { len = 15 } var companies = []; for (var i = 0; i < len; i++) { var it = items[i]; var id = Number(it.company); if (Ext.isNumber(id)) { id = '"' + id + '"' } companies .push([id, it.name, null, true]) } this.store.removeAll(); this.store.loadData(companies); name = name.toUpperCase(); this.store.filterBy(function(rec) { var fname = rec.data.formula; fname = fname.toUpperCase(); if (0 == fname.indexOf(name)) { return true } return false }, this); if (0 < this.store.getCount()) { var el = this.getEl(); this.show(); el.alignTo(textCoverEl) } else { this.hide() } } }, this) } } }); /**创建fnList*/ Ext.ns("Ext.ss.fn"); Ext.ss.fn.FnDropList = Ext.extend(Ext.ss.FnDropList, { searchMatch : function(name, textCoverEl, partVal) { if (/^['"]/.test(name)) { if (/ISIF\([^\(\)]*$/i.test(partVal)) { name = name.slice(1, name.length); if (name && 1 < name.length) { this.searchCompanyMatch(name, textCoverEl) } return } } Ext.ss.fn.FnDropList.superclass.searchMatch.apply( this, arguments) }, searchCompanyMatch : function(name, textCoverEl) { if (5 <= name.length) { feyaSoft.api.JsonP.searchCompanyName(name, function(data, response) { if (response && 200 == response.status) { var data = response.data; var items = data.items; var len = items.length; if (15 < len) { len = 15 } var companies = []; for (var i = 0; i < len; i++) { var it = items[i]; var id = Number(it.company); if (Ext.isNumber(id)) { id = '"' + id + '"' } companies .push([id, it.name, null, true]) } this.store.removeAll(); this.store.loadData(companies); name = name.toUpperCase(); this.store.filterBy(function(rec) { var fname = rec.data.formula; fname = fname.toUpperCase(); if (0 == fname.indexOf(name)) { return true } return false }, this); if (0 < this.store.getCount()) { var el = this.getEl(); this.show(); el.alignTo(textCoverEl) } else { this.hide() } } }, this) } } }); Ext.ns("Ext.ss"); Ext.ss.StatusBar = Ext.extend(Ext.ux.StatusBar, { initComponent : function() { this.cls += " "; delete this.statusAlign; Ext.ss.StatusBar.superclass.initComponent.call(this); }, afterRender : function() { Ext.ux.StatusBar.superclass.afterRender.call(this); this.currIconCls = this.iconCls || this.defaultIconCls; this.statusEl = new Ext.Toolbar.TextItem({ cls : "x-status-text " + (this.currIconCls || ""), text : this.text || this.defaultText || "" }); this.demoEl = new Ext.Toolbar.TextItem({ text : "优软科技  |  技术支持" }); this.insert(0, this.statusEl); this.insert(0, "->"); this.insert(1, this.demoEl); this.doLayout(); } }); Ext.ns("Ext.ss"); Ext.ss.DoList = Ext.extend(Ext.menu.Menu, { minWidth : 200, maxHeight : 300, scrollerOffset : 18, defaultDisplay : " ", plain : true, onRender : function(ct, position) { if (!ct) { ct = Ext.getBody(); } var dh = { id : this.getId(), cls : "x-menu " + (this.floating ? "x-menu-floating x-layer " : "") + (this.cls || "") + (this.plain ? " x-menu-plain" : "") + (this.showSeparator ? "" : " x-menu-nosep"), style : this.style, cn : [{ tag : "div", cls : "x-spreadsheet-dolist", cn : [{ tag : "a", cls : "x-menu-focus", href : "#", onclick : "return false;", tabIndex : "-1" }, { tag : "ul", cls : "x-menu-list" }] }, { tag : "span", cls : "x-menu-sep", html : " " }, { tag : "div", cls : "x-spreadsheet-dolist-foot", html : this.defaultDisplay }] }; if (this.floating) { this.el = new Ext.Layer({ shadow : this.shadow, dh : dh, constrain : false, parentEl : ct, zindex : this.zIndex }); } else { this.el = ct.createChild(dh); } Ext.menu.Menu.superclass.onRender.call(this, ct, position); this.focusEl = this.el.child("a.x-menu-focus"); this.list = this.el.child("div.x-spreadsheet-dolist"); this.ul = this.el.child("ul.x-menu-list"); this.foot = this.el.child("div.x-spreadsheet-dolist-foot"); this.mon(this.ul, { scope : this, click : this.onClick, mouseover : this.onMouseOver, mouseout : this.onMouseOut }); }, onMouseOver : function(e) { var t = this.findTargetItem(e); if (t) { var index = this.items.indexOf(t); var i; for (i = 0; i <= index; i++) { var it = this.items.get(i); if (it.canActivate && !it.disabled) { this.setActiveItem(it, true); } } for (var len = this.items.getCount(); i < len; i++) { var it = this.items.get(i); it.deactivate(); } this.activeCount = index + 1; this.fireEvent("mouseover", this, e, t); } else { this.fireEvent("mouseover", this, e); } this.over = true; }, deactiveAllItems : function() { for (var i = 0, len = this.items.getCount(); i < len; i++) { var it = this.items.get(i); it.deactivate(); } this.foot.dom.innerHTML = this.defaultDisplay; }, onMouseOut : function(e) { var t = this.findTargetItem(e); this.over = false; this.fireEvent("mouseout", this, e, t); }, setActiveItem : function(item, autoExpand) { if (item != this.activeItem) { if ((this.activeItem = item).isFormField) { item.focus(); } else { item.activate(autoExpand); } } else if (autoExpand) { item.expandMenu(); } }, show : function(el, pos, parentMenu) { if (this.floating) { this.parentMenu = parentMenu; if (!this.el) { this.render(); this.doLayout(false, true); } this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign, this.defaultOffsets), parentMenu); } else { Ext.menu.Menu.superclass.show.call(this); } this.deactiveAllItems(); }, showAt : function(xy, parentMenu) { if (this.fireEvent("beforeshow", this) !== false) { this.parentMenu = parentMenu; if (!this.el) { this.render(); } if (this.enableScrolling) { this.el.setXY(xy); this.constrainScroll(xy[1]); xy = [this.el.adjustForConstraints(xy)[0], xy[1]]; } else { xy = this.el.adjustForConstraints(xy); } this.el.setStyle("width", ""); if (this.el.getWidth() < this.minWidth) { this.el.setWidth(this.minWidth); } this.el.setXY(xy); this.el.show(); Ext.menu.Menu.superclass.onShow.call(this); if (Ext.isIE) { this.fireEvent("autosize", this); if (!Ext.isIE8) { this.el.repaint(); } } this.hidden = false; this.focus(); this.fireEvent("show", this); } }, constrainScroll : function(y) { var max, full = this.ul.setHeight("auto").getHeight(), returnY = y, normalY, parentEl, scrollTop, viewHeight; if (this.floating) { parentEl = Ext.fly(this.el.dom.parentNode); scrollTop = parentEl.getScroll().top; viewHeight = parentEl.getViewSize().height; normalY = y - scrollTop; max = this.maxHeight ? this.maxHeight : viewHeight - normalY; if (full > viewHeight) { max = viewHeight; returnY = y - normalY; } else if (max < full) { returnY = y - (full - max); max = full; } } else { max = this.getHeight(); } if (this.maxHeight) { max = Math.min(this.maxHeight, max); } if (full > max && max > 0) { this.activeMax = max - this.scrollerHeight * 2 - this.el.getFrameWidth("tb") - Ext.num(this.el.shadowOffset, 0); this.list.setHeight(this.activeMax); this.el.select(".x-menu-scroller").setDisplayed("none"); } else { this.list.setHeight(full); this.el.select(".x-menu-scroller").setDisplayed("none"); } this.ul.dom.scrollTop = 0; return returnY; } }); Ext.ns("Ext.ss"); Ext.ss.ChartManager = function(config) { Ext.apply(this, config); Ext.ss.ChartManager.superclass.constructor.call(this, {}); this.changedCharts = {}; this.addEvents("beforeselectionchange"); this.on("beforeselectionchange", this.onBeforeSelectionChangeFn, this); this.initContextMenu(); var ds = this.spreadsheet.ds; ds.on("afterdatachange", this.afterDataChange, this); this.on("syncchart", this.onSyncChart, this, { buffer : 100 }); }; Ext.extend(Ext.ss.ChartManager, Ext.util.Observable, { afterDataChange : function(x, y, sheetIndex, ds) { var ss = this.spreadsheet; var activeSheet = ds.activeSheet; var asheet = ds.sheets[activeSheet]; asheet.chartSet = asheet.chartSet || {}; var chartSet = asheet.chartSet; var changed = false; for (var p in chartSet) { var chart = chartSet[p]; var setting = chart.setting; var span = chart.span; if (span) { for (var i = 0, len = span.length; i < len; i++) { var it = span[i]; if (activeSheet == it.sheetIndex && it.x <= x && x <= it.ex && it.y <= y && y <= it.ey) { changed = true; this.changedCharts[p] = chart; } } } } if (changed) { this.fireEvent("syncchart", this); } }, onSyncChart : function() { var changed = false; var ss = this.spreadsheet, ds = ss.ds; for (var p in this.changedCharts) { if (this.changedCharts.hasOwnProperty(p)) { changed = true; var chart = this.changedCharts[p]; var setting = chart.setting; var span = chart.span; setting.data = ss.combineRanges(chart.span, "y"); this.generateChart(setting, chart.type, chart.span, chart.chartEl); } } if (changed) { ds.saveChanges(); } this.changedCharts = {}; }, deselectChart : function() { var sm = this.spreadsheet.sm; var cEl = this.selectedChartEl; if (cEl) { if (cEl.span) { sm.showDataRangeBorder(cEl.span); } cEl.removeClass("x-spreadsheet-chart-element-selected"); delete this.selectedChartEl; sm.fireEvent("renderborder"); } }, onBeforeSelectionChangeFn : function(os, ns) { var sm = this.spreadsheet.sm; if (os && os.span) { sm.showDataRangeBorder(os.span); } if (ns && ns.span) { sm.showDataRangeBorder(ns.span, true); } }, initContextMenu : function() { this.deleteItem = new Ext.menu.Item({ iconCls : "icon_delete", text : feyaSoft.lang.common['delete'], handler : this.onDeleteChartFn, scope : this }); this.settingItem = new Ext.menu.Item({ iconCls : "editItem", text : feyaSoft.lang.common.edit, handler : this.onEditChartFn, scope : this }); this.downloadItem = new Ext.menu.Item({ iconCls : "save", text : feyaSoft.lang.common.saveAsImage, handler : this.onSaveAsImageFn, scope : this }); this.cmenu = new Ext.menu.Menu({ items : [this.settingItem, this.downloadItem, "-", this.deleteItem] }); this.cmenu = Ext.menu.MenuMgr.get(this.cmenu); }, addChart : function(chartId, setting, type, span, existedChartEl) { var ss = this.spreadsheet; var ds = ss.ds; var chartEl = existedChartEl; if (!chartEl) { if (false == Ext.type(chartId)) { chartEl = Ext.DomHelper.append(ss.sctInner, "
", true); } else { chartEl = Ext.DomHelper .append( ss.sctInner, "
", true); } chartEl.center(ss.sct); } var obj = this.initChartEl(setting, chartEl, type, span); var asheet = ds.sheets[ds.activeSheet]; asheet.chartSet = asheet.chartSet || {}; asheet.chartSet[chartEl.id] = obj; return obj; }, initChartEl : function(setting, chartEl, type, span, flag) { var ss = this.spreadsheet; var sm = ss.sm; if ("image" == type) { this.generateImage(setting, chartEl); } else if ("gadgets" == type) { this.generateGadgets(setting, chartEl); } else if ("chart" == type) { if (!span) { span = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); span = [span]; } chartEl.update("
"); this.generateChart(setting, type, span, chartEl); } var linkEl = chartEl.child("a"); if (!linkEl) { linkEl = Ext.DomHelper .append( chartEl.dom, "
", true); } chartEl.on("mousedown", this.onChartMouseDownFn, { sender : this, chartEl : chartEl }); linkEl.on("keydown", this.onChartKeydown, { sender : this, chartEl : chartEl }); chartEl.on("dblclick", function(e) { e.stopEvent(); }); chartEl.on("contextmenu", this.onChartContextMenuFn, { sender : this, chartEl : chartEl }); if (!flag) { chartEl.dd = new Ext.dd.DD(chartEl.id, "ss-group", { onMouseDown : function(e) { e.stopEvent(); }, onDrag : function(e) { e.stopEvent(); }, onMouseUp : function(e) { e.stopEvent(); } }); var ds = this.spreadsheet.ds; var sm = this.spreadsheet.sm; chartEl.dd.endDrag = function() { ds.saveActiveSheet(true); ds.saveExtraInfo(); }; chartEl.rz = new Ext.Resizable(chartEl.id, { handles : "all", pinned : false, transparent : true }); chartEl.rz.on("resize", function() { ds.saveActiveSheet(true); ds.saveExtraInfo(); }, this); } return { chartEl : chartEl, span : span, type : type, setting : Ext.apply({}, setting) }; }, generateData : function(xflag, span) { var ss = this.spreadsheet; var ds = ss.ds; var fields = ["x"], data = []; var minx = span.minPos.x, miny = span.minPos.y, maxx = span.maxPos.x, maxy = span.maxPos.y; var tl = ds.getCell(span.minPos.x, span.minPos.y); var aflag = false, xaxis, yaxis; if (!tl.data || !Number(tl.data)) { xaxis = minx; yaxis = miny; minx++; miny++; aflag = true; } if ("y" == xflag) { for (var j = minx; j <= maxx; j++) { fields.push(j.toString()); } var index = 0; for (var i = miny; i <= maxy; i++) { var it = { x : ++index }; for (var j = minx; j <= maxx; j++) { it[j] = parseInt(ds.getCell(j, i).data); } data.push(it); } } else { for (var j = miny; j <= maxy; j++) { fields.push(j.toString()); } var index = 0; for (var i = minx; i <= maxx; i++) { var it = { x : ++index }; for (var j = miny; j <= maxy; j++) { it[j] = parseInt(ds.getCell(i, j).data); } data.push(it); } } return { fields : fields, data : data }; }, transferSetting2Params : function(setting) { var dataMatrix = setting.data; var params = {}, category = [], series = [], label = [], dataObj = {}; var needNumber = this.needNumberInXAxis(setting.type); if ("col" == setting.series_position) { var matrix = []; if (Ext.isObject(dataMatrix)) { for (var p in dataMatrix) { var it = dataMatrix[p]; var arr = []; for (var q in it) { arr.push(it[q]); } matrix.push(arr); } dataMatrix = matrix; } var i = 0, j = 0, len = dataMatrix.length, count = dataMatrix[0].length; if (setting.col_label) { i++; } if (setting.row_label) { j++; } if (setting.col_label) { var col = dataMatrix[0]; for (var k = j; k < count; k++) { label.push(col[k]); } dataObj.label = label; } if (setting.row_label) { for (var k = i; k < len; k++) { category.push(dataMatrix[k][0]); } dataObj.category = category; } for (; i < len; i++) { var col = dataMatrix[i]; var arr = []; for (var k = j; k < count; k++) { arr.push(col[k]); } series.push(arr); } dataObj.series = series; } else { var i = 0, j = 0, len = dataMatrix.length, count = dataMatrix[0].length; if (setting.col_label) { i++; } if (setting.row_label) { j++; } if (setting.col_label) { var col = dataMatrix[0]; for (var k = j; k < count; k++) { category.push(col[k]); } dataObj.category = category; } if (setting.row_label) { for (var k = i; k < len; k++) { label.push(dataMatrix[k][0]); } dataObj.label = label; } for (; j < count; j++) { var arr = []; for (var k = i; k < len; k++) { arr.push(dataMatrix[k][j]); } series.push(arr); } dataObj.series = series; } params.title = setting.title || " "; if (setting.subtitle) { if (params.title) { params.title += " - " + setting.subtitle; } else { params.title = setting.subtitle; } } if (setting.x_field_title) { params.x_field_title = setting.x_field_title; } if (setting.y_field_title) { params.y_field_title = setting.y_field_title; } if (setting.display_legend_pos) { params.display_legend_pos = setting.display_legend_pos; } if (setting.look3D) { params.look3D = setting.look3D; } params.fontfamily = setting.fontfamily || "Arial"; params.fontsize = setting.fontsize || "12"; params.fontcolor = setting.fontcolor || "000000"; params.fontstyle = setting.fontstyle || "PLAIN"; params.data = Ext.encode(dataObj); params.uid = Ext.id() + "-" + (new Date).format("YmdHis"); return params; }, needNumberInXAxis : function(type) { if ("line" == type || "scatter" == type || "bubble" == type || "stock" == type) { return true; } return false; }, getURLbyType : function(type, subtype) { var ssUrl = feyaSoft.home.CONST.spreadSheetUrl; var URL = ssUrl.barChart; if ("column" == type) { URL = URL + "?subtype=" + subtype; } else if ("bar" == type) { URL = URL + "?type=horizontal&subtype=" + subtype; } else if ("pie" == type) { URL = ssUrl.pieChart + "?subtype=" + subtype; } else if ("area" == type) { URL = ssUrl.areaChart + "?subtype=" + subtype; } else if ("line" == type) { URL = ssUrl.lineChart + "?subtype=" + subtype; } else if ("scatter" == type) { URL = ssUrl.scatterChart + "?subtype=" + subtype; } else if ("bubble" == type) { URL = ssUrl.bubbleChart + "?subtype=" + subtype; } else if ("stock" == type) { URL = ssUrl.tseriesChart + "?subtype=" + subtype; } else if ("columnline" == type) { URL = ssUrl.columnline + "?subtype=" + subtype; } return URL; }, generateChart : function(setting, type, span, chartEl) { chartEl.setting = setting; chartEl.span = span; var params = this.transferSetting2Params(setting); Ext.Ajax.request({ timeout : 300000, url : this.getURLbyType(setting.type, setting.subtype), params : params, success : function(response, option) { var json = Ext.decode(response.responseText); chartEl.chartImagePath = json.path; chartEl .child(".inner") .update(""); }, failure : function(response, option) { }, scope : this }); }, onChartMouseDownFn : function(e) { e.stopEvent(); var sender = this.sender; if (sender.selectedChartEl) { sender.selectedChartEl .removeClass("x-spreadsheet-chart-element-selected"); } this.chartEl.addClass("x-spreadsheet-chart-element-selected"); sender.fireEvent("beforeselectionchange", sender.selectedChartEl, this.chartEl); sender.selectedChartEl = this.chartEl; var linkEl = this.chartEl.child("a"); linkEl.focus(500); }, resetDataRangeBorder : function() { var sm = this.spreadsheet.sm; var cEl = this.selectedChartEl; if (cEl) { cEl.removeClass("x-spreadsheet-chart-element-selected"); if (cEl.span) { sm.showDataRangeBorder(cEl.span); } delete this.selectedChartEl; sm.fireEvent("renderborder"); } }, getChartConfig : function(index, chartIndex) { var ss = this.spreadsheet; var ds = ss.ds; var asheet = ds.sheets[index]; var chart = asheet.chartSet[chartIndex]; var cEl = chart.chartEl; var setting = chart.setting; var o = { setting : setting, chartImagePath : cEl.chartImagePath, span : ds.deepClone(chart.span), type : chart.type }; if (cEl.isVisible()) { Ext.apply(o, { top : cEl.getTop(), left : cEl.getLeft(), width : cEl.getWidth(), height : cEl.getHeight() }); } else { Ext.apply(o, cEl.cachePos); } return o; }, getCharts : function(index) { var ss = this.spreadsheet; var ds = ss.ds; var asheet = ds.sheets[index]; var arr = []; for (var p in asheet.chartSet) { arr.push(this.getChartConfig(index, p)); } return arr; }, generateCharts : function(charts) { var ss = this.spreadsheet; var ds = ss.ds; var asheet = ds.sheets[ds.activeSheet]; asheet.chartSet = {}; for (var i = 0, len = charts.length; i < len; i++) { var chart = charts[i]; this.generateChartByConfig(chart); } }, generateChartByConfig : function(chartConfig) { var obj = this.addChart(chartConfig.chartId, chartConfig.setting, chartConfig.type, chartConfig.span); var chartEl = obj.chartEl, parentEl = chartEl.parent(); chartEl.setTop(chartConfig.top - parentEl.getTop()); chartEl.setLeft(chartConfig.left - parentEl.getLeft()); chartEl.setWidth(chartConfig.width); chartEl.setHeight(chartConfig.height); }, onChartContextMenuFn : function(e) { e.stopEvent(); var chartEl = this.chartEl; var sender = this.sender; sender.cmenu.chartEl = chartEl; var ftNode = chartEl.dom.firstChild; if (ftNode.tagName.toLowerCase() == "img") { sender.downloadItem.setDisabled(true); sender.settingItem.setDisabled(true); } else { sender.downloadItem.setDisabled(false); sender.settingItem.setDisabled(false); } sender.cmenu.showAt(e.getXY()); }, onDeleteChartFn : function(item) { var cmenu = item.parentMenu; var chartEl = cmenu.chartEl; var ss = this.spreadsheet; var ds = ss.ds, sm = ss.sm; var og = { action : "delete-chart", type : "undo", sheetIndex : ds.activeSheet, chartId : chartEl.id, chartConfig : this.getChartConfig(ds.activeSheet, chartEl.id) }; var md = { action : "delete-chart", type : "redo", sheetIndex : ds.activeSheet, chartId : chartEl.id }; ds.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }, true); ds.trace(feyaSoft.ss.lang.deletePicture); this.deleteChartById(ds.activeSheet, chartEl.id); }, deleteChartById : function(sheetIndex, chartId) { var ss = this.spreadsheet; var sm = ss.sm; var ds = ss.ds; this.fireEvent("beforeselectionchange", this.selectedChartEl); var asheet = ds.sheets[ds.activeSheet]; var chartObj = asheet.chartSet[chartId]; chartObj.chartEl.remove(); delete asheet.chartSet[chartId]; delete this.selectedChartEl; sm.fireEvent("renderborder"); ds.saveActiveSheet(true); ds.saveExtraInfo(); }, onEditChartFn : function(item) { var ss = this.spreadsheet; var ds = ss.ds; var cmenu = item.parentMenu; var chartEl = cmenu.chartEl; var asheet = ds.sheets[ds.activeSheet]; ss.chartSelector.popup(asheet.chartSet[chartEl.id], chartEl); }, onSaveAsImageFn : function(item) { var cmenu = item.parentMenu; var chartEl = cmenu.chartEl; window.open(chartEl.chartImagePath, "_blank"); }, sysnChartPos : function(fr, sr, ofr, osr) { var ss = this.spreadsheet; var ds = ss.ds; var asheet = ds.sheets[ds.activeSheet]; var offsetx, offsety; var flagx = ofr.col.end > fr.col.end ? 1 : -1; var flagy = ofr.row.end > fr.row.end ? 1 : -1; if (0 > flagx) { offsetx = flagx * ds.getWidth(ofr.col.end + 1, fr.col.end); } else { offsetx = flagx * ds.getWidth(fr.col.end + 1, ofr.col.end); } if (0 > flagy) { offsety = flagy * ds.getHeight(ofr.row.end + 1, fr.row.end); } else { offsety = flagy * ds.getHeight(fr.row.end + 1, ofr.row.end); } var sl = ss.sctInner.getLeft(); var st = ss.sctInner.getTop(); for (var p in asheet.chartSet) { var chart = asheet.chartSet[p]; var cEl = chart.chartEl; var cl = cEl.getLeft(); var ct = cEl.getTop(); var l = cl - sl + offsetx; var t = ct - st + offsety; this.splitChart(chart, 0 > t, 0 > l); cEl.setLeft(l); cEl.setTop(t); } }, splitChart : function(chart, yflag, xflag) { var ss = this.spreadsheet; if (yflag) { } if (xflag) { } if (yflag && xflag) { } }, displayCharts : function(index, display) { var ss = this.spreadsheet; var ds = ss.ds; var sheets = ds.sheets; var charts = sheets[index].chartSet; for (var p in charts) { var cEl = charts[p].chartEl; cEl.cachePos = { left : cEl.getLeft(), top : cEl.getTop(), width : cEl.getWidth(), height : cEl.getHeight() }; cEl.dom.style.display = display || ""; } }, cleanCharts : function() { var ss = this.spreadsheet; var ds = ss.ds; var sheets = ds.sheets; var charts = sheets[ds.activeSheet].chartSet; for (var p in charts) { var cEl = charts[p].chartEl; cEl.remove(); } }, generateImage : function(setting, iEl) { iEl.dom.innerHTML = ""; return iEl; }, generateGadgets : function(setting, gEl) { var url = encodeURIComponent(setting.script); gEl.dom.innerHTML = ""; return gEl; }, onChartKeydown : function(e) { var me = this.sender; e.stopEvent(); var key = e.getKey(); if (e.DELETE == key) { me.onDeleteChartFn({ parentMenu : { chartEl : this.chartEl } }); } } }); Ext.ns("Ext.ss.menu"); Ext.ss.menu.ContextMenu = function(config) { Ext.apply(this, config); var lan_ss = feyaSoft.ss.lang; this.nameRangeItem = new Ext.menu.Item({ text : feyaSoft.ss.lang.markRange, handler : this.nameSelectionRange, scope : this }); this.spItem = new Ext.menu.Item({ iconCls : "icon_ss_split", text : feyaSoft.ss.lang.splitGrid, handler : this.onSplitGridFn, scope : this }); this.fzItem = new Ext.menu.Item({ iconCls : "icon_fz", text : feyaSoft.ss.lang.freezeGrid, handler : this.onFreezeFn, scope : this }); this.cutItem = new Ext.menu.Item({ iconCls : "icon_cut", text : feyaSoft.lang.common.cut, handler : this.onCutFn, scope : this }); this.copyItem = new Ext.menu.Item({ iconCls : "icon_copy", text : feyaSoft.lang.common.copy, handler : this.onCopyFn, scope : this }); this.pasteItem = new Ext.menu.Item({ iconCls : "icon_paste", text : feyaSoft.lang.common.paste, handler : this.onPasteFn, scope : this }); this.commentAddItem = new Ext.menu.Item({ iconCls : "icon_comment_add", text : feyaSoft.lang.common.newComment, handler : this.onAddCommentFn, scope : this }); this.commentEditItem = new Ext.menu.Item({ iconCls : "icon_comment_edit", text : feyaSoft.lang.common.editComment, handler : this.onEditCommentFn, scope : this }); this.commentDeleteItem = new Ext.menu.Item({ iconCls : "icon_comment_delete", text : feyaSoft.word.lang.delete_comment, handler : this.onDeleteCommentFn, scope : this }); this.combineItem = new Ext.menu.Item({ iconCls : "icon_combine_cell", text : feyaSoft.ss.lang.combineCells, handler : this.onCombineFn, scope : this }); this.splitItem = new Ext.menu.Item({ iconCls : "icon_split_cell", text : feyaSoft.ss.lang.splitCell, handler : this.onSplitFn, scope : this }); this.clearItem = new Ext.menu.Item({ iconCls : "icon_ss_clear", text : feyaSoft.ss.lang.clearSelection, handler : this.onClearContentFn, scope : this }); this.removeFormatItem = new Ext.menu.Item({ iconCls : "icon_remove_format", text : lan_ss.remove_format, handler : this.onRemoveFormatFn, scope : this }); this.insertItem = new Ext.menu.Item({ text : feyaSoft.lang.common.insert, handler : this.onInsertFn, scope : this }); this.insertRangeItem = new Ext.menu.Item({ text : feyaSoft.lang.common.insert, menu : [{ iconCls : "icon_insert_row_above", text : lan_ss.insertRowAbove, handler : function() { this.spreadsheet.toolbar.onInsertRowAboveFn(); }, scope : this }, { iconCls : "icon_insert_row_below", text : lan_ss.insertRowBelow, handler : function() { this.spreadsheet.toolbar.onInsertRowBelowFn(); }, scope : this }, { iconCls : "icon_insert_col_before", text : lan_ss.insertColBefore, handler : function() { this.spreadsheet.toolbar.onInsertColBeforeFn(); }, scope : this }, { iconCls : "icon_insert_col_after", text : lan_ss.insertColAfter, handler : function() { this.spreadsheet.toolbar.onInsertColAfterFn(); }, scope : this }] }); this.deleteItem = new Ext.menu.Item({ iconCls : "icon_delete", text : feyaSoft.lang.common['delete'], handler : this.onDeleteFn, scope : this }); this.colWidthField = new Ext.form.NumberField({ xtype : "numberfield", emptyText : "Enter a number(> 0)", allowBlank : false, enableKeyEvents : true, listeners : { keydown : { fn : this.onColWidthFn, scope : this } } }); this.colWidthItem = new Ext.menu.Item({ text : feyaSoft.ss.lang.columnWidth, menu : { items : [this.colWidthField] } }); this.rowHeightField = new Ext.form.NumberField({ emptyText : "Enter a number(> 0)", allowBlank : false, enableKeyEvents : true, listeners : { keydown : { fn : this.onRowHeightFn, scope : this } } }); this.rowHeightItem = new Ext.menu.Item({ text : feyaSoft.ss.lang.rowHeight, menu : { items : [this.rowHeightField] } }); this.hideItem = new Ext.menu.Item({ text : feyaSoft.ss.lang.hideRow, handler : this.onHideFn, scope : this }); this.unhideItem = new Ext.menu.Item({ text : feyaSoft.ss.lang.unhideRow, handler : this.onUnhideFn, scope : this }); this.insertIncellImageItem = new Ext.menu.Item({ iconCls : "icon_insert_image", text : feyaSoft.ss.lang.insertCellImage, menu : { items : [{ iconCls : "icon_insert_image_open", text : feyaSoft.ss.lang.selectImage, handler : this.onInsertIncellImageByOpenFn, scope : this }, { iconCls : "icon_insert_image_link", text : feyaSoft.ss.lang.linkImage, menu : { items : [{ xtype : "textarea", width : 300, height : 150, emptyText : feyaSoft.word.lang.insert_image_url, allowBlank : false, enableKeyEvents : true, listeners : { keydown : { fn : this.onInsertIncellImageByLinkFn, scope : this } } }] } }] } }); this.cropItem = new Ext.menu.Item({ text : "Crop", handler : this.onCropFn, scope : this }); this.fitImageItem = new Ext.menu.Item({ text : "Fit Image in Cell", handler : this.onFitImageFn, scope : this }); this.fitCellItem = new Ext.menu.Item({ text : "Fit Cell Around Image", handler : this.onFitCellFn, scope : this }); this.incellImageOptionItem = new Ext.menu.Item({ iconCls : "icon_setting", text : "In-cell Image Option", menu : { items : [this.cropItem, this.fitImageItem, this.fitCellItem] } }); this.addGroupItem = new Ext.menu.Item({ text : feyaSoft.ss.lang.addGroup, handler : this.onAddGroup, scope : this }); this.cancelGroupItem = new Ext.menu.Item({ text : feyaSoft.ss.lang.cancelGroup, handler : this.onCancelGroup, scope : this }); this.hyperlinkItem = new Ext.menu.Item({ iconCls : "icon_link", text : feyaSoft.ss.lang.hyperlink, handler : this.onHyperlink, scope : this }); this.editFormula = new Ext.menu.Item({ text : feyaSoft.ss.lang.isi_add_formula, hidden : true, handler : function() { this.emisOpenDialog("AL"); }, scope : this }); this.companyLookup = new Ext.menu.Item({ text : feyaSoft.ss.lang.isi_company_lookup, hidden : true, handler : function() { this.emisOpenDialog("CL"); }, scope : this }); this.importCompanies = new Ext.menu.Item({ text : feyaSoft.ss.lang.isi_import_company, hidden : true, handler : function() { this.emisOpenDialog("IC"); }, scope : this }); this.copyTpl = (new Ext.XTemplate([ "", "", "", "", "", "", "", "", "
{data}
"] .join(""))).compile(); this.copyRandomId = Ext.ss.CONST.copySourceID + (new Date).format("YmdHisu"); Ext.ss.menu.ContextMenu.superclass.constructor.call(this, { items : [this.fzItem, this.spItem, this.combineItem, this.splitItem, "-", this.cutItem, this.copyItem, this.pasteItem, "-", this.commentAddItem, this.commentEditItem, this.commentDeleteItem, "-", this.clearItem, this.removeFormatItem, this.insertItem, this.insertRangeItem, this.deleteItem, this.colWidthItem, this.rowHeightItem, this.hideItem, this.unhideItem, this.insertIncellImageItem, this.incellImageOptionItem, this.addGroupItem, this.cancelGroupItem, this.nameRangeItem, this.hyperlinkItem, "-", this.editFormula, this.companyLookup, this.importCompanies], listeners : { mouseover : { fn : function() { var ss = this.spreadsheet; ss.commenttip.hide(); }, scope : this } } }); }; Ext.extend(Ext.ss.menu.ContextMenu, Ext.menu.Menu, { onBodyContextMenuFn : function(e) { e.stopEvent(); var ss = this.spreadsheet; var sm = ss.sm; var ds = ss.ds; sm.transferFocus(); var target = e.getTarget(); var tgEl = Ext.get(target); var xy = e.getXY(); var xlimit = ss.ylivescroller.getLeft(); var ylimit = ss.xlivescroller.getTop(); ss.hyperlinktip.hide(); if (xy[0] <= xlimit && xy[1] <= ylimit) { var pos = ds.getPosFromXY(xy[0], xy[1]); if (pos) { if (false == sm.isSelected(pos.x, pos.y)) { sm.handleLeftClick(pos, true); } if (sm.isInRange(sm.focusCell)) { if (ss.splitFlag) { this.spItem.setText(feyaSoft.ss.lang.cancelSplit); this.spItem.show(); this.fzItem.hide(); } else { if (0 == ss.freezeRange.col.end && 0 == ss.freezeRange.row.end) { this.fzItem.setText(feyaSoft.ss.lang.freezeGrid); this.spItem.setText(feyaSoft.ss.lang.splitGrid); this.spItem.show(); } else { this.fzItem.setText(feyaSoft.ss.lang.cancelFreeze); this.spItem.hide(); } this.fzItem.show(); } } else { this.fzItem.hide(); this.spItem.hide(); } this.colWidthItem.hide(); this.rowHeightItem.hide(); this.hideItem.hide(); this.unhideItem.hide(); this.deleteItem.hide(); this.insertItem.hide(); this.insertRangeItem.show(); this.addGroupItem.hide(); this.cancelGroupItem.hide(); var selectedStart = sm.selectedStart, selectedEnd = sm.selectedEnd; var rt = sm.getMinMaxFromStartEnd(selectedStart, selectedEnd); var minx = rt.minPos.x, miny = rt.minPos.y, maxx = rt.maxPos.x, maxy = rt.maxPos.y; var cflag = 0 == selectedStart.x && 0 == selectedEnd.x; var rflag = 0 == selectedStart.y && 0 == selectedEnd.y; if (cflag && rflag) { } else if (cflag) { this.colWidthField.setValue(ds.getColWidth(pos.y)); this.colWidthItem.show(); if (sm.isContainHideCol()) { this.unhideItem.show(); this.unhideItem.setText(feyaSoft.ss.lang.unhideCol); } this.deleteItem.show(); this.insertItem.show(); this.insertRangeItem.hide(); this.hideItem.setText(feyaSoft.ss.lang.hideCol); this.hideItem.show(); if (0 < maxy - miny) { this.addGroupItem.show(); } var colSetting = ds.data.colSetting; for (var i = miny; i <= maxy; i++) { var it = colSetting[i]; if (it && it.group) { this.cancelGroupItem.show(); break; } } } else if (rflag) { this.rowHeightField.setValue(ds.getRowHeight(pos.x)); this.rowHeightItem.show(); if (sm.isContainHideRow()) { this.unhideItem.show(); this.unhideItem.setText(feyaSoft.ss.lang.unhideRow); } this.deleteItem.show(); this.insertItem.show(); this.insertRangeItem.hide(); this.hideItem.setText(feyaSoft.ss.lang.hideRow); this.hideItem.show(); if (0 < maxx - minx) { this.addGroupItem.show(); } var rowSetting = ds.data.rowSetting; for (var i = minx; i <= maxx; i++) { var it = rowSetting[i]; if (it && it.group) { this.cancelGroupItem.show(); break; } } } var cell = ds.getCellObj(pos.x, pos.y) || {}; this.bindCell = cell; if (Ext.ss.common.Mask.isImage(cell.data)) { this.incellImageOptionItem.show(); } else { this.incellImageOptionItem.hide(); } if (tgEl.hasClass(Ext.ss.CONST.cssHash[3])) { this.commentAddItem.hide(); } else { this.commentAddItem.show(); } var x = sm.focusCell.x, y = sm.focusCell.y; var wrap = cell.wrap; if (wrap) { this.fitCellItem.hide(); } else { this.fitCellItem.show(); } if (false == sm.isSingleSelected()) { this.splitItem.hide(); this.combineItem.show(); if (wrap) { var rs = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); if (rs.minPos.x == wrap.minx && rs.minPos.y == wrap.miny && rs.maxPos.x == wrap.maxx && rs.maxPos.y == wrap.maxy) { this.combineItem.hide(); this.splitItem.show(); } } } else { this.combineItem.hide(); this.splitItem.hide(); if (wrap) { var rs = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); if (rs.minPos.x == wrap.minx && rs.minPos.y == wrap.miny && rs.maxPos.x == wrap.maxx && rs.maxPos.y == wrap.maxy) { this.splitItem.show(); } } } if (feyaSoft.home.CONST.CLIENT_NAME == "isi") { this.editFormula.show(); this.companyLookup.show(); this.importCompanies.show(); } else { this.editFormula.hide(); this.companyLookup.hide(); this.importCompanies.hide(); } this.showAt(xy); } } }, onFreezeFn : function(item) { var ss = this.spreadsheet; var ds = ss.ds; var sm = ss.sm; var action; if (!ss.isFreezed()) { var x = sm.focusCell.x; var y = sm.focusCell.y; ss.MoveFreezer(x, y); action = feyaSoft.ss.lang.freezeAction; } else { ss.CancelFreezer(); action = feyaSoft.ss.lang.unfreezeAction; } ds.trace(action); sm.transferFocus(); }, onCutFn : function(item) { var ss = this.spreadsheet; var sm = ss.sm; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; this.copy(function(content) { this.sm .clearFormatRange(minx, miny, maxx, maxy, true, true); this.resetCutStatus(); }); }, onCopyFn : function(item) { this.copy(); }, copy : function(cb, scope) { var ss = this.spreadsheet; var sm = ss.sm, ds = ss.ds; var data = sm.getSelectedData(); var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; ss.setCutStatus(minx, miny, maxx, maxy); var span = data.span; var v = ss.editor.getSelectionValue(); if (minx == maxx && miny == maxy && v) { var da = data.data; var md = da[minx]; if (md) { md[miny].data = v; } } var fromRange = { sheetIndex : ds.activeSheet, minx : minx, miny : miny, maxx : maxx, maxy : maxy }; var textCover = sm.getTextCover(); var psTxt = ss.sview.dom.firstChild; minx = maxx = miny = maxy = false; var datas = data.data; for (var p in datas) { p = Number(p); if (false === minx) { minx = p; } else if (minx > p) { minx = p; } if (false === maxx) { maxx = p; } else if (maxx < p) { maxx = p; } var o = datas[p]; for (var q in o) { q = Number(q); if (false === miny) { miny = q; } else if (miny > q) { miny = q; } if (false === maxy) { maxy = q; } else if (maxy < q) { maxy = q; } } } var rows = []; for (var i = minx; i <= maxx; i++) { var arr = []; for (var j = miny; j <= maxy; j++) { arr.push(""); } rows.push(arr); } var html, strs = []; for (var p in datas) { p = Number(p); var o = datas[p]; for (var q in o) { q = Number(q); var val = o[q]['origin-data'] || o[q].data || ""; if (Ext.isString(val)) { val = Ext.util.Format.htmlDecode(val); val = val.replace(/"/g, "\""); val = val.replace(/\s/gi, " "); } rows[p - minx][q - miny] = val; } strs.push(rows[p - minx].join("\t")); } html = strs.join("\n"); psTxt.value = html; psTxt.focus(); psTxt.select(); if (Ext.isIE) { window.clipboardData.setData("Text", html); } Ext.util.GlobalBoard.setBoard({ cb : cb, scope : scope, type : ".ss", content : data, snapshot : html, path : null, source : null, fromRange : fromRange, paste2Fn : ss.pasteDataFromBoard2SS }); }, onPasteFn : function(item) { var me = this; var ss = this.spreadsheet, cmenu = ss.contextmenu; var sm = ss.sm; var textCover = sm.getTextCover(); var display = textCover.style.display; var psTxt = ss.sview.dom.firstChild; if (Ext.isIE) { psTxt.value = ""; } psTxt.focus(); psTxt.select(); (function() { var v = psTxt.value; var board = Ext.util.GlobalBoard.getBoard(); var snapshot = board.snapshot; if (Ext.isString(snapshot)) { snapshot = snapshot.replace(/\s/gi, ""); } var cur = v.replace(/\s/gi, ""); if (v && -1 == v.indexOf(me.copyRandomId) && cur !== snapshot && (-1 == cur.indexOf(snapshot) || !snapshot)) { if (display == "none") { v = v.trim(); var lt = v.match(/\t/gi); lt = lt ? lt.length : 0; var lbr = v.match(/
/gi); lbr = lbr ? lbr.length : 0; var ln = v.match(/\n/gi); ln = ln ? ln.length : 1; var dataVal = Ext.util.Format.htmlEncode(v); var param = { flag : "cells", span : { minx : 1, miny : 1, maxx : 1, maxy : 1 }, data : { '1' : {} }, rowSetting : {}, colSetting : {} }; if (false != Ext.type(dataVal) && "" != dataVal) { dataVal = dataVal.replace(/\s/gi, " "); param.data[1] = { '1' : { data : dataVal } }; } if (ln > 0 && lt > 0) { var nary = v.split("\n"); var nLeng = nary.length; param.span.maxx = nLeng; var maxAry = []; var split_tAry = []; for (var n = 0; n < nLeng; n++) { var tary = nary[n].split("\t"); maxAry.push(tary.length); split_tAry.push(tary); } var maxLeng = Ext.max(maxAry); param.span.maxy = maxLeng; for (var k = 0; k < split_tAry.length; k++) { var itAry = split_tAry[k]; if (k == 0 && itAry.length < maxLeng) { var subtractValue = maxLeng - itAry.length; for (r = 0; r < subtractValue; r++) { itAry.unshift(""); } } var tmp = {}; for (var t = 0; t < itAry.length; t++) { var dataVal = Ext.util.Format .htmlEncode(itAry[t]); if (false != Ext.type(dataVal) && "" != dataVal) { dataVal = dataVal.replace(/\s/gi, " "); tmp[t + 1] = { data : dataVal }; } } param.data[k + 1] = tmp; } } else if (ln > 0) { var nary = v.split("\n"); var nLeng = nary.length; param.span.maxx = nLeng; param.span.maxy = 1; for (var n = 0; n < nLeng; n++) { var dataVal = Ext.util.Format.htmlEncode(nary[n]); if (false != Ext.type(dataVal) && "" != dataVal) { dataVal = dataVal.replace(/\s/gi, " "); param.data[n + 1] = { 1 : { data : dataVal } }; } } } else if (lbr > 0) { var brary = v.split("
"); var brLeng = brary.length; param.span.maxx = brLeng; param.span.maxy = 1; for (var b = 0; b < brLeng; b++) { var dataVal = Ext.util.Format.htmlEncode(nary[n]); if (false != Ext.type(dataVal) && "" != dataVal) { dataVal = dataVal.replace(/\s/gi, " "); param.data[b + 1] = { 1 : { data : dataVal } }; } } } ss.pasteDataFromBoard2SS(ss, ".ss", undefined, { content : param }, true); } else { } psTxt.value = ""; } else { board.paste2Fn(ss, ".ss"); } }).defer(50); }, onAddCommentFn : function() { this.spreadsheet.commenteditor.show(Ext.ss.CONST.Comment.ADD); }, onEditCommentFn : function() { this.spreadsheet.commenteditor.show(Ext.ss.CONST.Comment.EDIT); }, onDeleteCommentFn : function() { var ss = this.spreadsheet; var sm = ss.sm, ds = ss.ds; var focusCell = sm.focusCell; var x = focusCell.x, y = focusCell.y; var cels = ss.getCellHEls(x, y); if (cels) { for (var i = 0, len = cels.length; i < len; i++) { var cEl = Ext.get(cels[i]); cEl.removeClass(Ext.ss.CONST.cssHash[3]); } } ss.ds.deleteCommentFn(x, y); ds.trace(feyaSoft.ss.lang.action_delete_comment(ds .getNameFromPos(focusCell))); }, onCombineFn : function(item) { var ss = this.spreadsheet; var fr = ss.freezeRange; var sm = ss.sm; var ds = ss.ds; var rs = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rs.minPos.x, miny = rs.minPos.y, maxx = rs.maxPos.x, maxy = rs.maxPos.y; var span = { minx : minx, miny : miny, maxx : maxx, maxy : maxy }; sm.focusCell = { x : minx, y : miny }; var ltel; for (var x = minx; x <= maxx; x++) { for (var y = miny; y <= maxy; y++) { var cels = ss.getCellHEls(x, y); if (cels) { for (var i = 0, len = cels.length; i < len; i++) { var cEl = Ext.get(cels[i]); var tel = cEl.dom.parentNode; if (x == minx && y == miny) { ltel = tel; } else if (ltel) { tel.style.backgroundColor = ltel.style.backgroundColor; cEl.dom.innerHTML = ""; } if (x != maxx && x != fr.row.end) { cEl.addClass("x-spreadsheet-bottom-none"); } if (y != maxy && y != fr.col.end) { cEl.addClass("x-spreadsheet-right-none"); } } } ds.fireEvent("attributechange", x, y, [["wrap", Ext.apply({}, span)]]); var obj = ds.getCell(x, y); obj.x = x; obj.y = y; ss.refreshCell(obj); } } delete ds.formulaRelatedMap; ds.onCheckFormulaFn(); ds.trace(feyaSoft.ss.lang.merge_cell, "wrap"); sm.fireEvent("renderborder"); sm.transferFocus(); }, onSplitFn : function(item) { var ss = this.spreadsheet; var sm = ss.sm; var ds = ss.ds; var rs = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rs.minPos.x, miny = rs.minPos.y, maxx = rs.maxPos.x, maxy = rs.maxPos.y; sm.focusCell = { x : minx, y : miny }; for (var x = minx; x <= maxx; x++) { for (var y = miny; y <= maxy; y++) { var cels = ss.getCellHEls(x, y); if (cels) { for (var i = 0, len = cels.length; i < len; i++) { var cEl = Ext.get(cels[i]); if (x != maxx) { cEl.removeClass("x-spreadsheet-bottom-none"); } if (y != maxy) { cEl.removeClass("x-spreadsheet-right-none"); } } } ds.fireEvent("attributechange", x, y, [["wrap", null]]); var obj = ds.getCell(x, y); obj.x = x; obj.y = y; ss.refreshCell(obj); } } delete ds.formulaRelatedMap; ds.onCheckFormulaFn(); ds.trace(feyaSoft.ss.lang.cancel_merge, "unwrap"); sm.fireEvent("renderborder"); sm.transferFocus(); }, onClearAllFn : function() { var ss = this.spreadsheet; var sm = ss.sm; sm.clearSelectedAll(); var ds = ss.ds; var sc = ds.getLetter(sm.selectedStart.y) + sm.selectedStart.x; var ec = ds.getLetter(sm.selectedEnd.y) + sm.selectedEnd.x; ds.trace(feyaSoft.ss.lang.action_clear(sc, ec), "clear-all"); }, onClearContentFn : function() { var ss = this.spreadsheet; ss.fxField.setValue(""); var sm = ss.sm; sm.clearSelectedData(); var ds = ss.ds; var sc = ds.getLetter(sm.selectedStart.y) + sm.selectedStart.x; var ec = ds.getLetter(sm.selectedEnd.y) + sm.selectedEnd.x; ds.trace(feyaSoft.ss.lang.action_clear(sc, ec)); }, onRemoveFormatFn : function() { var ss = this.spreadsheet; var sm = ss.sm; sm.clearSelectedFormat(); var ds = ss.ds; var sc = ds.getLetter(sm.selectedStart.y) + sm.selectedStart.x; var ec = ds.getLetter(sm.selectedEnd.y) + sm.selectedEnd.x; ds.trace(feyaSoft.ss.lang.action_clear_format(sc, ec)); }, onDeleteFn : function() { var sm = this.spreadsheet.sm; var toolbar = this.spreadsheet.toolbar; if (0 == sm.selectedStart.x) { toolbar.onDeleteColFn(); } else { toolbar.onDeleteRowFn(); } }, onColWidthFn : function(nf, e) { var key = e.getKey(); if (Ext.EventObject.ENTER == key) { if (nf.isValid()) { var ss = this.spreadsheet; var ds = ss.ds; var w = nf.getValue() - ss.xpaddingOffset; var sm = ss.sm; var min = ss.xpaddingOffset + 1; if (min > w) { w = min; } var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var miny = rt.minPos.y, maxy = rt.maxPos.y; for (var j = miny; j <= maxy; j++) { ss.fireEvent("updatecss", "colSetting", j, "cw", w); } ds.trace(feyaSoft.ss.lang.action_col_resize(ds.getLetter(miny), ds.getLetter(maxy))); ss.renderRange(ss.freezeRange, ss.showRange, true); sm.fireEvent("renderborder"); this.hide(); } } }, onRowHeightFn : function(nf, e) { var key = e.getKey(); if (Ext.EventObject.ENTER == key) { if (nf.isValid()) { var ss = this.spreadsheet; var h = nf.getValue() - ss.ypaddingOffset; var sm = ss.sm; var min = ss.ypaddingOffset + 1; if (min > h) { h = min; } var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x; for (var i = minx; i <= maxx; i++) { ss.fireEvent("updatecss", "rowSetting", i, "ch", h); } ss.ds.trace(feyaSoft.ss.lang.action_row_resize(minx, maxx)); ss.renderRange(ss.freezeRange, ss.showRange, true); sm.fireEvent("renderborder"); this.hide(); } } }, onHideFn : function() { var ss = this.spreadsheet; var ds = ss.ds; var cs = ds.data.colSetting, rs = ds.data.rowSetting; var fr = ss.freezeRange, sr = ss.showRange; var sm = ss.sm; if (0 == sm.selectedStart.x && 0 == sm.selectedEnd.x) { var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var miny = rt.minPos.y, maxy = rt.maxPos.y; sm.selectedStart.y = sm.selectedEnd.y + 1; sm.selectedEnd.y = sm.selectedStart.y; sm.focusCell.y = sm.selectedStart.y; for (var j = miny; j <= maxy; j++) { ds.fireEvent("colattributechange", j, [["display", "none"]]); } ss.refreshRange(); ds.trace(feyaSoft.ss.lang.action_col_hide(miny, maxy)); sm.fireEvent("renderborder"); } else if (0 == sm.selectedStart.y && 0 == sm.selectedEnd.y) { var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x; sm.selectedStart.x = sm.selectedEnd.x + 1; sm.selectedEnd.x = sm.selectedStart.x; sm.focusCell.x = sm.selectedStart.x; for (var i = minx; i <= maxx; i++) { ds.fireEvent("rowattributechange", i, [["display", "none"]]); } ss.refreshRange(); ds.trace(feyaSoft.ss.lang.action_row_hide(minx, maxx)); sm.fireEvent("renderborder"); } }, onUnhideFn : function() { var ss = this.spreadsheet; var ds = ss.ds; var cs = ds.data.colSetting, rs = ds.data.rowSetting; var fr = ss.freezeRange, sr = ss.showRange; var sm = ss.sm; if (0 == sm.selectedStart.x && 0 == sm.selectedEnd.x) { var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var miny = rt.minPos.y, maxy = rt.maxPos.y; if (1 != miny) { if (0 == ds.getVisibleColOffset(miny, 1)) { miny = 1; } } for (var j = miny; j <= maxy; j++) { ds.fireEvent("colattributechange", j, [["display", ""]]); } ds.trace(feyaSoft.ss.lang.action_col_show(miny, maxy)); ss.renderRange(ss.freezeRange, ss.showRange, true); sm.fireEvent("renderborder"); } else if (0 == sm.selectedStart.y && 0 == sm.selectedEnd.y) { var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x; if (1 != minx) { if (0 == ds.getVisibleRowOffset(minx, 1)) { minx = 1; } } for (var i = minx; i <= maxx; i++) { ds.fireEvent("rowattributechange", i, [["display", ""]]); } ds.trace(feyaSoft.ss.lang.action_row_show(minx, maxx)); ss.renderRange(ss.freezeRange, ss.showRange, true); sm.fireEvent("renderborder"); } }, onInsertIncellImageByOpenFn : function() { new feyaSoft.ss.popup.ImagePopup(function(imagePath) { var ss = this.spreadsheet; ss.insertImageInCell(imagePath); }, this); }, onInsertIncellImageByLinkFn : function(tf, e, pm) { pm = pm || this; var key = e.getKey(); if (Ext.EventObject.ENTER == key) { var ss = this.spreadsheet; var v = tf.getValue(); tf.reset(); ss.insertImageInCell(v); pm.hide(); } }, onCropFn : function() { var ss = this.spreadsheet; var bindCell = this.bindCell; var x = bindCell.x, y = bindCell.y; var data = bindCell.data; var m = data.match(/style\s*=\s*"[^"]*"/); if (m) { data = data.replace(m, ""); ss.setInCellImage(x, y, data); } }, onFitImageFn : function() { var ss = this.spreadsheet; var ds = ss.ds; var bindCell = this.bindCell; var x = bindCell.x, y = bindCell.y; ds.fireEvent("attributechange", x, y, [["align", "top"]]); var data = bindCell.data; var m = data.match(/style\s*=\s*"[^"]*"/); if (!m) { m = data.match(/ it[0]) { min = it[0]; } if (max < it[1]) { max = it[1]; } } return [min, max]; } else { var groups = {}, colSetting = ds.data.colSetting; for (var i = min; i <= max; i++) { var it = colSetting[i]; if (it && it.group) { var id = it.group.join("-"); groups[id] = it.group; } } for (var p in groups) { var it = groups[p]; if (min > it[0]) { min = it[0]; } if (max < it[1]) { max = it[1]; } } return [min, max]; } }, onAddGroup : function() { var ss = this.spreadsheet; var sm = ss.sm, ds = ss.ds; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, miny = rt.minPos.y, maxx = rt.maxPos.x, maxy = rt.maxPos.y; if (0 == minx) { if (0 < maxy - miny) { var span = this.findExtendGroupSpan(miny, maxy); miny = span[0]; maxy = span[1]; for (var i = miny; i <= maxy; i++) { ds.fireEvent("colattributechange", i, [ ["group", [miny, maxy]], ["display", ""], ["groupCollapsed", false]]); } ds.trace(feyaSoft.ss.lang.addGroup); ss.refreshRange(); sm.fireEvent("renderborder"); } } else { if (0 < maxx - minx) { var span = this.findExtendGroupSpan(minx, maxx, "row"); minx = span[0]; maxx = span[1]; for (var i = minx; i <= maxx; i++) { ds.fireEvent("rowattributechange", i, [ ["group", [minx, maxx]], ["display", ""], ["groupCollapsed", false]]); } ds.trace(feyaSoft.ss.lang.addGroup); ss.refreshRange(); sm.fireEvent("renderborder"); } } }, onCancelGroup : function() { var ss = this.spreadsheet; var sm = ss.sm, ds = ss.ds; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, miny = rt.minPos.y, maxx = rt.maxPos.x, maxy = rt.maxPos.y; if (0 == minx) { maxy++; var span = this.findExtendGroupSpan(miny, maxy); miny = span[0]; maxy = span[1]; for (var i = miny; i <= maxy; i++) { ds.fireEvent("colattributechange", i, [["group", false], ["display", ""], ["groupCollapsed", false]]); } ds.trace(feyaSoft.ss.lang.cancelGroup); ss.refreshRange(); sm.fireEvent("renderborder"); } else { maxx++; var span = this.findExtendGroupSpan(minx, maxx, "row"); minx = span[0]; maxx = span[1]; for (var i = minx; i <= maxx; i++) { ds.fireEvent("rowattributechange", i, [["group", false], ["display", ""], ["groupCollapsed", false]]); } ds.trace(feyaSoft.ss.lang.addGroup); ss.refreshRange(); sm.fireEvent("renderborder"); } }, onInsertFn : function() { var ss = this.spreadsheet; var sm = ss.sm; var toolbar = ss.toolbar; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, miny = rt.minPos.y, maxx = rt.maxPos.x, maxy = rt.maxPos.y; if (0 == minx && 0 == miny) { } else if (0 == minx) { toolbar.onInsertColBeforeFn(); } else if (0 == miny) { toolbar.onInsertRowAboveFn(); } else { } }, nameSelectionRange : function() { var win = this.getNameRangeWin(); win.popup(); }, getNameRangeWin : function() { if (!this.nameRangeWin) { this.nameRangeWin = new Ext.ss.popup.NameRangeWin({ title : feyaSoft.ss.lang.nameManager, closeAction : "hide", spreadsheet : this.spreadsheet, width : 300, height : 350 }); } return this.nameRangeWin; }, onHyperlink : function() { this.spreadsheet.hyperlinkwin.popup(); }, emisOpenDialog : function(type) { var emisJS = new Emis; emisJS.openDialog(type); } }); Ext.ns("Ext.ss.menu"); Ext.ss.menu.FilterMenu = Ext.extend(Ext.menu.Menu, { pageSize : 20, initComponent : function() { var lan_com = feyaSoft.lang.common; var lan_ss = feyaSoft.ss.lang; var store = new Ext.data.ArrayStore({ fields : ["value"], idIndex : 0 }); var sm = new Ext.grid.CheckboxSelectionModel; this.distinctList = new Ext.grid.GridPanel({ cls : "x-menu-list-item-indent", height : 200, autoScroll : false, width : 295, store : store, border : false, sm : sm, columns : [sm, { id : "value", header : "Select All", sortable : true, menuDisabled : true, dataIndex : "value", width : 230 }], view : new Ext.ux.grid.BufferView({ scrollDelay : false }) }); this.ascItem = new Ext.menu.Item({ iconCls : "icon_asc", text : lan_ss.asc_tip, handler : this.sortAsc, scope : this }); this.descItem = new Ext.menu.Item({ iconCls : "icon_desc", text : lan_ss.desc_tip, handler : this.sortDesc, scope : this }); this.rangeMenu = new Ext.ux.menu.RangeMenu({ fieldCls : Ext.form.TextField, fields : {}, fieldCfg : {}, iconCls : { gt : "ux-rangemenu-gt", lt : "ux-rangemenu-lt", eq : "ux-rangemenu-eq" }, menuItemCfgs : { emptyText : lan_com.inputFilterText + "...", selectOnFocus : true, width : 125 }, menuItems : ["lt", "gt", "eq"], listeners : { update : { fn : this.updateFilters, scope : this } } }); this.items = [this.ascItem, this.descItem, "-", { text : lan_ss.filters, menu : this.rangeMenu }, { text : lan_ss.clearFilter, handler : this.cancelFilter, scope : this }, "-", this.distinctList, "-", { xtype : "container", cls : "x-menu-list-item-indent", width : 300, height : 25, layout : { type : "hbox", align : "stretch" }, items : [{ xtype : "button", width : 80, minWidth : 80, text : lan_ss.removeFilter, handler : this.clearFilter, scope : this }, { xtype : "spacer", flex : 1 }, { xtype : "button", style : "padding-right:5px;", width : 80, minWidth : 80, text : lan_com.ok, handler : this.applyFilter, scope : this }, { xtype : "button", width : 80, minWidth : 80, text : lan_com.cancel, handler : this.cancel, scope : this }] }]; Ext.ss.menu.FilterMenu.superclass.initComponent.call(this); this.on("show", this.prepareFilterMenu, this, { delay : 10 }); }, show : function(el, pos) { this.pos = pos; Ext.ss.menu.FilterMenu.superclass.show.call(this, el); }, applyFilter : function() { var ss = this.spreadsheet; var notmatch = []; var sm = this.distinctList.getSelectionModel(); var store = this.distinctList.getStore(); store.clearFilter(true); var rds = store.getRange(); var len = rds.length; if (0 == len) { notmatch = null; } else { for (var i = 0; i < len; i++) { var rd = rds[i]; if (!sm.isSelected(rd)) { var v = rd.data.value; notmatch.push(v); } } if (0 == notmatch) { notmatch = null; } } var pos = this.pos; ss.doFilter(pos, notmatch); this.hide(); }, cancelFilter : function() { var ss = this.spreadsheet, ds = ss.ds; var pos = this.pos; var x = pos.x, y = pos.y; ds.fireEvent("attributechange", x, y, [["filterCheck", ""]]); ss.doFilter(pos, null, true); ds.trace(feyaSoft.ss.lang.filtering); ss.refreshRange(); this.hide(); }, clearFilter : function() { var ss = this.spreadsheet, ds = ss.ds; var pos = this.pos; var x = pos.x, y = pos.y; ds.fireEvent("attributechange", x, y, [["filterCheck", ""]]); ss.doFilter(pos, null, true); ds.fireEvent("attributechange", x, y, [["filter", ""]]); ds.trace(feyaSoft.ss.lang.filtering); ss.refreshRange(); this.hide(); }, cancel : function() { this.hide(); }, prepareFilterMenu : function() { var ss = this.spreadsheet; var ds = ss.ds; var pos = this.pos; if (pos) { var filterSet = ds.getAllFilters(); var row = pos.x, col = pos.y; var cell = ds.getCell(row, col); var filter = cell.filter; var distinct = ss.getDistinctValue(col, filter.minx + row, filter.maxx + row, filterSet); var store = this.distinctList.getStore(), sm = this.distinctList .getSelectionModel(); store.removeAll(); var adds = [], selected = [], flag = true; for (var p in distinct) { if (flag) { flag = distinct[p]; } var rd = new store.recordType({ value : p }); adds.push(rd); if (distinct[p]) { selected.push(rd); } } store.add(adds); if (flag) { sm.selectAll(); } else { sm.selectRecords(selected); } var fields = this.rangeMenu.fields; for (var p in fields) { fields[p].reset(); } } }, sortAsc : function() { this.sort(1); }, sortDesc : function() { this.sort(-1); }, sort : function(dir) { var lan_ss = feyaSoft.ss.lang; var lan_com = feyaSoft.lang.common; var ss = this.spreadsheet, ds = ss.ds; var pos = this.pos; if (pos) { var row = pos.x, col = pos.y; var cell = ds.getCell(row, col); var filter = cell.filter; var minx = filter.minx + row, maxx = filter.maxx + row; var flag = ds.sortRange(minx, col, maxx, col, dir); if (!flag) { Ext.Msg.show({ title : lan_com.notice, msg : lan_ss.canNotSortMerge, buttons : Ext.Msg.OK, icon : Ext.MessageBox.INFO }); return; } ss.renderRange(ss.freezeRange, ss.showRange, null, true); ds.trace(1 == dir ? feyaSoft.ss.lang.action_sort_asc : feyaSoft.ss.lang.action_sort_desc); } }, updateFilters : function(rangeMenu) { var mask = Ext.ss.common.Mask; var eq = rangeMenu.fields.eq.getValue(); var lt = rangeMenu.fields.lt.getValue(); var gt = rangeMenu.fields.gt.getValue(); var store = this.distinctList.getStore(); var sm = this.distinctList.getSelectionModel(); var ltfn, eqfn, gtfn; ltfn = eqfn = gtfn = function() { return true; }; if (lt && "" != lt) { ltfn = function(rd) { var v = rd.data.value; if (mask.isNumber(lt) && mask.isNumber(v)) { v = Number(v); lt = Number(lt); } var flag = v < lt; return flag; }; } if (gt && "" != gt) { gtfn = function(rd) { var v = rd.data.value; if (mask.isNumber(gt) && mask.isNumber(v)) { v = Number(v); gt = Number(gt); } var flag = v > gt; return flag; }; } if (eq && "" != eq) { eqfn = store.createFilterFn("value", eq); } store.filterBy(function(rd) { var flag = false; if (ltfn(rd) && eqfn(rd) && gtfn(rd)) { flag = true; } if (!flag) { sm.deselectRow(store.indexOf(rd)); } return flag; }, this); } }); Ext.ns("Ext.ss"); Ext.ss.DataSource = function(config) { Ext.apply(this, config); Ext.ss.DataSource.superclass.constructor.call(this); this.prepareFBox(); this.resetModifiedCache(); this.addEvents("datachange", "freezechange", "splitchange", "cellchange", "rowchange", "colchange", "attributechange", "colattributechange", "rowattributechange", "wholeattributechange", "project", "deproject", "checkformula", "hstackchange", "savemodified"); this.on("savemodified", this.saveModifiedCache, this, { buffer : this.saveCacheBuffer }); this.on("datachange", this.onDataChangeFn, this); this.on("freezechange", this.onFreezeChangeFn, this); this.on("splitchange", this.onSplitChangeFn, this); this.on("cellchange", this.onCellChangeFn, this); this.on("rowchange", this.onRowChangeFn, this); this.on("colchange", this.onColChangeFn, this); this.on("attributechange", this.onAttributeChangeFn, this); this.on("colattributechange", this.onColAttributeChangeFn, this); this.on("rowattributechange", this.onRowAttributeChangeFn, this); this.on("wholeattributechange", this.onWholeAttributeChangeFn, this); this.on("checkformula", this.onCheckFormulaFn, this, { buffer : 50 }); var ss = this.spreadsheet; this.defaultRowHeight = ss.cellHeight; this.defaultColWidth = ss.cellWidth; this.xpaddingOffset = ss.xpaddingOffset; this.ypaddingOffset = ss.ypaddingOffset; this.fixColor = ss.fixColor; this.fbColor = ss.fbColor; this.lcWidth = ss.lcWidth; }; Ext.extend(Ext.ss.DataSource, Ext.util.Observable, { defaultDateFormat : Ext.ss.CONST.DEFAULT_DATE_FROMAT, defaultTimeFormat : Ext.ss.CONST.DEFAULT_TIME_FROMAT, disableCallingBackEnd : false, data : null, saveCacheBuffer : 5000, warmingNonISIFormulaNum : 80000, warmingISIFormulaNum : 40000, loadTabUrl : feyaSoft.home.CONST.spreadSheetUrl.loadTab, loadPublicTabUrl : feyaSoft.home.CONST.spreadSheetUrl.loadPublicTab, sortUrl : feyaSoft.home.CONST.spreadSheetUrl.sortRows, updateModifiedUrl : feyaSoft.home.CONST.spreadSheetUrl.updateBatchCells, newTabUrl : feyaSoft.home.CONST.spreadSheetUrl.newTab, deleteTabUrl : feyaSoft.home.CONST.spreadSheetUrl.deleteTab, renameTabUrl : feyaSoft.home.CONST.spreadSheetUrl.renameTab, copyTabUrl : feyaSoft.home.CONST.spreadSheetUrl.copyTab, extraInfoUrl : feyaSoft.home.CONST.spreadSheetUrl.extraInfo, fileExtraInfoUrl : feyaSoft.home.CONST.spreadSheetUrl.fileExtraInfo, reorderUrl : feyaSoft.home.CONST.spreadSheetUrl.reorder, dotMaxLen : 15, posReg : Ext.ss.CONST.posReg, formulaRelatedMap : null, resetModifiedCache : function() { this.modifedCache = {}; }, resetHStack : function() { this.hStack = []; for (var i = 0; i < this.sheets.length; i++) { this.hStack[i] = { start : 0, index : 0, max : 0, records : {} }; } }, getHStack : function(index) { return this.hStack[index]; }, getActiveHStack : function() { return this.hStack[this.activeSheet]; }, addHStack : function(index) { var hs = this.hStack; for (var i = this.hStack.length - 1; i >= index; i--) { hs[i + 1] = hs[i]; } hs[i + 1] = { start : 0, index : 0, max : 0, records : {} }; }, deleteHStack : function(index) { var hs = this.hStack; for (var i = index + 1, len = this.hStack.length; i < len; i++) { hs[i - 1] = hs[i]; } hs.pop(); }, clearHStack : function(index) { this.hStack[index] = { start : 0, index : 0, max : 0, records : {} }; }, getSheetIdByIndex : function(index) { var sheet = this.sheets[index]; if (sheet) { return sheet.tabId; } }, parseText2Pos : function(text) { try { var sheetName; var parts = text.split("!"); if (1 < parts.length) { sheetName = parts[0].trim(); text = parts[1].toUpperCase(); } else { text = text.toUpperCase(); } parts = text.split(":"); var startPos, endPos; if (2 == parts.length) { startPos = Ext.ss.common.DataSourceHelper .parseSpan2Pos(parts[0]); endPos = Ext.ss.common.DataSourceHelper.parseSpan2Pos(parts[1]); } else { startPos = Ext.ss.common.DataSourceHelper .parseSpan2Pos(parts[0]); endPos = Ext.apply({}, startPos); } var pos = { x : startPos.x, y : startPos.y, ex : endPos.x, ey : endPos.y, ab : startPos.ab }; if (pos.ex < pos.x) { var tmp = pos.ex; pos.ex = pos.x; pos.x = tmp; } if (pos.ey < pos.y) { var tmp = pos.ey; pos.ey = pos.y; pos.y = tmp; } if (sheetName) { pos.sheetIndex = Ext.ss.common.DataSourceHelper .getSheetIndexByName(this.sheets, sheetName, true); } return pos; } catch (e) { return text; } }, syncFormula : function(x, y, txt, callback, scope) { try { var data; txt = txt.slice(1); var ds = this; var posReg = this.posReg; data = txt.replace(posReg, function(w) { var pos = ds.parseText2Pos(w); if (!Ext.isString(pos) && callback) { return callback.call(scope, pos); } return w; }); data = "=" + data; return data; } catch (e) { return e.toString(); } }, refreshOriginFormula : function(origin, ox, oy) { var tmpx = ox, tmpy = oy; var posReg = this.posReg; var ds = this; if (!origin) { return origin; } try { var newOrigin = origin.replace(posReg, function(w) { var index = arguments[arguments.length - 2], sqNum = 0, dqNum = 0; for (var i = 0; i < index; i++) { var ch = origin.charAt(i); if ("\"" == ch) { dqNum++; } if ("'" == ch) { sqNum++; } } if (0 != dqNum % 2 || 0 != sqNum % 2) { return w; } var pos = ds.parseText2Pos(w); if (Ext.isString(pos)) { return w; } if (true === pos.ab) { ox = 0; oy = 0; } else if (Ext.ss.CONST.ROW_AB == pos.ab) { oy = tmpy; ox = 0; } else if (Ext.ss.CONST.COL_AB == pos.ab) { oy = 0; ox = tmpx; } else { ox = tmpx; oy = tmpy; } var str = ""; if (pos.x == pos.ex && pos.y == pos.ey) { var x = pos.x + ox; var y = pos.y + oy; if (true === pos.ab) { if (0 == y) { str = "$" + x + ":$" + x; } else if (0 == x) { var ly = ds.getLetter(y); str = "$" + ly + ":$" + ly; } else { str = "$" + ds.getLetter(y) + "$" + x; } } else if (Ext.ss.CONST.ROW_AB == pos.ab) { if (0 == y) { str = "$" + x + ":$" + x; } else if (0 == x) { var ly = ds.getLetter(y); str = ly + ":" + ly; } else { str = ds.getLetter(y) + "$" + x; } } else if (Ext.ss.CONST.COL_AB == pos.ab) { if (0 == y) { str = x + ":" + x; } else if (0 == x) { var ly = ds.getLetter(y); str = "$" + ly + ":$" + ly; } else { str = "$" + ds.getLetter(y) + "" + x; } } else { if (0 == x) { var ly = ds.getLetter(y); str = ly + ":" + ly; } else if (0 == y) { str = x + ":" + x; } else { str = ds.getLetter(y) + x; } } } else { var x = pos.x + ox; var y = pos.y + oy; var ex = pos.ex + ox; var ey = pos.ey + oy; if (true === pos.ab) { if (0 == x) { str = "$" + ds.getLetter(y) + ":$" + ds.getLetter(ey); } else if (0 == y) { str = "$" + x + ":$" + ex; } else { str = "$" + ds.getLetter(y) + "$" + x + ":$" + ds.getLetter(ey) + "$" + ex; } } else if (Ext.ss.CONST.ROW_AB == pos.ab) { if (0 == x) { str = ds.getLetter(y) + ":" + ds.getLetter(ey); } else if (0 == y) { str = "$" + x + ":$" + ex; } else { str = ds.getLetter(y) + "$" + x + ":" + ds.getLetter(ey) + "$" + ex; } } else if (Ext.ss.CONST.COL_AB == pos.ab) { if (0 == x) { str = "$" + ds.getLetter(y) + ":$" + ds.getLetter(ey); } else if (0 == y) { str = x + ":" + ex; } else { str = "$" + ds.getLetter(y) + x + ":$" + ds.getLetter(ey) + ex; } } else { if (0 == x) { str = ds.getLetter(y) + ":" + ds.getLetter(ey); } else if (0 == y) { str = x + ":" + ex; } else { str = ds.getLetter(y) + x + ":" + ds.getLetter(ey) + ex; } } } var sheetName; var parts = w.split("!"); if (1 < parts.length) { sheetName = parts[0]; str = sheetName + "!" + str; } return str; }); return newOrigin; } catch (e) { return origin; } }, transfer5TplPos2Text : function(pos, ab, withoutSheetName) { var ds = this; var x = pos.x, ex = pos.ex, y = pos.y, ey = pos.ey, sheetIndex = pos.sheetIndex; var str; if (x === ex && y === ey) { if (true === ab) { if (0 == y) { str = "$" + x + ":$" + x; } else if (0 == x) { var ly = ds.getLetter(y); str = "$" + ly + ":$" + ly; } else { str = "$" + ds.getLetter(y) + "$" + x; } } else { if (0 == y) { str = x + ":" + x; } else if (0 == x) { var ly = ds.getLetter(y); str = ly + ":" + ly; } else { str = ds.getLetter(y) + x; } } } else { if (true == ab) { if (0 == x) { str = "$" + ds.getLetter(y) + ":$" + ds.getLetter(ey); } else if (0 == y) { str = "$" + x + ":$" + ex; } else { str = "$" + ds.getLetter(y) + "$" + x + ":$" + ds.getLetter(ey) + "$" + ex; } } else { if (0 == x) { str = ds.getLetter(y) + ":" + ds.getLetter(ey); } else if (0 == y) { str = x + ":" + ex; } else { str = ds.getLetter(y) + x + ":" + ds.getLetter(ey) + ex; } } } if (false !== Ext.type(sheetIndex) && !withoutSheetName) { var sheetName = ds.sheets[sheetIndex].name; str = sheetName + "!" + str; } return str; }, adjustFormula : function(x, y, txt, callback, scope) { try { var data; txt = txt.slice(1); var ds = this; var posReg = this.posReg; data = txt.replace(/[a-zA-Z0-9]+\(/gi, function(w) { var parts = w.split("(", 2); var fname = parts[0], rest = parts[1]; if ("if" == fname || "IF" == fname) { fname = "condition"; } fname = fname.toLowerCase(); return "FBox[\"" + fname + "\"](" + rest; }); data = Ext.ss.common.Helper.convertPercent2num(data); data = data.replace(posReg, function(w) { var argLen = arguments.length; var matchPos = arguments[argLen - 2]; if (Ext.ss.common.Helper.whetherInQuote(data, matchPos + w.length - 1)) { return w; } var inFunFlg = Ext.ss.common.Helper .whetherInFun(data, matchPos); if (inFunFlg) { for (var i = matchPos - 1; 0 <= i; i--) { var chr = data.charAt(i); if ("+" == chr || "-" == chr || "*" == chr || "/" == chr || "=" == chr || ">" == chr || "<" == chr || "%" == chr) { inFunFlg = false; break; } if ("," == chr || ")" == chr || " " !== chr) { break; } } } if (inFunFlg) { for (var i = matchPos + w.length, tlen = data.length; i < tlen; i++) { var chr = data.charAt(i); if ("+" == chr || "-" == chr || "*" == chr || "/" == chr || "=" == chr || ">" == chr || "<" == chr || "%" == chr) { inFunFlg = false; break; } if ("," == chr || ")" == chr || " " !== chr) { break; } } } var pos = ds.parseText2Pos(w); if (Ext.isString(pos)) { return w; } if (callback) { callback.call(scope, pos); } if (pos.x > pos.ex || pos.y > pos.ey) { return "0"; } else { var ox = pos.x - x; var oy = pos.y - y; var oex = pos.ex - x; var oey = pos.ey - y; if (inFunFlg) { return "{sheetIndex:" + pos.sheetIndex + ",ox:" + ox + ",oy:" + oy + ",oex:" + oex + ",oey:" + oey + ", ab:" + pos.ab + "}"; } else { return "FBox.getCellByOffset({sheetIndex:" + pos.sheetIndex + ",ox:" + ox + ",oy:" + oy + ",oex:" + oex + ",oey:" + oey + ", ab:" + pos.ab + "})"; } } }); var newData = data.replace(/[=]+/gi, function(w) { var pos = arguments[arguments.length - 2]; var last = ""; if (0 < pos) { last = data.charAt(pos - 1); } if (1 == w.length && ">" != last && "<" != last && "!" != last) { return "=="; } return w; }); data = newData.replace(/\<\>/gi, "!="); data = "=" + data; return data; } catch (e) { if ("#PARSE_ERROR" == e) { return "#NAME?"; } return txt; } }, wrapLink : function(url) { return "" + url + ""; }, onCheckFormulaFn : function(sheetIndex, x, y) { var me = this; var ss = this.spreadsheet; var tmp = this.activeSheet; this.formulaRelatedMap = this.formulaRelatedMap || {}; var sIndex = sheetIndex; if (false == Ext.type(sIndex) || "" !== sIndex) { sIndex = this.activeSheet; } if (false != Ext.type(x) && false != Ext.type(y)) { var mapId = sIndex + "-" + x + "-" + y; if (!this.formulaRelatedMap[mapId]) { var rows = this.sheets[sIndex].rows; var row = rows[x]; var retFlag = true; if (row) { var cell = row[y]; if ("ISFormula" == cell.type || this.isISFormula(cell['origin-data'])) { retFlag = false; } } if (retFlag) { return; } } } this.formulaRelatedMap = {}; this.ISFormulaQueue = []; var formulaCache = [], formulaNum = 0, isiformulaNum = 0; for (var i = 0, len = this.sheets.length; i < len; i++) { var rows = this.sheets[i].rows; this.data = this.sheets[i]; this.activeSheet = i; var lookup = []; for (var p in rows) { p = Number(p); var row = rows[p]; for (var q in row) { q = Number(q); var cell = row[q]; var isFormula = false; var isISIFormula = false; if (Ext.isDefined(cell['origin-data'])) { isFormula = Ext.ss.common.Mask .isFormula(cell['origin-data']); isISIFormula = "ISFormula" == cell.type || this.isISFormula(cell['origin-data']); } else { isFormula = Ext.ss.common.Mask.isFormula(cell.data); isISIFormula = "ISFormula" == cell.type || this.isISFormula(cell.data); } if (isFormula && ("dynamic" == cell.status || sIndex == i && x == p && y == q || isISIFormula)) { cell.oldResult = cell.result; delete cell.result; lookup.push({ x : p, y : q }); if (isISIFormula) { isiformulaNum++; } else if (isFormula) { formulaNum++; } } } } formulaCache.push(lookup); } var recalFn = function() { for (var i = 0, len = me.sheets.length; i < len; i++) { var rows = me.sheets[i].rows; me.data = me.sheets[i]; me.activeSheet = i; var lookup = formulaCache[i]; for (var j = 0, count = lookup.length; j < count; j++) { var it = lookup[j]; var x = it.x, y = it.y; var obj = me.getCell(x, y); obj.x = x; obj.y = y; if (i === tmp) { ss.refreshCell(obj); } me.fireEvent("afterdatachange", x, y, i, me); } } me.data = me.sheets[tmp]; me.activeSheet = tmp; me.checkISFormula(); }; if (formulaNum >= this.warmingNonISIFormulaNum || isiformulaNum >= this.warmingISIFormulaNum) { ss.maskUI(feyaSoft.ss.lang.updateLotOfFormula); (function () { recalFn(); ss.unmaskUI(); }).defer(100, this); } else { recalFn(); } }, onFreezeChangeFn : function(ofr, fr) { var ss = this.spreadsheet; var og = { freezeRange : {} }; og.freezeRange = ss.copyRange(ofr); var md = { freezeRange : {} }; md.freezeRange = ss.copyRange(fr); var sm = this.spreadsheet.sm; this.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }); }, onSplitChangeFn : function(ofr, fr, osf, sf) { var ss = this.spreadsheet; var og = { freezeRange : {}, splitFlag : Ext.ss.common.Mask.copy(osf) }; og.freezeRange = ss.copyRange(ofr); var md = { freezeRange : {}, splitFlag : Ext.ss.common.Mask.copy(sf) }; md.freezeRange = ss.copyRange(fr); var sm = this.spreadsheet.sm; this.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }); }, onRowChangeFn : function(x, obj) { if (this.data.rowNum < x) { this.data.rowNum = x; } var rs = this.data.rowSetting; rs[x] = rs[x] || {}; var rowcss = rs[x]; var og = { rowSetting : {} }; var o = Ext.apply({ ch : null, bg : null, bb : null, br : null, color : null, 'font-size' : null, 'word-wrap' : null, 'font-family' : null, 'text-align' : null, align : null, b : null, u : null, s : null, i : null, css : null, tdcss : null }, rowcss); var n = Ext.apply({ ch : null, bg : null, bb : null, br : null, color : null, 'font-size' : null, 'word-wrap' : null, 'font-family' : null, 'text-align' : null, align : null, b : null, u : null, s : null, i : null, css : null, tdcss : null }, obj); rs[x] = Ext.apply({}, obj); og.rowSetting[x] = o; var md = { rowSetting : {} }; md.rowSetting[x] = n; var sm = this.spreadsheet.sm; this.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }); this.put2ModifiedCache("createUpdate", { x : x, y : 0, data : this.getModifiedData(x, 0) }); }, onColChangeFn : function(y, obj) { if (this.data.colNum < y) { this.data.colNum = y; } var cs = this.data.colSetting; cs[y] = cs[y] || {}; var colcss = cs[y]; var og = { colSetting : {} }; var o = Ext.apply({ cw : null, bg : null, bb : null, br : null, color : null, 'font-size' : null, 'word-wrap' : null, 'font-family' : null, 'text-align' : null, align : null, b : null, u : null, s : null, i : null, css : null, tdcss : null }, colcss); var n = Ext.apply({ cw : null, bg : null, bb : null, br : null, color : null, 'font-size' : null, 'word-wrap' : null, 'font-family' : null, 'text-align' : null, align : null, b : null, u : null, s : null, i : null, css : null, tdcss : null }, obj); cs[y] = Ext.apply({}, obj); og.colSetting[y] = o; var md = { colSetting : {} }; md.colSetting[y] = n; var sm = this.spreadsheet.sm; this.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }); this.put2ModifiedCache("createUpdate", { x : 0, y : y, data : this.getModifiedData(0, y) }); }, onCellChangeFn : function(x, y, obj) { if (this.data.rowNum < x) { this.data.rowNum = x; } if (this.data.colNum < y) { this.data.colNum = y; } var rows = this.data.rows; rows[x] = rows[x] || {}; rows[x][y] = rows[x][y] || {}; var cell = rows[x][y]; var og = { rows : {} }; og.rows[x] = {}; var o = Ext.apply({ 'origin-data' : null, result : null, data : null, bg : null, bb : null, br : null, color : null, 'font-size' : null, 'word-wrap' : null, 'font-family' : null, 'text-align' : null, align : null, wrap : null, b : null, u : null, s : null, i : null, css : null, filter : null }, cell); delete o.tdcss; var n = Ext.apply({ 'origin-data' : null, result : null, data : null, bg : null, bb : null, br : null, color : null, 'font-size' : null, 'word-wrap' : null, 'font-family' : null, 'text-align' : null, align : null, wrap : null, b : null, u : null, s : null, i : null, css : null, tdcss : null, filter : null }, obj); rows[x][y] = Ext.apply({ tdcss : rows[x][y].tdcss }, obj); og.rows[x][y] = o; var md = { rows : {} }; md.rows[x] = {}; md.rows[x][y] = n; var sm = this.spreadsheet.sm; this.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }); obj = obj || {}; this.setCellData(x, y, obj.data, true); }, onAttributeChangeFn : function(x, y, pairs) { if (this.data.rowNum < x) { this.data.rowNum = x; } if (this.data.colNum < y) { this.data.colNum = y; } var rows = this.data.rows; rows[x] = rows[x] || {}; rows[x][y] = rows[x][y] || {}; var cell = rows[x][y]; var og = { rows : {} }; og.rows[x] = {}; var o = {}, n = {}; for (var i = 0, len = pairs.length; i < len; i++) { var pair = pairs[i]; var name = pair[0]; var value = pair[1]; o[name] = cell[name]; n[name] = value; cell[name] = value; } og.rows[x][y] = o; var md = { rows : {} }; md.rows[x] = {}; md.rows[x][y] = n; var sm = this.spreadsheet.sm; this.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }); this.put2ModifiedCache("createUpdate", { x : x, y : y, data : this.getModifiedData(x, y) }); }, onColAttributeChangeFn : function(y, pairs) { if (this.data.colNum < y) { this.data.colNum = y; } var cs = this.data.colSetting; cs[y] = cs[y] || {}; var col = cs[y]; var og = { colSetting : {} }; var o = {}, n = {}; for (var i = 0, len = pairs.length; i < len; i++) { var pair = pairs[i]; var name = pair[0]; var value = pair[1]; o[name] = col[name]; n[name] = value; col[name] = value; } og.colSetting[y] = o; var md = { colSetting : {} }; md.colSetting[y] = n; var sm = this.spreadsheet.sm; this.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }); this.put2ModifiedCache("createUpdate", { x : 0, y : y, data : this.getModifiedData(0, y) }); }, onRowAttributeChangeFn : function(x, pairs) { if (this.data.rowNum < x) { this.data.rowNum = x; } var rs = this.data.rowSetting; rs[x] = rs[x] || {}; var rowcss = rs[x]; var og = { rowSetting : {} }; var o = {}, n = {}; for (var i = 0, len = pairs.length; i < len; i++) { var pair = pairs[i]; var name = pair[0]; var value = pair[1]; o[name] = rowcss[name]; n[name] = value; rowcss[name] = value; } og.rowSetting[x] = o; var md = { rowSetting : {} }; md.rowSetting[x] = n; var sm = this.spreadsheet.sm; this.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }); this.put2ModifiedCache("createUpdate", { x : x, y : 0, data : this.getModifiedData(x, 0) }); }, onWholeAttributeChangeFn : function(pairs) { this.data.wholeSetting = this.data.wholeSetting || {}; var ws = this.data.wholeSetting; var og = { wholeSetting : {} }; var o = {}, n = {}; for (var i = 0, len = pairs.length; i < len; i++) { var pair = pairs[i]; var name = pair[0]; var value = pair[1]; o[name] = ws[name]; n[name] = value; ws[name] = value; } og.wholeSetting = o; var md = { wholeSetting : {} }; md.wholeSetting = n; var sm = this.spreadsheet.sm; this.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }); this.put2ModifiedCache("createUpdate", { x : 0, y : 0, data : this.getModifiedData(0, 0) }); }, onProjectFn : function(ds, pos, minOffset, maxOffset) { var project = this.data.project; var minx = pos.x + minOffset.ox, miny = pos.y + minOffset.oy, maxx = pos.x + maxOffset.ox, maxy = pos.y + maxOffset.oy; for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= maxy; j++) { var id = i + "-" + j; project[id] = project[id] || {}; project[id][pos.x + "-" + pos.y] = { x : pos.x, y : pos.y }; } } }, onDeprojectFn : function(ds, x, y) { var id = x + "-" + y; var project = this.data.project; for (var p in project) { var c = project[p]; delete c[id]; if (Ext.ss.common.Mask.isEmptyObject(c)) { delete project[p]; } } }, clone2 : function(dest, origin, expt) { var orows = origin.rows; if (orows) { dest.rows = dest.rows || {}; var drows = dest.rows; for (var x in orows) { drows[x] = drows[x] || {}; for (var y in orows[x]) { drows[x][y] = drows[x][y] || {}; Ext.apply(drows[x][y], this.deepClone(orows[x][y])); } } } var oSet = origin.rowSetting; var dSet; if (oSet) { dest.rowSetting = dest.rowSetting || {}; dSet = dest.rowSetting; for (var p in oSet) { dSet[p] = dSet[p] || {}; Ext.apply(dSet[p], oSet[p]); } } oSet = origin.colSetting; if (oSet) { dest.colSetting = dest.colSetting || {}; dSet = dest.colSetting; for (var p in oSet) { dSet[p] = dSet[p] || {}; Ext.apply(dSet[p], oSet[p]); } } oSet = origin.wholeSetting; if (oSet) { dest.wholeSetting = dest.wholeSetting || {}; dSet = dest.wholeSetting; Ext.apply(dSet, oSet); } oSet = origin.freezeRange; if (oSet) { dest.freezeRange = dest.freezeRange || {}; dSet = dest.freezeRange; for (var p in oSet) { dSet[p] = dSet[p] || {}; Ext.apply(dSet[p], oSet[p]); } } dest.splitFlag = Ext.ss.common.Mask.copy(origin.splitFlag); if (origin.clearspan) { dest.clearspan = Ext.apply({}, origin.clearspan); } dest.applyFlag = origin.applyFlag; dest.action = origin.action; dest.sheetIndex = origin.sheetIndex; dest.x = origin.x; dest.y = origin.y; }, doChange : function(data) { var clearspan = data.clearspan; if (clearspan) { this.clearSpan(clearspan); } var action = data.action, type = data.type; var applyFlag = data.applyFlag, ss = this.spreadsheet; if (applyFlag) { Ext.apply(this.data, data); delete this.data.applyFlag; } else if ("delete-row" == action) { if ("undo" == type) { for (var i = 0; i < data.span; i++) { this.insertRow(data.row, "above", true); } if (data.deletedRowSetting || data.deletedRows) { var obj = this.deepClone({ rowSetting : data.deletedRowSetting, rows : data.deletedRows }); this.clone2(this.data, obj); this.syncModifiedCache(obj); } if (data.formulas) { var obj = this.deepClone({ rows : data.formulas }); this.clone2(this.data, obj); this.syncModifiedCache(obj); } } else { this.deleteRow(data.row, data.span, true); if (data.changedRowSetting || data.changedRows) { var tmpObj = this.deepClone({ rowSetting : data.changedRowSetting, rows : data.changedRows }); this.clone2(this.data, tmpObj); this.syncModifiedCache(tmpObj); } if (data.formulas) { var obj = this.deepClone({ rows : data.formulas }); this.clone2(this.data, obj); this.syncModifiedCache(obj); } } } else if ("delete-col" == action) { if ("undo" == type) { for (var i = 0; i < data.span; i++) { this.insertCol(data.col, "before", true); } if (data.deletedColSetting || data.deletedCols) { var obj = this.deepClone({ colSetting : data.deletedColSetting, rows : data.deletedCols }); this.clone2(this.data, obj); this.syncModifiedCache(obj); } if (data.formulas) { var obj = this.deepClone({ rows : data.formulas }); this.clone2(this.data, obj); this.syncModifiedCache(obj); } } else { this.deleteCol(data.col, data.span, true); if (data.changedColSetting || data.changedCols) { var tmpObj = this.deepClone({ colSetting : data.changedColSetting, rows : data.changedCols }); this.clone2(this.data, tmpObj); this.syncModifiedCache(tmpObj); } if (data.formulas) { var obj = this.deepClone({ rows : data.formulas }); this.clone2(this.data, obj); this.syncModifiedCache(obj); } } } else if ("insert-row" == action) { if ("undo" == type) { this.deleteRow("above" != data.flag ? data.row + 1 : data.row, 1, true); if (data.changedRowSetting || data.changedRows) { var obj = this.deepClone({ rowSetting : data.changedRowSetting, rows : data.changedRows }); this.clone2(this.data, obj); this.syncModifiedCache(obj); } if (data.formulas) { var obj = this.deepClone({ rows : data.formulas }); this.clone2(this.data, obj); this.syncModifiedCache(obj); } } else { this.insertRow(data.row, data.flag, true); if (data.changedRowSetting || data.changedRows) { var obj = this.deepClone({ rowSetting : data.changedRowSetting, rows : data.changedRows }); this.clone2(this.data, obj); this.syncModifiedCache(obj); } if (data.formulas) { var obj = this.deepClone({ rows : data.formulas }); this.clone2(this.data, obj); this.syncModifiedCache(obj); } } } else if ("insert-col" == action) { if ("undo" == type) { this.deleteCol("before" != data.flag ? data.col + 1 : data.col, 1, true); if (data.changedColSetting || data.changedCols) { var obj = this.deepClone({ colSetting : data.changedColSetting, rows : data.changedCols }); this.clone2(this.data, obj); this.syncModifiedCache(obj); } if (data.formulas) { var obj = this.deepClone({ rows : data.formulas }); this.clone2(this.data, obj); this.syncModifiedCache(obj); } } else { this.insertCol(data.col, data.flag, true); if (data.changedColSetting || data.changedCols) { var obj = this.deepClone({ colSetting : data.changedColSetting, rows : data.changedCols }); this.clone2(this.data, obj); this.syncModifiedCache(obj); } if (data.formulas) { var obj = this.deepClone({ rows : data.formulas }); this.clone2(this.data, obj); this.syncModifiedCache(obj); } } } else if ("sort" == action) { if ("undo" == type) { var olds = data.olds, changes = data.changes, span = data.span, tabId = data.tabId; this.switchRows(changes, olds, span); if (!this.saveModifiedCache(false, function() { this.sortInBackend(tabId, changes, olds, span); }, this)) { this.sortInBackend(tabId, changes, olds, span); } } else { var olds = data.olds, changes = data.changes, span = data.span; this.switchRows(olds, changes, span); if (!this.saveModifiedCache(false, function() { this.sortInBackend(tabId, olds, changes, span); }, this)) { this.sortInBackend(tabId, olds, changes, span); } } } else if ("add-chart" == action) { if ("undo" == type) { var sheetIndex = data.sheetIndex, chartId = data.chartId; ss.chartManager.deleteChartById(sheetIndex, chartId); } else { var sheetIndex = data.sheetIndex, chartId = data.chartId, chartConfig = data.chartConfig; var tmpObj = Ext.apply({ chartId : chartId }, chartConfig); ss.chartManager.generateChartByConfig(tmpObj); } this.saveActiveSheet(true); this.saveExtraInfo(); } else if ("delete-chart" == action) { if ("undo" == type) { var sheetIndex = data.sheetIndex, chartId = data.chartId, chartConfig = data.chartConfig; var tmpObj = Ext.apply({ chartId : chartId }, chartConfig); ss.chartManager.generateChartByConfig(tmpObj); } else { var sheetIndex = data.sheetIndex, chartId = data.chartId; ss.chartManager.deleteChartById(sheetIndex, chartId); } this.saveActiveSheet(true); this.saveExtraInfo(); } else if ("set-cfm" == action) { var cfm = data.cfm; this.data.conditionFormat = cfm; this.prepareConditionFormat(cfm, this.data); this.saveExtraInfo(); ss.renderRange(ss.freezeRange, ss.showRange); } else { this.clone2(this.data, data); this.syncModifiedCache(data); } if ("datachange" == action || "clear-all" == action || "wrap" == action || "unwrap" == action) { var sheetIndex = data.sheetIndex, x = data.x, y = data.y; this.fireEvent("checkformula", sheetIndex, x, y); } }, syncModifiedCache : function(data, applyFlag) { var wholeSetting = data.wholeSetting, colSetting = data.colSetting, rowSetting = data.rowSetting, rows = data.rows; if (rows) { for (var x in rows) { var row = rows[x]; for (var y in row) { this.put2ModifiedCache("createUpdate", { x : x, y : y, data : this.getModifiedData(x, y) }); } } } if (wholeSetting) { this.put2ModifiedCache("createUpdate", { x : 0, y : 0, data : this.getModifiedData(0, 0) }); } if (rowSetting) { for (var x in rowSetting) { this.put2ModifiedCache("createUpdate", { x : x, y : 0, data : this.getModifiedData(x, 0) }); } } if (colSetting) { for (var y in colSetting) { this.put2ModifiedCache("createUpdate", { x : 0, y : y, data : this.getModifiedData(0, y) }); } } }, clearSpan : function(span) { var minx = span.minx, miny = span.miny, maxx = span.maxx, maxy = span.maxy; var rf, cf; if (0 == minx || 0 == maxx) { rf = true; minx = 1; maxx = this.data.rowNum - 1; } if (0 == miny || 0 == maxy) { cf = true; miny = 1; maxy = this.data.colNum - 1; } if (rf && cf) { delete this.data.rows; } else { var rows = this.data.rows; for (var i = minx; i <= maxx; i++) { if (rf) { delete rows[i]; } else { for (var j = miny; j <= maxy; j++) { if (rows[i] && rows[i][j]) { delete rows[i][j]; } } } } } }, trace : function(action, actionName) { if (this.cache) { this.cache.action = action; var hStack = this.getActiveHStack(); if (hStack.max - hStack.start >= Ext.ss.CONST.MAX_LEN_OF_HSTACK) { delete hStack.records[hStack.start++]; } for (var i = hStack.index + 1, len = hStack.len; i < len; i++) { delete hStack.records[i]; } if (actionName) { this.cache.origin.action = actionName; this.cache.modified.action = actionName; } hStack.records[hStack.index] = this.cache; hStack.index++; hStack.max = hStack.index; delete this.cache; this.fireEvent("hstackchange", hStack); } }, applyChange : function(rd, hStack) { var ss = this.spreadsheet; var fr = this.data.freezeRange; var splitFlag = this.data.splitFlag; ss.setupRange(fr, splitFlag); var sm = ss.sm; var selectedStart = rd.selectedStart; var selectedEnd = rd.selectedEnd; var focusCell = rd.focusCell; if (selectedStart && selectedEnd) { Ext.apply(sm.selectedStart, selectedStart); Ext.apply(sm.selectedEnd, selectedEnd); } if (focusCell) { Ext.apply(sm.focusCell, focusCell); } sm.handleFocus(sm.focusCell.x, sm.focusCell.y, true); sm.adjustSelected(); sm.fireEvent("renderBorder"); this.fireEvent("hstackchange", hStack); }, undo : function(count) { count = count || 1; var hStack = this.getActiveHStack(); var flag = false, rd; for (var i = 0; i < count; i++) { if (hStack.start < hStack.index) { flag = true; hStack.index--; var index = hStack.index; rd = hStack.records[index]; var origin = rd.origin; this.doChange(origin); } } if (flag) { this.applyChange(rd, hStack); } }, redo : function(count) { count = count || 1; var hStack = this.getActiveHStack(); var flag = false, rd; for (var i = 0; i < count; i++) { if (hStack.max > hStack.index) { flag = true; var index = hStack.index; rd = hStack.records[index]; hStack.index++; var modified = rd.modified; this.doChange(modified); } } if (flag) { this.applyChange(rd, hStack); } }, add2Modified : function(obj, applyFlag) { this.cache = this.cache || { origin : {}, modified : {} }; if (obj.focusCell) { this.cache.focusCell = Ext.apply({}, obj.focusCell); } if (obj.selectedStart) { this.cache.selectedStart = Ext.apply({}, obj.selectedStart); } if (obj.selectedEnd) { this.cache.selectedEnd = Ext.apply({}, obj.selectedEnd); } if (applyFlag) { this.cache.origin = Ext.apply({}, obj.origin); this.cache.modified = Ext.apply({}, obj.modified); } else { this.clone2(this.cache.origin, obj.origin, { chartSet : true }); this.clone2(this.cache.modified, obj.modified, { chartSet : true }); } }, getDefaultFreezeRange : function() { return { row : { start : 1, end : 0, len : 0 }, col : { start : 1, end : 0, len : 0 } }; }, getDefaultShowRange : function() { return { row : { start : 1, end : 20, len : 20 }, col : { start : 1, end : 12, len : 12 } }; }, generateData : function(name) { var rows = {}; return { name : name, rowNum : 101, colNum : 27, freezeRange : this.getDefaultFreezeRange(), showRange : this.getDefaultShowRange(), focusCell : { x : 1, y : 1 }, selectedStart : { x : 1, y : 1 }, selectedEnd : { x : 1, y : 1 }, wholeSetting : {}, rowSetting : {}, colSetting : {}, rows : rows, project : {}, footerWidth : 500 }; }, loadSheets : function(clear) { if (clear || !this.data) { this.sheets = []; for (var i = 0; i < 3; i++) { this.sheets.push(this.generateData("Sheet" + (i + 1))); } this.data = this.sheets[0]; this.resetModifiedCache(); this.resetHStack(); this.setActiveSheet(0, true); } else { this.resetHStack(); } return this.data; }, saveActiveSheet : function(suspendUpdate2Backend, callback, scope) { var ss = this.spreadsheet; var sm = ss.sm; var sheets = this.sheets; var a = this.activeSheet, asheet = sheets[a]; asheet.focusCell = Ext.apply({}, sm.focusCell); asheet.selectedStart = Ext.apply({}, sm.selectedStart); asheet.selectedEnd = Ext.apply({}, sm.selectedEnd); asheet.freezeRange = ss.copyRange(ss.freezeRange); asheet.showRange = ss.copyRange(ss.showRange); asheet.charts = ss.chartManager.getCharts(a); asheet.splitFlag = Ext.ss.common.Mask.copy(ss.splitFlag); asheet.footerWidth = ss.footerWidth; if (!suspendUpdate2Backend) { this.saveModifiedCache(true, callback, scope); } else if (callback) { callback.call(scope); } }, readActiveSheet : function(callback, scope) { var ss = this.spreadsheet; var sm = ss.sm; var sheets = this.sheets; var sheet = sheets[this.activeSheet]; var fn = function(sheet) { this.data = sheet; var data = this.data; ss.splitFlag = data.splitFlag || false; ss.footerWidth = data.footerWidth; ss.setFreezeRange(data.freezeRange); ss.setShowRange(data.showRange); sm.focusCell = Ext.apply({}, data.focusCell); sm.selectedStart = Ext.apply({}, data.selectedStart); sm.selectedEnd = Ext.apply({}, data.selectedEnd); sm.adjustFocused(); sm.adjustSelected(); if (callback) { callback.call(scope); } }; if (sheet.loaded || ss.isEmptyFile()) { fn.call(this, sheet); } else { this.loadTab(this.activeSheet, fn, this); } }, getNewSheetName : function() { var len = this.sheets.length; var index = len, name, flag = true; while (flag) { flag = false; name = "Sheet" + index; for (var i = 0; i < len; i++) { var sheet = this.sheets[i]; if (sheet.name == name) { flag = true; break; } } index++; } return name; }, loadTab : function(tabIndex, callback, scope) { var sheet = this.sheets[tabIndex]; if (this.disableCallingBackEnd) { Ext.apply(sheet, this.prepareTab(sheet, tabIndex)); sheet.loaded = true; callback.call(this, sheet); } else { var isPublicView = Ext.get("publicView").getAttribute("value"); var loadTabUrl = this.loadTabUrl; if (isPublicView && isPublicView == "yes") { loadTabUrl = this.loadPublicTabUrl; } Ext.Ajax.request({ timeout : 300000, url : loadTabUrl, params : { tabId : sheet.tabId }, success : function(response, options) { var json = Ext.decode(response.responseText); Ext.apply(sheet, this.prepareTab(json)); sheet.loaded = true; callback.call(this, sheet); }, scope : this }); } }, changeSheet : function(index, callback, scope) { this.saveActiveSheet(); this.setActiveSheet(index); var me = this; this.readActiveSheet(function() { me.fireEvent("switchsheet", me); callback.apply(scope, arguments); }, scope); }, getConvertData : function(x, y, cell, sheetIndex, recal) { var v, oldV; try { var ret; if (false != Ext.type(cell.data)) { ret = this.try2BeNumber(cell.data); if (Ext.isNumber(ret)) { cell.data = ret.data; if (ret.format) { cell.format = ret.format; } } } var isFormula = false; if (Ext.isDefined(cell['origin-data'])) { isFormula = Ext.ss.common.Mask.isFormula(cell['origin-data']); } else { isFormula = Ext.ss.common.Mask.isFormula(cell.data); } oldV = cell.result; var originData = cell['origin-data']; if (recal || false == Ext.type(oldV) || !isFormula) { if (false !== Ext.type(cell.oldResult)) { oldV = cell.oldResult; delete cell.oldResult; } v = this.convert(x, y, cell.data, originData, sheetIndex); } else { v = oldV; } } catch (e) { v = Ext.ss.common.Mask.getErrorCode(cell['origin-data'], e); } if (isFormula) { this.data.rows[x] = this.data.rows[x] || {}; this.data.rows[x][y] = this.data.rows[x][y] || {}; this.data.rows[x][y].result = v; delete this.data.rows[x][y].oldResult; this.data.rows[x][y].formula_version = "1.0"; if (oldV != v) { var data = this.getModifiedData(x, y); this.put2ModifiedCache("createUpdate", { tabId : Ext.isNumber(sheetIndex) ? this.sheets[sheetIndex].tabId : undefined, x : x, y : y, data : data }); } } return v; }, prepareFBox : function() { var ds = this; var FBox = {}; ds._fboxScope = {}; for (var p in Ext.ss.FunctionBox) { var fn = Ext.ss.FunctionBox[p]; if (Ext.isFunction(fn)) { FBox[p] = (function() { var args = []; for (var i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); } args.push(this.scope.sheetIndex); args.push(this.scope.x); args.push(this.scope.y); args.push(this.scope.ds); return this.originFn.apply(Ext.ss.FunctionBox, args); }).createDelegate({ scope : ds._fboxScope, originFn : fn }); } } ds._FBox = FBox; }, convert : function(x, y, data, origin, sheetIndex, useResult) { var ds = this; var sIndex; if (false == Ext.type(sheetIndex)) { sIndex = ds.activeSheet; } else { sIndex = sheetIndex; } ds.ISIFormulaIndex = 0; if (Ext.ss.common.Mask.isFormula(data)) { x = parseInt(x); y = parseInt(y); var id; id = sIndex + "-" + x + "-" + y; origin = origin || data; var cellObj = ds.getCellObj(x, y, sheetIndex) || {}; var isISIFormula = "ISFormula" == cellObj.type || this.isISFormula(origin); if (Ext.isArray(this.ISFormulaQueue) && isISIFormula && !this.escapeISFormulaQueue) { var idIndex = this.ISFormulaQueue.indexOf(id); if (-1 == idIndex) { this.ISFormulaQueue.push(id); } if (!ds.updteISFormulaFromServer && cellObj.lastOriginData == cellObj['origin-data']) { var result = cellObj.oldResult; if (false == Ext.type(result)) { result = cellObj.result; } ds.sheets[sIndex].rows[x][y].result = result; return result; } } try { this.formulaRelatedMap = this.formulaRelatedMap || {}; this.formulaRelatedMap[id] = true; data = data.toString(); if (data.indexOf("FBox[\"text\"](") != -1 && data.indexOf("&") != -1) { return Ext.ss.common.DataSourceHelper .calFormulaTextWithAnd(data, { ds : this, x : x, y : y, sheetIndex : sheetIndex }); } if (data.indexOf("FBox[\"countif\"](") != -1 && data.indexOf("&") != -1) { data = data.replace(/&/g, ","); } if (Ext.ss.common.Mask.CALLING_FUNCTION[id]) { throw "SS_ERROR_LOOP"; } else { Ext.ss.common.Mask.CALLING_FUNCTION[id] = true; } if (false != Ext.type(useResult)) { var result = cellObj.result; if (false != Ext.type(result)) { delete Ext.ss.common.Mask.CALLING_FUNCTION[id]; return useResult; } } if (!isISIFormula || ds.updteISFormulaFromServer) { var frows = ds.sheets[sIndex].rows; if (frows[x] && frows[x][y]) { delete frows[x][y].status; } } var str = data.slice(1); var ds = this; Ext.apply(ds._fboxScope, { sheetIndex : sheetIndex, x : x, y : y, ds : ds, isISIFormula : isISIFormula }); var FBox = ds._FBox; str = Ext.ss.common.DataSourceHelper.reCheckDoubleQuote(str); str = Ext.ss.common.DataSourceHelper.reCheckComma(str); str = Ext.ss.common.DataSourceHelper.reCheckBraces(str); var TRUE = true, FALSE = false, True = true, False = false; var nameRanges = ds.fileExtraInfo.nameRanges; if (nameRanges) { str = Ext.ss.common.DataSourceHelper.convertNameMgr2Str( nameRanges, str, x, y); } var r = eval(str); if (Ext.isObject(r)) { r = eval("FBox.getCellByOffset({sheetIndex:" + r.sheetIndex + ",ox:" + r.ox + ",oy:" + r.oy + ",oex:" + r.oex + ",oey:" + r.oey + "})"); } delete ds._fboxScope.ds; delete Ext.ss.common.Mask.CALLING_FUNCTION[id]; if (r.toString() == "Infinity") { throw "SS_ERROR_INFINITY"; } if (r.toString() == "#N/A") { throw "SS_ERROR_NA"; } if (true === r) { return "TRUE"; } else if (false === r) { return "FALSE"; } else if (/^[A-Za-z_]+$/i.test(str)) { throw "SS_ERROR_REF"; } var num = Number(r); if (Ext.isNumber(num) && false != Ext.type(r)) { var checkQuoteFormat = Ext.ss.common.Helper .fmFormatWithQuote(str); if (checkQuoteFormat == false) { throw "SS_ERROR_REF"; } } else { var separatedObjs = []; Ext.ss.common.DataSourceHelper.recursiveMathOpers(str, separatedObjs); if (separatedObjs.length > 1) { var operResult = Ext.ss.common.DataSourceHelper .calculateSeparatedObjs(separatedObjs, { ds : this, x : x, y : y, sheetIndex : sheetIndex }); if (operResult) { return operResult; } } separatedObjs.length = 0; } if ("NaN" == r.toString()) { return "#VALUE!"; } if (Ext.ss.common.Mask.isEmptyStr(r)) { return r; } if (Ext.isNumber(num) && false != Ext.type(r)) { if (-1 != r.toString().indexOf(".") && str.indexOf("FBox[\"text\"](") == -1) { r = Ext.util.Format.round(num, 15); } } if (r == "Infinity") { throw "SS_ERROR_INFINITY"; } return r; } catch (e) { Ext.ss.common.Mask.CALLING_FUNCTION = {}; throw e; } } else { var frows = ds.sheets[sIndex].rows; if (frows[x] && frows[x][y]) { delete frows[x][y].status; } return false == Ext.type(data) ? "" : data; } }, wrapAlign : function(data, style, align, rowIndex, colIndex) { if ("middle" != align && "bottom" != align || Ext.ss.common.Mask.isFullImage(data)) { return data; } style = style || ""; var rows = this.data.rows; var row = rows[rowIndex] || {}; var cell = row[colIndex] || {}; var sy = colIndex, ey = colIndex; if (cell.wrap) { sy = cell.wrap.miny; ey = cell.wrap.maxy; } var w = this.getWidth(sy, ey); w -= this.xpaddingOffset; var css = rows[rowIndex][colIndex].css || ""; if ("middle" == align) { data = "" + "
-1 ? Ext.ss.CONST.cssHash[4] : "") + "\" style=\"padding:0px;vertical-align:middle;border:none;\">
" + data + "
"; } else if ("bottom" == align) { data = "" + "
-1 ? Ext.ss.CONST.cssHash[4] : "") + "\" style=\"padding:0px;vertical-align:bottom;border:none;\">
" + data + "
"; } return data; }, packData : function(x, y, data) { try { var cell = this.data.rows[x][y]; if (cell.lp && cell.rp) { data = cell.lp + data + cell.rp; } var style = cell.style; var align = cell.align; return this.wrapAlign(data, style, align, x, y); } catch (e) { return data; } }, wrapBIUS : function(rowIndex, colIndex, obj, recal) { var data = this.getConvertData(rowIndex, colIndex, obj, undefined, recal); if (false == Ext.type(data)) { data = ""; } if (!obj['text-align']) { var tmp = obj['origin-data'] || obj.data; var align = Ext.ss.common.DataSourceHelper.guessTextAlign(tmp); obj['text-align'] = align ? "text-align:" + align + ";" : ""; } obj['origin-data'] = obj['origin-data'] || obj.data; obj.data = data; this.prepareFormat(obj, obj.format); data = obj.data; if (obj.b) { data = "" + data + ""; } if (obj.i) { data = "" + data + ""; } if (obj.u) { data = "" + data + ""; } if (obj.s) { data = "" + data + ""; } return data; }, makeupData : function(rowIndex, colIndex, obj, recal) { var data = this.wrapBIUS(rowIndex, colIndex, obj, recal); var style = obj.color + ";" + obj['font-size'] + ";" + obj['font-family'] + ";" + obj['text-align'] + ";" + obj['word-wrap']; data = this.wrapAlign(data, style, obj.align, rowIndex, colIndex); return data; }, wrapupData : function(wrap, x, y, obj, so, recal) { var ss = this.spreadsheet; var row = this.data.rows[wrap.minx]; if (row) { var cell = row[wrap.miny]; if (cell) { obj.lp = cell.lp; obj.rp = cell.rp; obj.data = cell.data; } } obj.data = obj.data || ""; var minx = wrap.minx, miny = wrap.miny, maxx = wrap.maxx, maxy = wrap.maxy; var data = this.makeupData(minx, miny, obj, recal); var w, h, l, t; w = this.getSpanWidth(miny, maxy) - ss.xpaddingOffset; h = this.getSpanHeight(minx, maxx) - ss.ypaddingOffset; l = -1 * this.getSpanWidth(miny, y - 1); t = -1 * this.getSpanHeight(minx, x - 1); if (so) { var sx = so.sx; var sy = so.sy; if (sy > miny) { l -= this.getSpanWidth(miny, sy - 1); } if (sx > minx) { t -= this.getSpanHeight(minx, sx - 1); } } var wordWrap = obj['word-wrap']; if (wordWrap) { wordWrap += "white-space:normal;"; } data = "
" + data + "
"; return data; }, getBgColor : function(c, rc, cc, wc) { var color = c; if (!c || "" == c) { color = rc; if (!rc || "" == rc) { color = cc; if (!cc || "" == cc) { color = wc; if (!wc || "" == wc) { color = ""; } } } } return color; }, isVisible : function(o) { return !(o && "none" == o.display); }, checkSheetIndexValid : function(sheetIndex) { if (!(0 <= sheetIndex || undefined == sheetIndex || null == sheetIndex || "" == sheetIndex)) { throw "#PARAM_ERROR"; } }, getCellValue : function(rowIndex, colIndex, sheetIndex, notAddToMap) { var fboxScope = this._fboxScope; var isCallByISIFormula = fboxScope.isISIFormula; if (fboxScope.ds) { var fsheetIndex = fboxScope.sheetIndex; if (false == Ext.type(fsheetIndex) || "" === Ext.type(fsheetIndex)) { fsheetIndex = this.activeSheet; } var frows = this.sheets[fsheetIndex].rows; var frow = frows[fboxScope.x]; if (!frow) { frows[fboxScope.x] = {}; frow = frows[fboxScope.x]; } var fcell = frow[fboxScope.y]; if (!fcell) { frow[fboxScope.y] = {}; fcell = frow[fboxScope.y]; } fcell.status = "dynamic"; } var rows = this.data.rows, mapId; if (Ext.isNumber(sheetIndex) && 0 <= sheetIndex && sheetIndex < this.sheets.length) { rows = this.sheets[sheetIndex].rows; mapId = sheetIndex + "-" + rowIndex + "-" + colIndex; } else { mapId = this.activeSheet + "-" + rowIndex + "-" + colIndex; } if (!notAddToMap && this.formulaRelatedMap) { this.formulaRelatedMap[mapId] = true; } if (rows[rowIndex] && rows[rowIndex][colIndex]) { var cell = rows[rowIndex][colIndex]; if (cell) { if (cell.wrap && !(cell.wrap.minx == rowIndex && cell.wrap.miny == colIndex)) { return; } else if (Ext.isDefined(cell.data)) { var val = this.convert(rowIndex, colIndex, cell.data, cell['origin-data'], sheetIndex, cell.result); if (isCallByISIFormula) { var newObj = this.getCell(rowIndex, colIndex); if (newObj['origin-data'] && /^=ISIF\(.+\)$/gi .test(newObj['origin-data'])) { var isifParams = newObj.ISIParams; if (1 == isifParams.length) { var pms = isifParams[0][1]; var pmLen = pms.length; if (1 == pmLen) { if (/(^[0-9]+$)|(^"[0-9]+"$)|(^'[0-9]+'$)/gi .test(pms[0])) { return pms[0]; } } else if (3 == pmLen) { if (/(^[0-9]+$)|(^"[0-9]+"$)|(^'[0-9]+'$)/gi .test(pms[0]) && /^INF$/gi.test(pms[1]) && Ext.isString(pms[2])) { return pms[0]; } } } } } return val; } } } }, getCell : function(rowIndex, colIndex, so, recal) { var ss = this.spreadsheet; var fr = ss.freezeRange; var colcss = this.data.colSetting[colIndex] || {}; var rowcss = this.data.rowSetting[rowIndex] || {}; var wholecss = this.data.wholeSetting || {}; var row = this.data.rows[rowIndex] || {}; var obj = { data : "", filter : false }; var cell = row[colIndex]; var fn = function(obj, rowcss, colcss, wholecss) { obj.b = this.getAttribute(obj, rowcss, colcss, wholecss, "b"); obj.i = this.getAttribute(obj, rowcss, colcss, wholecss, "i"); obj.u = this.getAttribute(obj, rowcss, colcss, wholecss, "u"); obj.s = this.getAttribute(obj, rowcss, colcss, wholecss, "s"); obj.align = this.getAttribute(obj, rowcss, colcss, wholecss, "align"); obj.color = this.getAttribute(obj, rowcss, colcss, wholecss, "color"); obj['font-size'] = this.getAttribute(obj, rowcss, colcss, wholecss, "font-size"); obj['word-wrap'] = this.getAttribute(obj, rowcss, colcss, wholecss, "word-wrap"); obj['font-family'] = this.getAttribute(obj, rowcss, colcss, wholecss, "font-family"); obj['text-align'] = this.getAttribute(obj, rowcss, colcss, wholecss, "text-align"); obj.bg = this.getAttribute(obj, rowcss, colcss, wholecss, "bg"); obj.css = this.getAttribute(obj, rowcss, colcss, wholecss, "css"); obj.tdcss = this.getAttribute(obj, rowcss, colcss, wholecss, "tdcss"); obj.br = this.getAttribute(obj, rowcss, colcss, wholecss, "br", "x-spreadsheet-right-silver"); obj.bb = this.getAttribute(obj, rowcss, colcss, wholecss, "bb", "x-spreadsheet-bottom-silver"); obj.display = this.getAttribute(obj, rowcss, colcss, wholecss, "display", ""); obj.format = this.getAttribute(obj, rowcss, colcss, wholecss, "format", ""); }; if (row && cell) { cell = Ext.apply({}, cell); var wrap = cell.wrap; if (wrap) { var rt = this.wrapData(rowIndex, colIndex, wrap); Ext.apply(obj, cell); Ext.apply(obj, rt); obj.data = this.wrapupData(wrap, rowIndex, colIndex, obj, so, recal); if (rowIndex != wrap.minx || colIndex != wrap.miny) { cell.bg = obj.bg; delete cell.data; } if (!(rowIndex == wrap.minx && colIndex == wrap.maxy)) { obj.filter = false; } } else { Ext.apply(obj, cell); fn.call(this, obj, rowcss, colcss, wholecss); obj.data = this.makeupData(rowIndex, colIndex, obj, recal); } } else { fn.call(this, obj, rowcss, colcss, wholecss); } if (!ss.splitFlag) { if (rowIndex == fr.row.end) { obj.bb = " x-spreadsheet-bottom-freeze"; } if (colIndex == fr.col.end) { obj.br = " x-spreadsheet-right-freeze"; } } obj.css = " x-spreadsheet-body-cursor " + obj.css; obj.size = this.getSizeStyle(rowIndex, colIndex); if (obj['word-wrap']) { obj['word-wrap'] += "white-space:normal;"; } var cfmLookup = this.data.cfmLookup; if (cfmLookup) { var id = [this.activeSheet, rowIndex, colIndex].join("-"); var colId = [this.activeSheet, 0, colIndex].join("-"); var rowId = [this.activeSheet, rowIndex, 0].join("-"); var shId = [this.activeSheet, 0, 0].join("-"); var cfmIndex = cfmLookup[id]; if (false === Ext.type(cfmIndex)) { cfmIndex = cfmLookup[rowId]; } if (false === Ext.type(cfmIndex)) { cfmIndex = cfmLookup[colId]; } if (false === Ext.type(cfmIndex)) { cfmIndex = cfmLookup[shId]; } if (false !== Ext.type(cfmIndex)) { var cfm = this.data.conditionFormat[cfmIndex]; this.checkConditionFormat(obj, cfm); } } return obj; }, checkConditionFormat : function(cell, conditionFormat) { var data = cell.data; var cfm = conditionFormat; if (cfm) { var option = cfm.opt, target = cfm.tgt; var matched = false; if ("include" == option) { if (data) { data = data.toString(); if (-1 !== data.indexOf(target)) { matched = true; } } } else if ("exclude" == option) { if (!data) { matched = true; } else { data = data.toString(); if (-1 === data.indexOf(target)) { matched = true; } } } else if ("exact" == option) { if (data) { data = data.toString(); if (data === target.toString()) { matched = true; } } } else if ("empty" == option) { if (!data) { matched = true; } } else if ("gt" == option) { data = Number(data); if (Ext.isNumber(data) && NaN !== data) { target = Number(target); if (data > target) { matched = true; } } } else if ("lt" == option) { data = Number(data); if (Ext.isNumber(data) && NaN !== data) { target = Number(target); if (data < target) { matched = true; } } } else if ("eq" == option) { data = Number(data); if (Ext.isNumber(data) && NaN !== data) { target = Number(target); if (data === target) { matched = true; } } } else if ("ne" == option) { data = Number(data); if (Ext.isNumber(data) && NaN !== data) { target = Number(target); if (data !== target) { matched = true; } } } else if ("bw" == option) { data = Number(data); if (Ext.isNumber(data) && NaN !== data) { var min = Number(cfm.min); var max = Number(cfm.max); if (data >= min && data <= max) { matched = true; } } } else if ("nbw" == option) { data = Number(data); if (Ext.isNumber(data) && NaN !== data) { var min = Number(cfm.min); var max = Number(cfm.max); if (!(data >= min && data <= max)) { matched = true; } } } if (matched) { if (cfm.color) { cell.color = "color:" + cfm.color + ";"; } if (cfm.bgc) { cell.bg = cfm.bgc; } } } }, getAttribute : function(o, r, c, w, n, df) { return o[n] || r[n] || c[n] || w[n] || df || ""; }, getSizeStyle : function(x, y) { var s = ""; var row = this.data.rowSetting[x]; if (row && (row.ch || 0 == row.ch)) { if (Ext.isIE && row.ch) { s += "height:" + row.ch + "px;"; } else { s += "height:" + row.ch + "px;"; } } var col = this.data.colSetting[y]; if (col && (col.cw || 0 == col.cw)) { s += "width:" + col.cw + "px;"; } return s; }, getHeight : function(start, end) { if (0 != start) { start = start || 1; } if (0 != end) { end = end || this.data.rowNum; } var height = 0; for (var j = start; j <= end; j++) { height += this.getRowHeight(j); } return height; }, getNameFromPos : function(pos) { return this.getLetter(pos.y) + pos.x; }, getLetter : function(index) { return Ext.ss.common.DataSourceHelper.getLetter(index); }, getLetter22 : function(index) { var idx = 0; var len = 1; while (idx <= index) { idx += Math.pow(26, len); len++; } len--; var arr = []; while (0 <= len) { var base = Math.pow(26, len); arr.push(Math.floor(index / base)); index = index % base; len--; } var temp = []; for (var i = 0, len = arr.length; i < len; i++) { var it = arr[i]; if (0 != it) { temp.push(String.fromCharCode(it + 64)); } else if (len - 1 == i) { var last = arr[i - 1] - 1; var ch = "Z"; if (0 < last) { ch = String.fromCharCode(last + 64) + ch; } temp[temp.length - 1] = ch; } } return temp.join(""); }, getHeadText : function(index) { var colSetting = this.data.colSetting; var rowcss = this.data.rowSetting[0] || {}, colcss = colSetting[index] || {}, wholecss = this.data.wholeSetting; this.data.rows[0] = this.data.rows[0] || {}; var htext = this.getLetter(index); this.data.rows[0][index] = this.data.rows[0][index] || {}; this.data.rows[0][index].data = 0 == index ? "" : htext + "
"; var cell = this.data.rows[0][index] || {}; var obj = Ext.apply({ bg : "", css : "x-spreadsheet-header-cursor", bb : "x-spreadsheet-bottom-freeze", br : "x-spreadsheet-right-freeze", filter : false }, cell); obj.tdcss = this.getAttribute(cell, rowcss, colcss, wholecss, "tdcss"); obj.display = this.getAttribute(cell, rowcss, colcss, wholecss, "display"); obj.size = this.getSizeStyle(0, index); obj.css = obj.css || colcss.css; if (0 < index) { var lstIndex = index - 1; if (!this.isVisible(colSetting[lstIndex])) { obj.css += " x-spreadsheet-col-with-hidden"; } } if (colcss.group) { var cls = "", inner = ""; var group = colcss.group, groupCollapsed = colcss.groupCollapsed; if (true === groupCollapsed) { cls += " x-spreadsheet-group-collapsed "; } if (group[0] == index) { cls += " x-spreadsheet-col-group-start "; inner = "
"; } if (group[1] == index) { cls += " x-spreadsheet-col-group-end "; } obj.data += "
" + inner + "
"; obj.color = "overflow:visible;"; } return obj; }, getLeftText : function(index) { var rowSetting = this.data.rowSetting; var rowcss = rowSetting[index] || {}, colcss = this.data.colSetting[0] || {}, wholecss = this.data.wholeSetting; var rows = this.data.rows; rows[index] = rows[index] || {}; var text, css; if (0 === index) { text = ""; css = " x-spreadsheet-index-bg "; } else { text = index; css = ""; } rows[index][0] = rows[index][0] || {}; rows[index][0].data = text + "
"; var cell = rows[index][0]; var obj = Ext.apply({ bg : "", filter : false, css : "x-spreadsheet-left-cursor", br : "x-spreadsheet-right-freeze", bb : "x-spreadsheet-bottom-freeze" }, cell); obj.css = css; obj.tdcss = this.getAttribute(cell, rowcss, colcss, wholecss, "tdcss"); obj.display = this.getAttribute(cell, rowcss, colcss, wholecss, "display"); obj.size = this.getSizeStyle(index, 0); obj.css = obj.css || rowcss.css; if (0 < index) { var lstIndex = index - 1; if (!this.isVisible(rowSetting[lstIndex])) { obj.css += " x-spreadsheet-row-with-hidden"; } } if (rowcss.group) { var group = rowcss.group, groupCollapsed = rowcss.groupCollapsed; var cls = "", inner = ""; if (true === groupCollapsed) { cls += " x-spreadsheet-group-collapsed "; } if (group[0] == index) { cls += " x-spreadsheet-row-group-start "; inner = "
"; } if (group[1] == index) { cls += " x-spreadsheet-row-group-end "; } obj.data += "
" + inner + "
"; obj.color = "overflow:visible;"; } return obj; }, getOffsetWidth : function(offset, flen, slen, len) { var width = 0; width = offset * (len - flen - slen); return width; }, getOffsetHeight : function(offset, flen, slen, len) { var height = 0; height = offset * (len - flen - slen); return height; }, getWidth : function(start, end) { if (0 != start) { start = start || 1; } if (0 != end) { end = end || this.data.rowNum; } var width = 0; for (var j = start; j <= end; j++) { width += this.getColWidth(j); } return width; }, onUpdateCssFn : function(field, pos, proper, v) { this.data[field][pos] = this.data[field][pos] || {}; var og = {}, md = {}; og[field] = {}; og[field][pos] = {}; og[field][pos][proper] = this.data[field][pos][proper]; md[field] = {}; md[field][pos] = {}; md[field][pos][proper] = v; this.add2Modified({ origin : og, modified : md }); this.data[field][pos][proper] = v; if ("wholeSetting" == field) { this.put2ModifiedCache("createUpdate", { x : 0, y : 0, data : this.getModifiedData(0, 0) }); } else if ("rowSetting" == field) { this.put2ModifiedCache("createUpdate", { x : pos, y : 0, data : this.getModifiedData(pos, 0) }); } else if ("colSetting" == field) { this.put2ModifiedCache("createUpdate", { x : 0, y : pos, data : this.getModifiedData(0, pos) }); } }, walkVisibleRow : function(rowStart, span) { var rowSetting = this.data.rowSetting; var i = 0, row = rowStart; if (0 < span) { while (i < span) { var o = rowSetting[row++]; if (this.isVisible(o)) { i++; } } } while (!this.isVisible(rowSetting[row])) { row++; } return row; }, walkVisibleCol : function(colStart, span) { var colSetting = this.data.colSetting; var i = 0, col = colStart; if (0 < span) { while (i < span) { var o = colSetting[col++]; if (this.isVisible(o)) { i++; } } } while (!this.isVisible(colSetting[col])) { col++; } return col; }, getVisibleRowOffset : function(rowEnd, rowStart) { var rowSetting = this.data.rowSetting; var flag = 1; if (rowStart > rowEnd) { flag = -1; var tmp = rowStart; rowStart = rowEnd; rowEnd = tmp; } var offset = 0; for (var i = rowStart; i < rowEnd; i++) { if (this.isVisible(rowSetting[i])) { offset++; } } return flag * offset; }, getVisibleColOffset : function(colEnd, colStart) { var colSetting = this.data.colSetting; var flag = 1; if (colStart > colEnd) { flag = -1; var tmp = colStart; colStart = colEnd; colEnd = tmp; } var offset = 0; for (var i = colStart; i < colEnd; i++) { if (this.isVisible(colSetting[i])) { offset++; } } return flag * offset; }, getRange : function(params) { var colSetting = this.data.colSetting; var rowSetting = this.data.rowSetting; var ss = this.spreadsheet; if (params.freezeRange) { this.data.freezeRange = ss.copyRange(params.freezeRange); } var freezeRange = this.data.freezeRange; var hfstart = freezeRange.row.start; var hfend = freezeRange.row.end; var lfstart = freezeRange.col.start; var lfend = freezeRange.col.end; var rowStart = parseInt(params.rowStart); var rowEnd = parseInt(params.rowEnd); var colStart = parseInt(params.colStart); var colEnd = parseInt(params.colEnd); var adjustWidth = params.adjustWidth; var adjustHeight = params.adjustHeight; if (adjustWidth && adjustHeight) { var rt = this.calculateShowRange(rowStart, colStart, adjustWidth, adjustHeight); colEnd = colStart + rt.colNum - 1; rowEnd = rowStart + rt.rowNum - 1; } var slheader = []; var lscroller = []; var sheader = []; var scroller = []; var slw = this.lcWidth + this.xpaddingOffset, sw = 0, sh = 0, slh = this.defaultRowHeight + this.ypaddingOffset; var lcvisible = [0], cvisible = [], trvisible = [0], rvisible = []; for (var i = lfstart; i <= lfend; i++) { if (this.isVisible(colSetting[i])) { lcvisible.push(i); } } for (var i = colStart; i <= colEnd; i++) { if (this.isVisible(colSetting[i])) { cvisible.push(i); } } for (var i = hfstart; i <= hfend; i++) { if (this.isVisible(rowSetting[i])) { trvisible.push(i); } } for (var i = rowStart; i <= rowEnd; i++) { if (this.isVisible(rowSetting[i])) { rvisible.push(i); } } for (var i = 0, len = trvisible.length; i < len; i++) { var row = trvisible[i]; var arr = []; for (var j = 0, count = lcvisible.length; j < count; j++) { var col = lcvisible[j]; var o = 0 == row ? this.getHeadText(col) : 0 == col ? this .getLeftText(row) : this.getCell(row, col); o.idx = col; arr.push(o); } slheader.push({ idx : row, arr : arr }); } for (var i = 0, len = trvisible.length; i < len; i++) { var row = trvisible[i]; var arr = []; for (var j = 0, count = cvisible.length; j < count; j++) { var col = cvisible[j]; var o = 0 == row ? this.getHeadText(col) : this.getCell(row, col); o.idx = col; arr.push(o); } sheader.push({ idx : row, arr : arr }); } for (var i = 0, len = rvisible.length; i < len; i++) { var row = rvisible[i]; var arr = []; for (var j = 0, count = lcvisible.length; j < count; j++) { var col = lcvisible[j]; var o = 0 == col ? this.getLeftText(row) : this.getCell(row, col); o.idx = col; arr.push(o); } lscroller.push({ idx : row, arr : arr }); } for (var i = 0, len = rvisible.length; i < len; i++) { var row = rvisible[i]; var arr = []; for (var j = 0, count = cvisible.length; j < count; j++) { var col = cvisible[j]; var o = this.getCell(row, col); o.idx = col; arr.push(o); } scroller.push({ idx : row, arr : arr }); } slw += this.getWidth(lfstart, lfend); slh += this.getHeight(hfstart, hfend); sw = this.getWidth(colStart, colEnd); sh = this.getHeight(rowStart, rowEnd); if (rowEnd >= this.data.rowNum) { this.data.rowNum = rowEnd + 1; } if (colEnd >= this.data.colNum) { this.data.colNum = colEnd + 1; } var rowNum = rowEnd - rowStart + 1; var colNum = colEnd - colStart + 1; return { slw : slw, slh : slh, sw : sw, sh : sh, freezeRange : freezeRange, rowStart : rowStart, rowNum : rowNum, rowEnd : rowEnd, colStart : colStart, colNum : colNum, colEnd : colEnd, slheader : slheader, lscroller : lscroller, sheader : sheader, scroller : scroller }; }, getURowRange : function(params) { var colSetting = this.data.colSetting; var rowSetting = this.data.rowSetting; var lfstart = params.freezeRange.col.start; var lfend = params.freezeRange.col.end; var rowStart = params.rowStart; var rowEnd = params.rowEnd; var fillHeight = params.fillHeight; fillHeight -= this.getRowHeight(0); if (0 < fillHeight) { var rowNum = this.calculateRowRange(rowStart, fillHeight); rowEnd = rowStart + rowNum - 1; } var colStart = params.colStart; var colEnd = params.colEnd; var lheader = []; var header = []; var lcvisible = [0], cvisible = [], rvisible = [0]; for (var i = lfstart; i <= lfend; i++) { if (this.isVisible(colSetting[i])) { lcvisible.push(i); } } for (var i = colStart; i <= colEnd; i++) { if (this.isVisible(colSetting[i])) { cvisible.push(i); } } for (var i = rowStart; i <= rowEnd; i++) { if (this.isVisible(rowSetting[i])) { rvisible.push(i); } } for (var i = 0, len = rvisible.length; i < len; i++) { var row = rvisible[i]; var arr = []; for (var j = 0, count = lcvisible.length; j < count; j++) { var col = lcvisible[j]; var o = 0 == row ? this.getHeadText(col) : 0 == col ? this .getLeftText(row) : this.getCell(row, col); o.idx = col; arr.push(o); } lheader.push({ idx : row, arr : arr }); } for (var i = 0, len = rvisible.length; i < len; i++) { var row = rvisible[i]; var arr = []; for (var j = 0, count = cvisible.length; j < count; j++) { var col = cvisible[j]; var o = 0 == row ? this.getHeadText(col) : this.getCell(row, col); o.idx = col; arr.push(o); } header.push({ idx : row, arr : arr }); } if (rowEnd >= this.data.rowNum) { this.data.rowNum = rowEnd + 1; } var row = rowEnd - rowStart + 1; return { rh : this.getHeight(rowStart, rowEnd), rowNum : rowNum, rowEnd : rowEnd, lheader : lheader, header : header }; }, getRowRange : function(params) { var colSetting = this.data.colSetting; var rowSetting = this.data.rowSetting; var lfstart = params.freezeRange.col.start; var lfend = params.freezeRange.col.end; var rowStart = params.rowStart; var rowEnd = params.rowEnd; var fillHeight = params.fillHeight; if (0 < fillHeight) { var rowNum = this.calculateRowRange(rowStart, fillHeight); rowEnd = rowStart + rowNum - 1; } var colStart = params.colStart; var colEnd = params.colEnd; var lscroller = []; var scroller = []; var lcvisible = [0], cvisible = [], rvisible = []; for (var i = lfstart; i <= lfend; i++) { if (this.isVisible(colSetting[i])) { lcvisible.push(i); } } for (var i = colStart; i <= colEnd; i++) { if (this.isVisible(colSetting[i])) { cvisible.push(i); } } for (var i = rowStart; i <= rowEnd; i++) { if (this.isVisible(rowSetting[i])) { rvisible.push(i); } } for (var i = 0, len = rvisible.length; i < len; i++) { var row = rvisible[i]; var arr = []; for (var j = 0, count = lcvisible.length; j < count; j++) { var col = lcvisible[j]; var o = 0 == col ? this.getLeftText(row) : this.getCell(row, col); o.idx = col; arr.push(o); } lscroller.push({ idx : row, arr : arr }); } for (var i = 0, len = rvisible.length; i < len; i++) { var row = rvisible[i]; var arr = []; for (var j = 0, count = cvisible.length; j < count; j++) { var col = cvisible[j]; var o = this.getCell(row, col); o.idx = col; arr.push(o); } scroller.push({ idx : row, arr : arr }); } if (rowEnd >= this.data.rowNum) { this.data.rowNum = rowEnd + 1; } var rowNum = rowEnd - rowStart + 1; return { rh : this.getHeight(rowStart, rowEnd), rowNum : rowNum, rowEnd : rowEnd, lscroller : lscroller, scroller : scroller }; }, getLColRange : function(params) { var colSetting = this.data.colSetting; var rowSetting = this.data.rowSetting; var hfstart = params.freezeRange.row.start; var hfend = params.freezeRange.row.end; var rowStart = params.rowStart; var rowEnd = params.rowEnd; var colStart = params.colStart; var colEnd = params.colEnd; var fillWidth = params.fillWidth; fillWidth -= (this.lcWidth + this.xpaddingOffset); if (fillWidth && 0 < fillWidth) { var colNum = this.calculateColRange(colStart, fillWidth); colEnd = colStart + colNum - 1; } var cvisible = [0], trvisible = [0], rvisible = []; for (var i = colStart; i <= colEnd; i++) { if (this.isVisible(colSetting[i])) { cvisible.push(i); } } for (var i = hfstart; i <= hfend; i++) { if (this.isVisible(rowSetting[i])) { trvisible.push(i); } } for (var i = rowStart; i <= rowEnd; i++) { if (this.isVisible(rowSetting[i])) { rvisible.push(i); } } var lheader = []; var lscroller = []; for (var i = 0, len = trvisible.length; i < len; i++) { var row = trvisible[i]; var arr = []; for (var j = 0, count = cvisible.length; j < count; j++) { var col = cvisible[j]; var o = 0 == row ? this.getHeadText(col) : 0 == col ? this .getLeftText(row) : this.getCell(row, col); o.idx = col; arr.push(o); } lheader.push({ idx : row, arr : arr }); } for (var i = 0, len = rvisible.length; i < len; i++) { var row = rvisible[i]; var arr = []; for (var j = 0, count = cvisible.length; j < count; j++) { var col = cvisible[j]; var o = 0 == col ? this.getLeftText(row) : this.getCell(row, col); o.idx = col; arr.push(o); } lscroller.push({ idx : row, arr : arr }); } if (colEnd >= this.data.colNum) { this.data.colNum = colEnd + 1; } var colNum = colEnd - colStart + 1; return { rw : this.getWidth(colStart, colEnd), colNum : colNum, colEnd : colEnd, lheader : lheader, lscroller : lscroller }; }, getColRange : function(params) { var colSetting = this.data.colSetting; var rowSetting = this.data.rowSetting; var hfstart = params.freezeRange.row.start; var hfend = params.freezeRange.row.end; var rowStart = params.rowStart; var rowEnd = params.rowEnd; var colStart = params.colStart; var colEnd = params.colEnd; var fillWidth = params.fillWidth; if (fillWidth && 0 < fillWidth) { var colNum = this.calculateColRange(colStart, fillWidth); colEnd = colStart + colNum - 1; } var cvisible = [], trvisible = [0], rvisible = []; for (var i = colStart; i <= colEnd; i++) { if (this.isVisible(colSetting[i])) { cvisible.push(i); } } for (var i = hfstart; i <= hfend; i++) { if (this.isVisible(rowSetting[i])) { trvisible.push(i); } } for (var i = rowStart; i <= rowEnd; i++) { if (this.isVisible(rowSetting[i])) { rvisible.push(i); } } var sheader = []; var scroller = []; for (var i = 0, len = trvisible.length; i < len; i++) { var row = trvisible[i]; var arr = []; for (var j = 0, count = cvisible.length; j < count; j++) { var col = cvisible[j]; var o = 0 == row ? this.getHeadText(col) : this.getCell(row, col); o.idx = col; arr.push(o); } sheader.push({ idx : row, arr : arr }); } for (var i = 0, len = rvisible.length; i < len; i++) { var row = rvisible[i]; var arr = []; for (var j = 0, count = cvisible.length; j < count; j++) { var col = cvisible[j]; var o = this.getCell(row, col); o.idx = col; arr.push(o); } scroller.push({ idx : row, arr : arr }); } if (colEnd >= this.data.colNum) { this.data.colNum = colEnd + 1; } var colNum = colEnd - colStart + 1; return { rw : this.getWidth(colStart, colEnd), colNum : colNum, colEnd : colEnd, sheader : sheader, scroller : scroller }; }, onDataChangeFn : function(x, y, html, origin) { if (this.data.rowNum < x) { this.data.rowNum = x; } if (this.data.colNum < y) { this.data.colNum = y; } this.data.rows[x] = this.data.rows[x] || {}; this.data.rows[x][y] = this.data.rows[x][y] || {}; var cell = this.data.rows[x][y]; var og = { rows : {}, action : "datachange", x : x, y : y, sheetIndex : this.activeSheet }; og.rows[x] = {}; og.rows[x][y] = { data : cell.data, 'origin-data' : cell['origin-data'] }; var md = { rows : {}, action : "datachange", x : x, y : y, sheetIndex : this.activeSheet }; md.rows[x] = {}; md.rows[x][y] = { data : html, 'origin-data' : origin }; var sm = this.spreadsheet.sm; this.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }); cell['origin-data'] = origin; Ext.ss.common.Helper.generateHyperlink(html, cell); this.setCellData(x, y, html, true); }, put2ModifiedCache : function(action, info) { var tabId = info.tabId; if (false == Ext.type(tabId)) { tabId = this.sheets[this.activeSheet].tabId; } if ("createUpdate" == action) { var x = info.x, y = info.y; var id = [tabId, x, y, action].join("$"); delete this.modifedCache[id]; this.modifedCache[id] = { tabId : tabId, x : x, y : y, action : action, data : info.data }; } else if ("insertRowAt" == action) { var x = info.x; var timestamp = (new Date).format("YmdHisu"); var id = [tabId, x, action, timestamp].join("$"); this.modifedCache[id] = { tabId : tabId, x : x, action : action }; } else if ("insertColumnAt" == action) { var y = info.y; var timestamp = (new Date).format("YmdHisu"); var id = [tabId, y, action, timestamp].join("$"); this.modifedCache[id] = { tabId : tabId, y : y, action : action }; } else if ("deleteRows" == action) { var x = info.x; var timestamp = (new Date).format("YmdHisu"); var id = [tabId, x, action, timestamp].join("$"); this.modifedCache[id] = { tabId : tabId, x : x, span : info.span, action : action }; } else if ("deleteCols" == action) { var y = info.y; var timestamp = (new Date).format("YmdHisu"); var id = [tabId, x, action, timestamp].join("$"); this.modifedCache[id] = { tabId : tabId, y : y, span : info.span, action : action }; } this.fireEvent("savemodified"); }, getModifiedData : function(x, y) { if (0 === x && 0 === y) { return this.data.wholeSetting ? Ext.encode(this.data.wholeSetting) : ""; } else if (0 === x) { return this.data.colSetting[y] ? Ext .encode(this.data.colSetting[y]) : ""; } else if (0 === y) { return this.data.rowSetting[x] ? Ext .encode(this.data.rowSetting[x]) : ""; } else { var rows = this.data.rows; if (rows[x] && rows[x][y]) { var cell = this.deepClone(rows[x][y]); if (cell.data && Ext.isString(cell.data)) { var date = this.transfer2Date(cell.data); if (Ext.isDate(date)) { if (!cell.dateFormat) { cell.dateFormat = this.defaultDateFormat; } cell.dValue = date.format(this.defaultDateFormat); } else { delete cell.dateFormat; delete cell.dValue; } if (cell.data && 0 === cell.data.indexOf("=")) { } else { delete cell['origin-data']; delete cell.formula_version; delete cell.ISIParams; delete cell.lastOriginData; } } for (var p in cell) { if (cell.hasOwnProperty(p)) { if (false == Ext.type(cell[p]) || "" === cell[p]) { delete cell[p]; } } } var jsonStr; if (cell.wrap) { cell.wrap = this.absoluteWrap2Relative(cell.wrap, Number(x), Number(y)); delete cell.relativeWrap; } cell = this.transferCellProperty(cell); jsonStr = Ext.encode(cell); return jsonStr; } } return ""; }, transferCellProperty : function(cell, short2Full) { var map; if (!short2Full) { map = Ext.ss.CONST.full2Short; } else { map = Ext.ss.CONST.short2Full; } var obj = {}; for (var p in cell) { var val = cell[p]; var name = map[p]; if (name) { obj[name] = val; } else if ("br" == p || "bb" == p) { obj[p] = map[val] || val; } else { obj[p] = val; } } return obj; }, saveModifiedCache : function(extraInfo, callback, scope, needBackup) { var ss = this.spreadsheet; /**更改:2013-02-27 实现单元格保存 ! this.disableCallingBackEnd*/ if (this.disableCallingBackEnd) { this.resetModifiedCache(); if (callback) { callback.call(scope); } return true; } if (this._callingBackEnd) { this.fireEvent("savemodified", extraInfo, callback, scope, needBackup); return; } if (ss.isReadOnly()) { this.resetModifiedCache(); if (callback) { callback.call(scope); } return true; } if (this.isChanged()) { var file = this.getFile() || {}; if (file.isTemp) { file.onceChanged = true; } this._callingBackEnd = true; var cellJson = [], tabId = this.sheets[this.activeSheet].tabId; if (!tabId) { Ext.Msg.alert(feyaSoft.lang.common.error, feyaSoft.ss.lang.internetError); return true; } for (var p in this.modifedCache) { var it = this.modifedCache[p]; var x = parseInt(it.x), y = parseInt(it.y), action = it.action; if ("createUpdate" == action) { cellJson.push(Ext.encode({ tabId : it.tabId || tabId, x : x, y : y, action : action, content : it.data })); } else if ("insertRowAt" == action) { cellJson.push(Ext.encode({ row : x, action : action })); } else if ("insertColumnAt" == action) { cellJson.push(Ext.encode({ column : y, action : action })); } else if ("deleteRows" == action) { cellJson.push(Ext.encode({ row : x, span : it.span || 1, action : action })); } else if ("deleteCols" == action) { cellJson.push(Ext.encode({ column : y, span : it.span || 1, action : action })); } } this.resetModifiedCache(); var params = { tabId : tabId, cellJsons : cellJson, needBackup : needBackup }; if (extraInfo) { params.extraInfo = this.getExtraInfo(); params.asActive = true; } if (!file.isTemp) { ss.setStatus({ text : feyaSoft.ss.lang.saveChanges, iconCls : "x-status-busy" }); } Ext.Ajax.request({ timeout : 300000, url : this.updateModifiedUrl, params : params, success : function(response) { this._callingBackEnd = false; var json = Ext.decode(response.responseText); if ("true" == json.success) { if (callback) { callback.call(scope); } if (!file.isTemp) { ss.setStatus({ text : feyaSoft.ss.lang.saved + " " + feyaSoft.lang.common.at + " " + (new Date) .format("H:i:s d/m Y"), iconCls : "x-status-valid" }); } } else { if (json.success == "relogin") { new feyaSoft.home.Login; } else { Ext.Msg.alert(feyaSoft.lang.common.error, json.info); } ss.setStatus({ text : feyaSoft.ss.lang.fail2Save, iconCls : "x-status-error" }); } }, failure : function(response) { this._callingBackEnd = false; //不提示错误 /**ss.setStatus({ text : feyaSoft.ss.lang.fail2Save, iconCls : "x-status-error" });**/ }, scope : this }); return true; } else if (callback) { callback.call(scope); return true; } }, setCellData : function(x, y, data, direct) { if (!direct) { this.data.rows[x] = this.data.rows[x] || {}; this.data.rows[x][y] = this.data.rows[x][y] || {}; } var o = this.data.rows[x][y].data; this.data.rows[x][y].data = data; var oldResult = this.data.rows[x][y].result; delete this.data.rows[x][y].result; var isFormula = Ext.ss.common.Mask.isFormula(data); if (isFormula) { var originData = this.data.rows[x][y]['origin-data']; if (originData && originData.toLowerCase().indexOf("=round") != -1) { if (originData.indexOf(",") == -1) { this.data.rows[x][y]['origin-data'] = originData.replace( /\)$/i, ",0)"); } } else if (originData && originData.toLowerCase().indexOf("=rate") != -1) { this.data.rows[x][y].data = this.data.rows[x][y].data.replace( /,\s*,/g, ",0,"); } else { if (originData && originData.toLowerCase().indexOf("=sum") != -1) { this.data.rows[x][y].data = this.data.rows[x][y].data .replace(/,\s*,/g, ",0,"); } this.data.rows[x][y]['origin-data'] = this .refreshOriginFormula(originData, 0, 0); } var result = this.getConvertData(x, y, this.data.rows[x][y], undefined, true); } else { this.put2ModifiedCache("createUpdate", { x : x, y : y, data : this.getModifiedData(x, y) }); } if (Ext.ss.common.Mask.isFormula(o) && o != data) { } this.data.rows[x][y].oldResult = oldResult; this.fireEvent("checkformula", this.activeSheet, x, y); this.fireEvent("afterdatachange", x, y, this.activeSheet, this); }, processOldFile : function(json) { json.name = "Sheet1"; json.showRange = { row : { start : json.freezeRange.row.end + 1, end : json.freezeRange.row.end + 20, len : 20 }, col : { start : json.freezeRange.col.end + 1, end : json.freezeRange.col.end + 10, len : 10 } }; json.wholeSetting = json.wholeSetting || {}; json.focusCell = { x : 1, y : 1 }; json.selectedStart = { x : 1, y : 1 }; json.selectedEnd = { x : 1, y : 1 }; return [json]; }, prepareSheets : function(sheets, extraInfo, activeSheetIndex) { this.activeSheet = activeSheetIndex || 0; this.sheets = sheets; this.data = sheets[this.activeSheet]; for (var i = 0, len = sheets.length; i < len; i++) { var sheet = sheets[i]; sheet.loaded = true; sheet = this.prepareTab(sheet); } return sheets; }, prepareTab : function(sheet, sheetIndex) { if (false == Ext.type(sheetIndex)) { sheetIndex = this.activeSheet; } sheet.rows = sheet.rows || {}; if (!sheet.wholeSetting) { if (sheet.rows[0] && sheet.rows[0][0]) { sheet.wholeSetting = sheet.rows[0][0]; } else { sheet.wholeSetting = {}; } } if (!sheet.rowSetting) { sheet.rowSetting = {}; var rows = sheet.rows; for (var p in rows) { var row = rows[p]; if (row[0]) { sheet.rowSetting[p] = row[0]; delete row[0]; } } } if (!sheet.colSetting) { if (sheet.rows[0]) { sheet.colSetting = sheet.rows[0]; delete sheet.rows[0]; } else { sheet.colSetting = {}; } } if (sheet.conditionFormat) { this.prepareConditionFormat(sheet.conditionFormat, sheet); } var defaults = this.generateData(sheet.name); for (var p in defaults) { if (false === Ext.type(sheet[p])) { sheet[p] = defaults[p]; } } var rows = sheet.rows; for (var p in rows) { p = Number(p); var row = rows[p]; for (var q in row) { q = Number(q); var cell = row[q]; row[q] = this.transferCellProperty(cell, true); cell = row[q]; if (cell.wrap) { var wrap = cell.wrap; if (this.isRelativeWrap(wrap)) { cell.relativeWrap = Ext.apply({}, wrap); cell.wrap = this.relativeWrap2Absolute(wrap, p, q); } } if ("ISFormula" == cell.type) { var isfObj = this.transferISFormula(p, q, cell['origin-data']); Ext.apply(cell, isfObj); } else if (Ext.ss.common.Mask.isFormula(cell['origin-data'])) { delete cell.result; cell.data = this.adjustFormula(p, q, cell['origin-data']); } } } return sheet; }, prepareConditionFormat : function(conditionFormat, sheet) { var cfmLookup = {}; for (var k = 0, len = conditionFormat.length; k < len; k++) { var it = conditionFormat[k]; var pos = it.pos; var si = pos.sheetIndex, x = pos.x, y = pos.y, ex = pos.ex, ey = pos.ey; for (var i = x; i <= ex; i++) { for (var j = y; j <= ey; j++) { var id = [si, i, j].join("-"); cfmLookup[id] = k; } } } sheet.cfmLookup = cfmLookup; }, isRelativeWrap : function(wrap) { if (0 >= wrap.minx || 0 >= wrap.miny || 0 >= wrap.maxx || 0 >= wrap.maxy) { return true; } return false; }, relativeWrap2Absolute : function(wrap, x, y) { wrap.minx += x; wrap.miny += y; wrap.maxx += x; wrap.maxy += y; return wrap; }, absoluteWrap2Relative : function(wrap, x, y) { wrap.minx -= x; wrap.miny -= y; wrap.maxx -= x; wrap.maxy -= y; return wrap; }, setSheets : function(sheets, extraInfo, activeSheet) { var file = this.getFile(); if (file.isFake) { this.disableCallingBackEnd = true; } else { this.disableCallingBackEnd = false; } var ss = this.spreadsheet; if (extraInfo) { if (Ext.isString(extraInfo)) { this.fileExtraInfo = Ext.decode(extraInfo); } else { this.fileExtraInfo = this.deepClone(extraInfo); } } else { this.fileExtraInfo = {}; } if (sheets == null) { alert("should not appear ..."); this.sheets = this.processOldFile(sheets); } else { this.sheets = this.prepareSheets(sheets, activeSheet); } this.resetHStack(); this.setActiveSheet(parseInt(activeSheet || 0), true); this.readActiveSheet(); }, getSheets : function() { this.saveActiveSheet(); var sheets = []; for (var i = 0, len = this.sheets.length; i < len; i++) { sheets.push(this.getData(i)); } return { sheets : sheets, activeSheet : this.activeSheet }; }, getData : function(index) { var data = this.sheets[index]; var ss = this.spreadsheet; var freezeRange = ss.copyRange(data.freezeRange); var showRange = ss.copyRange(data.showRange); var selectedStart = Ext.apply({}, data.selectedStart); var selectedEnd = Ext.apply({}, data.selectedEnd); var focusCell = Ext.apply({}, data.focusCell); var obj = { name : data.name, splitFlag : data.splitFlag, footerWidth : data.footerWidth || 500, freezeRange : freezeRange, showRange : showRange, rowNum : data.rowNum, colNum : data.colNum, selectedStart : selectedStart, selectedEnd : selectedEnd, focusCell : focusCell }; var rows = data.rows; var rs = {}; for (var p in rows) { if (0 != p) { if (rows[p]) { for (var q in rows[p]) { var cell = rows[p][q]; if (0 != q) { if (cell.data && "" != cell.data || cell.style && "" != cell.style || cell.bg && "" != cell.bg || cell.br && "" != cell.br && "x-spreadsheet-right-silver" != cell.br || cell.bb && "" != cell.bb && "x-spreadsheet-bottom-silver" != cell.br || cell.wrap || cell.comment || cell.b && cell.s && cell.u && cell.i && "" !== cell.b && "" !== cell.s && "" !== cell.u && "" !== cell.i || cell.css && "" != cell.css || cell.tdcss && "" != cell.tdcss || cell.filter && "" != cell.filter) { rs[p] = rs[p] || {}; rs[p][q] = Ext.apply({}, cell); } } } } } } obj.rows = rs; obj.project = data.project; obj.charts = ss.chartManager.getCharts(index); obj.wholeSetting = Ext.apply({}, data.wholeSetting); var rowSetting = data.rowSetting; rs = {}; for (var p in rowSetting) { rs[p] = Ext.apply({}, rowSetting[p]); } obj.rowSetting = rs; var colSetting = data.colSetting; rs = {}; for (var p in colSetting) { rs[p] = Ext.apply({}, colSetting[p]); } obj.colSetting = rs; return obj; }, calculateShowRange : function(rowStart, colStart, w, h) { var rowIndex = rowStart, colIndex = colStart; var ih = 0; while (ih < h) { ih += this.getRowHeight(rowIndex); rowIndex++; } var iw = 0; while (iw < w) { iw += this.getColWidth(colIndex); colIndex++; } var rowNum = rowIndex - rowStart; var colNum = colIndex - colStart; if (1 == rowNum) { rowNum = 2; } if (1 == colNum) { colNum = 2; } return { rowNum : rowNum, colNum : colNum }; }, calculateRowRange : function(rowStart, h) { var rowIndex = rowStart; var ih = 0; while (ih < h) { ih += this.getRowHeight(rowIndex); rowIndex++; } var rowNum = rowIndex - rowStart; if (1 == rowNum) { rowNum = 2; } return rowNum; }, calculateColRange : function(colStart, w) { var colIndex = colStart; var iw = 0; while (iw < w) { iw += this.getColWidth(colIndex); colIndex++; } var colNum = colIndex - colStart; if (1 == colNum) { colNum = 2; } return colNum; }, getRowHeight : function(rowIndex) { var rs = this.data.rowSetting; var rh = this.defaultRowHeight + this.ypaddingOffset; if (rs[rowIndex]) { if (!this.isVisible(rs[rowIndex])) { rh = 0; } else if (rs[rowIndex].ch || 0 == rs[rowIndex].ch) { rh = rs[rowIndex].ch + this.ypaddingOffset; } } return rh; }, getSpanHeight : function(start, end) { var h = 0; var rs = this.data.rowSetting; var rh = this.defaultRowHeight + this.ypaddingOffset; var count = end - start + 1; for (var i = start; i <= end; i++) { if (rs[i]) { if (!this.isVisible(rs[i])) { count--; } else if (rs[i].ch || 0 == rs[i].ch) { count--; h += rs[i].ch + this.ypaddingOffset; } } } h += rh * count; return h; }, getAvailSpanHeight : function(start, end) { var ss = this.spreadsheet; var fr = ss.freezeRange, sr = ss.showRange; var h = 0; for (var i = start; i <= end; i++) { if (fr.row.start <= i && fr.row.end >= i || sr.row.start <= i && sr.row.end >= i) { h += this.getRowHeight(i); } } return h; }, getColWidth : function(colIndex) { var cs = this.data.colSetting; var cw = this.defaultColWidth + this.xpaddingOffset; if (cs[colIndex]) { if (!this.isVisible(cs[colIndex])) { cw = 0; } else if (cs[colIndex].cw || 0 == cs[colIndex].cw) { cw = cs[colIndex].cw + this.xpaddingOffset; } } return cw; }, getSpanWidth : function(start, end) { var w = 0; var cs = this.data.colSetting; var cw = this.defaultColWidth + this.xpaddingOffset; var count = end - start + 1; for (var i = start; i <= end; i++) { if (cs[i]) { if (!this.isVisible(cs[i])) { count--; } else if (cs[i].cw || 0 == cs[i].cw) { count--; w += cs[i].cw + this.xpaddingOffset; } } } w += cw * count; return w; }, getColDistance : function(start, end, flag) { var min = start, max = end, f = 1; if (min > max) { min = end; max = start - 1; f = -1; if ("before" != flag) { min++; } } else { if ("before" == flag) { max -= 1; } } var w = 0; var cs = this.data.colSetting; var cw = this.defaultColWidth + this.xpaddingOffset; var count = max - min + 1; for (var i = min; i <= max; i++) { if (cs[i]) { if (!this.isVisible(cs[i])) { count--; } else if (cs[i].cw || 0 == cs[i].cw) { count--; w += cs[i].cw + this.xpaddingOffset; } } } w += cw * count; return f * w; }, getRowDistance : function(start, end, flag) { var min = start, max = end, f = 1; if (min > max) { min = end; max = start - 1; f = -1; if ("before" != flag) { min++; } } else { if ("before" == flag) { max -= 1; } } var h = 0; var rs = this.data.rowSetting; var rh = this.defaultRowHeight + this.ypaddingOffset; var count = max - min + 1; for (var i = min; i <= max; i++) { if (rs[i]) { if (!this.isVisible(rs[i])) { count--; } else if (rs[i].ch || 0 == rs[i].ch) { count--; h += rs[i].ch + this.ypaddingOffset; } } } h += rh * count; return f * h; }, getAvailSpanWidth : function(start, end) { var ss = this.spreadsheet; var fr = ss.freezeRange, sr = ss.showRange; var w = 0; for (var i = start; i <= end; i++) { if (fr.col.start <= i && fr.col.end >= i || sr.col.start <= i && sr.col.end >= i) { w += this.getColWidth(i); } } return w; }, addCommentFn : function(x, y, comment) { var rows = this.data.rows; rows[x] = rows[x] || {}; rows[x][y] = rows[x][y] || {}; var og = { rows : {} }; og.rows[x] = {}; var css = this.data.rows[x][y].css || ""; og.rows[x][y] = { comment : this.data.rows[x][y].comment, css : css }; var md = { rows : {} }; md.rows[x] = {}; md.rows[x][y] = { comment : comment, css : css + " " + Ext.ss.CONST.cssHash[3] }; var sm = this.spreadsheet.sm; this.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }); rows[x][y].comment = comment; rows[x][y].css = css + " " + Ext.ss.CONST.cssHash[3]; this.put2ModifiedCache("createUpdate", { x : x, y : y, data : this.getModifiedData(x, y) }); }, deleteCommentFn : function(x, y) { var rows = this.data.rows; rows[x] = rows[x] || {}; rows[x][y] = rows[x][y] || {}; var og = { rows : {} }; og.rows[x] = {}; var css = this.data.rows[x][y].css; og.rows[x][y] = { css : css, comment : this.data.rows[x][y].comment }; var md = { rows : {} }; md.rows[x] = {}; css = css.replace(Ext.ss.CONST.cssHash[3], "").trim(); md.rows[x][y] = { css : css, comment : "" }; var sm = this.spreadsheet.sm; this.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }); rows[x][y].css = css; rows[x][y].comment = ""; this.put2ModifiedCache("createUpdate", { x : x, y : y, data : this.getModifiedData(x, y) }); }, getStrPos : function(x, y) { var h = this.getLetter(y); return h + x; }, getPos : function(str) { str = str.toUpperCase(); var x = str.match(/\d+/); var parts = str.split(x, 1); var l = parts[0]; var y = l.charCodeAt(0) - 64; for (var i = 1, len = l.length; i < len; i++) { var c = str.charCodeAt(i) - 65; y += c * Math.pow(26, i); } var obj = { x : parseInt(x), y : parseInt(y) }; return obj; }, checkWrap : function(minx, miny, maxx, maxy) { var rows = this.data.rows; if (0 == minx && 0 == maxx) { for (var p in rows) { var row = rows[p]; for (var q in row) { for (var j = miny; j <= maxy; j++) { if (this.isWraped(q, j)) { return true; } } } } } else if (0 == miny && 0 == maxy) { for (var i = minx; i <= maxx; i++) { var row = rows[i]; if (row) { for (var q in row) { if (this.isWraped(i, q)) { return true; } } } } } else { for (var i = minx; i <= maxx; i++) { var row = rows[i]; if (row) { for (var j = miny; j <= maxy; j++) { if (this.isWraped(i, j)) { return true; } } } } } return false; }, sortRange : function(minx, miny, maxx, maxy, sf) { var span = { minx : minx, miny : miny, maxx : maxx, maxy : maxy }; if (this.checkWrap(minx, miny, maxx, maxy)) { return false; } var flag; var arr = [], rows = this.data.rows; if (0 == minx && 0 == maxx) { flag = true; minx = 1; maxx = this.data.rowNum - 1, stop = false; for (var i = 1; i <= maxx; i++) { var r = rows[i]; if (r) { for (var j = miny; j <= maxy; j++) { var c = r[j]; if (c) { if ("" != c.data && false != Ext.type(c.data)) { stop = true; break; } } } if (stop) { minx = i; break; } } } } for (var i = minx; i <= maxx; i++) { var b = rows[i] || {}; for (var j = arr.length - 1; j >= 0; j--) { var a = rows[arr[j]] || {}; a[miny] = a[miny] || {}; b[miny] = b[miny] || {}; if (sf == Ext.ss.common.DataSourceHelper.compareStr( a[miny].data, b[miny].data, sf)) { arr[j + 1] = arr[j]; } else { break; } } arr[j + 1] = i; } var olds = [], changes = []; for (var i = 0, len = arr.length; i < len; i++) { if (i + minx !== arr[i]) { olds.push(arr[i]); changes.push(i + minx); } } if (!this.saveModifiedCache(false, function() { this.sortInBackend(this.data.tabId, olds, changes, span); }, this)) { this.sortInBackend(this.data.tabId, olds, changes, span); } this.switchRows(olds, changes, span); var sm = this.spreadsheet.sm; this.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : { action : "sort", type : "undo", tabId : this.data.tabId, olds : olds, changes : changes, span : span }, modified : { action : "sort", type : "redo", tabId : this.data.tabId, olds : olds, changes : changes, span : span } }, true); return true; }, switchRows : function(olds, news, span) { var miny = span.miny, maxy = span.maxy, expand = 0 === span.maxx; var rows = this.data.rows, lookup = {}; for (var i = 0, len = olds.length; i < len; i++) { var index = olds[i]; if (expand) { lookup[index] = rows[index]; } else { lookup[index] = {}; for (var j = miny; j <= maxy; j++) { if (rows[index]) { lookup[index][j] = rows[index][j]; } } } } for (var i = 0, len = news.length; i < len; i++) { var oi = olds[i], ni = news[i]; if (expand) { rows[ni] = lookup[oi]; } else { rows[ni] = rows[ni] || {}; lookup[oi] = lookup[oi] || {}; var row = rows[ni], back = lookup[oi]; for (var j = miny; j <= maxy; j++) { if (back[j]) { row[j] = back[j]; } else { delete row[j]; } } } } }, sortInBackend : function(tabId, oldRowIndex, newRowIndex, span, callback, scope) { var ss = this.spreadsheet; if (ss.isReadOnly()) { this.resetModifiedCache(); if (callback) { callback.call(scope); } return; } var params = { tabId : tabId, oldRowIndex : oldRowIndex, newRowIndex : newRowIndex }; if (0 !== span.minx && 0 != span.maxx) { params.mincol = span.miny; params.maxcol = span.maxy; } Ext.Ajax.request({ timeout : 300000, url : this.sortUrl, params : params, success : function(response, opts) { var json = Ext.decode(response.responseText); if ("true" == json.success) { if (callback) { callback.call(scope); } ss.setStatus({ text : feyaSoft.ss.lang.saved + " " + feyaSoft.lang.common.at + " " + (new Date) .format("H:i:s d/m Y"), iconCls : "x-status-valid" }); } else { var lanCom = feyaSoft.lang.common; Ext.Msg.alert(lanCom.error, json.info); } }, failure : function(response, opts) { var lanCom = feyaSoft.lang.common; Ext.Msg.alert(lanCom.error, "Server-side failure with status code " + response.status); }, scope : this }); }, wrapData : function(x, y, span) { var minx = span.minx, miny = span.miny, maxx = span.maxx, maxy = span.maxy; var rows = this.data.rows; var colcss = this.data.colSetting[miny] || {}; var rowcss = this.data.rowSetting[minx] || {}; var wholecss = this.data.wholeSetting || {}; var b = "", i = "", u = "", s = "", bg = "", br = "", bb = ""; var color = "", align = "", fontsize = "", wordwrap = "", fontfamily = "", textalign = "", css = " x-spreadsheet-body-cursor ", display = "", filter, format; if (rows[minx] && rows[minx][miny]) { var cell = rows[minx][miny]; b = this.getAttribute(cell, rowcss, colcss, wholecss, "b"); i = this.getAttribute(cell, rowcss, colcss, wholecss, "i"); u = this.getAttribute(cell, rowcss, colcss, wholecss, "u"); s = this.getAttribute(cell, rowcss, colcss, wholecss, "s"); bg = this.getAttribute(cell, rowcss, colcss, wholecss, "bg"); color = this.getAttribute(cell, rowcss, colcss, wholecss, "color"); fontsize = this.getAttribute(cell, rowcss, colcss, wholecss, "font-size"); wordwrap = this.getAttribute(cell, rowcss, colcss, wholecss, "word-wrap"); fontfamily = this.getAttribute(cell, rowcss, colcss, wholecss, "font-family"); textalign = this.getAttribute(cell, rowcss, colcss, wholecss, "text-align"); align = this.getAttribute(cell, rowcss, colcss, wholecss, "align"); format = this .getAttribute(cell, rowcss, colcss, wholecss, "format"); filter = cell.filter; } var rflag = this.isRightCellInWrap(y, span); var bflag = this.isBottomCellInWrap(x, span); if (rows[x] && rows[x][y]) { var cell = rows[x][y]; colcss = this.data.colSetting[y] || {}; rowcss = this.data.rowSetting[x] || {}; css += this.getAttribute(cell, rowcss, colcss, wholecss, "css"); if (rflag) { br = this.getAttribute(cell, rowcss, colcss, wholecss, "br", "x-spreadsheet-right-silver"); } if (bflag) { bb = this.getAttribute(cell, rowcss, colcss, wholecss, "bb", "x-spreadsheet-bottom-silver"); } display = this.getAttribute(cell, rowcss, colcss, wholecss, "display"); } if (!bflag) { bb = "x-spreadsheet-bottom-none"; } if (!rflag) { br = "x-spreadsheet-right-none"; } return { b : b, i : i, u : u, s : s, bg : bg, br : br, bb : bb, color : color, 'font-size' : fontsize, 'word-wrap' : wordwrap, 'font-family' : fontfamily, 'text-align' : textalign, align : align, css : css, display : display, filter : filter, format : format }; }, getVisiableSpan : function(minx, miny, maxx, maxy) { var span = {}; var cs = this.data.colSetting, rs = this.data.rowSetting; for (var i = minx; i <= maxx; i++) { var r = rs[i]; if (!r || "none" != r.display) { span.minx = i; break; } } for (var i = maxx; i >= minx; i--) { var r = rs[i]; if (!r || "none" != r.display) { span.maxx = i; break; } } for (var j = miny; j <= maxy; j++) { var c = cs[j]; if (!c || "none" != c.display) { span.miny = j; break; } } for (var j = maxy; j >= miny; j--) { var c = cs[j]; if (!c || "none" != c.display) { span.maxy = j; break; } } return span; }, isRightCellInWrap : function(y, wrap) { var cs = this.data.colSetting; var maxy = wrap.maxy; for (var i = y + 1; i <= maxy; i++) { var c = cs[i]; if (!c || "none" != c.display) { return false; } } return true; }, isBottomCellInWrap : function(x, wrap) { var rs = this.data.rowSetting; var maxx = wrap.maxx; for (var i = x + 1; i <= maxx; i++) { var r = rs[i]; if (!r || "none" != r.display) { return false; } } return true; }, getPosFromXY : function(x, y) { var ss = this.spreadsheet; var fr = ss.freezeRange, sr = ss.showRange; var st = ss.sview.getTop(), sl = ss.sview.getLeft(); var w = sl + this.lcWidth + this.xpaddingOffset, h = st + this.getRowHeight(0); var lw = sl + ss.lhscroller.getWidth(), lh = st + ss.lhscroller.getHeight(); var rowIndex = 0, colIndex = 0, i, j; var lf = false, tf = false; if (h < y) { if (y <= lh) { for (i = fr.row.start; i <= fr.row.end; i++) { h += this.getRowHeight(i); if (h >= y) { rowIndex = i; break; } } } else { tf = true; if (ss.isRowSplit()) { lh += ss.SPLIT_BAR_SIZE; } h = 0; y -= lh; if (0 > y) { return; } for (i = sr.row.start; i <= sr.row.end; i++) { h += this.getRowHeight(i); if (h >= y) { rowIndex = i; break; } } } } if (w < x) { if (x <= lw) { for (j = fr.col.start; j <= fr.col.end; j++) { w += this.getColWidth(j); if (w >= x) { colIndex = j; break; } } } else { lf = true; if (ss.isColSplit()) { lw += ss.SPLIT_BAR_SIZE; } w = 0; x -= lw; if (0 > x) { return; } for (j = sr.col.start; j <= sr.col.end; j++) { w += this.getColWidth(j); if (w >= x) { colIndex = j; break; } } } } return { x : rowIndex, y : colIndex, tf : tf, lf : lf }; }, getSplitPosFromXY : function(x, y) { var ss = this.spreadsheet; var fr = ss.freezeRange; var st = ss.sview.getTop(), sl = ss.sview.getLeft(); var w = sl + this.lcWidth + this.xpaddingOffset, h = st + this.getRowHeight(0); var rh = 0, cw = 0, i, j, r = 0, c = 0; i = fr.row.start; while (h < y) { rh = h; r = i; h += this.getRowHeight(i); i++; } j = fr.col.start; while (w < x) { cw = w; c = j; w += this.getColWidth(j); j++; } cw -= sl; rh -= st; return { r : r, c : c, x : cw, y : rh }; }, checkFormulaAfterRowInserted : function(x, span) { var maxx = x + span - 1; var changed = {}; var activeSheet = this.activeSheet; for (var i = 0, len = this.sheets.length; i < len; i++) { this.activeSheet = i; this.data = this.sheets[i]; var rows = this.data.rows; for (var p in rows) { p = Number(p); var row = rows[p]; for (var q in row) { q = Number(q); var cell = row[q], data = cell.data; if (Ext.ss.common.Mask.isFormula(data)) { var posChanged = false; var formula = this.adjustFormula(p, q, cell['origin-data'], function(pos) { var sheetIndex = pos.sheetIndex; if ((false == Ext.type(sheetIndex) || -1 == sheetIndex) && i == activeSheet || sheetIndex == activeSheet) { if (x <= pos.x) { pos.x += span; pos.ex += span; posChanged = true; } else if (x <= pos.ex) { pos.ex += span; posChanged = true; } else if (x <= p) { posChanged = true; } } }, this); if (posChanged) { var origin = this.syncFormula(p, q, cell['origin-data'], function(pos) { var sheetIndex = pos.sheetIndex; if ((false == Ext.type(sheetIndex) || -1 == sheetIndex) && i == activeSheet || sheetIndex == activeSheet) { if (x <= pos.x) { pos.x += span; pos.ex += span; } else if (x <= pos.ex) { pos.ex += span; } } var sheetName = ""; if (false != Ext.type(sheetIndex) && -1 != sheetIndex) { sheetName = this.sheets[sheetIndex].name + "!"; } if (pos.x == pos.ex && pos.y == pos.ey) { if (true === pos.ab) { return sheetName + "$" + this.getLetter(pos.y) + "$" + pos.x; } else if (Ext.ss.CONST.ROW_AB == pos.ab) { return sheetName + this.getLetter(pos.y) + "$" + pos.x; } else if (Ext.ss.CONST.COL_AB == pos.ab) { return sheetName + "$" + this.getLetter(pos.y) + pos.x; } else { return sheetName + this.getLetter(pos.y) + pos.x; } } else { if (true === pos.ab) { return sheetName + "$" + this.getLetter(pos.y) + "$" + pos.x + ":$" + this .getLetter(pos.ey) + "$" + pos.ex; } else if (Ext.ss.CONST.ROW_AB == pos.ab) { return sheetName + this.getLetter(pos.y) + "$" + pos.x + ":" + this .getLetter(pos.ey) + "$" + pos.ex; } else if (Ext.ss.CONST.COL_AB == pos.ab) { return sheetName + "$" + this.getLetter(pos.y) + pos.x + ":$" + this .getLetter(pos.ey) + pos.ex; } else { return sheetName + this.getLetter(pos.y) + pos.x + ":" + this .getLetter(pos.ey) + pos.ex; } } }, this); cell['origin-data'] = origin; cell.data = formula; changed[p] = changed[p] || {}; changed[p][q] = Ext.apply({}, cell); } } } } } this.activeSheet = activeSheet; this.data = this.sheets[activeSheet]; return changed; }, checkFormulaAfterColumnInserted : function(y, span) { var changed = {}; var activeSheet = this.activeSheet; for (var i = 0, len = this.sheets.length; i < len; i++) { this.activeSheet = i; this.data = this.sheets[i]; var rows = this.data.rows; for (var p in rows) { p = Number(p); var row = rows[p]; for (var q in row) { q = Number(q); var cell = row[q], data = cell.data; if (Ext.ss.common.Mask.isFormula(data)) { var posChanged = false; var formula = this.adjustFormula(p, q, cell['origin-data'], function(pos) { var sheetIndex = pos.sheetIndex; if ((false == Ext.type(sheetIndex) || -1 == sheetIndex) && i == activeSheet || sheetIndex == activeSheet) { if (y <= pos.y) { posChanged = true; pos.y += span; pos.ey += span; } else if (y <= pos.ey) { pos.ey += span; posChanged = true; } else if (y <= q) { posChanged = true; } } }, this); if (posChanged) { var origin = this.syncFormula(p, q, cell['origin-data'], function(pos) { var sheetIndex = pos.sheetIndex; if ((false == Ext.type(sheetIndex) || -1 == sheetIndex) && i == activeSheet || sheetIndex == activeSheet) { if (y <= pos.y) { pos.y += span; pos.ey += span; } else if (y <= pos.ey) { pos.ey += span; } } var sheetName = ""; if (false != Ext.type(sheetIndex) && -1 != sheetIndex) { sheetName = this.sheets[sheetIndex].name + "!"; } if (pos.x == pos.ex && pos.y == pos.ey) { if (true === pos.ab) { return sheetName + "$" + this.getLetter(pos.y) + "$" + pos.x; } else if (Ext.ss.CONST.ROW_AB == pos.ab) { return sheetName + this.getLetter(pos.y) + "$" + pos.x; } else if (Ext.ss.CONST.COL_AB == pos.ab) { return sheetName + "$" + this.getLetter(pos.y) + pos.x; } else { return sheetName + this.getLetter(pos.y) + pos.x; } } else { if (true === pos.ab) { return sheetName + "$" + this.getLetter(pos.y) + "$" + pos.x + ":$" + this .getLetter(pos.ey) + "$" + pos.ex; } else if (Ext.ss.CONST.ROW_AB == pos.ab) { return sheetName + this.getLetter(pos.y) + "$" + pos.x + ":" + this .getLetter(pos.ey) + "$" + pos.ex; } else if (Ext.ss.CONST.COL_AB == pos.ab) { return sheetName + "$" + this.getLetter(pos.y) + pos.x + ":$" + this .getLetter(pos.ey) + pos.ex; } else { return sheetName + this.getLetter(pos.y) + pos.x + ":" + this .getLetter(pos.ey) + pos.ex; } } }, this); cell['origin-data'] = origin; cell.data = formula; changed[p] = changed[p] || {}; changed[p][q] = Ext.apply({}, cell); } } } } } this.activeSheet = activeSheet; this.data = this.sheets[activeSheet]; return changed; }, checkFormulaAfterRowDeleted : function(x, span) { var changed = {}; var ex = x + span - 1; var activeSheet = this.activeSheet; var formulaNumber = 0; for (var i = 0, len = this.sheets.length; i < len; i++) { this.activeSheet = i; this.data = this.sheets[i]; var rows = this.data.rows; for (var p in rows) { p = Number(p); var row = rows[p]; for (var q in row) { q = Number(q); var cell = row[q], data = cell.data; if (Ext.ss.common.Mask.isFormula(data)) { formulaNumber++; var posChanged = false; var formula = this.adjustFormula(p, q, cell['origin-data'], function(pos) { var sheetIndex = pos.sheetIndex; if ((false == Ext.type(sheetIndex) || -1 == sheetIndex) && i == activeSheet || sheetIndex == activeSheet) { if (x < pos.x) { if (ex < pos.x) { pos.x -= span; pos.ex -= span; } else { pos.x = x; pos.ex -= span; } posChanged = true; } else if (x <= pos.ex) { if (ex > pos.ex) { pos.ex = x - 1; } else { pos.ex -= span; } posChanged = true; } else if (x <= p) { posChanged = true; } } }, this); if (posChanged) { var origin = this.syncFormula(p, q, cell['origin-data'], function(pos) { var sheetIndex = pos.sheetIndex; if ((false == Ext.type(sheetIndex) || -1 == sheetIndex) && i == activeSheet || sheetIndex == activeSheet) { if (x < pos.x) { if (ex < pos.x) { pos.x -= span; pos.ex -= span; } else { pos.x = x; pos.ex -= span; } } else if (x <= pos.ex) { if (ex > pos.ex) { pos.ex = x - 1; } else { pos.ex -= span; } } if (pos.x > pos.ex || pos.y > pos.ey) { return "0"; } } var sheetName = ""; if (false != Ext.type(sheetIndex) && -1 != sheetIndex) { sheetName = this.sheets[sheetIndex].name + "!"; } if (pos.x == pos.ex && pos.y == pos.ey) { if (true === pos.ab) { return sheetName + "$" + this.getLetter(pos.y) + "$" + pos.x; } else if (Ext.ss.CONST.ROW_AB == pos.ab) { return sheetName + this.getLetter(pos.y) + "$" + pos.x; } else if (Ext.ss.CONST.COL_AB == pos.ab) { return sheetName + "$" + this.getLetter(pos.y) + pos.x; } else { return sheetName + this.getLetter(pos.y) + pos.x; } } else { if (true === pos.ab) { return sheetName + "$" + this.getLetter(pos.y) + "$" + pos.x + ":$" + this .getLetter(pos.ey) + "$" + pos.ex; } else if (Ext.ss.CONST.ROW_AB == pos.ab) { return sheetName + this.getLetter(pos.y) + "$" + pos.x + ":" + this .getLetter(pos.ey) + "$" + pos.ex; } else if (Ext.ss.CONST.COL_AB == pos.ab) { return sheetName + "$" + this.getLetter(pos.y) + pos.x + ":$" + this .getLetter(pos.ey) + pos.ex; } else { return sheetName + this.getLetter(pos.y) + pos.x + ":" + this .getLetter(pos.ey) + pos.ex; } } }, this); cell['origin-data'] = origin; cell.data = formula; changed[p] = changed[p] || {}; changed[p][q] = Ext.apply({}, cell); } } } } } this.activeSheet = activeSheet; this.data = this.sheets[activeSheet]; return changed; }, checkFormulaAfterColumnDeleted : function(y, span) { var changed = {}; var ey = y + span - 1; var activeSheet = this.activeSheet; for (var i = 0, len = this.sheets.length; i < len; i++) { this.activeSheet = i; this.data = this.sheets[i]; var rows = this.data.rows; for (var p in rows) { p = Number(p); var row = rows[p]; for (var q in row) { q = Number(q); var cell = row[q], data = cell.data; if (Ext.ss.common.Mask.isFormula(data)) { var posChanged = false; var formula = this.adjustFormula(p, q, cell['origin-data'], function(pos) { var sheetIndex = pos.sheetIndex; if ((false == Ext.type(sheetIndex) || -1 == sheetIndex) && i == activeSheet || sheetIndex == activeSheet) { if (y < pos.y) { if (ey < pos.y) { pos.y -= span; pos.ey -= span; } else { pos.y = y; pos.ey -= span; } posChanged = true; } else if (y <= pos.ey) { if (ey > pos.ey) { pos.ey = y - 1; } else { pos.ey -= span; } posChanged = true; } else if (y <= q) { posChanged = true; } } }, this); if (posChanged) { var origin = this.syncFormula(p, q, cell['origin-data'], function(pos) { var sheetIndex = pos.sheetIndex; if ((false == Ext.type(sheetIndex) || -1 == sheetIndex) && i == activeSheet || sheetIndex == activeSheet) { if (y < pos.y) { if (ey < pos.y) { pos.y -= span; pos.ey -= span; } else { pos.y = y; pos.ey -= span; } } else if (y <= pos.ey) { if (ey > pos.ey) { pos.ey = y - 1; } else { pos.ey -= span; } } if (pos.x > pos.ex || pos.y > pos.ey) { return "0"; } } var sheetName = ""; if (false != Ext.type(sheetIndex) && -1 != sheetIndex) { sheetName = this.sheets[sheetIndex].name + "!"; } if (pos.x == pos.ex && pos.y == pos.ey) { if (true === pos.ab) { return sheetName + "$" + this.getLetter(pos.y) + "$" + pos.x; } else if (Ext.ss.CONST.ROW_AB == pos.ab) { return sheetName + this.getLetter(pos.y) + "$" + pos.x; } else if (Ext.ss.CONST.COL_AB == pos.ab) { return sheetName + "$" + this.getLetter(pos.y) + pos.x; } else { return sheetName + this.getLetter(pos.y) + pos.x; } } else { if (true === pos.ab) { return sheetName + "$" + this.getLetter(pos.y) + "$" + pos.x + ":$" + this .getLetter(pos.ey) + "$" + pos.ex; } else if (Ext.ss.CONST.ROW_AB == pos.ab) { return sheetName + this.getLetter(pos.y) + "$" + pos.x + ":" + this .getLetter(pos.ey) + "$" + pos.ex; } else if (Ext.ss.CONST.COL_AB == pos.ab) { return sheetName + "$" + this.getLetter(pos.y) + pos.x + ":$" + this .getLetter(pos.ey) + pos.ex; } else { return sheetName + this.getLetter(pos.y) + pos.x + ":" + this .getLetter(pos.ey) + pos.ex; } } }, this); cell['origin-data'] = origin; cell.data = formula; changed[p] = changed[p] || {}; changed[p][q] = Ext.apply({}, cell); } } } } } this.activeSheet = activeSheet; this.data = this.sheets[activeSheet]; return changed; }, getWrapId : function(wrap) { return [wrap.minx, wrap.miny, wrap.maxx, wrap.maxy].join("-"); }, deleteRow : function(x, span, supressAction) { span = span || 1; var rows = this.data.rows; var rowSetting = this.data.rowSetting; var rowNum = this.getMaxRowNumber(); var og, md; var wraps = {}; for (var p in rows) { var row = rows[p]; for (var q in row) { var cell = row[q]; if (cell && cell.wrap) { var wrap = cell.wrap; var wid = this.getWrapId(wrap); if (!wraps[wid]) { wraps[wid] = wrap; } } } } var groups = {}; for (var p in rowSetting) { var rs = rowSetting[p]; if (rs && rs.group) { var group = rs.group; if (!groups[p]) { groups[p] = group; } } } var originWraps = {}, originGroups = {}, cellLookup = {}, rowSettingLookup = {}; for (var p in wraps) { var wrap = wraps[p]; if (x <= wrap.maxx) { originWraps[p] = Ext.apply({}, wrap); for (var r = wrap.minx; r <= wrap.maxx; r++) { for (var c = wrap.miny; c <= wrap.maxy; c++) { cellLookup[r + "-" + c] = { x : r, y : c }; } } } } for (var p in groups) { var group = groups[p]; if (x <= group[1]) { originGroups[p] = [].concat(group); for (var c = group[0]; c <= group[1]; c++) { rowSettingLookup[c] = true; } } } if (!supressAction) { var deletedRowSetting = {}, deletedRows = {}, formulas = {}; for (var i = 0; i < span; i++) { var r = x + i; if (rowSetting[r]) { deletedRowSetting[r] = this.deepClone(rowSetting[r]); } var row = rows[r]; deletedRows[r] = deletedRows[r] || {}; for (var c in row) { deletedRows[r][c] = this.deepClone(row[c]); } } for (var p in cellLookup) { var coo = cellLookup[p]; var r = coo.x, c = coo.y; var row = rows[r]; if (row[c]) { deletedRows[r] = deletedRows[r] || {}; deletedRows[r][c] = this.deepClone(row[c]); } } for (var p in rowSettingLookup) { if (rowSetting[p]) { deletedRowSetting[p] = this.deepClone(rowSetting[p]); } } for (var p in rows) { var row = rows[p]; for (var q in row) { var cell = row[q]; if (Ext.ss.common.Mask.isFormula(cell.data)) { formulas[p] = formulas[p] || {}; formulas[p][q] = this.deepClone(cell); } } } og = { action : "delete-row", type : "undo", rowNum : rowNum, row : x, span : span, deletedRowSetting : deletedRowSetting, deletedRows : deletedRows, formulas : formulas }; } var sx = x + span, ex = x + span - 1; for (var i = x; i < sx; i++) { delete rows[i]; delete rowSetting[i]; } for (var i = sx; i <= rowNum; i++) { if (rows[i]) { rows[i - span] = rows[i]; } else { delete rows[i - span]; } if (rowSetting[i]) { rowSetting[i - span] = rowSetting[i]; } else { delete rowSetting[i - span]; } } for (var i = rowNum - span + 1; i <= rowNum; i++) { delete rows[i]; delete rowSetting[i]; } this.data.rowNum -= span; cellLookup = {}; colSettingLookup = {}; for (var p in originWraps) { var wrap = originWraps[p]; if (!(x <= wrap.minx && ex >= wrap.maxx)) { var wrapChanged = wrap.minx <= x && x <= wrap.maxx || wrap.minx <= ex && ex <= wrap.maxx; if (ex < wrap.minx) { wrap.minx -= span; wrap.maxx -= span; } else if (x <= wrap.maxx) { if (x < wrap.minx) { wrap.minx = x; } wrap.maxx -= span; if (wrap.maxx < x - 1) { wrap.maxx = x - 1; } } for (var r = wrap.minx; r <= wrap.maxx; r++) { for (var c = wrap.miny; c <= wrap.maxy; c++) { cellLookup[r + "-" + c] = { x : r, y : c, wrapChanged : wrapChanged }; if (!rows[r]) { rows[r] = {}; } if (!rows[r][c]) { rows[r][c] = {}; } var cell = rows[r][c]; if (wrap.maxy <= wrap.miny && wrap.minx >= wrap.maxx) { delete cell.wrap; } else { cell.wrap = Ext.apply({}, wrap); } } } } } for (var p in originGroups) { var group = originGroups[p]; if (ex < group[0]) { group[0] -= span; group[1] -= span; } else if (x <= group[1]) { if (x < group[0]) { group[0] = x; } group[1] -= span; if (group[1] < x - 1) { group[1] = x - 1; } } if (group[0] >= group[1]) { delete rowSetting[group[0]].group; } for (var r = group[0]; r <= group[1]; r++) { rowSettingLookup[r] = true; } } var changedFormulas = this.checkFormulaAfterRowDeleted(x, span); delete this.formulaRelatedMap; this.onCheckFormulaFn(); if (!supressAction) { var formulas = {}; for (var p in rows) { var row = rows[p]; for (var q in row) { var cell = row[q]; if (Ext.ss.common.Mask.isFormula(cell.data)) { formulas[p] = formulas[p] || {}; formulas[p][q] = this.deepClone(cell); } } } var changedRowSetting = {}, changedRows = {}; for (var p in cellLookup) { var coo = cellLookup[p]; var r = coo.x, c = coo.y; var row = rows[r]; if (row && row[c]) { changedRows[r] = changedRows[r] || {}; changedRows[r][c] = this.deepClone(row[c]); } } for (var p in rowSettingLookup) { if (rowSetting[p]) { changedRowSetting[p] = this.deepClone(rowSetting[p]); } } md = { action : "delete-row", type : "redo", rowNum : this.data.rowNum, row : x, span : span, changedRowSetting : changedRowSetting, changedRows : changedRows, formulas : formulas }; var sm = this.spreadsheet.sm; this.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }, true); } this.put2ModifiedCache("deleteRows", { x : x, span : span }); for (var p in cellLookup) { var coo = cellLookup[p]; if (coo.wrapChanged) { var r = coo.x, c = coo.y; this.put2ModifiedCache("createUpdate", { x : r, y : c, data : this.getModifiedData(r, c) }); } } for (var p in rowSettingLookup) { this.put2ModifiedCache("createUpdate", { x : p, y : 0, data : this.getModifiedData(p, 0) }); } for (var p in changedFormulas) { var formula = changedFormulas[p]; for (var q in formula) { this.put2ModifiedCache("createUpdate", { x : p, y : q, data : this.getModifiedData(p, q) }); } } }, deleteCol : function(y, span, supressAction) { span = span || 1; span = Number(span); var rows = this.data.rows; var colSetting = this.data.colSetting; var colNum = this.getMaxColumnNumber(); var og, md; var wraps = {}; for (var p in rows) { var row = rows[p]; for (var q in row) { var cell = row[q]; if (cell && cell.wrap) { var wrap = cell.wrap; var wid = this.getWrapId(wrap); if (!wraps[wid]) { wraps[wid] = Ext.apply({}, wrap); } } } } var groups = {}; for (var p in colSetting) { var rs = colSetting[p]; if (rs && rs.group) { var group = rs.group; if (!groups[p]) { groups[p] = group; } } } var originWraps = {}, originGroups = {}, cellLookup = {}, colSettingLookup = {}; for (var p in wraps) { var wrap = wraps[p]; if (y <= wrap.maxy) { originWraps[p] = Ext.apply({}, wrap); for (var r = wrap.minx; r <= wrap.maxx; r++) { for (var c = wrap.miny; c <= wrap.maxy; c++) { cellLookup[r + "-" + c] = { x : r, y : c }; } } } } for (var p in groups) { var group = groups[p]; if (y <= group[1]) { originGroups[p] = [].concat(group); for (var c = group[0]; c <= group[1]; c++) { colSettingLookup[c] = true; } } } if (!supressAction) { var deletedColSetting = {}, deletedCols = {}, formulas = {}; for (var i = 0; i < span; i++) { var c = y + i; if (colSetting[c]) { deletedColSetting[c] = this.deepClone(colSetting[c]); } for (var p in rows) { p = Number(p); if (0 !== p) { var row = rows[p]; if (row[c]) { deletedCols[p] = deletedCols[p] || {}; deletedCols[p][c] = this.deepClone(row[c]); } } } } for (var p in cellLookup) { var coo = cellLookup[p]; var r = coo.x, c = coo.y; var row = rows[r]; if (row[c]) { deletedCols[r] = deletedCols[r] || {}; deletedCols[r][c] = this.deepClone(row[c]); } } for (var p in colSettingLookup) { if (colSetting[p]) { deletedColSetting[p] = this.deepClone(colSetting[p]); } } for (var p in rows) { var row = rows[p]; for (var q in row) { var cell = row[q]; if (cell && Ext.ss.common.Mask.isFormula(cell.data)) { formulas[p] = formulas[p] || {}; formulas[p][q] = this.deepClone(cell); } } } og = { action : "delete-col", type : "undo", colNum : colNum, col : y, span : span, deletedColSetting : deletedColSetting, deletedCols : deletedCols, formulas : formulas }; } var sy = y + span, ey = y + span - 1; for (var p in rows) { if (0 == p) { continue; } var row = rows[p]; if (row) { for (var j = y; j < sy; j++) { delete row[j]; } for (var j = sy; j <= colNum; j++) { if (row[j]) { row[j - span] = row[j]; } else { delete row[j - span]; } } for (var j = colNum - span + 1; j <= colNum; j++) { delete row[j]; } } } for (var j = y; j < sy; j++) { delete colSetting[j]; } for (var j = sy; j <= colNum; j++) { if (colSetting[j]) { colSetting[j - span] = colSetting[j]; } else { delete colSetting[j - span]; } } for (var j = colNum - span + 1; j <= colNum; j++) { delete colSetting[j]; } this.data.colNum -= span; cellLookup = {}; colSettingLookup = {}; for (var p in originWraps) { var wrap = originWraps[p]; if (!(wrap.miny >= y && ey >= wrap.maxy)) { var wrapChanged = wrap.miny <= y && y <= wrap.maxy || wrap.miny <= ey && ey <= wrap.maxy; if (ey < wrap.miny) { wrap.miny -= span; wrap.maxy -= span; } else if (y <= wrap.maxy) { if (y < wrap.miny) { wrap.miny = y; } wrap.maxy -= span; if (wrap.maxy < y - 1) { wrap.maxy = y - 1; } } for (var r = wrap.minx; r <= wrap.maxx; r++) { for (var c = wrap.miny; c <= wrap.maxy; c++) { cellLookup[r + "-" + c] = { x : r, y : c, wrapChanged : wrapChanged }; if (!rows[r]) { rows[r] = {}; } if (!rows[r][c]) { rows[r][c] = {}; } var cell = rows[r][c]; if (wrap.maxy <= wrap.miny && wrap.minx >= wrap.maxx) { delete cell.wrap; } else { cell.wrap = Ext.apply({}, wrap); } } } } } for (var p in originGroups) { var group = originGroups[p]; if (!(group[0] >= y && ey >= group[1])) { if (ey < group[0]) { group[0] -= span; group[1] -= span; } else if (y <= group[1]) { if (y < group[0]) { group[0] = y; } group[1] -= span; if (group[1] < y - 1) { group[1] = y - 1; } } if (group[0] >= group[1]) { delete colSetting[group[0]].group; } for (var c = group[0]; c <= group[1]; c++) { colSettingLookup[c] = true; } } } var changedFormulas = this.checkFormulaAfterColumnDeleted(y, span); delete this.formulaRelatedMap; this.onCheckFormulaFn(); if (!supressAction) { var formulas = {}; for (var p in rows) { var row = rows[p]; for (var q in row) { var cell = row[q]; if (Ext.ss.common.Mask.isFormula(cell.data)) { formulas[p] = formulas[p] || {}; formulas[p][q] = this.deepClone(cell); } } } var changedColSetting = {}, changedCols = {}; for (var p in cellLookup) { var coo = cellLookup[p]; var r = coo.x, c = coo.y; var row = rows[r]; if (row[c]) { changedCols[r] = changedCols[r] || {}; changedCols[r][c] = this.deepClone(row[c]); } } for (var p in colSettingLookup) { if (colSetting[p]) { changedColSetting[p] = this.deepClone(colSetting[p]); } } md = { action : "delete-col", type : "redo", colNum : this.data.colNum, col : y, span : span, changedColSetting : changedColSetting, changedCols : changedCols, formulas : formulas }; var sm = this.spreadsheet.sm; this.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }, true); } this.put2ModifiedCache("deleteCols", { y : y, span : span }); for (var p in cellLookup) { var coo = cellLookup[p]; if (coo.wrapChanged) { var r = coo.x, c = coo.y; this.put2ModifiedCache("createUpdate", { x : r, y : c, data : this.getModifiedData(r, c) }); } } for (var p in colSettingLookup) { this.put2ModifiedCache("createUpdate", { x : 0, y : p, data : this.getModifiedData(0, p) }); } for (var p in changedFormulas) { var formula = changedFormulas[p]; for (var q in formula) { this.put2ModifiedCache("createUpdate", { x : p, y : q, data : this.getModifiedData(p, q) }); } } }, insertCol : function(y, flag, supressAction) { var ry = y; if ("before" != flag) { ry++; } var rows = this.data.rows; var colSetting = this.data.colSetting; var colNum = this.getMaxColumnNumber(); var og, md; var wraps = {}; for (var p in rows) { var row = rows[p]; for (var q in row) { var cell = row[q]; if (cell && cell.wrap) { var wrap = cell.wrap; var wid = this.getWrapId(wrap); if (!wraps[wid]) { wraps[wid] = wrap; } } } } var groups = {}; for (var p in colSetting) { var rs = colSetting[p]; if (rs && rs.group) { var group = rs.group; if (!groups[p]) { groups[p] = group; } } } var originWraps = {}, originGroups = {}, cellLookup = {}, colSettingLookup = {}; for (var p in wraps) { var wrap = wraps[p]; if (ry <= wrap.maxy) { originWraps[p] = Ext.apply({}, wrap); for (var r = wrap.minx; r <= wrap.maxx; r++) { for (var c = wrap.miny; c <= wrap.maxy; c++) { cellLookup[r + "-" + c] = { x : r, y : c }; } } } } for (var p in groups) { var group = groups[p]; if (group[1] >= ry) { originGroups[p] = [].concat(group); for (var c = group[0]; c <= group[1]; c++) { colSettingLookup[c] = true; } } } if (!supressAction) { var formulas = {}; for (var p in rows) { var row = rows[p]; for (var q in row) { var cell = row[q]; if (Ext.ss.common.Mask.isFormula(cell.data)) { formulas[p] = formulas[p] || {}; formulas[p][q] = this.deepClone(cell); } } } var changedCols = {}, changedColSetting = {}; for (var p in cellLookup) { var coo = cellLookup[p]; var r = coo.x, c = coo.y; var row = rows[r]; if (row[c]) { changedCols[r] = changedCols[r] || {}; changedCols[r][c] = this.deepClone(row[c]); } } for (var p in colSettingLookup) { if (colSetting[p]) { changedColSetting[p] = this.deepClone(colSetting[p]); } } og = { action : "insert-col", type : "undo", colNum : colNum, col : y, flag : flag, formulas : formulas, changedCols : changedCols, changedColSetting : changedColSetting }; } cellLookup = {}; colSettingLookup = {}; for (var p in originWraps) { var wrap = originWraps[p]; var wrapChanged = wrap.miny < ry && ry <= wrap.maxy; if (ry <= wrap.miny) { wrap.miny += 1; } if (wrap.maxy >= ry) { wrap.maxy += 1; } for (var r = wrap.minx; r <= wrap.maxx; r++) { for (var c = wrap.miny; c <= wrap.maxy; c++) { cellLookup[r + "-" + c] = { x : r, y : c, wrapChanged : wrapChanged }; } } } for (var p in originGroups) { var group = originGroups[p]; if (ry <= group[0]) { group[0] += 1; } if (ry <= group[1]) { group[1] += 1; } for (var c = group[0]; c <= group[1]; c++) { colSettingLookup[c] = true; } } for (var p in rows) { if (0 == p) { continue; } var row = rows[p]; if (row) { for (var j = colNum; j >= ry; j--) { if (row[j]) { row[j + 1] = row[j]; } else { delete row[j + 1]; } } delete row[ry]; if (!supressAction) { var obj = {}, cell = row[ry - 1]; if (cell && cell.wrap && cell.wrap.maxy >= ry) { obj.wrap = Ext.apply({}, cell.wrap); } row[ry] = obj; } } } for (var j = colNum; j >= ry; j--) { if (colSetting[j]) { colSetting[j + 1] = colSetting[j]; } else { delete colSetting[j + 1]; } } delete colSetting[ry]; if (!supressAction) { var obj = {}, cs = colSetting[ry - 1]; if (cs && cs.group && cs.group[1] >= ry) { obj.group = [].concat(cs.group); } colSetting[ry] = obj; } this.data.colNum++; var changedFormulas = this.checkFormulaAfterColumnInserted(ry, 1); delete this.formulaRelatedMap; this.onCheckFormulaFn(); if (!supressAction) { var formulas = {}; for (var p in rows) { var row = rows[p]; for (var q in row) { var cell = row[q]; if (Ext.ss.common.Mask.isFormula(cell.data)) { formulas[p] = formulas[p] || {}; formulas[p][q] = Ext.apply({}, cell); } } } var changedCols = {}, changedColSetting = {}; for (var p in cellLookup) { var coo = cellLookup[p]; var r = coo.x, c = coo.y; var row = rows[r]; if (row[c]) { changedCols[r] = changedCols[r] || {}; changedCols[r][c] = this.deepClone(row[c]); } } for (var p in colSettingLookup) { if (colSetting[p]) { changedColSetting[p] = this.deepClone(colSetting[p]); } } md = { action : "insert-col", type : "redo", colNum : colNum, col : y, flag : flag, formulas : formulas, changedColSetting : changedColSetting, changedCols : changedCols }; var sm = this.spreadsheet.sm; this.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }, true); } this.put2ModifiedCache("insertColumnAt", { y : ry }); for (var p in cellLookup) { var coo = cellLookup[p]; if (coo.wrapChanged) { var r = coo.x, c = coo.y; this.put2ModifiedCache("createUpdate", { x : r, y : c, data : this.getModifiedData(r, c) }); } } for (var p in colSettingLookup) { this.put2ModifiedCache("createUpdate", { x : 0, y : p, data : this.getModifiedData(0, p) }); } for (var p in changedFormulas) { var formula = changedFormulas[p]; for (var q in formula) { this.put2ModifiedCache("createUpdate", { x : p, y : q, data : this.getModifiedData(p, q) }); } } }, getMaxRowNumber : function(sheetIndex) { if (false == Ext.type(sheetIndex)) { sheetIndex = this.activeSheet; } var data = this.sheets[sheetIndex]; var rows = data.rows; var rowNum = 0; for (var p in rows) { p = Number(p); if (p > rowNum) { rowNum = p; } } data.rowNum = rowNum; return rowNum; }, getMaxColumnNumber : function(sheetIndex) { if (false == Ext.type(sheetIndex)) { sheetIndex = this.activeSheet; } var data = this.sheets[sheetIndex]; var rows = data.rows; var colNum = 0; for (var p in rows) { p = Number(p); var row = rows[p]; for (var q in row) { q = Number(q); if (q > colNum) { colNum = q; } } } data.colNum = colNum; return colNum; }, insertRow : function(x, flag, supressAction) { var rx = x; if ("above" != flag) { rx++; } var rows = this.data.rows; var rowSetting = this.data.rowSetting; var rowNum = this.getMaxRowNumber(); var og, md; var wraps = {}; for (var q in rows) { var row = rows[q]; for (var p in row) { var cell = row[p]; if (cell.wrap) { var wrap = cell.wrap; var wid = this.getWrapId(wrap); if (!wraps[wid]) { wraps[wid] = wrap; } } } } var groups = {}; for (var p in rowSetting) { var rs = rowSetting[p]; if (rs && rs.group) { var group = rs.group; if (!groups[p]) { groups[p] = group; } } } var originWraps = {}, originGroups = {}, cellLookup = {}, rowSettingLookup = {}; for (var p in wraps) { var wrap = wraps[p]; if (rx <= wrap.maxx) { originWraps[p] = Ext.apply({}, wrap); for (var r = wrap.minx; r <= wrap.maxx; r++) { for (var c = wrap.miny; c <= wrap.maxy; c++) { cellLookup[r + "-" + c] = { x : r, y : c }; } } } } for (var p in groups) { var group = groups[p]; if (group[1] >= rx) { originGroups[p] = [].concat(group); for (var c = group[0]; c <= group[1]; c++) { rowSettingLookup[c] = true; } } } if (!supressAction) { var formulas = {}; for (var p in rows) { var row = rows[p]; for (var q in row) { var cell = row[q]; if (Ext.ss.common.Mask.isFormula(cell.data)) { formulas[p] = formulas[p] || {}; formulas[p][q] = this.deepClone(cell); } } } var changedRows = {}, changedRowSetting = {}; for (var p in cellLookup) { var coo = cellLookup[p]; var r = coo.x, c = coo.y; var row = rows[r]; if (row[c]) { changedRows[r] = changedRows[r] || {}; changedRows[r][c] = this.deepClone(row[c]); } } for (var p in rowSettingLookup) { if (rowSetting[p]) { changedRowSetting[p] = this.deepClone(rowSetting[p]); } } og = { action : "insert-row", type : "undo", rowNum : rowNum, row : x, flag : flag, formulas : formulas, changedRows : changedRows, changedRowSetting : changedRowSetting }; } cellLookup = {}; rowSettingLookup = {}; for (var p in originWraps) { var wrap = originWraps[p]; var wrapChanged = wrap.minx < rx && rx <= wrap.maxx; if (rx <= wrap.minx) { wrap.minx += 1; } if (wrap.maxx >= rx) { wrap.maxx += 1; } for (var r = wrap.minx; r <= wrap.maxx; r++) { for (var c = wrap.miny; c <= wrap.maxy; c++) { cellLookup[r + "-" + c] = { x : r, y : c, wrapChanged : wrapChanged }; } } } for (var p in originGroups) { var group = originGroups[p]; if (rx <= group[0]) { group[0] += 1; } if (rx <= group[1]) { group[1] += 1; } for (var c = group[0]; c <= group[1]; c++) { rowSettingLookup[c] = true; } } for (var i = rowNum; i >= rx; i--) { if (rows[i]) { rows[i + 1] = rows[i]; } else { delete rows[i + 1]; } if (rowSetting[i]) { rowSetting[i + 1] = rowSetting[i]; } else { delete rowSetting[i + 1]; } } delete rowSetting[rx]; delete rows[rx]; if (!supressAction) { var obj = {}, rs = rowSetting[rx - 1]; if (rs && rs.group && rs.group[1] >= rx) { obj.group = [].concat(rs.group); } rowSetting[rx] = obj; obj = {}; var row = rows[rx - 1]; if (row) { for (var c in row) { var cell = row[c]; if (cell && cell.wrap && cell.wrap.maxx >= rx) { obj[c] = { wrap : Ext.apply({}, wrap) }; } } rows[rx] = obj; } } this.data.rowNum++; var changedFormulas = this.checkFormulaAfterRowInserted(x, 1); delete this.formulaRelatedMap; this.onCheckFormulaFn(); if (!supressAction) { var formulas = {}; for (var p in rows) { var row = rows[p]; for (var q in row) { var cell = row[q]; if (Ext.ss.common.Mask.isFormula(cell.data)) { formulas[p] = formulas[p] || {}; formulas[p][q] = this.deepClone(cell); } } } var changedRows = {}, changedRowSetting = {}; for (var p in cellLookup) { var coo = cellLookup[p]; var r = coo.x, c = coo.y; var row = rows[r]; if (row[c]) { changedRows[r] = changedRows[r] || {}; changedRows[r][c] = this.deepClone(row[c]); } } for (var p in rowSettingLookup) { if (rowSetting[p]) { changedRowSetting[p] = this.deepClone(rowSetting[p]); } } md = { action : "insert-row", type : "redo", rowNum : rowNum, row : x, flag : flag, formulas : formulas, changedRows : changedRows, changedRowSetting : changedRowSetting }; var sm = this.spreadsheet.sm; this.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }, true); } this.put2ModifiedCache("insertRowAt", { x : rx }); for (var p in cellLookup) { var coo = cellLookup[p]; if (coo.wrapChanged) { var r = coo.x, c = coo.y; this.put2ModifiedCache("createUpdate", { x : r, y : c, data : this.getModifiedData(r, c) }); } } for (var p in rowSettingLookup) { this.put2ModifiedCache("createUpdate", { x : p, y : 0, data : this.getModifiedData(p, 0) }); } for (var p in changedFormulas) { var formula = changedFormulas[p]; for (var q in formula) { this.put2ModifiedCache("createUpdate", { x : p, y : q, data : this.getModifiedData(p, q) }); } } }, checkBorder : function(minx, miny, maxx, maxy) { var x = minx - 1, y = miny - 1; var t = this.getCell(x, miny), l = this.getCell(minx, y); if ("x-spreadsheet-bottom-black" == t.bb && "x-spreadsheet-right-black" == l.br) { return true; } else { return false; } }, isWraped : function(x, y) { var row = this.data.rows[x]; if (row) { var cell = row[y]; if (cell && cell.wrap) { return true; } } return false; }, cancelWraped : function(x, y, stopEvent) { var rows = this.data.rows; var wrap = rows[x][y].wrap; var minx = wrap.minx, miny = wrap.miny, maxx = wrap.maxx, maxy = wrap.maxy; for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= maxy; j++) { if (stopEvent) { var cell = rows[i][j]; delete cell.wrap; } else { this.fireEvent("attributechange", i, j, [["wrap", null]]); } } } }, getCellSize : function(x, y) { var minx = x, maxx = x, miny = y, maxy = y; var row = this.data.rows[x]; if (row) { var cell = row[y]; if (cell && cell.wrap) { minx = cell.wrap.minx; miny = cell.wrap.miny; maxx = cell.wrap.maxx; maxy = cell.wrap.maxy; } } var w = this.getSpanWidth(miny, maxy); var h = this.getSpanHeight(minx, maxx); return [w, h]; }, getWrapCellInCol : function(col) { var wraps = {}; var rows = this.data.rows; for (var p in rows) { var cell = rows[p][col]; if (cell && cell.wrap) { var w = cell.wrap; wraps[w.minx + "-" + w.miny + "-" + w.maxx + "-" + w.maxy] = w; } } return wraps; }, getWrapCellInRow : function(row) { var wraps = {}; row = this.data.rows[row]; for (var p in row) { var cell = row[p]; if (cell && cell.wrap) { var w = cell.wrap; wraps[w.minx + "-" + w.miny + "-" + w.maxx + "-" + w.maxy] = w; } } return wraps; }, getRowIndexFromTop : function(top) { var ss = this.spreadsheet; var t = 0; for (var i = 1; i <= ss.lastPosy; i++) { t += this.getHeight(i, i); if (t >= top) { return i; } } return ss.lastPosy; }, getColIndexFromLeft : function(left) { var ss = this.spreadsheet; var l = 0; for (var i = 1; i <= ss.lastPosx; i++) { l += this.getWidth(i, i); if (l >= left) { return i; } } return ss.lastPosx; }, copyCell : function(pos, obj) { var x = pos.x, y = pos.y; var rows = this.data.rows; rows[x] = rows[x] || {}; rows[x][y] = Ext.apply({}, obj); this.setCellData(x, y, rows[x][y].data, true); }, copyRowSetting : function(x, obj) { var rs = this.data.rowSetting; rs[x] = Ext.apply({}, obj); }, copyColSetting : function(y, obj) { var cs = this.data.colSetting; cs[y] = Ext.apply({}, obj); }, findVisiableCell : function(x, y, direct, flag) { var cs = this.data.colSetting, rs = this.data.rowSetting; var i, j, r, c; if ("col" == direct) { if ("left" == flag) { for (j = y; j >= 0; j--) { c = cs[j]; if (!c || "none" != c.display) { break; } } if (0 > j) { j = y; } } else { for (j = y;; j++) { c = cs[j]; if (!c || "none" != c.display) { break; } } } return { x : x, y : j }; } else if ("row" == direct) { if ("up" == flag) { for (i = x; i >= 0; i--) { r = rs[i]; if (!r || "none" != r.display) { break; } } if (0 > i) { i = x; } } else { for (i = x;; i++) { r = rs[i]; if (!r || "none" != r.display) { break; } } } return { x : i, y : y }; } else { i = x; j = y; var count = 0; while (count < 2) { count = 0; r = rs[i]; c = cs[j]; if (r && "none" == r.display) { i++; } else { count++; } if (c && "none" == c.display) { j++; } else { count++; } } return { x : i, y : j }; } }, addSheet : function(name, index, callback, scope) { var ss = this.spreadsheet; if (ss.isReadOnly()) { Ext.Msg.alert(feyaSoft.lang.common.error, feyaSoft.ss.lang.noPermissionAction); return; } this.saveActiveSheet(null, function() { var sheets = this.sheets; this.addHStack(index); for (var j = this.sheets.length - 1; j >= index; j--) { sheets[j + 1] = sheets[j]; } j++; sheets[j] = this.generateData(name); this.createNewTab(name, index + 1, function(tabId) { sheets[j].tabId = tabId; sheets[j].name = name; delete sheets[j].loaded; this.setActiveSheet(j); this.readActiveSheet(callback, scope); }, this); }, this); }, renameSheet : function(name, index) { var ss = this.spreadsheet; if (ss.isReadOnly()) { Ext.Msg.alert(feyaSoft.lang.common.error, feyaSoft.ss.lang.noPermissionAction); return; } var oldName = this.sheets[index].name; this.sheets[index].name = name; var tabId = this.sheets[index].tabId; if (false !== Ext.type(tabId)) { this.renameTab(tabId, name, oldName); } }, renameTab : function(tabId, name, oldName, callback, scope) { if (this.disableCallingBackEnd) { this.changeFormulaAfterRenameTab(tabId, name, oldName); if (callback) { callback.call(scope); } } else { Ext.Ajax.request({ timeout : 300000, url : this.renameTabUrl, params : { name : name, tabId : tabId }, success : function(response, opts) { var json = Ext.decode(response.responseText); if ("true" == json.success) { this.changeFormulaAfterRenameTab(tabId, name, oldName); if (callback) { callback.call(scope); } } else { var lanCom = feyaSoft.lang.common; Ext.Msg.alert(lanCom.error, json.info); } }, failure : function(response, opts) { var lanCom = feyaSoft.lang.common; Ext.Msg.alert(lanCom.error, "Server-side failure with status code " + response.status); }, scope : this }); } }, changeFormulaAfterRenameTab : function(tabId, name, oldName) { var sheets = this.sheets; oldName = oldName.trim(); var exp = "\"" + oldName + "\"!"; exp = Ext.escapeRe(exp); exp = "(" + exp + ")"; var exp1 = "'" + oldName + "'!"; exp1 = Ext.escapeRe(exp1); exp = exp + "|" + exp1; var exp2 = oldName + "!"; exp2 = Ext.escapeRe(exp2); exp = exp + "|" + exp2; var reg = new RegExp(exp, "gi"); for (var i = 0, len = sheets.length; i < len; i++) { var sheet = sheets[i]; var rows = sheet.rows; for (var r in rows) { var row = rows[r]; for (var c in row) { var cell = row[c]; if (cell && Ext.ss.common.Mask.isFormula(cell.data)) { var origin = cell['origin-data']; if (origin) { var target = origin.replace(reg, function(w) { var pos = arguments[arguments.length - 2]; var pre = origin[pos - 1]; if (/[\+\-\*\/\%\(\[\{\,\s\=]/gi .test(pre)) { return "\"" + name + "\"!"; } return w; }); cell['origin-data'] = target; this.put2ModifiedCache("createUpdate", { tabId : sheet.tabId, x : r, y : c, data : Ext.encode(cell) }); } } } } } }, createNewTab : function(name, index, callback, scope) { if (this.disableCallingBackEnd) { var tabId = this.getNewTabId(); if (callback) { callback.call(scope, tabId); } } else { Ext.Ajax.request({ timeout : 300000, url : this.newTabUrl, params : { name : name, documentId : this.getFileId(), position : index }, success : function(response, opts) { var json = Ext.decode(response.responseText); if ("true" == json.success) { if (callback) { callback.call(scope, json.tabId); } } else { var lanCom = feyaSoft.lang.common; Ext.Msg.alert(lanCom.error, json.info); } }, failure : function(response, opts) { var lanCom = feyaSoft.lang.common; Ext.Msg.alert(lanCom.error, "Server-side failure with status code " + response.status); }, scope : this }); } }, deleteSheet : function(index, callback, scope) { var ss = this.spreadsheet; if (ss.isReadOnly()) { Ext.Msg.alert(feyaSoft.lang.common.error, feyaSoft.ss.lang.noPermissionAction); return; } var sheets = this.sheets; var tabId = sheets[index].tabId; var flag = false; var fn = function() { this.deleteHStack(index); for (var i = index + 1, len = sheets.length; i < len; i++) { sheets[i - 1] = sheets[i]; } sheets.pop(); this.deleteTab(tabId, sheets[this.activeSheet].tabId); if (flag) { this.readActiveSheet(callback, scope); } else if (callback) { callback.call(scope); } }; if (this.activeSheet == index) { flag = true; var i = 0 < this.activeSheet ? this.activeSheet - 1 : 0; this.setActiveSheet(i); fn.call(this); } else { this.saveActiveSheet(null, function() { if (index < this.activeSheet) { flag = true; this.setActiveSheet(this.activeSheet - 1); } fn.call(this); }, this); } }, deleteTab : function(tabId, activeTabId, callback, scope) { var ss = this.spreadsheet; if (ss.isReadOnly()) { this.resetModifiedCache(); if (callback) { callback.call(scope); } return; } if (this.disableCallingBackEnd) { if (callback) { callback.call(scope); } } else { Ext.Ajax.request({ timeout : 300000, url : this.deleteTabUrl, params : { delTabId : tabId, activeTabId : activeTabId }, success : function(response, opts) { var json = Ext.decode(response.responseText); if ("true" == json.success) { if (callback) { callback.call(scope); } } else { var lanCom = feyaSoft.lang.common; Ext.Msg.alert(lanCom.error, json.info); } }, failure : function(response, opts) { var lanCom = feyaSoft.lang.common; Ext.Msg.alert(lanCom.error, "Server-side failure with status code " + response.status); }, scope : this }); } }, deepClone : function(o, expt) { var obj; var type = Ext.type(o); if ("array" == type) { obj = []; for (var i = 0, len = o.length; i < len; i++) { obj.push(this.deepClone(o[i], expt)); } } else if ("object" == type) { obj = {}; for (var p in o) { if (expt) { if (!expt[p]) { obj[p] = this.deepClone(o[p], expt); } } else { obj[p] = this.deepClone(o[p], expt); } } } else { obj = o; } return obj; }, copySheet : function(name, index, oindex, callback, scope) { var ss = this.spreadsheet; if (ss.isReadOnly()) { Ext.Msg.alert(feyaSoft.lang.common.error, feyaSoft.ss.lang.noPermissionAction); return; } ss.maskUI(feyaSoft.ss.lang.copySheet); this.saveActiveSheet(null, function() { var sheets = this.sheets; var tabId = sheets[oindex].tabId; var obj = this.deepClone(sheets[oindex], { chartSet : true }); this.addHStack(index); for (var j = this.sheets.length - 1; j >= index; j--) { sheets[j + 1] = sheets[j]; } j++; sheets[j] = obj; sheets[j].name = name; if (false !== Ext.type(tabId)) { this.copyPasteTab(tabId, index, name, function(newTabId) { sheets[j].tabId = newTabId; this.setActiveSheet(j); this.readActiveSheet(callback, scope); ss.unmaskUI(); }, this); } else { this.setActiveSheet(j); this.readActiveSheet(); ss.unmaskUI(); } }, this); }, getNewTabId : function() { return (new Date).format("YmdHis") + Ext.id(); }, copyPasteTab : function(tabId, index, name, callback, scope) { if (this.disableCallingBackEnd) { if (callback) { callback.call(scope, this.getNewTabId()); } } else { Ext.Ajax.request({ timeout : 300000, url : this.copyTabUrl, params : { tabId : tabId, position : index + 1, name : name }, success : function(response, opts) { var json = Ext.decode(response.responseText); if ("true" == json.success) { if (callback) { callback.call(scope, json.tabId); } } else { var lanCom = feyaSoft.lang.common; Ext.Msg.alert(lanCom.error, json.info); } }, failure : function(response, opts) { var lanCom = feyaSoft.lang.common; Ext.Msg.alert(lanCom.error, "Server-side failure with status code " + response.status); }, scope : this }); } }, moveSheet : function(oindex, tindex) { var ss = this.spreadsheet; if (ss.isReadOnly()) { Ext.Msg.alert(feyaSoft.lang.common.error, feyaSoft.ss.lang.noPermissionAction); return; } var hs = []; var arr = []; var sheets = this.sheets; this.changeTabOrder(sheets[oindex].tabId, oindex < tindex ? tindex - 1 : tindex); var hStack = this.hStack; if (oindex > tindex) { for (var i = 0; i < tindex; i++) { arr.push(sheets[i]); hs.push(hStack[i]); } arr.push(sheets[oindex]); hs.push(hStack[oindex]); for (var i = tindex; i < oindex; i++) { arr.push(sheets[i]); hs.push(hStack[i]); } for (var i = oindex + 1, len = sheets.length; i < len; i++) { arr.push(sheets[i]); hs.push(hStack[i]); } if (tindex <= this.activeSheet && this.activeSheet <= oindex) { if (this.activeSheet == oindex) { this.setActiveSheet(tindex); } else { this.setActiveSheet(this.activeSheet + 1); } } } else { for (var i = 0; i < oindex; i++) { arr.push(sheets[i]); hs.push(hStack[i]); } var len = sheets.length; tindex--; for (var i = oindex + 1; i <= tindex; i++) { arr.push(sheets[i]); hs.push(hStack[i]); } arr.push(sheets[oindex]); hs.push(hStack[oindex]); for (var i = tindex + 1; i < len; i++) { arr.push(sheets[i]); hs.push(hStack[i]); } if (oindex <= this.activeSheet && this.activeSheet <= tindex) { if (this.activeSheet == oindex) { this.setActiveSheet(tindex); } else { this.setActiveSheet(this.activeSheet - 1); } } } this.hStack = hs; this.sheets = arr; }, changeTabOrder : function(tabId, index, callback, scope) { var ss = this.spreadsheet; if (ss.isReadOnly()) { this.resetModifiedCache(); if (callback) { callback.call(scope); } return; } var params = { tabId : tabId, position : index + 1 }; Ext.Ajax.request({ timeout : 300000, url : this.reorderUrl, params : params, success : function(response, opts) { var json = Ext.decode(response.responseText); if ("true" == json.success) { if (callback) { callback.call(scope); } } else { var lanCom = feyaSoft.lang.common; Ext.Msg.alert(lanCom.error, json.info); } }, failure : function(response, opts) { var lanCom = feyaSoft.lang.common; Ext.Msg.alert(lanCom.error, "Server-side failure with status code " + response.status); }, scope : this }); }, setActiveSheet : function(index, reset) { if (reset) { delete this.lastActiveSheet; } else { this.lastActiveSheet = this.activeSheet; } this.activeSheet = index; this.fireEvent("hstackchange", this.getActiveHStack()); }, copyCell2Cell : function(ox, oy, tx, ty) { var rows = this.data.rows; var row = rows[ox]; if (row) { var cell = row[oy]; this.copyCell({ x : tx, y : ty }, cell); } }, copyRow2Row : function(ox, tx, autoConfig) { var autoFlag, rows = this.data.rows, rs = this.data.rowSetting; if (autoConfig) { autoFlag = autoConfig.flag; rows = autoConfig.selectedData.data; rs = autoConfig.selectedData.rowSetting; } var row = rows[ox]; if (row) { for (var p in row) { if (0 != p) { var obj = Ext.apply({}, this.getOrignCellObj(ox, p, rows)); if ("style" == autoFlag) { var origin = Ext.apply({}, this.getOrignCellObj(tx, p, rows)); if (origin) { obj.data = origin.data; obj['origin-data'] = origin['origin-data']; } else { delete obj.data; delete obj['origin-data']; } } else if ("content" == autoFlag) { var textalign = Ext.ss.common.Mask.isNumber(obj.data) ? "text-align:right;" : "text-align:left;"; obj = { 'text-align' : textalign, 'origin-data' : obj['origin-data'], data : obj.data }; } if ("copy" != autoFlag && "style" != autoFlag) { var data = Ext.num(obj.data, obj.data); var r = this.contentRule[p]; if (Ext.isNumber(data)) { var dn = 0; var tmp = r.last.toString(); if (tmp) { var parts = tmp.split("."); if (2 == parts.length) { if (dn < parts[1].length) { dn = parts[1].length; } } } obj.data = this.formatFloat(r.last + r.inc * (tx - r.lindex), dn); } else if (data) { data = data.toString(); if ("week" == r.type) { obj.data = this.loopWeek(data, ox, r); } else if ("month" == r.type) { obj.data = this.loopMonth(data, ox, r); } else if ("date" == r.type) { obj.data = this.loopDate(data, ox, r); } } } if (Ext.ss.common.Mask.isFormula(obj.data)) { var originStr = this.refreshOriginFormula( obj['origin-data'], tx - ox, 0); obj.data = this.adjustFormula(tx, p, originStr); obj['origin-data'] = originStr; } if (obj.wrap) { var wrap = Ext.apply({}, obj.wrap); wrap.minx = wrap.minx - ox + tx; wrap.maxx = wrap.maxx - ox + tx; obj.wrap = wrap; } this.fireEvent("cellchange", tx, p, obj); } } } if ("content" !== autoFlag) { var r = rs[ox]; this.fireEvent("rowchange", tx, r); } else { var r = rs[tx]; this.fireEvent("rowchange", tx, r); } }, copyCol2Col : function(oy, ty, autoConfig) { var autoFlag, rows = this.data.rows, cs = this.data.colSetting; if (autoConfig) { autoFlag = autoConfig.flag; rows = autoConfig.selectedData.data; cs = autoConfig.selectedData.colSetting; } for (var p in rows) { if (0 != p) { var row = rows[p]; if (row) { var obj = Ext.apply({}, this.getOrignCellObj(p, oy, rows)); if ("style" == autoFlag) { var origin = Ext.apply({}, this.getOrignCellObj(p, ty, rows)); if (origin) { obj.data = origin.data; obj['origin-data'] = origin['origin-data']; } else { delete obj.data; delete obj['origin-data']; } } else if ("content" == autoFlag) { var textalign = Ext.ss.common.Mask.isNumber(obj.data) ? "text-align:right;" : "text-align:left;"; obj = { 'text-align' : textalign, 'origin-data' : obj['origin-data'], data : obj.data }; } if (Ext.ss.common.Mask.isFormula(obj.data)) { var originStr = this.refreshOriginFormula( obj['origin-data'], 0, ty - oy); obj.data = this.adjustFormula(p, ty, originStr); obj['origin-data'] = originStr; } if (obj.wrap) { var wrap = Ext.apply({}, obj.wrap); wrap.miny = wrap.miny - oy + ty; wrap.maxy = wrap.maxy - oy + ty; obj.wrap = wrap; } this.fireEvent("cellchange", p, ty, obj); } } } if ("content" !== autoFlag) { var c = cs[oy]; this.fireEvent("colchange", ty, c); } else { var c = cs[ty]; this.fireEvent("colchange", ty, c); } }, autoCalculateRow : function(minx, maxx, x, autoFlag) { var len = maxx - minx + 1; var offset, i; if (x > maxx) { offset = x - maxx - 1; i = offset % len + minx; } else { offset = minx - x - 1; i = maxx - offset % len; } this.copyRow2Row(i, x, autoFlag); }, autoCalculateCol : function(miny, maxy, y, autoFlag) { var len = maxy - miny + 1; var offset, j; if (y > maxy) { offset = y - maxy - 1; j = offset % len + miny; } else { offset = miny - y - 1; j = maxy - offset % len; } this.copyCol2Col(j, y, autoFlag); }, autoCalculateCellByRow : function(minx, maxx, col, x, autoConfig, miny) { var len = maxx - minx + 1; var offset, i; if (x > maxx) { offset = x - maxx - 1; i = offset % len + minx; } else { offset = minx - x - 1; i = maxx - offset % len; } var autoFlag, rows; if (autoConfig) { autoFlag = autoConfig.flag; rows = autoConfig.selectedData.data; } var obj = Ext.apply({}, this.getOrignCellObj(i, col, rows)); if ("style" == autoFlag) { var origin = this.getOrignCellObj(x, col, rows) || {}; obj.data = origin.data; obj['origin-data'] = origin['origin-data']; } else if ("copy" != autoFlag) { var data = Ext.num(obj.data, obj.data); var r = this.contentRule[col]; if (Ext.isNumber(data)) { if (false !== Ext.type(r.last)) { var dn = 0; var tmp = r.last.toString(); var parts = tmp.split("."); if (2 == parts.length) { if (dn < parts[1].length) { dn = parts[1].length; } } obj.data = this.formatFloat( r.last + r.inc * (x - r.lindex), dn); } } else if (data) { data = data.toString(); if ("week" == r.type) { obj.data = this.loopWeek(data, x, r); } else if ("month" == r.type) { obj.data = this.loopMonth(data, x, r); } else if ("date" == r.type) { obj.data = this.loopDate(data, x, r); } else if ("isif" == r.type) { obj['origin-data'] = this.loopISIF(data, x, r); } } if ("content" == autoFlag) { var textalign; if (Ext.isNumber(obj.data)) { textalign = "text-align:right;"; } obj = { data : obj.data, 'origin-data' : obj['origin-data'], 'text-align' : textalign }; } if (Ext.ss.common.Mask.isFormula(obj.data)) { var originStr = this.refreshOriginFormula(obj['origin-data'], x - i, 0); obj.data = this.adjustFormula(x, col, originStr); obj['origin-data'] = originStr; } } else { if (Ext.ss.common.Mask.isFormula(obj.data)) { var originStr = obj['origin-data']; obj.data = this.adjustFormula(x, col, originStr); obj['origin-data'] = originStr; } } if ("content" !== autoFlag) { if (1 < col && miny == col) { var left = this.getCell(i, col - 1) || {}; if ("x-spreadsheet-right-black" == left.br && (!left.wrap || left.wrap.maxy == col - 1)) { this.addLeftBorderFlag = this.addLeftBorderFlag || {}; var temp = this.getCell(x, col - 1); if (false == Ext.type(this.addLeftBorderFlag[x])) { this.addLeftBorderFlag[x] = temp.br || ""; } this.fireEvent("attributechange", x, col - 1, [["br", left.br]]); } } } else { if (1 < col && miny == col) { if (this.addLeftBorderFlag) { this.fireEvent("attributechange", x, col - 1, [["br", this.addLeftBorderFlag[x]]]); } } } if (obj.wrap) { var wrap = Ext.apply({}, obj.wrap); wrap.minx = wrap.minx - i + x; wrap.maxx = wrap.maxx - i + x; obj.wrap = wrap; } this.fireEvent("cellchange", x, col, obj); this.spreadsheet.editor.fitRow(x, true, true); }, autoCalculateCellByCol : function(miny, maxy, row, y, autoConfig, minx) { var len = maxy - miny + 1; var offset, j; if (y > maxy) { offset = y - maxy - 1; j = offset % len + miny; } else { offset = miny - y - 1; j = maxy - offset % len; } var autoFlag, rows; if (autoConfig) { autoFlag = autoConfig.flag; rows = autoConfig.selectedData.data; } var obj = Ext.apply({}, this.getOrignCellObj(row, j, rows)); var origin = this.getOrignCellObj(row, y, rows) || {}; if ("style" == autoFlag) { obj.data = origin.data; obj['origin-data'] = origin['origin-data']; } else if ("copy" != autoFlag) { var data = Ext.num(obj.data, obj.data); var r = this.contentRule[row]; if (Ext.isNumber(data)) { var dn = 0; var tmp = r.last.toString(); if (tmp) { var parts = tmp.split("."); if (2 == parts.length) { if (dn < parts[1].length) { dn = parts[1].length; } } } obj.data = this .formatFloat(r.last + r.inc * (y - r.lindex), dn); } else if (data) { data = data.toString(); if ("week" == r.type) { obj.data = this.loopWeek(data, y, r); } else if ("month" == r.type) { obj.data = this.loopMonth(data, y, r); } } if ("content" == autoFlag) { var textalign; if (Ext.isNumber(obj.data)) { textalign = "text-align:right;"; } obj = { data : obj.data, 'origin-data' : obj['origin-data'], 'text-align' : textalign }; } if (Ext.ss.common.Mask.isFormula(obj.data)) { var originStr = this.refreshOriginFormula(obj['origin-data'], 0, y - j); obj.data = this.adjustFormula(row, y, originStr); obj['origin-data'] = originStr; } } if ("content" !== autoFlag) { if (1 < row && row == minx) { var top = this.getCell(row - 1, j) || {}; if ("x-spreadsheet-bottom-black" == top.bb && (!top.wrap || top.wrap.maxx == row - 1)) { this.addTopBorderFlag = this.addTopBorderFlag || {}; var temp = this.getCell(row - 1, y); if (false == Ext.type(this.addTopBorderFlag[y])) { this.addTopBorderFlag[y] = temp.bb || ""; } this.fireEvent("attributechange", row - 1, y, [["bb", top.bb]]); } } } else { if (1 < row && row == minx) { if (this.addTopBorderFlag) { this.fireEvent("attributechange", row - 1, y, [["bb", this.addTopBorderFlag[y]]]); } } } if (obj.wrap) { var wrap = Ext.apply({}, obj.wrap); wrap.miny = wrap.miny - j + y; wrap.maxy = wrap.maxy - j + y; obj.wrap = wrap; } this.fireEvent("cellchange", row, y, obj); }, loopWeek : function(data, index, rule) { var fcap = "Z" > data.charAt(0); data = data.toLowerCase(); var ws = Ext.ss.common.Mask.week_set; var week = ws[data]; if (!week) { ws = Ext.ss.common.Mask.week_full_set; week = ws[data]; } if (week) { var day = Math.round(rule.last + rule.inc * (index - rule.lindex)) % 7; day = day || 7; data = ws[day]; } if (!fcap) { data = data.replace(/\b\w+\b/, function(word) { return word.substring(0, 1).toLowerCase() + word.substring(1); }); } else { data = data.replace(/\b\w+\b/, function(word) { return word.substring(0, 1).toUpperCase() + word.substring(1); }); } return data; }, loopMonth : function(data, index, rule) { var fcap = "Z" > data.charAt(0); data = data.toLowerCase(); var ms = Ext.ss.common.Mask.month_set; var month = ms[data]; if (!month) { ms = Ext.ss.common.Mask.month_full_set; month = ms[data]; } if (month) { var m = Math.round(rule.last + rule.inc * (index - rule.lindex)) % 12; m = m || 12; data = ms[m]; } if (!fcap) { data = data.replace(/\b\w+\b/, function(word) { return word.substring(0, 1).toLowerCase() + word.substring(1); }); } else { data = data.replace(/\b\w+\b/, function(word) { return word.substring(0, 1).toUpperCase() + word.substring(1); }); } return data; }, loopDate : function(data, index, rule) { var elapsed = rule.elapsed; var count = rule.count; var offset = index - rule.findex; var len = rule.arr.length; var t = Math.floor(offset / len), i = offset % len; var base = rule.first; t = t * (1 + count); var bais = 0; for (var j = 0; j < i; j++) { if (Ext.isDate(rule.arr[j])) { bais++; } } t += bais; var date = base.add(Date.MILLI, t * elapsed); data = date.format("m/d/Y"); return data; }, loopISIF : function(data, index, rule) { var findex = rule.findex, lindex = rule.lindex, periodIndex = rule.periodIndex, partsLen = rule.partsLen; var partsLookup = rule.partsLookup; var len = lindex - findex + 1; var off = (index - findex) % len, count = Math.floor((index - findex) / len); var i = off + findex; if (!partsLookup[i]) { return data; } var it = [].concat(partsLookup[i].parts); var poffset = rule.poffset; if (Ext.isNumber(poffset)) { it[periodIndex] = Number(it[periodIndex]) + count * partsLen * rule.poffset; } else { var offtype = poffset.offtype, off = poffset.off, fm = poffset.fm; if ("q" == offtype) { var cur = it[periodIndex], q; cur.replace(/[0-9]+/i, function(w) { q = Number(w.charAt(0)); wlen = w.length; var year = Number(w.slice(1, wlen)); q = year * 4 + q - 1; }); q = q + count * partsLen * off; var year = Math.floor(q / 4); q = q % 4 + 1; var str = String.format(fm, q, year); it[periodIndex] = str; } else if ("y" == offtype) { var cur = it[periodIndex], year; cur.replace(/[0-9]+/i, function(w) { year = Number(w); }); year = year + count * partsLen * off; var str = String.format(fm, year); it[periodIndex] = str; } } return it.join(","); }, generateRule : function(obj, origin, dest, rows, dir) { var rule = {}; for (var j in obj) { var first = false, last, findex, lindex, count = 0, sum = 0, type = "", elapsed, arr = []; var isifRule, lastParts, partsLookup = {}, countIndex = 0, periodIndex = 3, poffset, lastPOffset, skipFlag; for (var i = origin; i <= dest; i++) { var cell = ("row" == dir ? this.getOrignCellObj(i, j, rows) : this.getOrignCellObj(j, i, rows)) || {}; var data = Ext.num(cell.data, cell.data); var originData = cell['origin-data']; if (Ext.isNumber(data)) { if (false === first) { first = data; findex = i; last = data; lindex = i; } else { last = data; lindex = i; count += lindex - findex; sum += last - first; } } else if (data) { data = data.toString().toLowerCase(); var ws = Ext.ss.common.Mask.week_set; var week = ws[data]; if (!week) { ws = Ext.ss.common.Mask.week_full_set; week = ws[data]; } if (week) { if (false === first) { first = week; findex = i; last = week; lindex = i; } else { last = week; lindex = i; count += lindex - findex; sum += last - first; } type = "week"; } else { var ms = Ext.ss.common.Mask.month_set; var month = ms[data]; if (!month) { ms = Ext.ss.common.Mask.month_full_set; month = ms[data]; } if (month) { if (false === first) { first = month; findex = i; last = month; lindex = i; } else { last = month; lindex = i; count += lindex - findex; sum += last - first; } type = "month"; } else { var date = this.transfer2Date(data); if (date) { arr.push(date); if (false === first) { first = date; findex = i; lindex = i; } else { lindex = i; count++; if (elapsed) { if (elapsed != last.getElapsed(date)) { elapsed = false; break; } } else { elapsed = last.getElapsed(date); } } last = date; } else if (!skipFlag) { if (originData && 0 === originData.indexOf("=")) { var parts = originData.split(","); if (periodIndex < parts.length) { if (!lastParts) { partsLookup[i] = { index : countIndex++, parts : [].concat(parts) }; lastParts = parts; } else { var pFlag = true; var pLen = lastParts.length; if (pLen === parts.length) { for (var k = 0; k < pLen; k++) { if (k !== periodIndex) { if (lastParts[k] !== parts[k]) { pFlag = false; break; } } } } if (pFlag) { poffset = this .getISIFPeriodOffset( parts[periodIndex], lastParts[periodIndex]); if (false == Ext .type(lastPOffset)) { lastPOffset = poffset; isifRule = true; partsLookup[i] = { index : countIndex++, parts : [] .concat(parts) }; } else if (Ext .encode(lastPOffset) === Ext .encode(poffset)) { partsLookup[i] = { index : countIndex++, parts : [] .concat(parts) }; } else { skipFlag = true; } } else { skipFlag = true; } lastParts = parts; } } } } } } } } var inc = 0; if (0 != count) { inc = sum / count; } rule[j] = { findex : findex, first : Number(first), lindex : lindex, last : Number(last), inc : inc, type : type }; if (elapsed) { rule[j] = { findex : findex, first : first, lindex : lindex, last : last, arr : arr, elapsed : elapsed, type : "date", count : count }; } if (isifRule && !skipFlag) { rule[j] = { type : "isif", findex : origin, lindex : dest, partsLookup : partsLookup, partsLen : countIndex, periodIndex : periodIndex, poffset : poffset }; } } return rule; }, getISIFPeriodOffset : function(pre, next) { pre = pre.trim(); next = next.trim(); var preNum = Number(pre), nextNum = Number(next); if (Ext.isNumber(preNum) && Ext.isNumber(nextNum)) { return preNum - nextNum; } else { var preLeft, preQ, preYear, flag = 0; if (/['"]?Q[1-4][0-9]{4}['"]?/i.test(pre)) { preLeft = pre.replace(/[0-9]+/i, function(w) { preQ = Number(w.charAt(0)); wlen = w.length; preYear = Number(w.slice(1, wlen)); var rs = ""; for (var i = 0; i < wlen; i++) { rs += "_"; } return rs; }); flag++; } var nextLeft, nextQ, nextYear; if (/['"]?Q[1-4][0-9]{4}['"]?/i.test(next)) { nextLeft = next.replace(/[0-9]+/i, function(w) { nextQ = Number(w.charAt(0)); wlen = w.length; nextYear = Number(w.slice(1, wlen)); var rs = ""; for (var i = 0; i < wlen; i++) { rs += "_"; } return rs; }); flag++; } if (2 === flag && preLeft === nextLeft) { var qoff = preYear * 4 + preQ - nextYear * 4 - nextQ; return { off : qoff, offtype : "q", fm : " 'Q{0}{1}'" }; } else { var preLeft, preYear, flag = 0; if (/['"]?FY[\s]?[0-9]{4}['"]?/i.test(pre)) { preLeft = pre.replace(/[0-9]+/i, function(w) { preYear = Number(w); return "{0}"; }); flag++; } var nextLeft, nextYear; if (/['"]?FY[\s]?[0-9]{4}['"]?/i.test(next)) { nextLeft = next.replace(/[0-9]+/i, function(w) { nextYear = Number(w); return "{0}"; }); flag++; } if (2 === flag && preLeft === nextLeft) { var qoff = preYear - nextYear; return { off : qoff, offtype : "y", fm : " " + nextLeft }; } } } }, generateRuleForISIF : function(data) { }, contentAnalysis : function(minPos, maxPos, rt, flag, rows) { var rule = {}, type; if ("row" == flag) { var minx = minPos.x, maxx = maxPos.x, miny = minPos.y, maxy = maxPos.y; var obj = {}; if (0 == maxy) { for (var i = minx; i <= maxx; i++) { var row = rows[i]; for (var j in row) { obj[j] = true; } } } else { for (var i = minx; i <= maxx; i++) { var row = rows[i]; if (row) { for (var j = miny; j <= maxy; j++) { if (row[j]) { obj[j] = true; } } } } } rule = this.generateRule(obj, minx, maxx, rows, flag); } else if ("col" == flag) { var minx = minPos.x, maxx = maxPos.x, miny = minPos.y, maxy = maxPos.y; var obj = {}; if (0 == maxx) { for (var i in rows) { var row = rows[i]; obj[i] = true; } } else { for (var i = minx; i <= maxx; i++) { var row = rows[i]; if (row) { for (var j = miny; j <= maxy; j++) { if (row[j]) { obj[i] = true; } } } } } rule = this.generateRule(obj, miny, maxy, rows, flag); } return rule; }, doAutoContent : function(minPos, maxPos, rt, autoFlag) { var ss = this.spreadsheet; var sm = ss.sm; rt = rt || sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var flag = sm.compareSelectionRange(rt, { minPos : minPos, maxPos : maxPos }); var rows = autoFlag.selectedData.data; this.contentRule = this.contentAnalysis(minPos, maxPos, rt, flag, rows); var min = rt.minPos, max = rt.maxPos; if ("row" == flag) { var minx, maxx; if (min.x < minPos.x) { minx = min.x; maxx = minPos.x - 1; } else if (max.x > maxPos.x) { minx = maxPos.x + 1; maxx = max.x; } if (0 == min.y && 0 == max.y) { for (var i = minx; i <= maxx; i++) { this.autoCalculateRow(minPos.x, maxPos.x, i, autoFlag); } } else { for (var j = min.y; j <= max.y; j++) { for (var i = minx; i <= maxx; i++) { this.autoCalculateCellByRow(minPos.x, maxPos.x, j, i, autoFlag, minPos.y); } } } } else if ("col" == flag) { var miny, maxy; if (min.y < minPos.y) { miny = min.y; maxy = minPos.y - 1; } else if (max.y > maxPos.y) { miny = maxPos.y + 1; maxy = max.y; } if (0 == min.x && 0 == max.x) { for (var j = miny; j <= maxy; j++) { this.autoCalculateCol(minPos.y, maxPos.y, j, autoFlag); } } else { for (var i = min.x; i <= max.x; i++) { for (var j = miny; j <= maxy; j++) { this.autoCalculateCellByCol(minPos.y, maxPos.y, i, j, autoFlag, minPos.x); } } } } this.trace(feyaSoft.ss.lang.action_fromat_brush(this .getNameFromPos(min), this.getNameFromPos(max))); if ("content" == autoFlag) { this.addLeftBorderFlag = false; this.addTopBorderFlag = false; } ss.refreshRange(); }, getCellObj : function(x, y, sheetIndex) { var rows = this.data.rows; if (false !== Ext.type(sheetIndex)) { rows = this.sheets[sheetIndex].rows; } var row = rows[x]; if (row) { var cell = row[y] || {}; var wrap = cell.wrap; if (wrap) { x = wrap.minx; y = wrap.miny; cell = Ext.applyIf({ x : x, y : y }, rows[x][y]); return cell; } cell = Ext.applyIf({ x : x, y : y }, cell); return cell; } }, getOrignCellObj : function(x, y, rows) { rows = rows || this.data.rows; var row = rows[x]; if (row) { return row[y]; } }, getCellWidth : function(x, y) { var miny = y, maxy = y; var rows = this.data.rows; var row = rows[x]; if (row) { var cell = row[y]; if (cell) { var wrap = cell.wrap; if (wrap) { miny = wrap.miny; maxy = wrap.maxy; } } } return this.getSpanWidth(miny, maxy); }, formatFloat : function(f, d) { d = Math.pow(10, d); f = Math.round(f * d) / d; return f; }, findSheetName : function(name) { name = name.toLowerCase(); var sheets = this.sheets; for (var i = 0, len = sheets.length; i < len; i++) { if (name == sheets[i].name.toLowerCase()) { return true; } } return false; }, findTargets : function(target) { var targetLinks = new Array; var rows = this.data.rows; for (var x in rows) { if (0 == x) { continue; } var row = rows[x]; for (var y in row) { if (0 == y) { continue; } var data = row[y].data; if (false != Ext.type(data)) { if (Ext.ss.common.Mask.isFormula(data)) { data = this.getCellValue(x, y, undefined, true); } data = data.toString(); if (-1 !== data.toLowerCase().indexOf(target.toLowerCase())) { targetLinks.push({ x : x, y : y, data : data }); } } } } return targetLinks; }, filterBy : function(fn, scope) { var rows = this.data.rows; for (var p in rows) { } }, filterByValues : function(col, minrow, maxrow, values) { var fn = function(arr, find) { if (!arr) { return true; } for (var k = 0, len = arr.length; k < len; k++) { if (arr[k].toString() == find.toString()) { return true; } } return false; }; var rows = this.data.rows; for (var i = minrow; i <= maxrow; i++) { var cell = this.getCell(i, col); if (!fn(values, cell.data)) { this.fireEvent("rowattributechange", i, [["display", "none"]]); } else { this.fireEvent("rowattributechange", i, [["display", ""]]); } } }, doFiltering : function(minrow, maxrow) { var rowSetting = this.data.rowSetting; var filters = this.getAllFilters(); for (var i = minrow; i <= maxrow; i++) { if (this.doFilterChecking(i, filters)) { if (!rowSetting[i] || "" != rowSetting[i].display) { this.fireEvent("rowattributechange", i, [["display", ""]]); } } else { if (!rowSetting[i] || "none" != rowSetting[i].display) { this.fireEvent("rowattributechange", i, [["display", "none"]]); } } } }, getAllFilters : function(sheetIndex) { var data = this.data; if (false != Ext.type(sheetIndex)) { data = this.sheets[sheetIndex]; } var filters = {}; var rows = data.rows; for (var p in rows) { var row = rows[p]; for (var q in row) { var cell = row[q]; if (cell && cell.filter) { var x = Number(p); var minx = cell.filter.minx + x, maxx = cell.filter.maxx + x; var y = Number(q); var id = y + "-" + minx + "-" + maxx; var obj = { y : y, minx : minx, maxx : maxx }; if (cell.filterCheck) { obj.check = Ext.apply({}, cell.filterCheck); } filters[id] = obj; } } } return filters; }, doFilterChecking : function(x, filters) { var rows = this.data.rows; var row = rows[x] || {}; for (var p in filters) { var it = filters[p]; var minx = it.minx, maxx = it.maxx, check = it.check, y = it.y; if (check) { if ((minx <= x || 0 == minx) && (x <= maxx || 0 == maxx)) { var cell = this.getCell(x, y); var data = cell.data, flag = true; if (cell.wrap) { data = this.getCellValue(cell.wrap.minx, cell.wrap.miny, this.activeSheet, true); } else { data = this.getCellValue(x, y, this.activeSheet, true); } data = data.toString(); for (var q in check) { var cond = check[q]; if (cond) { for (var i = 0, len = cond.length; i < len; i++) { if (cond[i] === data) { flag = false; break; } } } if (!flag) { break; } } if (!flag) { return false; } } } } return true; }, transfer2Date : function(dateStr) { try { var date = this.prepareDate(dateStr, this.defaultDateFormat); return date; } catch (e) { return dateStr; } }, prepareDateStr : function(dateStr, dateFormat) { if (dateStr == null || !Ext.isString(dateStr)) { return false; } dateStr = dateStr.replace(/[a-zA-Z]+/gi, function(w) { if ("am" == w || "pm" == w) { return w; } return Ext.util.Format.capitalize(w); }); var dateFormat = dateFormat || this.defaultDateFormat; try { var arr = Ext.ss.common.Mask.dateFormats, date; for (var i = 0, len = arr.length; i < len; i++) { var f = arr[i]; date = Date.parseDate(dateStr, f); if (date) { if (date.format(f) == dateStr) { return date.format(dateFormat); } } } } catch (e) { return false; } }, prepareDate : function(dateStr, dateFormat) { if (typeof dateStr == "string") { dateStr = dateStr.replace(/[a-zA-Z]+/gi, function(w) { if ("am" == w || "pm" == w) { return w; } return Ext.util.Format.capitalize(w); }); var dateFormat = dateFormat || this.defaultDateFormat; try { var arr = Ext.ss.common.Mask.dateFormats, date; for (var i = 0, len = arr.length; i < len; i++) { var f = arr[i]; date = Date.parseDate(dateStr, f); if (date) { if (date.format(f) == dateStr) { return date; } } } } catch (e) { return false; } } }, prepareFormat : function(obj, format) { var mask = Ext.ss.common.Mask; var cuurDigital = Ext.ss.common.Helper.getDigitalLen(Number(obj.data)); var numFlag = mask.isNumber(obj.data); if ("money" == format || "dollar" == format) { if (numFlag) { var n = Number(obj.data); var digital = Ext.ss.common.Helper.getDigitalLen(n); var numFormat = Ext.ss.common.Helper.getNumFormat(digital); obj.data = "$ " + Ext.util.Format.number(obj.data, numFormat); if (!obj['text-align']) { obj['text-align'] = "text-align:right;"; } } } else if ("rmb" == format) { if (numFlag) { var n = Number(obj.data); var digital = Ext.ss.common.Helper.getDigitalLen(n); var numFormat = Ext.ss.common.Helper.getNumFormat(digital); obj.data = String.fromCharCode(165) + " " + Ext.util.Format.number(obj.data, numFormat); if (!obj['text-align']) { obj['text-align'] = "text-align:right;"; } } } else if ("pound" == format) { if (numFlag) { var n = Number(obj.data); var digital = Ext.ss.common.Helper.getDigitalLen(n); var numFormat = Ext.ss.common.Helper.getNumFormat(digital); obj.data = String.fromCharCode(8356) + " " + Ext.util.Format.number(obj.data, numFormat); if (!obj['text-align']) { obj['text-align'] = "text-align:right;"; } } } else if ("euro" == format) { if (numFlag) { var n = Number(obj.data); var digital = Ext.ss.common.Helper.getDigitalLen(n); var numFormat = Ext.ss.common.Helper.getNumFormat(digital); obj.data = String.fromCharCode(8364) + " " + Ext.util.Format.number(obj.data, numFormat); if (!obj['text-align']) { obj['text-align'] = "text-align:right;"; } } } else if ("comma" == format) { if (numFlag) { var n = Number(obj.data); var digital = Ext.ss.common.Helper.getDigitalLen(n); var numFormat = Ext.ss.common.Helper.getNumFormat(digital); obj.data = Ext.util.Format.number(n, numFormat); if (!obj['text-align']) { obj['text-align'] = "text-align:right;"; } } } else if ("percent" == format) { if (numFlag) { var n = Number(obj.data); var digital = Ext.ss.common.Helper.getDigitalLen(n); var numFormat = Ext.ss.common.Helper.getNumFormat(digital); obj.data = Ext.util.Format.number(n * 100, numFormat) + "%"; if (!obj['text-align']) { obj['text-align'] = "text-align:right;"; } } } else if ("science" == format) { if (numFlag) { obj.data = obj.data.toString().toLowerCase(); var n = Number(obj.data); obj.data = n.toExponential(); if (!obj['text-align']) { obj['text-align'] = "text-align:right;"; } numFlag = false; } } else if ("number" == format) { if (numFlag) { obj.data = obj.data.toString().toLowerCase(); var n = Number(obj.data); var digital = Ext.ss.common.Helper.getDigitalLen(n); var numFormat = Ext.ss.common.Helper.getNumFormat(digital); obj.data = Ext.util.Format.number(n, numFormat); if (!obj['text-align']) { obj['text-align'] = "text-align:right;"; } } } else if ("date" == format) { var temp = obj.data; var dateStr = this.prepareDateStr(obj.data, obj.dateFormat); if (dateStr) { obj.data = dateStr; if (!obj['text-align']) { obj['text-align'] = "text-align:right;"; } } else { obj.data = temp; } } else if ("time" == format) { var temp = obj.data, str = obj.data; var arr = Ext.ss.common.Mask.timeFormats, date; for (var i = 0, len = arr.length; i < len; i++) { var f = arr[i]; date = Date.parseDate(str, f); if (date) { break; } } try { obj.data = date.format(this.defaultTimeFormat); if (!obj['text-align']) { obj['text-align'] = "text-align:right;"; } } catch (e) { obj.data = temp; } } else if ("text" == format) { if (!obj['text-align']) { obj['text-align'] = "text-align:left;"; } } else { if (true === obj.data || obj.data.toString().toLowerCase() == "true") { obj.data = "TRUE"; obj['text-align'] = "text-align:right;"; } else if (false === obj.data || obj.data.toString().toLowerCase() == "false") { obj.data = "FALSE"; obj['text-align'] = "text-align:right;"; } } if (numFlag) { var dotLen; if (false == Ext.type(obj.digital)) { dotLen = cuurDigital; } else { dotLen = Number(obj.digital) || 0; } var text = obj.data.toString(); text = text.toLowerCase(); var arr = text.split("."), dots = ""; if (2 == arr.length) { dots = arr[1]; } var itg = arr[0]; var digital = dots.length; var withPercent; if ("%" == itg.charAt(itg.length - 1)) { withPercent = true; arr[0] = itg.slice(0, itg.length - 1); } if ("%" == dots.charAt(digital - 1)) { withPercent = true; digital--; dots = dots.slice(0, digital); } if (digital > dotLen) { dots = dots.slice(0, dotLen); } else if (digital < dotLen) { for (var k = digital; k < dotLen; k++) { dots = dots + "0"; } } if (dots) { obj.data = arr[0] + "." + dots; } else { obj.data = arr[0]; } if (Ext.isNumber(Number(obj.data))) { } if (withPercent) { obj.data += "%"; obj.format = obj.format || "percent"; } else { obj.format = obj.format || "number"; } } if (!obj['text-align']) { var num = Number(obj.data); if (false != Ext.type(obj.data) && "" !== obj.data && Ext.isNumber(num)) { obj.data = obj.data.toString().toLowerCase(); obj['text-align'] = "text-align:right;"; } else { var dateStr = this.prepareDateStr(obj.data, obj.dateFormat); if (dateStr) { obj.data = dateStr; obj.format = obj.format || "date"; obj['text-align'] = "text-align:right;"; } else { obj['text-align'] = "text-align:left;"; var str = obj.data || ""; var slen = str.length; if (1 < slen && "%" == str.charAt(slen - 1)) { str = str.slice(0, slen - 1); num = Number(str); if ("" !== str && Ext.isNumber(num)) { obj['text-align'] = "text-align:right;"; obj.format = obj.format || "percent"; } } } } } var num = Number(obj.data); if (false != Ext.type(obj.data) && "" !== obj.data && Ext.isNumber(num)) { obj.data = obj.data.toString().toLowerCase(); } return obj; }, try2BeNumber : function(value) { var str = value.toString(); var num = Number(str); if (Ext.isNumber(num)) { return { data : num }; } if (!/[^0-9,.]+/gi.test(str)) { if (-1 != str.indexOf(",")) { var cls = str.replace(/,/gi, function() { return ""; }); cls = Number(cls); if (Ext.isNumber(cls)) { var parts = str.split("."); var zeros = ""; if (1 < parts.length) { for (var k = 0, len = parts[parts.length - 1].length; k < len; k++) { zeros += "0"; } } if ("" !== zeros) { zeros = "0,0." + zeros; } else { zeros = "0,0"; } var num = Ext.util.Format.number(cls, zeros); if (num == value) { value = cls; return { data : value, format : "comma" }; } } } } }, isChanged : function() { return 0 < Ext.ss.common.Mask.getObjSize(this.modifedCache); }, getExtraInfo : function() { var sheet = this.sheets[this.activeSheet]; var extraInfo = { freezeRange : sheet.freezeRange, splitFlag : sheet.splitFlag, showRange : sheet.showRange, selectedStart : sheet.selectedStart, selectedEnd : sheet.selectedEnd, focusCell : sheet.focusCell, charts : sheet.charts, printHeadFoot : sheet.printHeadFoot, conditionFormat : sheet.conditionFormat }; extraInfo = Ext.encode(extraInfo); return extraInfo; }, setPrintHeadFoot : function(headFoot) { var sheet = this.sheets[this.activeSheet]; sheet.printHeadFoot = headFoot; }, saveExtraInfo : function(asActive, callback, scope, needBackup) { var ss = this.spreadsheet; if (ss.isReadOnly() || this.disableCallingBackEnd) { if (callback) { callback.call(scope); } return; } var sheet = this.sheets[this.activeSheet]; var extraInfo = this.getExtraInfo(); var params = { tabId : sheet.tabId, extraInfo : extraInfo, needBackup : needBackup }; if (asActive) { params.asActive = true; } var setExtraFn = function() { this._callingBackEnd = true; Ext.Ajax.request({ timeout : 300000, url : this.extraInfoUrl, params : params, success : function(response, opts) { delete this._callingBackEnd; var json = Ext.decode(response.responseText); if ("true" == json.success) { if (callback) { callback.call(scope); } } else { if (json.success == "relogin") { new feyaSoft.home.Login; } else { Ext.Msg.alert(feyaSoft.lang.common, json.info); } } }, failure : function(response, opts) { delete this._callingBackEnd; var lanCom = feyaSoft.lang.common; Ext.Msg.alert(lanCom.error, "Server-side failure with status code " + response.status); }, scope : this }); }; var count = 0; var tmpFn = function() { count++; if (!this._callingBackEnd) { setExtraFn.call(this); } else if (count < 10) { tmpFn.defer(500, this); } }; tmpFn.call(this); }, saveOldVersion : function(callback, scope) { var ss = this.spreadsheet; if (ss.isReadOnly()) { if (callback) { callback.call(scope); } return; } var fileId = this.getFileId(); if (Ext.isDefined(fileId)) { Ext.Ajax.request({ timeout : 300000, url : this.revisionUrl, params : { oldFileId : fileId }, success : function(response) { if (callback) { callback.call(scope); } }, failure : function() { if (callback) { callback.call(scope); } }, scope : this }); } else if (callback) { callback.call(scope); } }, saveChanges : function(callback, scope, needBackup) { var ss = this.spreadsheet; if (ss.isReadOnly()) { if (callback) { callback.call(scope); } return; } this.saveActiveSheet(true); var flag = this.saveModifiedCache(true, callback, scope, needBackup); if (!flag) { this.saveExtraInfo(true, callback, scope, needBackup); } else if (needBackup) { Ext.Ajax.request({ timeout : 300000, url : this.updateModifiedUrl, params : { tabId : this.sheets[this.activeSheet].tabId, needBackup : true } }); } }, updateTabIds : function(tabIds) { for (var i = 0, len = this.sheets.length; i < len; i++) { var sheet = this.sheets[i]; this.updateModifedCacheTabId(sheet.tabId, tabIds[i]); sheet.tabId = tabIds[i]; } this.data.tabId = this.sheets[this.activeSheet].tabId; }, getFile : function() { return this.spreadsheet.file; }, getFileId : function() { var file = this.getFile(); if (file) { return file.id; } }, updateModifedCacheTabId : function(oldTid, newTid) { var mc = this.modifedCache; for (var m in mc) { if (mc[m].tabId == oldTid) { mc[m].tabId = newTid; } } }, addHyperlinkFn : function(x, y, hyperlink, data) { var rows = this.data.rows; rows[x] = rows[x] || {}; rows[x][y] = rows[x][y] || {}; var og = { rows : {} }; og.rows[x] = {}; var css = this.data.rows[x][y].css || ""; og.rows[x][y] = { hyperlink : this.data.rows[x][y].hyperlink, css : css, data : this.data.rows[x][y].data }; var md = { rows : {} }; md.rows[x] = {}; md.rows[x][y] = { hyperlink : hyperlink, css : css + " " + Ext.ss.CONST.cssHash[4], data : data }; var sm = this.spreadsheet.sm; this.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }); rows[x][y].hyperlink = hyperlink; rows[x][y].css = css + " " + Ext.ss.CONST.cssHash[4]; rows[x][y].data = data; this.put2ModifiedCache("createUpdate", { x : x, y : y, data : this.getModifiedData(x, y) }); }, deleteHyperlinkFn : function(x, y) { var rows = this.data.rows; rows[x] = rows[x] || {}; rows[x][y] = rows[x][y] || {}; var og = { rows : {} }; og.rows[x] = {}; var css = this.data.rows[x][y].css || ""; og.rows[x][y] = { css : css, hyperlink : this.data.rows[x][y].hyperlink }; var md = { rows : {} }; md.rows[x] = {}; css = css.replace(Ext.ss.CONST.cssHash[4], "").trim(); md.rows[x][y] = { css : css }; delete md.rows[x][y].hyperlink; var sm = this.spreadsheet.sm; this.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }); rows[x][y].css = css; delete rows[x][y].hyperlink; this.put2ModifiedCache("createUpdate", { x : x, y : y, data : this.getModifiedData(x, y) }); }, saveFileExtraInfo : function(callback, scope) { var params = { id : this.getFileId(), extraInfo : Ext.encode(this.fileExtraInfo) }; Ext.Ajax.request({ timeout : 300000, url : this.fileExtraInfoUrl, params : params, success : function(response, opts) { delete this._callingBackEnd; var json = Ext.decode(response.responseText); if ("true" == json.success) { if (callback) { callback.call(scope); } } else { if (json.success == "relogin") { new feyaSoft.home.Login; } else { Ext.Msg.alert(feyaSoft.lang.common, json.info); } } }, failure : function(response, opts) { delete this._callingBackEnd; var lanCom = feyaSoft.lang.common; Ext.Msg.alert(lanCom.error, "Server-side failure with status code " + response.status); }, scope : this }); }, withFilter : function() { var rows = this.data.rows; for (var p in rows) { var row = rows[p]; for (var q in row) { var cell = row[q]; if (cell.filter) { return true; } } } }, getReachBounds : function() { var rows = this.data.rows; var maxrow = 1, maxcol = 1; for (var p in rows) { p = Number(p); if (p > maxrow) { maxrow = p; } var row = rows[p]; for (var q in row) { q = Number(q); if (q > maxcol) { maxcol = q; } } } return { row : maxrow, col : maxcol }; }, transferISFormula : function(x, y, originData) { var data = this.adjustFormula(x, y, originData); var sheetIndex = this.activeSheet; this.updteISFormulaFromServer = true; this.escapeISFormulaQueue = true; this.ISFCache = []; var ds = this; this.ISFCache = []; this.convert(x, y, data, originData, sheetIndex); result = this.ISFCache; delete this.escapeISFormulaQueue; delete this.updteISFormulaFromServer; return { data : data, ISIParams : result, lastOriginData : originData }; }, compareISI : function(pre, cur) { if (Ext.isArray(pre) && Ext.isArray(cur)) { var pLen = pre.length, cLen = cur.length; var len = pLen; if (pLen > cLen) { len = cLen; } for (var i = 0; i < len; i++) { var pIt = pre[i], cIt = cur[i]; if (pIt[0] == cIt[0] && Ext.encode(pIt[1]) == Ext.encode(cIt[1])) { } else { return false; } } return true; } return false; }, checkISFormula : function() { var ss = this.spreadsheet; if (this.ISFormulaQueue && 0 < this.ISFormulaQueue.length) { var tmp = this.activeSheet; var it = this.ISFormulaQueue.shift(); var arr = it.split("-"); var sheetIndex = Number(arr[0]), x = Number(arr[1]), y = Number(arr[2]); var cellObj = this.getCellObj(x, y, sheetIndex) || {}; this.activeSheet = sheetIndex; this.data = this.sheets[sheetIndex]; this.updteISFormulaFromServer = true; this.escapeISFormulaQueue = true; this.ISFCache = []; try { this.convert(x, y, cellObj.data, cellObj['origin-data'], sheetIndex); } catch (e) { } var result = this.ISFCache; delete this.escapeISFormulaQueue; this.activeSheet = tmp; this.data = this.sheets[tmp]; var notChange = this.compareISI(cellObj.ISIParams, result); if (notChange) { delete this.updteISFormulaFromServer; this.sheets[sheetIndex].rows[x][y].lastOriginData = cellObj['origin-data']; if (false == Ext .type(this.sheets[sheetIndex].rows[x][y].result)) { this.sheets[sheetIndex].rows[x][y].result = this.sheets[sheetIndex].rows[x][y].oldResult; } this.checkISFormula.defer(50, this); } else { this.requestISFormulaUpdate(cellObj, result, function(iparams) { this.sheets[sheetIndex].rows[x][y].ISIParams = iparams; this.sheets[sheetIndex].rows[x][y].result = this .convert(x, y, cellObj.data, cellObj['origin-data'], sheetIndex); this.activeSheet = sheetIndex; this.data = this.sheets[sheetIndex]; var data = this.getModifiedData(x, y); this.put2ModifiedCache("createUpdate", { tabId : this.sheets[sheetIndex].tabId, x : x, y : y, data : data }); if (sheetIndex === tmp) { var obj = this.getCell(x, y); obj.x = x; obj.y = y; ss.refreshCell(obj); this.fireEvent("afterdatachange", x, y, tmp, this); } this.sheets[sheetIndex].rows[x][y].lastOriginData = cellObj['origin-data']; this.activeSheet = tmp; this.data = this.sheets[tmp]; this.checkNonISFormula(); this.checkISFormula(); }, this); } } }, requestISFormulaUpdate : function(cellObj, ISIArr, callback, scope) { var me = this; var iparams = this.deepClone(ISIArr), index = 0; var fn = function() { var len = ISIArr.length; delete this.updteISFormulaFromServer; if (0 < len) { var it = ISIArr.shift(); feyaSoft.api.JsonP.callISIFormula("ISIF", { ISFName : it[0], ISFArgs : it[1] }, function(data, response) { if (response) { var result; if (200 == response.status && response.data && response.data.items && response.data.items[0]) { result = response.data.items[0].result; } else { result = 0; } iparams[index].push(result); index++; if (1 == len && callback) { callback.call(scope, iparams); } else { fn(); } } else { fn(); } }, me); } }; fn(); }, isISFormula : function(origin) { if (origin && Ext.isString(origin)) { return -1 !== origin.indexOf("ISIF") || -1 !== origin.indexOf("isif"); } }, checkNonISFormula : function() { this.escapeISFormulaQueue = true; var ss = this.spreadsheet; var tmp = this.activeSheet; for (var i = 0, len = this.sheets.length; i < len; i++) { var rows = this.sheets[i].rows; this.data = this.sheets[i]; this.activeSheet = i; var lookup = []; for (var p in rows) { p = Number(p); var row = rows[p]; for (var q in row) { q = Number(q); var cell = row[q]; if ("ISFormula" != cell.type) { var isFormula = false; if (Ext.isDefined(cell['origin-data'])) { isFormula = Ext.ss.common.Mask .isFormula(cell['origin-data']); } else { isFormula = Ext.ss.common.Mask.isFormula(cell.data); } if (isFormula && !this.isISFormula(cell['origin-data'])) { cell.oldResult = cell.result; delete cell.result; lookup.push({ x : p, y : q }); } } } } for (var j = 0, count = lookup.length; j < count; j++) { var it = lookup[j]; var x = it.x, y = it.y; var obj = this.getCell(x, y); obj.x = x; obj.y = y; if (i === tmp) { ss.refreshCell(obj); } this.fireEvent("afterdatachange", x, y, i, this); } } this.data = this.sheets[tmp]; this.activeSheet = tmp; delete this.escapeISFormulaQueue; }, isCompanyCell : function(cell) { var data = cell['origin-data'] || cell.data; if (data) { data = data.toString(); var firstChar = data.charAt(0); var flag = false; if ("=" == firstChar) { data.replace(/ISIF\([^)]*\)/gi, function(found) { var params = found.slice(5, found.length - 1); if (params) { params = params.split(","); var len = params.length; if (1 == len) { var fp = params[0]; if (/^['"]?[0-9]+['"]?$/gi.test(fp)) { flag = true; return false; } } else if (3 == len) { var fp = params[0], sp = params[1], tp = params[2]; if (/^['"]?[0-9]+['"]?$/gi.test(fp) && /^['"]?INF['"]?$/gi.test(sp) && /^['"]?name['"]?$/gi.test(tp)) { flag = true; return false; } } } }); if (flag) { return true; } } } } }); Ext.ns("Ext.ss"); Ext.ss.Editor = function(config) { Ext.apply(this, config); Ext.ss.Editor.superclass.constructor.call(this); this.dropList = new Ext.ss.company.FormulaDropList({ spreadsheet : this.spreadsheet, hidden : true }); this.fieldList=new Ext.ss.field.FieldDropList({ spreadsheet : this.spreadsheet, hidden : true }); this.fnList=new Ext.ss.fn.FnDropList({ spreadsheet : this.spreadsheet, hidden : true }); this.addEvents("complete", "typing"); this.on("typing", this.onTypingFn, this, { defer : 10 }); /**判断是否是 以==开头*/ this.on("typeup", this.onTypeUpFn, this, { defer : 10 }); this.dropList.on("selectformula", this.selectFormulaFromDropList, this); this.fieldList.on("selectfield", this.selectFieldFromDropList, this); this.fnList.on("selectfn",this.selectFnFromDropList,this); }; Ext.extend(Ext.ss.Editor, Ext.util.Observable, { pendingInterval : 15, onBodyDbClickFn : function(e) { var lan_ss = feyaSoft.ss.lang; var target = e.getTarget(); var tgEl = Ext.get(target); var ss = this.spreadsheet; var ds = ss.ds; var rows = ds.data.rows; var xy = e.getXY(); var xlimit = ss.ylivescroller.getLeft(); var ylimit = ss.xlivescroller.getTop(); if (xy[0] <= xlimit && xy[1] <= ylimit) { var pos = ds.getPosFromXY(xy[0], xy[1]); if (pos) { var x = pos.x; var y = pos.y; if (0 == x && 0 == y) { } else if (0 == x) { if (tgEl.hasClass("x-spreadsheet-col-resizer")) { this.fitCol(y); var l = ds.getLetter(y); ds.trace(lan_ss.action_col_resize(l, l)); } } else if (0 == y) { if (tgEl.hasClass("x-spreadsheet-row-resizer")) { this.fitRow(x, undefined, undefined, true); ds.trace(lan_ss.action_row_resize(x, x)); } } else if (!ss.settings.readOnlyView) { if (rows[x] && rows[x][y]) { var wrap = rows[x][y].wrap; if (wrap) { pos = { x : wrap.minx, y : wrap.miny }; wrap = ds.getVisiableSpan(wrap.minx, wrap.miny, wrap.maxx, wrap.maxy); x = wrap.minx; y = wrap.miny; } } this.startEditing(pos, null, "db"); } } } }, measureHeight : function(x, y) { var ss = this.spreadsheet; var toy = ss.toy; var t = toy.dom; var ds = ss.ds; var obj = ds.getCell(x, y); t.style.cssText = ""; if ("" != obj['font-size']) { t.style.cssText += obj['font-size']; } if ("" != obj['word-wrap']) { t.style.cssText += obj['word-wrap']; } if ("" != obj['font-family']) { t.style.cssText += obj['font-family']; } var w = ds.getCellWidth(x, y) - ss.xpaddingOffset; t.style.width = w + "px"; obj = ds.getCellObj(x, y); if (obj.data) { t.innerHTML = ds.wrapBIUS(x, y, obj); } else { t.innerHTML = " "; } var h = toy.getHeight(); return h; }, fitRow : function(x, onlyOne, notRefresh, autoHeight) { var ss = this.spreadsheet; var sm = ss.sm; delete sm.mdFlag; var ds = ss.ds; var rows = ds.data.rows; var flag, my = 0; var row = rows[x]; var rowHeader = ds.data.rowSetting[x]; for (var p in row) { if ("0" == p.toString()) { continue; } var cell = row[p]; if (cell && (!cell.wrap || cell.wrap.minx == cell.wrap.maxx && p == cell.wrap.miny && x == cell.wrap.minx)) { if (autoHeight || !rowHeader || !rowHeader.hchanged) { flag = true; var h = this.measureHeight(x, p); if (h > my) { my = h; } } } } if (flag) { var bh = ss.body.getHeight() - 20 - ss.scrollOffset; if (my > bh - 10) { my = bh - 10; } if (my < 20) { my = 20; } var fhg = ds.getRowHeight(x); if (fhg < my) { ss.xResizingRow(x, my, onlyOne, notRefresh, true); sm.resizeRowHeight = my; } } }, fitCol : function(y) { var ss = this.spreadsheet; var sm = ss.sm; delete sm.mdFlag; var toy = ss.toy; var t = toy.dom; var ds = ss.ds; var rows = ds.data.rows; var flag = false, mx = 0; for (var p in rows) { if ("0" == p.toString()) { continue; } var cell = rows[p][y]; if (cell && !cell.wrap) { flag = true; var obj = ds.getCell(p, y); t.style.cssText = "white-space:nowrap;"; if ("" != obj['font-size']) { t.style.cssText += obj['font-size']; } if ("" != obj['font-family']) { t.style.cssText += obj['font-family']; } t.style.height = "auto"; t.style.width = "auto"; t.innerHTML = obj.data; var w = toy.getWidth(); if (w > mx) { mx = w; } } } if (flag) { var w = mx + ss.xpaddingOffset; var bw = ss.body.getWidth() - ss.lcWidth - ss.scrollOffset; if (w > bw - 10) { w = bw - 10; } ss.yResizingCol(y, w); sm.resizeColWidth = w; } }, prepareTextCover : function(pos, v) { var ss = this.spreadsheet; var ds = ss.ds; var sm = ss.sm; var focusCover = sm.findFocusCover(); if (focusCover) { var x = pos.x, y = pos.y; ss.scroll2Show(x, y); var textCover = sm.getTextCover(); focusCover.appendChild(textCover); var size = ds.getCellSize(x, y); var w = size[0], h = size[1]; var obj = ds.getCell(x, y); var cssText = ""; if ("" != obj['font-size']) { cssText += obj['font-size']; } else { cssText += "line-height:10pt;"; } if ("" != obj['font-family']) { cssText += obj['font-family']; } if ("" != obj.color) { cssText += obj.color; } if ("" != obj.bg) { cssText += "background:" + obj.bg + ";"; } cssText += "white-space:nowrap;"; textCover.style.cssText = cssText; if (Ext.isIE) { w = focusCover.previousSibling.style.width; var idx = w.indexOf("px"); w = idx > 0 ? w.substring(0, idx) : w; w = Number(w) - 2; h -= 5; } else if (Ext.isChrome) { w -= 9; h -= 7; } else { w -= 3; h -= 4; } var textCoverEl = Ext.get(textCover); var mw = ss.body.getRight() - textCoverEl.getLeft(); var mh = ss.body.getBottom() - textCoverEl.getTop(); textCoverEl.setStyle("min-width", w + "px"); textCoverEl.setStyle("width", w + "px"); textCoverEl.setStyle("max-width", mw + "px"); textCoverEl.setStyle("min-height", h + "px"); textCoverEl.setStyle("height", h + "px"); textCoverEl.setStyle("max-height", mh + "px"); textCover.style.display = ""; textCover.value = v; textCover.pos = Ext.apply({}, pos); return textCover; } }, /**开始编辑*/ startEditing : function(pos, sv, where) { if ("db" != where) { this.movingFormulaFlag = true; } else { this.movingFormulaFlag = false; } where = "db"; var ss = this.spreadsheet; var sm = ss.sm, ds = ss.ds; pos.sheetIndex = ds.activeSheet; ss.resetCutStatus(); var ov = ss.getInnerText(pos.x, pos.y); if (!sv) { sv = ov; } if (true === sv) { sv = ""; } sv = sv || ""; if (sv == "") { delete this.inEditMode; } else { this.inEditMode = true; } sv = Ext.util.Format.htmlDecode(sv); var textCover = this.prepareTextCover(pos, sv); if (textCover) { textCover.ov = ov; textCover.where = where; textCover.focus(); if (!Ext.isGecko) { var len = textCover.value.length; Ext.ss.common.Mask.setCaretPosition(textCover, len, len); } } }, onTextCoverKeyUpFn : function(e) { var ss = this.spreadsheet; var sm = ss.sm; var textCover = sm.getTextCover(); if ("db" == textCover.where) { e.stopEvent(); } if (!this.formulaKeyFlag && e.ENTER != e.getKey()) { this.fireEvent("typeup", this); } }, onTextCoverClickFn : function(e) { this.inEditMode = true; delete this.movingFormulaFlag; }, onTextCoverKeyDownFn : function(e) { var ss = this.spreadsheet; var sm = ss.sm; var textCover = sm.getTextCover(); var key = e.getKey(), shift = e.shiftKey, ctrl = e.ctrlKey; var hk = ss.hotkey; if (Ext.EventObject.TAB != key) { e.stopPropagation(); } else { e.stopEvent(); } var v = textCover.value; this.formulaKeyFlag = false; var returnFlag; var formulaFlag = /^[=]/gi.test(v); if (sm.formulaEditing || formulaFlag) { sm.checkFormulaEditing(v); if (this.movingFormulaFlag) { if (Ext.EventObject.UP == key) { e.stopEvent(); if (this.dropList.isVisible()) { this.dropList.selectUp(); } else { if (1 < sm.selectedStart.x && 1 < sm.selectedEnd.x) { ss.getNearestFormulaSpan(); if (shift) { if (!this._lastShift) { this._lastShift = Ext .apply(sm.selectedStart); } if (this._lastShift.x == sm.selectedStart.x && this._lastShift.y == sm.selectedStart.y) { sm.selectedEnd.x--; } else { sm.selectedStart.x--; } } else { delete this._lastShift; sm.selectedStart.x--; sm.selectedEnd.x--; } sm.selectRange(null, sm.selectedStart, sm.selectedEnd); sm.updateFormulaRange(); } } returnFlag = true; this.formulaKeyFlag = true; } else if (Ext.EventObject.RIGHT == key) { e.stopEvent(); ss.getNearestFormulaSpan(); if (shift) { if (!this._lastShift) { this._lastShift = Ext.apply(sm.selectedStart); } if (this._lastShift.x == sm.selectedStart.x && this._lastShift.y == sm.selectedStart.y) { sm.selectedEnd.y++; } else { sm.selectedStart.y++; } } else { delete this._lastShift; sm.selectedStart.y++; sm.selectedEnd.y++; } sm.selectRange(null, sm.selectedStart, sm.selectedEnd); sm.updateFormulaRange(); returnFlag = true; } else if (Ext.EventObject.DOWN == key) { e.stopEvent(); if (this.dropList.isVisible()) { this.dropList.selectDown(); } else { ss.getNearestFormulaSpan(); if (shift) { if (!this._lastShift) { this._lastShift = Ext.apply(sm.selectedStart); } if (this._lastShift.x == sm.selectedStart.x && this._lastShift.y == sm.selectedStart.y) { sm.selectedEnd.x++; } else { sm.selectedStart.x++; } } else { delete this._lastShift; sm.selectedStart.x++; sm.selectedEnd.x++; } sm.selectRange(null, sm.selectedStart, sm.selectedEnd); sm.updateFormulaRange(); } returnFlag = true; this.formulaKeyFlag = true; } else if (Ext.EventObject.LEFT == key) { e.stopEvent(); if (1 < sm.selectedStart.y && 1 < sm.selectedEnd.y) { ss.getNearestFormulaSpan(); if (shift) { if (!this._lastShift) { this._lastShift = Ext.apply(sm.selectedStart); } if (this._lastShift.x == sm.selectedStart.x && this._lastShift.y == sm.selectedStart.y) { sm.selectedEnd.y--; } else { sm.selectedStart.y--; } } else { delete this._lastShift; sm.selectedStart.y--; sm.selectedEnd.y--; } sm.selectRange(null, sm.selectedStart, sm.selectedEnd); sm.updateFormulaRange(); } returnFlag = true; } } else if (this.dropList.isVisible()) { if (Ext.EventObject.UP == key) { e.stopEvent(); this.formulaKeyFlag = true; this.dropList.selectUp(); return; } else if (Ext.EventObject.DOWN == key) { e.stopEvent(); this.formulaKeyFlag = true; this.dropList.selectDown(); return; } } } if (returnFlag) { e.stopEvent(); var x = sm.selectedStart.x, y = sm.selectedStart.y; if (!sm.isInRange({ x : x, y : y })) { ss.scroll2Pos(x, y, [1, 1]); } return; } if (e.altKey && Ext.EventObject.ENTER == key) { if (document.selection) { textCover.focus(); sel = document.selection.createRange(); sel.text = "\n"; sel.select(); } else if (textCover.selectionStart || textCover.selectionStart == "0") { var startPos = textCover.selectionStart; var endPos = textCover.selectionEnd; textCover.value = textCover.value.substring(0, startPos) + "\n" + textCover.value.substring(endPos, textCover.value.length); textCover.focus(); } else { textCover.value += "\n"; textCover.focus(); } } else if (Ext.EventObject.ENTER == key) { if (this.dropList.isVisible() && this.dropList.isSelected()) { e.stopEvent(); this.dropList.selectFormula(); return; } else { textCover.style.display = "none"; if (sm.formulaEditing) { sm.fireEvent("formulaeditingchanged", true, false); } hk.onDownFn(); } } else if (Ext.EventObject.ESC == key) { textCover.value = textCover.ov; textCover.style.display = "none"; if (sm.formulaEditing) { if (this.dropList) { this.dropList.hide(); } sm.fireEvent("formulaeditingchanged", true, false); } sm.setFocusCell(sm.focusCell.x, sm.focusCell.y); } else if (Ext.EventObject.TAB != key) { if (!this.inEditMode) { if (Ext.EventObject.UP == key) { if (sm.formulaEditing) { sm.fireEvent("formulaeditingchanged", true, false); } hk.onUpFn(); } else if (Ext.EventObject.RIGHT == key) { if (sm.formulaEditing) { sm.fireEvent("formulaeditingchanged", true, false); } hk.onRightFn(); } else if (Ext.EventObject.DOWN == key) { if (sm.formulaEditing) { sm.fireEvent("formulaeditingchanged", true, false); } hk.onDownFn(); } else if (Ext.EventObject.LEFT == key) { if (sm.formulaEditing) { sm.fireEvent("formulaeditingchanged", true, false); } hk.onLeftFn(); } else { this.sysTyping.defer(1, this); } } else { this.sysTyping.defer(1, this); } } else if (Ext.EventObject.TAB == key) { if (sm.formulaEditing) { sm.fireEvent("formulaeditingchanged", true, false); } hk.onRightFn(); } if ((v == "" && key == 36 || key == 33 || key == 34) || ctrl && (key == 70 || 83 == key || 80 == key || 79 == key)) { e.stopEvent(); hk.onKeydownFn(e); } delete ss.cachedCursorPos; }, onTextCoverKeyPressFn : function(e) { e.stopPropagation(); var ss = this.spreadsheet; var sm = ss.sm; var textCover = sm.getTextCover(); var textCoverEl = Ext.get(textCover); var flag = sm.checkFormulaEditing(textCover.value); ss.focusObj = textCover; if (flag) { var text = ss.selectDataRange(); if (text) { ss.showDataRangeBorder(text); } } this.fireEvent("typing", textCoverEl); }, sysTyping : function() { var ss = this.spreadsheet; var sm = ss.sm; var textCover = sm.getTextCover(); ss.fxField.setValue(textCover.value); }, /**显示函数列表*/ showFormulaDropList : function() { var ss = this.spreadsheet, sm = ss.sm; var dropListEl = this.dropList.getEl(); var textCover = sm.getTextCover(); var cursorPos = Ext.ss.common.Mask.getCursorPos(textCover); var val = textCover.value; var fname; for (var i = cursorPos; 0 <= i; i--) { var ch = val.charAt(i); if (/[\,\=@\+\-\*\/\s\)\(]/gi.test(ch)) { this.startCursorPos = i + 1; this.endCursorPos = cursorPos; fname = val.slice(this.startCursorPos, cursorPos); break; } } if (fname) { var textCoverEl = Ext.get(textCover); var part = val.slice(0, cursorPos + 1); this.dropList.searchMatch(fname, textCoverEl, part); } }, showFieldList :function(){ var ss = this.spreadsheet, sm = ss.sm; var fieldListEl = this.fieldList.getEl(); var textCover = sm.getTextCover(); var fieldList=this.fieldList; var cursorPos = Ext.ss.common.Mask.getCursorPos(textCover); var val = textCover.value; var fname; for (var i = cursorPos; 0 <= i; i--) { var ch = val.charAt(i); if (/[\,\=#\+\-\*\/\s\)\(]/gi.test(ch)) { this.startCursorPos = i+1; this.endCursorPos = cursorPos; fname = val.slice(this.startCursorPos, cursorPos); break; } } if (true) { var textCoverEl = Ext.get(textCover); var part = val.slice(0, cursorPos +1); var id=Ext.getCmp('ds_id').getValue(); if(!FieldData&&id){ Ext.Ajax.request({ url: basePath+'ma/getFieldsByTable.action', method:'post', params: { id:id }, success: function(response){ var text = Ext.decode(response.responseText); FieldData=text.data; fieldList.store.loadData(FieldData); fieldList.searchMatch(fname, textCoverEl, part); } }); }else if(FieldData){ fieldList.store.loadData(FieldData); fieldList.searchMatch(fname, textCoverEl, part); } } }, //显示自定义函数列表 showFnList :function(){ var ss = this.spreadsheet, sm = ss.sm; var fnListEl = this.fnList.getEl(); var textCover = sm.getTextCover(); var fnList=this.fnList; var cursorPos = Ext.ss.common.Mask.getCursorPos(textCover); var val = textCover.value; var fname; for (var i = cursorPos; 0 <= i; i--) { var ch = val.charAt(i); if (/[\,\=&\+\-\*\/\s\)\(]/gi.test(ch)) { this.startCursorPos = i+1; this.endCursorPos = cursorPos; fname = val.slice(this.startCursorPos, cursorPos); break; } } if (true) { var textCoverEl = Ext.get(textCover); var part = val.slice(0, cursorPos +1); var id=Ext.getCmp('ds_id').getValue(); if(!FnData&&id){ Ext.Ajax.request({ url: basePath+'ma/getExcelFxsByTable.action', method:'post', params: { id:id }, success: function(response){ var text = Ext.decode(response.responseText); FnData=text.data; fnList.store.loadData(FnData); fnList.searchMatch(fname, textCoverEl, part); } }); }else if(FnData){ fnList.store.loadData(FnData); fnList.searchMatch(fname, textCoverEl, part); } } }, onTypingFn : function(ta) { this.autosizeTextArea(ta); }, /**判断是否 以"="开头*/ onTypeUpFn : function(ta) { var ss = this.spreadsheet; var sm = ss.sm; var textCover = sm.getTextCover(); var v = textCover.value; var formulaFlag = /^[=]/gi.test(v); //自定义规则 :处理列所有值 #开头标示显示到整列 var columnFlag =/=#/.test(v); var cellFlag =/=&/.test(v); sm.checkFormulaEditing(v); if (formulaFlag) { this.showFormulaDropList(); } else { if (this.dropList) { this.dropList.hide(); } } if(columnFlag){ this.showFieldList(); }if(cellFlag){ this.showFnList(); } }, autosizeTextArea : function(ta) { var ss = this.spreadsheet; var toy = ss.toy; var t = toy.dom; t.style.cssText = ta.dom.style.cssText; t.style.minWidth = "0px"; if ("nowrap" == ta.getStyle("white-space")) { t.style.width = "auto"; } t.style.wordWrap = "break-word"; t.style.height = "auto"; t.innerHTML = ta.dom.value; var innerWidth = toy.getWidth() + 10, innerHeight = toy.getHeight(); var taEl = Ext.get(ta), pEl = Ext.get(ta.dom.parentNode); var ctWidth = pEl.getWidth(), ctHeight = taEl.getHeight(); if (ctWidth < innerWidth) { if (ss.ylivescroller.getLeft() > ta.getLeft() + innerWidth + 15) { taEl.setWidth(innerWidth); } else { taEl.setWidth(ss.ylivescroller.getLeft() - ta.getLeft() - 15); taEl.setStyle("white-space", "normal"); } } else { taEl.setWidth(ctWidth - 6); } if (ctHeight < innerHeight && 24 < innerHeight) { taEl.setHeight(innerHeight); } }, onTextCoverFocusFn : function(e) { var ss = this.spreadsheet; var sm = ss.sm; var textCover = sm.getTextCover(); var flag = sm.checkFormulaEditing(textCover.value); ss.focusObj = textCover; if (flag) { var text = ss.selectDataRange(); if (text) { ss.showDataRangeBorder(text); } } }, onTextCoverBlurFn : function(e) { var ss = this.spreadsheet; var sm = ss.sm, ds = ss.ds; var textCover = sm.getTextCover(); var pos = textCover.pos; var v = textCover.value; if (v != textCover.ov) { if (Ext.ss.common.Mask.isFormula(v)) { if (pos.sheetIndex != ds.activeSheet) { ss.changeSheet(pos.sheetIndex); } var errInfo = Ext.ss.common.Mask.checkEmbrace(v); if (true !== errInfo) { var lan = feyaSoft.ss.lang; Ext.Msg.show({ title : lan.formulaError, msg : lan.bracketError + "\"" + errInfo + "\"", buttons : Ext.Msg.YESNO, fn : function(bid) { if ("yes" == bid) { v = errInfo; } this.resize2FitText(v, pos); this.fireEvent("complete", this, pos, v); }, scope : this, icon : Ext.MessageBox.QUESTION }); } else { this.resize2FitText(v, pos); this.fireEvent("complete", this, pos, v); } } else { this.resize2FitText(v, pos); this.fireEvent("complete", this, pos, v); } } textCover.style.display = "none"; var pnode = Ext.get(textCover).parent().parent(); var labelEl = pnode.child(".x-spreadsheet-focus-label"); if (labelEl) { Ext.removeNode(labelEl.dom); } sm.transferFocus(); if (this.dropList) { this.dropList.hide(); } delete ss.fxCell; var focusCell = sm.focusCell; ss.stateField.setValue(ds.getLetter(focusCell.y) + focusCell.x); }, resize2FitText : function(v, pos) { var ss = this.spreadsheet; var ds = ss.ds; if (false == Ext.type(pos.sheetIndex)) { pos.sheetIndex = ds.activeSheet; } var x = pos.x, y = pos.y, sheetIndex = pos.sheetIndex; var tmp = ds.activeSheet; ds.activeSheet = sheetIndex; ds.data = ds.sheets[sheetIndex]; v = ss.setInnerText(v, x, y, tmp !== sheetIndex); ds.activeSheet = tmp; ds.data = ds.sheets[tmp]; return true; }, selectFormulaFromDropList : function(formula, isNameMgr) { var ss = this.spreadsheet, sm = ss.sm; var textCover = sm.getTextCover(); console.log(textCover); var val = textCover.value, len = val.length; var pre = val.slice(0, this.startCursorPos), pos = val.slice( this.endCursorPos, len); if (isNameMgr == true) { textCover.value = pre + formula + pos; } else { textCover.value = pre + formula + "(" + pos; } len = textCover.value.length; console.log(len); Ext.ss.common.Mask.setCaretPosition(textCover, len, len); }, /**选中Field*/ selectFieldFromDropList : function(field, isNameMgr) { var ss = this.spreadsheet, sm = ss.sm; var textCover = sm.getTextCover(); var val = textCover.value, len = val.length; var pre = val.slice(0, this.startCursorPos), pos = val.slice( this.endCursorPos, len); textCover.value="#"+field+"&"+isNameMgr; /**if (isNameMgr == true) { textCover.value = pre + field + pos; } else { textCover.value = pre + field + "(" + pos; }**/ len = textCover.value.length; Ext.ss.common.Mask.setCaretPosition(textCover, len, len); }, selectFnFromDropList : function(fn, isNameMgr) { var ss = this.spreadsheet, sm = ss.sm; var textCover = sm.getTextCover(); var val = textCover.value, len = val.length; var pre = val.slice(0, this.startCursorPos), pos = val.slice( this.endCursorPos, len); textCover.value="Fn."+fn+"&"+isNameMgr; /**if (isNameMgr == true) { textCover.value = pre + field + pos; } else { textCover.value = pre + field + "(" + pos; }**/ len = textCover.value.length; Ext.ss.common.Mask.setCaretPosition(textCover, len, len); }, getSelectionValue : function() { var ss = this.spreadsheet, sm = ss.sm; var selectedText; var textFiled = sm.getTextCover(); var value = textFiled.value; if (document.selection && document.selection.type == "Text") { selectedText = document.selection.createRange().text; try { document.selection.empty(); } catch (e) { } } else if (textFiled.selectionStart != undefined && textFiled.selectionEnd != undefined && textFiled.selectionStart != textFiled.selectionEnd) { var start = textFiled.selectionStart; var end = textFiled.selectionEnd; var selPoint = value.length - 1; selectedText = value.substring(start, end); textFiled.selectionStart = selPoint; textFiled.selectionEnd = selPoint; try { textFiled.setSelectionRange(selPoint, selPoint); } catch (e) { } } return selectedText; }, fxShowFormulaDropList : function(val, fxFiled) { var ss = this.spreadsheet, sm = ss.sm; var dropListEl = this.dropList.getEl(); var cursorPos = Ext.ss.common.Mask.getCursorPos(fxFiled.el.dom); var fname; for (var i = cursorPos; 0 <= i; i--) { var ch = val.charAt(i); if (/[\,\=\+\-\*\/\s\)]/gi.test(ch)) { this.startCursorPos = i + 1; this.endCursorPos = cursorPos; fname = val.slice(this.startCursorPos, cursorPos); break; } } if (fname) { this.dropList.searchMatch(fname, fxFiled.el); } else { this.dropList.hide(); } }, fxInputEnter : function(fxfield) { var dp = this.dropList; var ss = this.spreadsheet, sm = ss.sm; var rds = dp.view.getSelectedRecords(); if (rds.length > 0) { var rd = rds[0]; fxfield.setValue("=" + rd.get("id") + "("); dp.hide(); } else { ss.enterFx(); } } }); Ext.ns("Ext.ss"); Ext.ss.FunctionBox = { precisionDigital : 3, acos : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon(arguments, "acos"); }, cos : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon(arguments, "cos"); }, asin : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon(arguments, "asin"); }, sin : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon(arguments, "sin"); }, atan : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon(arguments, "atan"); }, tan : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon(arguments, "tan"); }, isblank : function() { return Ext.ss.common.FunctionBoxHelper.statisticalCommon(arguments, "isblank"); }, isnumber : function() { return Ext.ss.common.FunctionBoxHelper.statisticalCommon(arguments, "isnumber"); }, istext : function() { return Ext.ss.common.FunctionBoxHelper.statisticalCommon(arguments, "istext"); }, islogical : function() { return Ext.ss.common.FunctionBoxHelper.statisticalCommon(arguments, "islogical"); }, n : function() { return Ext.ss.common.FunctionBoxHelper .statisticalCommon(arguments, "n"); }, odd : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon2(arguments, "odd"); }, even : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon2(arguments, "even"); }, abs : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon2(arguments, "abs"); }, sqrt : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon2(arguments, "sqrt"); }, sqrtpi : function() { return Ext.ss.common.FunctionBoxHelper .aMathCommon2(arguments, "sqrtpi"); }, degrees : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon2(arguments, "degrees"); }, exp : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon2(arguments, "exp"); }, fact : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon2(arguments, "fact"); }, 'int' : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon2(arguments, "int"); }, radians : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon2(arguments, "radians"); }, iseven : function() { return Ext.ss.common.FunctionBoxHelper .aMathCommon2(arguments, "iseven"); }, isodd : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon2(arguments, "isodd"); }, sign : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon2(arguments, "sign"); }, count : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon3(arguments, "count"); }, counta : function() { return Ext.ss.common.FunctionBoxHelper .aMathCommon3(arguments, "counta"); }, countblank : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon3(arguments, "countblank"); }, floor : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon4(arguments, "floor"); }, ceiling : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon4(arguments, "ceiling"); }, mod : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon4(arguments, "mod"); }, randbetween : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon4(arguments, "randbetween"); }, quotient : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon4(arguments, "quotient"); }, atan2 : function() { return Ext.ss.common.FunctionBoxHelper.aMathCommon4(arguments, "atan2"); }, round : function() { return Ext.ss.common.FunctionBoxHelper.aMathRound(arguments, "round"); }, rounddown : function() { return Ext.ss.common.FunctionBoxHelper.aMathRound(arguments, "rounddown"); }, roundup : function() { return Ext.ss.common.FunctionBoxHelper.aMathRound(arguments, "roundup"); }, upper : function() { return Ext.ss.common.FunctionBoxHelper.stringComm1(arguments, "upper"); }, lower : function() { return Ext.ss.common.FunctionBoxHelper.stringComm1(arguments, "lower"); }, len : function() { return Ext.ss.common.FunctionBoxHelper.stringComm1(arguments, "len"); }, 'true' : function() { if (4 == arguments.length) { return "TRUE"; } throw "SS_ERROR_NA"; }, 'false' : function() { if (4 == arguments.length) { return "FALSE"; } throw "SS_ERROR_NA"; }, pi : function() { if (arguments.length != 4) { throw "SS_ERROR_NA"; } return Math.PI; }, rand : function() { if (arguments.length != 4) { throw "SS_ERROR_NA"; } return Math.random(); }, value : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (1 != len) { throw "SS_ERROR_NA"; } var val = arguments[0]; val = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, val); if (val === undefined || Ext.ss.common.Mask.isEmptyStr(val)) { throw "SS_ERROR_VALUE"; } var checkDate = ds.prepareDate(val); if (checkDate) { val = Ext.ss.common.Helper.convertDateToNum(checkDate); return val; } var num = Number(val); if (!Ext.isNumber(num)) { throw "SS_ERROR_VALUE"; } return num; }, text : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (2 != len) { throw "SS_ERROR_NA"; } var val = arguments[0], fm = arguments[1]; val = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, val); fm = Ext.ss.common.FunctionBoxHelper .getObjVal(ds, x, y, sheetIndex, fm); var num = Number(val); if (!Ext.isNumber(num)) { if (fm && Ext.isString(fm) && fm.length > 3) { fm = fm.replace(/yyyy/i, "Y").replace(/dd/i, "d").replace( /mmm/gi, "M").replace(/mm/gi, "m").replace(/hh/i, "h"); if (fm.indexOf(":m") != -1) { fm = fm.replace(/:m/i, ":i"); } } var checkDate = ds.prepareDateStr(val, fm); if (checkDate && false != checkDate) { return checkDate + " "; } else { return val + "
"; } } else { var txt = Ext.ss.common.FunctionBoxHelper.formatNumber(val, fm); return txt + "
"; } }, rept : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (2 != len) { throw "SS_ERROR_NA"; } var txt = arguments[0], times = arguments[1]; txt = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, txt); times = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, times); times = Number(times); if (Ext.isNumber(times)) { if (0 > times) { throw "SS_ERROR_VALUE"; } else if (0 == times) { return ""; } } else { throw "SS_ERROR_VALUE"; } if (Ext.isNumber(txt) || Ext.isString(txt)) { txt = txt.toString(); var arr = []; for (var i = 0; i < times; i++) { arr.push(txt); } return arr.join(""); } else { throw "SS_ERROR_VALUE"; } }, find : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (2 > len || 3 < len) { throw "SS_ERROR_NA"; } var source = arguments[0], target = arguments[1], start = 2 == len ? 0 : arguments[2]; target = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, target); if (target === undefined || Ext.ss.common.Mask.isEmptyStr(target)) { throw "SS_ERROR_VALUE"; } source = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, source); if (source === undefined || Ext.ss.common.Mask.isEmptyStr(source)) { throw "SS_ERROR_VALUE"; } start = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, start); if ((Ext.isNumber(source) || Ext.isString(source)) && (Ext.isNumber(target) || Ext.isString(target))) { source = source.toString(); target = target.toString(); if (0 < start) { start = start - 1; target = target.slice(start, target.length); } else { start = 0; } var index = target.indexOf(source); if (-1 == index) { throw "SS_ERROR_VALUE"; } return index + 1 + start; } else { throw "SS_ERROR_VALUE"; } }, mid : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (3 != len) { throw "SS_ERROR_NA"; } var str = arguments[0], pos = arguments[1], leng = arguments[2]; str = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, str); if (str === undefined || Ext.ss.common.Mask.isEmptyStr(str)) { throw "SS_ERROR_VALUE"; } pos = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, pos); leng = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, leng); if ((Ext.isNumber(str) || Ext.isString(str)) && Ext.isNumber(pos) && Ext.isNumber(leng)) { str = str.toString(); if (0 < pos && leng >= 0) { return str.substr(pos - 1, leng); } else { throw "SS_ERROR_VALUE"; } } else { throw "SS_ERROR_VALUE"; } }, date : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (3 != len) { throw "SS_ERROR_NA"; } var year = arguments[0], month = arguments[1], day = arguments[2]; year = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, year); month = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, month); day = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, day); var date = new Date(year, month - 1, day); if (date) { return date.format("m/d/Y"); } else { throw "SS_ERROR_VALUE"; } }, today : function() { if (4 == arguments.length) { var today = new Date; today = today.format("m/d/Y"); return today; } else { throw "SS_ERROR_NA"; } }, weekday : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (1 != len && 2 != len) { throw "SS_ERROR_NA"; } var enterDate = arguments[0]; var retVal = 1; if (len == 2) { retVal = arguments[1]; retVal = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, retVal); } if (retVal === undefined) { throw "SS_ERROR_NUM"; } if (retVal != 1 && retVal != 2 && retVal != 3) { throw "SS_ERROR_NUM"; } enterDate = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, enterDate); if (enterDate === undefined || Ext.ss.common.Mask.isEmptyStr(enterDate)) { throw "SS_ERROR_NUM"; } var checkDate = ds.prepareDate(enterDate); if (checkDate) { var result = checkDate.getDay(); if (retVal == 1) { result += 1; } if (retVal == 2 && result == 0) { result = 7; } if (retVal == 3) { result -= 1; if (result == -1) { result = 6; } } return result; } else { throw "SS_ERROR_VALUE"; } }, concatenate : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (0 == len) { throw "SS_ERROR_NA"; } var res = []; for (var k = 0; k < len; k++) { var posOffset = arguments[k]; if (Ext.isObject(posOffset)) { var tmp = Ext.ss.common.FunctionBoxHelper.getRangeVal(ds, x, y, sheetIndex, posOffset); res = res.concat(tmp); } else { if (Ext.isArray(posOffset)) { res = res.concat(posOffset); } else if (false != Ext.type(posOffset)) { var str = posOffset.toString(); if (str) { res.push(str); } } } } return res.join(""); }, year : function() { var len = arguments.length; var ds = arguments[len - 1]; var y = arguments[len - 2]; var x = arguments[len - 3]; var sheetIndex = arguments[len - 4]; len -= 4; if (1 != len) { throw "SS_ERROR_NA"; } var pos = arguments[0]; var val = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, pos); if (Number(val) < 0) { throw "SS_ERROR_NUM"; } var arr = Ext.ss.common.Mask.dateFormats; for (var i = 0, len = arr.length; i < len; i++) { var f = arr[i]; try { var date = Date.parseDate(val, f); if (date.format(f) == val) { return date.getFullYear(); } } catch (e) { } } if (Ext.isNumber(Number(val))) { var myDate = new Date; myDate.setFullYear(1900, 0, val); if (myDate.getFullYear() > 9999) { throw "SS_ERROR_NUM"; } return myDate.getFullYear(); } else { throw "SS_ERROR_NA"; } }, month : function() { var len = arguments.length; var ds = arguments[len - 1]; var y = arguments[len - 2]; var x = arguments[len - 3]; var sheetIndex = arguments[len - 4]; len -= 4; if (1 != len) { throw "SS_ERROR_NA"; } var pos = arguments[0]; var val = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, pos); if (Number(val) < 0) { throw "SS_ERROR_NUM"; } var arr = Ext.ss.common.Mask.dateFormats; for (var i = 0, len = arr.length; i < len; i++) { var f = arr[i]; try { var date = Date.parseDate(val, f); if (date.format(f) == val) { return date.getMonth() + 1; } } catch (e) { } } if (Ext.isNumber(Number(val))) { var myDate = new Date; myDate.setFullYear(1900, 0, val); if (myDate.getFullYear() > 9999) { throw "SS_ERROR_NUM"; } return myDate.getMonth() + 1; } throw "SS_ERROR_NA"; }, combin : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (2 != len) { throw "SS_ERROR_NA"; } var number = arguments[0], choose = arguments[1]; var number = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, number); var choose = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, choose); var sum1 = 1, sum2 = 1; for (var i = Math.floor(number); i > Math.floor(number) - Math.floor(choose); i--) { sum1 = sum1 * i; } for (var i = 1; i <= Math.floor(choose); i++) { sum2 = sum2 * i; } return Math.floor(sum1 / sum2); }, offset : function() { var len = arguments.length; var ds = arguments[len - 1]; var y = arguments[len - 2]; var x = arguments[len - 3]; var sheetIndex = arguments[len - 4]; len -= 4; if (3 <= len && len <= 5) { var originPos = arguments[0]; if (Ext.isObject(originPos)) { originPos = Ext.apply({}, originPos); ds.fireEvent("project", ds, { x : x, y : y }, { ox : originPos.ox, oy : originPos.oy }, { ox : originPos.oex, oy : originPos.oey }); var rowOffset = arguments[1], colOffset = arguments[2], rowLen, colLen; if (4 <= len) { rowLen = arguments[3]; } if (5 == len) { colLen = arguments[4]; } if (Ext.isObject(rowOffset)) { rowOffset = Ext.ss.common.FunctionBoxHelper.getNumObjValue( ds, x, y, sheetIndex, rowOffset); } rowOffset = Number(rowOffset); if (!Ext.isNumber(rowOffset)) { throw "SS_ERROR_VALUE"; } if (Ext.isObject(colOffset)) { colOffset = Ext.ss.common.FunctionBoxHelper.getNumObjValue( ds, x, y, sheetIndex, colOffset); } colOffset = Number(colOffset); if (!Ext.isNumber(colOffset)) { throw "SS_ERROR_VALUE"; } if (Ext.isObject(rowLen)) { rowLen = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, rowLen); } if (Ext.isObject(colLen)) { colLen = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, colLen); } originPos.ox += rowOffset; originPos.oex += rowOffset; originPos.oy += colOffset; originPos.oey += colOffset; if (Ext.isDefined(rowLen)) { rowLen = Number(rowLen); if (Ext.isNumber(rowLen) && 0 < rowLen) { originPos.oex = originPos.ox + rowLen - 1; } else { throw "SS_ERROR_VALUE"; } } if (Ext.isDefined(colLen)) { rowLen = Number(colLen); if (Ext.isNumber(colLen) && 0 < colLen) { originPos.oey = originPos.oy + colLen - 1; } else { throw "SS_ERROR_VALUE"; } } return originPos; } else { throw "#PARAM_ERROR"; } } else { throw "SS_ERROR_NA"; } }, indirect : function() { var len = arguments.length; var ds = arguments[len - 1]; var y = arguments[len - 2]; var x = arguments[len - 3]; var sheetIndex = arguments[len - 4]; len -= 4; if (len != 1) { throw "SS_ERROR_NA"; } var txt = arguments[0]; var value; if (Ext.isObject(txt)) { value = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, txt); } else { var pos = ds.parseText2Pos(txt); value = ds.getCellValue(pos.x, pos.y, sheetIndex); } if (!value) { value = ""; } return value; }, areas : function() { var len = arguments.length; var ds = arguments[len - 1]; var y = arguments[len - 2]; var x = arguments[len - 3]; var sheetIndex = arguments[len - 4]; if (len - 4 == 0) { throw "SS_ERROR_NA"; } var n = 0; var fn = function(args) { for (var i = 0, len = args.length; i < len; i++) { var arg = args[i]; if (Ext.isObject(arg)) { if (Ext.isDefined(arg.ox)) { n++; } } else if (Ext.isArray(arg)) { fn(arg); } } }; fn(arguments); return n; }, index : function() { var len = arguments.length; var ds = arguments[len - 1]; var y = arguments[len - 2]; var x = arguments[len - 3]; var sheetIndex = arguments[len - 4]; len -= 4; if (0 < len && len <= 4) { var areas = arguments[0], rowIndex, colIndex, areaIndex; if (1 == len) { rowIndex = 1; colIndex = 1; areaIndex = 1; } else if (2 == len) { rowIndex = arguments[1]; colIndex = 1; areaIndex = 1; } else if (3 == len) { rowIndex = arguments[1]; colIndex = arguments[2]; areaIndex = 1; } else if (4 == len) { rowIndex = arguments[1]; colIndex = arguments[2]; areaIndex = arguments[3]; } if (Ext.isObject(rowIndex)) { rowIndex = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, rowIndex); if (1 > rowIndex) { throw "SS_ERROR_VALUE"; } } else { rowIndex = Number(rowIndex); if (!Ext.isNumber(rowIndex) || 1 > rowIndex) { throw "SS_ERROR_VALUE"; } } if (Ext.isObject(colIndex)) { colIndex = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, colIndex); if (!Ext.isNumber(colIndex) || 1 > colIndex) { throw "SS_ERROR_VALUE"; } } else { colIndex = Number(colIndex); if (!Ext.isNumber(colIndex)) { throw "SS_ERROR_VALUE"; } } if (Ext.isObject(areaIndex)) { areaIndex = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, areaIndex); } else { areaIndex = Number(areaIndex); if (!Ext.isNumber(areaIndex)) { throw "SS_ERROR_VALUE"; } } if (Ext.isObject(areas) && 1 == areaIndex) { ds.fireEvent("project", ds, { x : x, y : y }, { ox : areas.ox, oy : areas.oy }, { ox : areas.oex, oy : areas.oey }); var minx = areas.ox + x, miny = areas.oy + y, maxx = areas.oex + x, maxy = areas.oey + y; ds.checkSheetIndexValid(areas.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(areas.sheetIndex)) { curSheetIndex = areas.sheetIndex; } var row = minx + rowIndex - 1, col = miny + colIndex - 1; if (row <= maxx && col <= maxy) { var rest = ds.getCellValue(row, col, curSheetIndex); if (Ext.isNumber(Number(rest))) { return Number(rest); } else { return rest; } } else { throw "SS_ERROR_VALUE"; } } else if (Ext.isArray(areas) && areaIndex <= areas.length) { var area; for (var i = 0, count = areas.length; i < count; i++) { area = areas[i]; ds.fireEvent("project", ds, { x : x, y : y }, { ox : area.ox, oy : area.oy }, { ox : area.oex, oy : area.oey }); } area = areas[areaIndex - 1]; var minx = area.ox + x, miny = area.oy + y, maxx = area.oex + x, maxy = area.oey + y; var row = minx + rowIndex - 1, col = miny + colIndex - 1; ds.checkSheetIndexValid(areas.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(areas.sheetIndex)) { curSheetIndex = areas.sheetIndex; } if (row <= maxx && col <= maxy) { var rest = ds.getCellValue(row, col, curSheetIndex); if (Ext.isNumber(Number(rest))) { return Number(rest); } else { return rest; } } else { throw "SS_ERROR_VALUE"; } } else { throw "SS_ERROR_VALUE"; } } else { throw "SS_ERROR_NA"; } }, trim : function() { var len = arguments.length; var ds = arguments[len - 1]; var y = arguments[len - 2]; var x = arguments[len - 3]; var sheetIndex = arguments[len - 4]; len -= 4; if (1 != len) { throw "SS_ERROR_NA"; } var cell = arguments[0]; if (Ext.isObject(cell)) { cell = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, cell); } cell = cell.toString(); if (Ext.isDefined(cell) && "" !== cell) { return cell.trim(); } if (cell == "") { return ""; } throw "SS_ERROR_VALUE"; }, sumproduct : function() { var len = arguments.length; var ds = arguments[len - 1]; var y = arguments[len - 2]; var x = arguments[len - 3]; var sheetIndex = arguments[len - 4]; len -= 4; if (0 == len) { throw "SS_ERROR_NA"; } var varArrs = []; for (var k = 0; k < len; k++) { var posOffset = arguments[k]; if (Ext.isObject(posOffset)) { var tempArr = Ext.ss.common.FunctionBoxHelper.getNumRangeVal( ds, x, y, sheetIndex, posOffset); if (tempArr.length > 0) { varArrs.push(tempArr); } } else { if (posOffset.length != null) { var tmAry = Ext.ss.common.FunctionBoxHelper .restructureArray(posOffset, x, y, sheetIndex, ds); varArrs.push(tmAry); } else { var num = Number(posOffset); varArrs.push([num]); } } } if (varArrs.length > 0) { var basicLen = varArrs[0].length; for (var m = 0; m < varArrs.length; m++) { if (varArrs[m].length != basicLen) { varArrs = []; throw "SS_ERROR_VALUE"; } } var total = 0; for (var t = 0; t < varArrs[0].length; t++) { var result = 1; for (var c = 0; c < varArrs.length; c++) { if (!Ext.isNumber(varArrs[c][t])) { throw "SS_ERROR_VALUE"; } result *= varArrs[c][t]; } total += result; } varArrs = []; return total; } varArrs = []; throw "SS_ERROR_VALUE"; }, gcd : function() { var arr = []; var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len == 0) { throw "SS_ERROR_NA"; } var res = 0; for (var k = 0; k < len; k++) { var posOffset = arguments[k]; if (Ext.isObject(posOffset)) { var ary = Ext.ss.common.FunctionBoxHelper.getNumRangeVal(ds, x, y, sheetIndex, posOffset); for (var i = 0; i < ary.length; i++) { var num = Number(ary[i]); if (num < 0) { throw "SS_ERROR_NUM"; } if (!Ext.isNumber(num)) { throw "SS_ERROR_VALUE"; } arr.push(Math.floor(num)); } } else { var num = Number(posOffset); if (Ext.isNumber(num)) { if (num < 0) { throw "SS_ERROR_NUM"; } arr.push(Math.floor(num)); } else { throw "SS_ERROR_VALUE"; } } } arr.sort(function(a, b) { return a - b; }); res = arr[0]; while (res > 0) { var counts = 0; for (i = 0; i < arr.length; i++) { if (arr[i] % res == 0) { counts++; } } if (counts == arr.length) { break; } res--; } return res; }, lcm : function() { var len = arguments.length; var ds = arguments[len - 1]; var y = arguments[len - 2]; var x = arguments[len - 3]; var sheetIndex = arguments[len - 4]; len -= 4; if (0 == len) { throw "SS_ERROR_NA"; } var arr = []; for (var k = 0; k < len; k++) { var pos = arguments[k]; if (Ext.isObject(pos)) { var ary = Ext.ss.common.FunctionBoxHelper.getRangeVal(ds, x, y, sheetIndex, pos); for (var i = 0; i < ary.length; i++) { Ext.ss.common.FunctionBoxHelper.checkErrorCode(ary[i]); if (ary[i] != "") { var num = Number(ary[i]); if (Ext.isNumber(num)) { arr.push(Math.floor(num)); } else if (ary[i] != undefined) { throw "SS_ERROR_VALUE"; } } } } else { if (pos === undefined || Ext.ss.common.Mask.isEmptyStr(pos)) { throw "SS_ERROR_VALUE"; } var num = Number(pos); if (Ext.isNumber(num)) { arr.push(Math.floor(pos)); } else { throw "SS_ERROR_VALUE"; } } } var size = arr.length; if (size == 0) { throw "SS_ERROR_VALUE"; } for (var i = 0; i < size; i++) { if (arr[i] < 0 || arr[i] == null) { throw "SS_ERROR_NUM"; } } if (1 == size) { return arr[0]; } else if (1 < size) { var obj = {}; for (var i = 0; i < size; i++) { if (arr[i] == 0 || arr[i] == "") { return 0; } obj[arr[i]] = true; } var fn = function(num) { var fcs = {}; for (var f = 2; f <= num;) { if (0 == num % f) { fcs[f] = fcs[f] || 0; fcs[f]++; num = num / f; } else { f++; } } if (1 != num) { fcs[num] = fcs[num] || 0; fcs[num]++; } return fcs; }; var all = {}; for (var p in obj) { var num = Math.abs(p); if (num > 999999999999999) { throw "SS_ERROR_VALUE"; } var parts = fn(num); for (var q in parts) { if (parts[q] > 999999999999999) { throw "SS_ERROR_VALUE"; } if (!Ext.isDefined(all[q])) { all[q] = parts[q]; } else if (all[q] < parts[q]) { all[q] = parts[q]; } } } var ret = 1; for (var p in all) { ret *= Math.pow(p, all[p]); } return ret; } }, mode : function() { var len = arguments.length; var ds = arguments[len - 1]; var y = arguments[len - 2]; var x = arguments[len - 3]; var sheetIndex = arguments[len - 4]; len -= 4; if (len == 0) { throw "SS_ERROR_NA"; } var arr = []; for (var k = 0; k < len; k++) { var pos = arguments[k]; if (Ext.isObject(pos)) { var tempArr = Ext.ss.common.FunctionBoxHelper.getRangeVal(ds, x, y, sheetIndex, pos); for (var i = 0; i < tempArr.length; i++) { Ext.ss.common.FunctionBoxHelper.checkErrorCode(tempArr[i]); } if (tempArr.length > 0) { arr = arr.concat(tempArr); } } else { pos = Number(pos); if (Ext.isNumber(pos)) { arr.push(pos); } } } var size = arr.length; if (0 == size) { throw "SS_ERROR_VALUE"; } else if (2 > size) { throw "SS_ERROR_NA"; } else if (2 == size) { if (arr[0] == arr[1]) { return arr[0]; } throw "SS_ERROR_NA"; } else { var obj = {}; for (var i = 0; i < size; i++) { obj[arr[i]] = obj[arr[i]] || 0; obj[arr[i]]++; } var max = -1, val; for (var p in obj) { if (max < obj[p]) { val = p; max = obj[p]; } } if (1 >= max) { throw "SS_ERROR_NA"; } return val; } }, median : function() { var len = arguments.length; var ds = arguments[len - 1]; var y = arguments[len - 2]; var x = arguments[len - 3]; var sheetIndex = arguments[len - 4]; len -= 4; if (0 == len) { throw "SS_ERROR_NA"; } var arr = []; for (var k = 0; k < len; k++) { var pos = arguments[k]; if (Ext.isObject(pos)) { var tempArr = Ext.ss.common.FunctionBoxHelper.getRangeVal(ds, x, y, sheetIndex, pos); for (var i = 0; i < tempArr.length; i++) { Ext.ss.common.FunctionBoxHelper.checkErrorCode(tempArr[i]); var num = Number(tempArr[i]); if (Ext.isNumber(num)) { arr.push(num); } } } else { pos = Number(pos); if (Ext.isNumber(pos)) { arr.push(pos); } } } var size = arr.length; if (0 == size) { throw "SS_ERROR_VALUE"; } else if (size == 1) { if (!Ext.ss.common.Mask.isNumber(arr[0])) { throw "SS_ERROR_VALUE"; } return arr[0]; } else if (size == 2) { if (!Ext.ss.common.Mask.isNumber(arr[0]) && !Ext.ss.common.Mask.isNumber(arr[1])) { throw "SS_ERROR_VALUE"; } var sum = arr[0] + arr[1]; return Math.round(sum / size * 100) / 100; } else { arr.sort(function(a, b) { return a - b; }); if (0 == size % 2) { var mid = Math.floor(size / 2); return (arr[mid] + arr[mid - 1]) / 2; } else { var mid = Math.floor(size / 2); return arr[mid]; } } }, countif : function() { var len = arguments.length; var ds = arguments[len - 1]; var y = arguments[len - 2]; var x = arguments[len - 3]; var sheetIndex = arguments[len - 4]; len -= 4; if (len < 2 && len > 3) { throw "SS_ERROR_NA"; } var range = arguments[0], criteria = arguments[1], append = null, result = 0; criteria = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, criteria); if (3 == len) { append = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, arguments[2]); criteria = criteria + append; } range = Ext.ss.common.FunctionBoxHelper.getRangeVal(ds, x, y, sheetIndex, range); var compareFlag = /^\s*[!<>=]/gi.test(criteria.toString()); for (var i = 0; i < range.length; i++) { var tempValue = range[i]; var flag = false; if (compareFlag) { if (Ext.isNumber(Number(tempValue))) { flag = eval(tempValue + criteria); } else { flag = eval("\"" + tempValue + "\"" + criteria); } } else { if (tempValue == null) { tempValue = ""; } if (1 == Ext.ss.common.Mask.shExpMatch_KMP( tempValue.toString(), criteria.toString())) { flag = true; } } if (flag) { result++; } } return result; }, columns : function() { var len = arguments.length; var ds, x, y, index, sheetIndex; if (5 == len) { ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; var posOffset = arguments[0]; if (Ext.isObject(posOffset)) { var miny = parseInt(posOffset.oy), maxy = parseInt(posOffset.oey); return maxy - miny + 1; } } throw "SS_ERROR_NA"; }, column : function() { var len = arguments.length; var ds, x, y, sheetIndex, index; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; if (5 == len) { var posOffset = arguments[0]; if (Ext.isObject(posOffset)) { var i = parseInt(posOffset.ox) + x, j = parseInt(posOffset.oy) + y; return j; } } else if (4 == len) { var i = x, j = y; return j; } throw "SS_ERROR_NA"; }, rows : function() { var len = arguments.length; var ds, x, y, sheetIndex, index; if (5 == len) { ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; var posOffset = arguments[0]; if (Ext.isObject(posOffset)) { var minx = parseInt(posOffset.ox), maxx = parseInt(posOffset.oex); return maxx - minx + 1; } } throw "#PARAM_ERROR"; }, row : function() { var len = arguments.length; var ds, x, y, sheetIndex, index; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; if (5 == len) { var posOffset = arguments[0]; if (Ext.isObject(posOffset)) { var i = parseInt(posOffset.ox) + x, j = parseInt(posOffset.oy) + y; return i; } } else if (4 == len) { var i = x; return i; } throw "SS_ERROR_NA"; }, choose : function() { var len = arguments.length; var ds, x, y, sheetIndex, index; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (0 == len) { throw "SS_ERROR_NA"; } var rows = ds.data.rows; var indexPos = arguments[0]; indexPos = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, indexPos); if (0 < indexPos && indexPos < len) { var result = arguments[indexPos]; result = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, result); return result; } else { throw "SS_ERROR_VALUE"; } }, trunc : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (0 == len || len > 2) { throw "SS_ERROR_NA"; } var digital = arguments[1]; digital = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, digital); var posOffset = arguments[0]; posOffset = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, posOffset); if (posOffset === undefined) { return 0; } if (!digital || digital == undefined) { digital = 0; posOffset += ""; var nDx = posOffset.indexOf("."); if (nDx == 0) { return 0; } else if (nDx > 0) { posOffset = posOffset.substring(0, nDx); } } var num = Number(posOffset); digital = Number(digital); if (!Ext.isNumber(digital) || !Ext.isNumber(num) || Ext.ss.common.Mask.isEmptyStr(posOffset)) { throw "SS_ERROR_VALUE"; } else if (num == 0 || digital < 0) { return 0; } if (digital > 0) { var maxIdx = 10; if (num < 0) { maxIdx = 11; } num += ""; var base = Math.floor(digital); var idx = num.indexOf("."); if (idx > -1) { var leg = num.length; if (idx >= maxIdx) { num = Math.round(num); } else { if (leg - idx - 1 > base) { var a = "1"; for (var k = 0; k < base - 1; k++) { a += "0"; } a = Number(a); num = num.substring(0, idx + base + 1); if (maxIdx - 1 == idx) { num = parseFloat(Math.round(num * a)) / a; } } else { var a = "1"; for (var k = 0; k < maxIdx - idx; k++) { a += "0"; } a = Number(a); num = num.substring(0, maxIdx + 2); num = parseFloat(Math.round(num * a)) / a; } } } } return num; }, product : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (0 == len) { throw "SS_ERROR_NA"; } var res = 1; var allArgsNaN = true; for (var k = 0; k < len; k++) { var posOffset = arguments[k]; if (Ext.isObject(posOffset)) { ds.fireEvent("project", ds, { x : x, y : y }, { ox : posOffset.ox, oy : posOffset.oy }, { ox : posOffset.oex, oy : posOffset.oey }); var minx = parseInt(posOffset.ox) + x, maxx = parseInt(posOffset.oex) + x, miny = parseInt(posOffset.oy) + y, maxy = parseInt(posOffset.oey) + y; ds.checkSheetIndexValid(posOffset.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(posOffset.sheetIndex)) { curSheetIndex = posOffset.sheetIndex; } for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= maxy; j++) { var num = ds.getCellValue(i, j, curSheetIndex); if (len == 1 && (num === undefined || num === "")) { return 0; } num = Number(num); if (Ext.isNumber(num)) { res *= num; allArgsNaN = false; } } } } else { var num = Number(posOffset); if (Ext.isNumber(num)) { res *= num; allArgsNaN = false; } } } if (allArgsNaN) { res = 0; } return res; }, not : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (1 != len) { throw "SS_ERROR_NA"; } var num = arguments[0]; if (Ext.isObject(num)) { num = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, num); Ext.ss.common.FunctionBoxHelper.checkErrorCode(num); if (num == undefined || num == "true" || num == "false" || !isNaN(num) || num == "TRUE" || num == "FALSE") { return !num || "false" == num || 0 == num || "FALSE" == num ? "TRUE" : "FALSE"; } else { throw "SS_ERROR_VALUE"; } } if (typeof num == "string" || num == "null" || num == undefined || Ext.ss.common.Mask.isEmptyStr(num)) { throw "SS_ERROR_VALUE"; } return !num || "false" == num || 0 == num || "FALSE" == num ? "TRUE" : "FALSE"; }, or : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len == 0) { throw "SS_ERROR_NA"; } var tmAry = []; for (var j = 0; j < len; j++) { var posOffset = arguments[j]; if (Ext.isObject(posOffset)) { var arr = Ext.ss.common.FunctionBoxHelper.getRangeVal(ds, x, y, sheetIndex, posOffset); for (var i = 0; i < arr.length; i++) { var num = arr[i]; if (num == null) { throw "SS_ERROR_VALUE"; } tmAry.push(num); } } else { if (posOffset == null || typeof posOffset == "string") { throw "SS_ERROR_VALUE"; } tmAry.push(posOffset); } } if (tmAry.length == 1 && Ext.isString(tmAry[r])) { throw "SS_ERROR_VALUE"; } for (var r = 0; r < tmAry.length; r++) { var num = tmAry[r]; if (("FALSE" != num && "false" != num && num != "0" && !isNaN(num)) && num != undefined || num == "true" || num == "TRUE") { return "TRUE"; } } return "FALSE"; }, and : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len == 0) { throw "SS_ERROR_NA"; } var allArgsAreNotNumber = null; for (var k = 0; k < len; k++) { var posOffset = arguments[k]; if (Ext.isObject(posOffset)) { var arr = Ext.ss.common.FunctionBoxHelper.getRangeVal(ds, x, y, sheetIndex, posOffset); for (var i = 0; i <= arr.length; i++) { var num = arr[i]; if (null == num || num === undefined || num === "") { if (allArgsAreNotNumber == null) { allArgsAreNotNumber = true; } } else if (0 == num || "0" == num || "false" == num || "FALSE" == num) { return "FALSE"; } else if (Ext.ss.common.Mask.isEmptyStr(num)) { if (allArgsAreNotNumber == null) { allArgsAreNotNumber = true; } } else if (Ext.isNumber(Number(num))) { allArgsAreNotNumber = false; } else { if (allArgsAreNotNumber == null) { allArgsAreNotNumber = true; } } } } else { var num = posOffset; if (null == num || num === undefined || num === "") { if (allArgsAreNotNumber == null) { allArgsAreNotNumber = true; } } else if (0 == num || "0" == num || "false" == num || "FALSE" == num) { return "FALSE"; } else if (Ext.ss.common.Mask.isEmptyStr(num)) { if (allArgsAreNotNumber == null) { allArgsAreNotNumber = true; } } else if (Ext.isNumber(Number(num))) { allArgsAreNotNumber = false; } else { if (allArgsAreNotNumber == null) { allArgsAreNotNumber = true; } } } } if (allArgsAreNotNumber && allArgsAreNotNumber == true) { throw "SS_ERROR_VALUE"; } return "TRUE"; }, power : function() { var len = arguments.length; var ds, x, y, sheetIndex, powNum; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len != 2) { throw "SS_ERROR_NA"; } powNum = arguments[1]; if (powNum === undefined || powNum === "") { throw "SS_ERROR_VALUE"; } powNum = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, powNum); var num = arguments[0]; num = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, num); return Math.pow(num, powNum); }, left : function() { var len = arguments.length; var ds, x, y, sheetIndex, leftPos = 1, posOffset; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (0 == len || len > 2) { throw "SS_ERROR_NA"; } if (2 == len) { leftPos = arguments[1]; posOffset = arguments[0]; if (Ext.isObject(leftPos)) { leftPos = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, leftPos); leftPos = leftPos.toString(); if (leftPos.toUpperCase() == "TRUE") { leftPos = 1; } else if (leftPos == "" || leftPos.toUpperCase() == "FALSE") { return ""; } } } else { posOffset = arguments[0]; } leftPos = leftPos.toString(); if (leftPos.toUpperCase() == "TRUE") { leftPos = 1; } else if (leftPos.toUpperCase() == "FALSE") { return ""; } leftPos = Number(leftPos); if (!Ext.isNumber(leftPos)) { throw "SS_ERROR_VALUE"; } leftPos = Math.floor(leftPos); if (Ext.isString(posOffset) || Ext.isNumber(posOffset) || Ext.isBoolean(posOffset)) { if (Ext.isBoolean(posOffset)) { posOffset = posOffset.toString().toUpperCase(); } else { posOffset = posOffset.toString(); } return posOffset.slice(0, leftPos); } else { var res = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, posOffset); if (res.toUpperCase() == "FALSE") { res = res.toUpperCase(); } res = res.toString(); res = res.slice(0, leftPos); return res; } }, right : function() { var len = arguments.length; var ds, x, y, sheetIndex, rightPos = 1, posOffset; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (0 == len || len > 2) { throw "SS_ERROR_NA"; } if (2 == len) { rightPos = arguments[1]; posOffset = arguments[0]; if (Ext.isObject(rightPos)) { ds.fireEvent("project", ds, { x : x, y : y }, rightPos, { ox : rightPos.oex, oy : rightPos.oey }); var abPos = { sheetIndex : rightPos.sheetIndex, x : x + rightPos.ox, y : y + rightPos.oy }; ds.checkSheetIndexValid(abPos.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(abPos.sheetIndex)) { curSheetIndex = abPos.sheetIndex; } var i = parseInt(abPos.x), j = parseInt(abPos.y); rightPos = ds.getCellValue(i, j, curSheetIndex) || ""; rightPos = rightPos.toString(); if (rightPos.toUpperCase() == "TRUE") { rightPos = 1; } else if (rightPos == "" || rightPos.toUpperCase() == "FALSE") { return ""; } } } else { posOffset = arguments[0]; } rightPos = rightPos.toString(); if (rightPos.toUpperCase() == "TRUE") { rightPos = 1; } else if (rightPos.toUpperCase() == "FALSE") { return ""; } rightPos = Number(rightPos); if (!Ext.isNumber(rightPos)) { throw "SS_ERROR_VALUE"; } rightPos = Math.floor(rightPos); if (Ext.isString(posOffset) || Ext.isNumber(posOffset) || Ext.isBoolean(posOffset)) { if (Ext.isBoolean(posOffset)) { posOffset = posOffset.toString().toUpperCase(); } else { posOffset = posOffset.toString(); } var strLen = posOffset.length; return posOffset.slice(strLen - rightPos, strLen); } else { var res = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, posOffset); res = res || ""; res = res.toString(); if (res.toUpperCase() == "FALSE") { res = res.toUpperCase(); } var strLen = res.length; res = res.slice(strLen - rightPos, strLen); return res; } }, num : function(v, dv) { if (Ext.isNumber(Number(v))) { return Number(v); } return dv; }, sum : function() { var maxDigNum = 0; var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (0 == len) { throw "SS_ERROR_NA"; } var res = 0; var argsIncludeNaN = false; for (var k = 0; k < len; k++) { var posOffset = arguments[k]; if (Ext.isObject(posOffset)) { var arr = Ext.ss.common.FunctionBoxHelper.getRangeVal(ds, x, y, sheetIndex, posOffset); for (var i = 0; i < arr.length; i++) { var num = arr[i]; Ext.ss.common.FunctionBoxHelper.checkInfinitieError(num); num = Number(num); if (Ext.isNumber(num)) { var dn = Ext.ss.common.Helper.getDigitalLen(num); if (dn > maxDigNum) { maxDigNum = dn; } res += num; } } } else { if (posOffset.length != null) { var tmAry = Ext.ss.common.FunctionBoxHelper .restructureArray(posOffset, x, y, sheetIndex, ds); for (var z = 0; z < tmAry.length; z++) { var dn = Ext.ss.common.Helper.getDigitalLen(tmAry[z] || "0"); if (dn > maxDigNum) { maxDigNum = dn; } res += Number(tmAry[z] || "0"); } } else { var num = Number(posOffset); if (Ext.isNumber(num)) { var dn = Ext.ss.common.Helper.getDigitalLen(num); if (dn > maxDigNum) { maxDigNum = dn; } res += num; } else { argsIncludeNaN = true; } } } } if (argsIncludeNaN) { throw "SS_ERROR_VALUE"; } var dn = Ext.ss.common.Helper.getDigitalLen(res); if (dn > maxDigNum) { res = Ext.util.Format.round(res, maxDigNum); } return res; }, sumsq : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len == 0) { throw "SS_ERROR_NA"; } var res = 0; for (var k = 0; k < len; k++) { var posOffset = arguments[k]; if (Ext.isObject(posOffset)) { var arr = Ext.ss.common.FunctionBoxHelper.getRangeVal(ds, x, y, sheetIndex, posOffset); for (var i = 0; i < arr.length; i++) { var num = arr[i]; num = Ext.ss.FunctionBox.num(num, 0); res += Math.pow(num, 2); } } else { var num = Number(posOffset); if (Ext.isNumber(num)) { res += Math.pow(num, 2); } } } return res; }, sumxmy2 : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (2 != len) { throw "SS_ERROR_NA"; } var xrng = arguments[0], yrng = arguments[1]; return Ext.ss.common.FunctionBoxHelper.sumHelper(x, y, sheetIndex, ds, xrng, yrng, "sumxmy2"); }, sumx2py2 : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (2 != len) { throw "SS_ERROR_NA"; } var xrng = arguments[0], yrng = arguments[1]; return Ext.ss.common.FunctionBoxHelper.sumHelper(x, y, sheetIndex, ds, xrng, yrng, "sumx2py2"); }, sumx2my2 : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (2 != len) { throw "SS_ERROR_NA"; } var xrng = arguments[0], yrng = arguments[1]; return Ext.ss.common.FunctionBoxHelper.sumHelper(x, y, sheetIndex, ds, xrng, yrng, "sumx2my2"); }, /**定义函数*/ mfff:function(){ return "sddd"; }, sumif : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len < 2 || len > 5) { throw "SS_ERROR_NA"; } var checkOffset = arguments[0], conditionOffset = arguments[1]; var sumOffset = Ext.apply({}, checkOffset); if (len == 3) { sumOffset = arguments[2]; } var minOffset = { sheetIndex : checkOffset.sheetIndex, ox : checkOffset.ox, oy : checkOffset.oy }; var maxOffset = { sheetIndex : checkOffset.sheetIndex, ox : checkOffset.oex, oy : checkOffset.oey }; var sumMinOffset = { sheetIndex : sumOffset.sheetIndex, ox : sumOffset.ox, oy : sumOffset.oy }; var sumMaxOffset = { sheetIndex : sumOffset.sheetIndex, ox : sumOffset.oex, oy : sumOffset.oey }; var minx = minOffset.ox + x, miny = minOffset.oy + y, maxx = maxOffset.ox + x, maxy = maxOffset.oy + y; var sumMinx = sumMinOffset.ox + x, sumMiny = sumMinOffset.oy + y, sumMaxx = sumMaxOffset.ox + x, sumMaxy = sumMaxOffset.oy + y; var rows = ds.data.rows; var r = 0, cond, compareFlag = false; if (Ext.isObject(conditionOffset)) { ds.fireEvent("project", ds, { x : x, y : y }, conditionOffset, conditionOffset); var cx = conditionOffset.ox + x, cy = conditionOffset.oy + y; ds.checkSheetIndexValid(conditionOffset.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(conditionOffset.sheetIndex)) { curSheetIndex = conditionOffset.sheetIndex; } var cond = ds.getCellValue(cx, cy, curSheetIndex); if (Ext.isString(cond)) { cond = Ext.util.Format.htmlDecode(cond); } } else { cond = conditionOffset; } compareFlag = /^\s*[!<>=]/gi.test(cond); ds.checkSheetIndexValid(minOffset.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(minOffset.sheetIndex)) { curSheetIndex = minOffset.sheetIndex; } ds.checkSheetIndexValid(sumMinOffset.sheetIndex); var sumSheetIndex = sheetIndex; if (false != Ext.type(sumMinOffset.sheetIndex)) { sumSheetIndex = sumMinOffset.sheetIndex; } var xoffset = sumMinx - minx, yoffset = sumMiny - miny; for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= maxy; j++) { var data = ds.getCellValue(i, j, curSheetIndex); var num = Number(data); if (!Ext.isNumber(num)) { continue; } var flag = false; if (compareFlag) { if (Ext.isNumber(Number(data))) { flag = eval(data + cond); } else { flag = eval("\"" + data + "\"" + cond); } } else if (1 == Ext.ss.common.Mask.shExpMatch_KMP(data .toString(), cond.toString())) { flag = true; } if (flag) { var sumData = ds.getCellValue(xoffset + i, yoffset + j, sumSheetIndex); sumData = Number(sumData); if (Ext.isNumber(sumData)) { r += sumData; } } } } ds.fireEvent("project", ds, { x : x, y : y }, minOffset, maxOffset); ds.fireEvent("project", ds, { x : x, y : y }, sumMinOffset, sumMaxOffset); return r; }, sumifs : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len < 3) { throw "SS_ERROR_NA"; } var sumOffset = arguments[0]; var sumMinOffset = { sheetIndex : sumOffset.sheetIndex, ox : sumOffset.ox, oy : sumOffset.oy }; var sumMaxOffset = { sheetIndex : sumOffset.sheetIndex, ox : sumOffset.oex, oy : sumOffset.oey }; var sumMinx = sumMinOffset.ox + x, sumMiny = sumMinOffset.oy + y, sumMaxx = sumMaxOffset.ox + x, sumMaxy = sumMaxOffset.oy + y; var i = 1; var checkOffset = []; var conditionOffset = []; while (i < len) { checkOffset[checkOffset.length] = arguments[i]; i = i + 1; conditionOffset[conditionOffset.length] = arguments[i]; i = i + 1; } var minx = [], miny = [], maxx = [], maxy = []; var cond = [], compareFlag = []; var curSheetIndex = []; for (var i = 0; i < checkOffset.length; i++) { var minOffset = { sheetIndex : checkOffset[i].sheetIndex, ox : checkOffset[i].ox, oy : checkOffset[i].oy }; var maxOffset = { sheetIndex : checkOffset[i].sheetIndex, ox : checkOffset[i].oex, oy : checkOffset[i].oey }; minx[minx.length] = minOffset.ox + x, miny[miny.length] = minOffset.oy + y, maxx[maxx.length] = maxOffset.ox + x, maxy[maxy.length] = maxOffset.oy + y; var rows = ds.data.rows; if (Ext.isObject(conditionOffset[i])) { ds.fireEvent("project", ds, { x : x, y : y }, conditionOffset, conditionOffset); var cx = conditionOffset.ox + x, cy = conditionOffset.oy + y; ds.checkSheetIndexValid(conditionOffset.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(conditionOffset.sheetIndex)) { curSheetIndex = conditionOffset.sheetIndex; } var condi = ds.getCellValue(cx, cy, curSheetIndex); if (Ext.isString(condi)) { condi = Ext.util.Format.htmlDecode(condi); } cond[cond.length] = condi; } else { cond[cond.length] = conditionOffset[i]; } compareFlag[compareFlag.length] = /^\s*[<>=]/gi.test(cond); ds.checkSheetIndexValid(minOffset.sheetIndex); if (false != Ext.type(minOffset.sheetIndex)) { curSheetIndex[curSheetIndex.length] = minOffset.sheetIndex; } else { curSheetIndex[curSheetIndex.length] = sheetIndex; } } ds.checkSheetIndexValid(sumMinOffset.sheetIndex); var sumSheetIndex = sheetIndex; if (false != Ext.type(sumMinOffset.sheetIndex)) { sumSheetIndex = sumMinOffset.sheetIndex; } var r = 0; for (var i = sumMinx; i <= sumMaxx; i++) { for (var j = sumMiny; j <= sumMaxy; j++) { var flag = true; for (var k = 0; k < checkOffset.length; k++) { var data = ds.getCellValue(minx[k] + (i - sumMinx), miny[k] + (j - sumMiny), curSheetIndex[k]); var condflag = false; if (compareFlag[k]) { if (Ext.isNumber(Number(data))) { condflag = eval(data + cond[k]); } else { condflag = eval("\"" + data + "\"" + cond[k]); } } else if (1 == Ext.ss.common.Mask.shExpMatch_KMP(data .toString(), cond[k].toString())) { condflag = true; } flag = flag && condflag; } if (flag) { var sumData = ds.getCellValue(i, j, sumSheetIndex); sumData = Number(sumData); if (Ext.isNumber(sumData)) { r += sumData; } } } } return r; }, lookup : function(conditionOffset, checkOffset, sumOffset, sheetIndex, x, y, ds) { if (len < 6 || len > 7) { throw "SS_ERROR_NA"; } if (6 == arguments.length) { ds = y; y = x; x = sheetIndex; sheetIndex = sumOffset; sumOffset = Ext.apply({}, checkOffset); } var cond = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, conditionOffset); if (Ext.isObject(checkOffset)) { var minOffset = { sheetIndex : checkOffset.sheetIndex, ox : checkOffset.ox, oy : checkOffset.oy }; var maxOffset = { sheetIndex : checkOffset.sheetIndex, ox : checkOffset.oex, oy : checkOffset.oey }; var minx = minOffset.ox + x, miny = minOffset.oy + y, maxx = maxOffset.ox + x, maxy = maxOffset.oy + y; var sumMinOffset = { sheetIndex : sumOffset.sheetIndex, ox : sumOffset.ox, oy : sumOffset.oy }; var sumMaxOffset = { sheetIndex : sumOffset.sheetIndex, ox : sumOffset.oex, oy : sumOffset.oey }; var sumMinx = sumMinOffset.ox + x, sumMiny = sumMinOffset.oy + y, sumMaxx = sumMaxOffset.ox + x, sumMaxy = sumMaxOffset.oy + y; ds.fireEvent("project", ds, { x : x, y : y }, minOffset, maxOffset); ds.fireEvent("project", ds, { x : x, y : y }, sumMinOffset, sumMaxOffset); if (!Ext.isDefined(cond)) { throw "SS_ERROR_NA"; } ds.checkSheetIndexValid(minOffset.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(minOffset.sheetIndex)) { curSheetIndex = minOffset.sheetIndex; } ds.checkSheetIndexValid(sumMinOffset.sheetIndex); var sumSheetIndex = sheetIndex; if (false != Ext.type(sumMinOffset.sheetIndex)) { sumSheetIndex = sumMinOffset.sheetIndex; } for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= maxy; j++) { var data = ds.getCellValue(i, j, curSheetIndex); if (1 == Ext.ss.common.Mask.shExpMatch_KMP(data.toString(), cond.toString())) { var sum = ds.getCellValue(sumMinx + i - minx, sumMiny + j - miny, sumSheetIndex); return sum; } } } var sum = ""; for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= maxy; j++) { var data = ds.getCellValue(i, j, curSheetIndex); if (Number(data) < Number(cond)) { sum = ds.getCellValue(sumMinx + i - minx, sumMiny + j - miny, sumSheetIndex); } } } if (sum) { return sum; } throw "SS_ERROR_NA"; } else if (Ext.isArray(checkOffset)) { if (!Ext.isDefined(cond)) { throw "SS_ERROR_NA"; } for (var i = 0, len = checkOffset.length; i < len; i++) { var it = checkOffset[i]; if (it == cond || 1 == Ext.ss.common.Mask.shExpMatch_KMP( it.toString(), cond.toString())) { return it; } } throw "SS_ERROR_NA"; } }, iferror : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (2 != len) { throw "SS_ERROR_NA"; } var val = arguments[0], txt = arguments[1]; var txt = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, txt); if (Ext.isObject(val)) { var val = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, txt); if (val == "Infinity" || val == "NaN" || val == "#NUM!" || val == "#VALUE!" || val == "#ERROR!" || val == "#REF!") { return txt; } } if (val === undefined || val === "") { return 0; } if (val == "Infinity" || val == "NaN") { return txt; } return val; }, pmt : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (3 > len || len > 5) { throw "SS_ERROR_NA"; } var rate = arguments[0], nper = arguments[1], pv = arguments[2], fv = 0, type = 0; if (4 == len) { fv = arguments[3]; } if (5 == len) { fv = arguments[3]; type = arguments[4]; } rate = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, rate); nper = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, nper); pv = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, pv); fv = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, fv); type = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, type); rate = parseFloat(rate); nper = parseFloat(nper); pv = parseFloat(pv); type = parseFloat(type); fv = parseFloat(fv); var pmt1 = Math.round(pv * (rate * Math.pow(1 + rate, nper - type)) / (Math.pow(1 + rate, nper) - 1) * 100) / 100; var ir = 0; if (1 == type) { for (var i = 1; i <= nper; i++) { ir = ir + Math.pow(rate + 1, i); } } else { ir = 1; for (var i = 1; i < nper; i++) { ir = ir + Math.pow(rate + 1, i); } } var pmt2 = Math.round(fv / ir * 100) / 100; return -(pmt1 + pmt2); }, rate : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (3 > len || len > 6) { throw "SS_ERROR_NA"; } var nper = arguments[0], pmt = arguments[1], pv = arguments[2], fv = 0, type = 0, guess = 0; if (4 == len) { fv = arguments[3]; } if (5 == len) { fv = arguments[3]; type = arguments[4]; } if (6 == len) { fv = arguments[3]; type = arguments[4]; guess = arguments[5]; } nper = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, nper); pmt = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, pmt); pv = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, pv); fv = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, fv); type = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, type); guess = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, guess); nper = parseFloat(nper) ? parseFloat(nper) : 0; pmt = parseFloat(pmt) ? parseFloat(pmt) : 0; pv = parseFloat(pv) ? parseFloat(pv) : 0; type = parseFloat(type) ? parseFloat(type) : 0; fv = parseFloat(fv) ? parseFloat(fv) : 0; guess = parseFloat(guess) ? parseFloat(guess) : 0; var maxrate = 0; var minrate = Math.abs((pmt * nper + fv + pv) / pv / nper); if (Math.abs(minrate) > 1) { return "#NUM!"; } if (Math.abs(pmt * nper + fv) < Math.abs(pv)) { maxrate = -Math.abs(minrate); minrate = -1; } else { maxrate = 1; } var rate = maxrate; for (var irup = 1; irup < 50; irup++) { var ir = 0; for (var i = 1; i <= nper; i++) { ir = ir + pmt * Math.pow(rate + 1, i); } var trypv = -(ir / Math.pow(rate + 1, nper + 1 - type) + fv / Math.pow(rate + 1, nper)); if (pmt > 0) { if (trypv < pv) { minrate = rate; rate = (rate + maxrate) / 2; if (Math.abs(rate) == 1) { return "#NUM!"; } } else if (trypv > pv) { maxrate = rate; rate = (rate + minrate) / 2; if (Math.abs(rate) == 1) { return "#NUM!"; } } else if (trypv = pv) { return Math.round(rate * 10000000) / 10000000; } } else { if (trypv > pv) { minrate = rate; rate = (rate + maxrate) / 2; if (Math.abs(rate) == 1) { return "#NUM!"; } } else if (trypv < pv) { maxrate = rate; rate = (rate + minrate) / 2; if (Math.abs(rate) == 1) { return "#NUM!"; } } else if (trypv = pv) { return Math.round(rate * 10000000) / 10000000; } } irup++; } return Math.round(rate * 10000000) / 10000000; }, irr : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len > 2) { throw "SS_ERROR_NA"; } var values = arguments[0]; var guess = 0; var nums = []; if (2 == len) { guess = arguments[1]; } if (Ext.isObject(values)) { nums = Ext.ss.common.FunctionBoxHelper.getNumRangeVal(ds, x, y, sheetIndex, values); } else if (Ext.isString(values)) { if (values.charAt(0) == "{" && values.charAt(values.length - 1) == "}") { var str = values.slice(1, values.length - 1); nums = str.split(","); } else { throw "SS_ERROR_NA"; } } guess = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, guess); var fsum = 0, zsum = 0; for (var ii = 0; ii < nums.length; ii++) { if (!Ext.isNumber(nums[ii])) { throw "SS_ERROR_VALUE"; } nums[ii] = parseFloat(nums[ii]); if (nums[ii] < 0) { fsum = fsum + nums[ii]; } else { zsum = zsum + nums[ii]; } } guess = parseFloat(guess) ? parseFloat(guess) : 0.1; var irr = guess, lawirr = 0, maxirr = 0, b = false, ir = 0, lastir = 0, testirr = 0; for (var i = 0; i < nums.length; i++) { ir = ir + nums[i] / Math.pow(irr + 1, i); } if (ir == 0) { return Math.round(irr * 10000000) / 10000000; } else if (ir < 0) { lastir = ir; ir = 0; testirr = irr - guess; for (var i = 0; i < nums.length; i++) { ir = ir + nums[i] / Math.pow(testirr + 1, i); } if (ir < lastir) { b = true; } do { ir = 0; if (b) { lawirr = irr; irr = irr + guess; } else { maxirr = irr; irr = irr - guess; } for (var i = 0; i < nums.length; i++) { ir = ir + nums[i] / Math.pow(irr + 1, i); } } while (ir < 0); if (b) { maxirr = irr; } else { lawirr = irr; } } else if (ir > 0) { lastir = ir; ir = 0; testirr = irr + guess; for (var i = 0; i < nums.length; i++) { ir = ir + nums[i] / Math.pow(testirr + 1, i); } if (ir > lastir) { b = true; } do { ir = 0; if (b) { maxirr = irr; irr = irr - guess; } else { lawirr = irr; irr = irr + guess; } for (var i = 0; i < nums.length; i++) { ir = ir + nums[i] / Math.pow(irr + 1, i); } } while (ir > 0); if (b) { lawirr = irr; } else { maxirr = irr; } } irr = lawirr; for (var irup = 1; irup < 50; irup++) { var ir = 0; for (var i = 0; i < nums.length; i++) { ir = ir + nums[i] / Math.pow(irr + 1, i); } if (ir == 0) { return Math.round(irr * 10000000) / 10000000; } if (b) { if (ir < 0) { lawirr = irr; irr = (maxirr + irr) / 2; } else { maxirr = irr; irr = (irr + lawirr) / 2; } } else { if (ir < 0) { maxirr = irr; irr = (irr + lawirr) / 2; } else { lawirr = irr; irr = (maxirr + irr) / 2; } } irup++; } return Math.round(irr * 10000000) / 10000000; }, nper : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (3 > len || len > 5) { throw "SS_ERROR_NA"; } var rate = arguments[0], pmt = arguments[1], pv = arguments[2], fv = 0, type = 0; if (4 == len) { fv = arguments[3]; if (fv === undefined || Ext.ss.common.Mask.isEmptyStr(fv)) { fv = 0; } } else { fv = arguments[3]; if (fv === undefined || Ext.ss.common.Mask.isEmptyStr(fv)) { fv = 0; } type = arguments[4]; if (type === undefined || Ext.ss.common.Mask.isEmptyStr(type)) { type = 0; } } rate = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, rate); pmt = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, pmt); pv = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, pv); fv = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, fv); type = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, type); rate = parseFloat(rate) ? parseFloat(rate) : 0; pmt = parseFloat(pmt) ? parseFloat(pmt) : 0; pv = parseFloat(pv) ? parseFloat(pv) : 0; fv = parseFloat(fv) ? parseFloat(fv) : 0; type = parseFloat(type) ? parseFloat(type) : 0; var minnper = (-fv - pv) / pmt; minnper = (-fv / Math.pow(1 + rate, minnper - type) - pv) / pmt; var maxnper = (-fv - pv * Math.pow(1 + rate, minnper - type)) / pmt; var nper = maxnper; for (var irup = 1; irup < 50; irup++) { var calpmt = (-fv / Math.pow(1 + rate, nper) - pv) * (rate * Math.pow(1 + rate, nper - type)) / (Math.pow(1 + rate, nper) - 1); if (calpmt == pmt) { return Math.round(calpmt * 10000000) / 10000000; } else { if (nper < 0) { if (Math.abs(calpmt) < Math.abs(pmt)) { minnper = nper; nper = (maxnper + nper) / 2; } else { maxnper = nper; nper = (nper + minnper) / 2; } } else { if (Math.abs(calpmt) < Math.abs(pmt)) { maxnper = nper; nper = (nper + minnper) / 2; } else { minnper = nper; nper = (maxnper + nper) / 2; } } if (maxnper == minnper) { throw "SS_ERROR_NUM"; } } irup++; } return Math.round(nper * 10000000) / 10000000; }, subtotal : function() { var args = Array.prototype.slice.call(arguments); var fun_num = args.shift(); switch (fun_num) { case 1 : return this.average.apply(null, args.concat()); break; case 2 : return this.count.apply(null, args.concat()); break; case 3 : return this.counta.apply(null, args.concat()); break; case 4 : return this.max.apply(null, args.concat()); break; case 5 : return this.min.apply(null, args.concat()); break; case 6 : return this.product.apply(null, args.concat()); break; case 7 : return this.sum.apply(null, args.concat()); break; default : ; } }, pv : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (3 > len || len > 5) { throw "SS_ERROR_NA"; } var rate = arguments[0], nper = arguments[1], payment = arguments[2], fv = 0, type = 0; if (4 == len) { fv = arguments[3]; if (fv === undefined || Ext.ss.common.Mask.isEmptyStr(fv)) { fv = 0; } } if (5 == len) { fv = arguments[3]; if (fv === undefined || Ext.ss.common.Mask.isEmptyStr(fv)) { fv = 0; } type = arguments[4]; if (type === undefined || Ext.ss.common.Mask.isEmptyStr(type)) { type = 0; } } rate = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, rate); nper = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, nper); payment = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, payment); fv = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, fv); type = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, type); rate = parseFloat(rate); nper = parseFloat(nper); payment = parseFloat(payment); type = parseFloat(type); fv = parseFloat(fv); var ir = 0; for (var i = 1; i <= nper; i++) { ir = ir + payment * Math.pow(rate + 1, i); } var pv = -(ir / Math.pow(rate + 1, nper + 1 - type) + fv / Math.pow(rate + 1, nper)); return Math.round(pv * 10000) / 10000; }, npv : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len < 2) { throw "SS_ERROR_NA"; } var npv = 0; var rate = arguments[0]; rate = "" + Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, rate); rate = Ext.ss.common.Helper.convertPercent2num(rate); var rate = Number(rate); if (!Ext.isNumber(rate)) { throw "SS_ERROR_VALUE"; } for (var k = 1; k < len; k++) { var posOffset = arguments[k]; var num = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, posOffset); npv = npv + num / Math.pow(1 + rate, k); } return Math.round(npv * 10000) / 10000; }, fv : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (3 > len || len > 5) { throw "SS_ERROR_NA"; } var rate = arguments[0], nper = arguments[1], payment = arguments[2], pv = 0, type = 0; if (4 == len) { pv = arguments[3]; if (pv === undefined || Ext.ss.common.Mask.isEmptyStr(pv)) { pv = 0; } } if (5 == len) { pv = arguments[3]; if (pv === undefined || Ext.ss.common.Mask.isEmptyStr(pv)) { pv = 0; } type = arguments[4]; if (type === undefined || Ext.ss.common.Mask.isEmptyStr(type)) { type = 0; } } rate = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, rate); nper = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, nper); payment = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, payment); pv = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, pv); type = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, type); rate = parseFloat(rate); nper = parseFloat(nper); payment = parseFloat(payment); type = parseFloat(type); pv = parseFloat(pv); var ir = 0; for (var i = 1; i <= nper; i++) { ir = ir + payment * Math.pow(rate + 1, i - 1 + type); } var fv = -(ir + pv * Math.pow(rate + 1, nper)); return Math.round(fv * 100) / 100; }, vlookup : function(conditionOffset, checkOffset, ix, presion, sheetIndex, x, y, ds) { if (7 == arguments.length) { ds = y; y = x; x = sheetIndex; sheetIndex = presion; } var cond = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, conditionOffset); if (Ext.isObject(checkOffset)) { var minOffset = { sheetIndex : checkOffset.sheetIndex, ox : checkOffset.ox, oy : checkOffset.oy }; var maxOffset = { sheetIndex : checkOffset.sheetIndex, ox : checkOffset.oex, oy : checkOffset.oey }; var minx = minOffset.ox + x, miny = minOffset.oy + y, maxx = maxOffset.ox + x, maxy = maxOffset.oy + y; ds.fireEvent("project", ds, { x : x, y : y }, minOffset, maxOffset); if (!Ext.isDefined(cond)) { throw "SS_ERROR_NA"; } ds.checkSheetIndexValid(minOffset.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(minOffset.sheetIndex)) { curSheetIndex = minOffset.sheetIndex; } for (var i = minx; i <= maxx; i++) { var data = ds.getCellValue(i, miny, curSheetIndex); if (1 == Ext.ss.common.Mask.shExpMatch_KMP(data.toString(), cond.toString())) { var sum = ds.getCellValue(i, miny + ix - 1, curSheetIndex); return sum; } } throw "SS_ERROR_NA"; } }, hlookup : function(conditionOffset, checkOffset, iy, presion, sheetIndex, x, y, ds) { if (7 == arguments.length) { ds = y; y = x; x = sheetIndex; sheetIndex = presion; } var cond = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, conditionOffset); if (Ext.isObject(checkOffset)) { var minOffset = { sheetIndex : checkOffset.sheetIndex, ox : checkOffset.ox, oy : checkOffset.oy }; var maxOffset = { sheetIndex : checkOffset.sheetIndex, ox : checkOffset.oex, oy : checkOffset.oey }; var minx = minOffset.ox + x, miny = minOffset.oy + y, maxx = maxOffset.ox + x, maxy = maxOffset.oy + y; ds.fireEvent("project", ds, { x : x, y : y }, minOffset, maxOffset); if (!Ext.isDefined(cond)) { throw "SS_ERROR_NA"; } ds.checkSheetIndexValid(minOffset.sheetIndex); var curSheetIndex = sheetIndex; if (false != Ext.type(minOffset.sheetIndex)) { curSheetIndex = minOffset.sheetIndex; } for (var i = miny; i <= maxy; i++) { var data = ds.getCellValue(minx, i, curSheetIndex); if (1 == Ext.ss.common.Mask.shExpMatch_KMP(data.toString(), cond.toString())) { var sum = ds.getCellValue(miny + iy - 1, i, curSheetIndex); return sum; } } throw "SS_ERROR_NA"; } }, match : function(lookup_value, lookup_array, match_type, sheetIndex, x, y, ds) { if (6 == arguments.length) { ds = y; y = x; x = sheetIndex; sheetIndex = match_type; match_type = 1; } var lookarray = []; var cond = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, lookup_value); if (Ext.isObject(lookup_array)) { lookarray = Ext.ss.common.FunctionBoxHelper.getRangeVal(ds, x, y, sheetIndex, lookup_array); } else { lookup_array = lookup_array.toString(); lookup_array = lookup_array.substring(1, lookup_array.length - 1); lookarray = lookup_array.split(","); } var result = 0; for (var i = 0; i < lookarray.length; i++) { if (match_type == "0") { if (lookarray[i].toString() == cond) { result = i + 1; break; } } else if (match_type == "1") { if (lookarray[i].toString() <= cond) { result = i + 1; } else { break; } } else if (match_type == "-1") { if (lookarray[i].toString() >= cond) { result = i + 1; } else { break; } } } if (result == 0) { throw "SS_ERROR_NA"; } else { return result; } }, address : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; var row_num, column_num, abs_num = 1, a1 = true, sheet_text = ""; if (len < 2 || len > 5) { throw "SS_ERROR_NA"; } row_num = arguments[0]; column_num = arguments[1]; if (len > 2) { abs_num = arguments[2]; } if (len > 3) { a1 = arguments[3]; } if (len > 4) { sheet_text = arguments[4]; } if (row_num == true) { row_num = 1; } if (column_num == true) { column_num = 1; } if (abs_num == true) { abs_num = 1; } row_num = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, row_num); column_num = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, column_num); abs_num = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, abs_num); a1 = Ext.ss.common.FunctionBoxHelper .getObjVal(ds, x, y, sheetIndex, a1); if (undefined == a1 || a1 == "" || a1 == null) { a1 = true; } else if (typeof a1 == "string") { var lower = a1.toLowerCase(); if (lower == "false" || lower == "true") { a1 = eval(lower); } else { throw "SS_ERROR_VALUE"; } } var result = ""; if (!/^[1-9]+$/.test(row_num) || !/^[1-9]+$/.test(column_num) || !/^[1-9]+$/.test(abs_num)) { throw "SS_ERROR_VALUE"; } var scolumn = ""; if (column_num > 702 || column_num < 1) { throw "SS_ERROR_VALUE"; } else if (column_num < 27) { scolumn = String.fromCharCode("A".charCodeAt(0) + column_num - 1); } else { scolumn = String.fromCharCode("A".charCodeAt(0) + Math.floor(column_num / 26) - 1) + String.fromCharCode("A".charCodeAt(0) + column_num % 26 - 1); } if (sheet_text) { sheet_text = "\"" + sheet_text + "\"!"; } if (a1) { if (abs_num == 1) { result = sheet_text + "$" + scolumn + "$" + row_num; } else if (abs_num == 2) { result = sheet_text + scolumn + "$" + row_num; } else if (abs_num == 3) { result = sheet_text + "$" + scolumn + row_num; } else if (abs_num == 4) { result = sheet_text + scolumn + "" + row_num; } else { throw "SS_ERROR_VALUE"; } } else { result = sheet_text + "R" + row_num + "C" + column_num; } return result; }, average : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (0 == len) { throw "SS_ERROR_NA"; } var res = 0, count = 0; var argsAllNaN = true; for (var k = 0; k < len; k++) { var posOffset = arguments[k]; if (Ext.isObject(posOffset)) { var numarray = Ext.ss.common.FunctionBoxHelper.getRangeVal(ds, x, y, sheetIndex, posOffset); count += numarray.length; for (var i = 0; i < numarray.length; i++) { var num = numarray[i]; Ext.ss.common.FunctionBoxHelper.checkErrorCode(num); if (Ext.ss.common.Mask.isNumber(num)) { res += Ext.ss.FunctionBox.num(num, 0); argsAllNaN = false; } else { count = count - 1; } } } else { if (len == 1 && Ext.ss.common.Mask.isEmptyStr(posOffset)) { throw "SS_ERROR_VALUE"; } var num = Number(posOffset); if (Ext.isNumber(num)) { res += num; count++; argsAllNaN = false; } } } if (argsAllNaN) { throw "SS_ERROR_INFINITY"; } return res / count * 100 / 100; }, min : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len == 0) { throw "SS_ERROR_NA"; } var res = false; for (var k = 0; k < len; k++) { var posOffset = arguments[k]; if (Ext.isObject(posOffset)) { var numarray = Ext.ss.common.FunctionBoxHelper.getRangeVal(ds, x, y, sheetIndex, posOffset); for (var i = 0; i < numarray.length; i++) { if (numarray[i] == undefined || numarray[i] == "") { break; } Ext.ss.common.FunctionBoxHelper.checkErrorCode(numarray[i]); var num = Number(numarray[i]); if (Ext.isNumber(num)) { if (res == false || res > num) { res = num; } } } } else { if (posOffset == "" || posOffset == null) { throw "SS_ERROR_VALUE"; } Ext.ss.common.FunctionBoxHelper.checkErrorCode(posOffset); var num = Number(posOffset); if (Ext.isNumber(num)) { if (res == false || res > num) { res = num; } } else { throw "SS_ERROR_VALUE"; } } } if (res == false) { res = 0; } return res; }, max : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (0 == len) { throw "SS_ERROR_NA"; } var res = false; for (var k = 0; k < len; k++) { var posOffset = arguments[k]; if (Ext.isObject(posOffset)) { var numarray = Ext.ss.common.FunctionBoxHelper.getRangeVal(ds, x, y, sheetIndex, posOffset); for (var i = 0; i < numarray.length; i++) { if (numarray[i] == undefined || numarray[i] == "") { break; } Ext.ss.common.FunctionBoxHelper.checkErrorCode(numarray[i]); var num = Ext.ss.FunctionBox.num(numarray[i], 0); if (Ext.isNumber(num)) { if (res == false || res < num) { res = num; } } } } else { if (posOffset == "" || posOffset == null) { throw "SS_ERROR_VALUE"; } Ext.ss.common.FunctionBoxHelper.checkErrorCode(posOffset); var num = Number(posOffset); if (Ext.isNumber(num)) { if (res == false || res < num) { res = num; } } else { throw "SS_ERROR_VALUE"; } } } if (res == false) { res = 0; } return res; }, getCellByOffset : function(ox, oy, sheetIndex, x, y, ds) { if (5 == arguments.length) { ds = y; y = x; x = sheetIndex; sheetIndex = oy; if (ox.ox != ox.oex || ox.oy != ox.oey) { throw "SS_ERROR_VALUE"; return; } oy = ox.oy; if (false !== Ext.type(ox.sheetIndex)) { sheetIndex = ox.sheetIndex; } ox = ox.ox; if (!(0 <= sheetIndex || undefined == sheetIndex || null == sheetIndex || "" == sheetIndex)) { throw "#PARAM_ERROR"; } if (!Ext.isNumber(sheetIndex)) { sheetIndex = ds.activeSheet; } } if (false == Ext.type(sheetIndex) || "" === sheetIndex) { sheetIndex = ds.activeSheet; } var pos = { x : x, y : y }; x += ox; y += oy; var r = ds.getCellValue(x, y, sheetIndex); var date = ds.transfer2Date(r); var tmp = ds.getCellObj(x, y, sheetIndex); var sheetObj = ds.sheets[sheetIndex]; var colcss = sheetObj.colSetting[y] || {}; var rowcss = sheetObj.rowSetting[x] || {}; var wholecss = sheetObj.wholeSetting || {}; var fm = ds.getAttribute(tmp, rowcss, colcss, wholecss, "format"); if (Ext.isDate(date)) { r = date.format(ds.defaultDateFormat); } else if (Ext.isString(r)) { if ("text" != fm) { var last = r.charAt(r.length - 1); if ("%" == last) { var rest = r.slice(0, r.length - 1); var rest = Number(rest); if (NaN != rest) { r = rest / 100; } } } } var num = Number(r); if (Ext.isNumber(num)) { r = num; } else if (false == Ext.type(r) || "" === r) { r = 0; } ds.fireEvent("project", ds, pos, { ox : ox, oy : oy }, { ox : ox, oy : oy }); if ("true" == r || "TRUE" == r || "True" == r) { r = true; } if ("false" == r || "FALSE" == r || "False" == r) { r = false; } return r; }, condition : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len != 3) { throw "SS_ERROR_NA"; } var cond = arguments[0], trueVal = arguments[1], falseVal = arguments[2]; if (cond && "FALSE" !== cond && "false" !== cond) { if ("true" == trueVal || "TRUE" == trueVal || "True" == trueVal) { return TRUE; } if ("false" == trueVal || "FALSE" == trueVal || "False" == trueVal) { return FALSE; } else { return trueVal; } } else { if ("true" == trueVal || "TRUE" == trueVal || "True" == trueVal) { return TRUE; } if ("false" == trueVal || "FALSE" == trueVal || "False" == trueVal) { return FALSE; } else { return falseVal; } } }, day : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; if (len != 5) { throw "SS_ERROR_NA"; } var posOffset = arguments[0]; posOffset = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, posOffset); if (Ext.isNumber(Number(posOffset))) { var baseDate = new Date("1900-01-01"); if (posOffset == "") { throw "SS_ERROR_NUM"; } baseDate.setDate(baseDate.getDate() + Number(posOffset) - 2); return baseDate.getDate(); } else if (Ext.isDate(new Date(posOffset))) { var baseDate = new Date(posOffset); return baseDate.getDate(); } else { throw "SS_ERROR_VALUE"; } }, large : function() { var maxDigNum = 0; var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len != 2) { throw "SS_ERROR_NA"; } var argsAry = []; for (var k = 0; k < len; k++) { var posOffset = arguments[k]; if (Ext.isObject(posOffset)) { argsAry[k] = Ext.ss.common.FunctionBoxHelper.getNumRangeVal(ds, x, y, sheetIndex, posOffset); } else { argsAry[k] = posOffset; } } if (Ext.isBoolean(argsAry[0]) && argsAry[1] > 0) { return Number(argsAry[0]); } if (!argsAry[0].length) { throw "SS_ERROR_NUM"; } var arg2 = Number(argsAry[1]); if (!Ext.isNumber(arg2)) { throw "SS_ERROR_VALUE"; } var tmp = [], ac = argsAry[0]; for (var i = 0; i < ac.length; i++) { if (Ext.isNumber(ac[i])) { tmp.push(ac[i]); } } var len = tmp.length; for (var m = 0; m < len - 1; m++) { if (!Ext.isNumber(tmp[m])) { throw "SS_ERROR_VALUE"; } for (var n = m + 1; n < len; n++) { if (tmp[m] < tmp[n]) { var tp = tmp[m]; tmp[m] = tmp[n]; tmp[n] = tp; } } } return tmp[arg2 - 1]; }, small : function() { var maxDigNum = 0; var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len != 2) { throw "SS_ERROR_NA"; } var argsAry = []; for (var k = 0; k < len; k++) { var posOffset = arguments[k]; if (Ext.isObject(posOffset)) { argsAry[k] = Ext.ss.common.FunctionBoxHelper.getNumRangeVal(ds, x, y, sheetIndex, posOffset); } else { argsAry[k] = posOffset; } } if (Ext.isBoolean(argsAry[0]) && argsAry[1] > 0) { return Number(argsAry[0]); } if (!argsAry[0].length) { throw "SS_ERROR_NUM"; } var arg2 = Number(argsAry[1]); if (!Ext.isNumber(arg2)) { throw "SS_ERROR_VALUE"; } var tmp = [], ac = argsAry[0]; for (var i = 0; i < ac.length; i++) { if (Ext.isNumber(ac[i])) { tmp.push(ac[i]); } } var len = tmp.length; for (var m = 0; m < len - 1; m++) { for (var n = m + 1; n < len; n++) { if (tmp[m] > tmp[n]) { var tp = tmp[m]; tmp[m] = tmp[n]; tmp[n] = tp; } } } return tmp[arg2 - 1]; }, time : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len != 3) { throw "SS_ERROR_NA"; } var argsAry = []; for (var k = 0; k < len; k++) { var posOffset = arguments[k]; if (!posOffset) { posOffset = 0; } argsAry[k] = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, posOffset); if (argsAry[k] == true) { argsAry[k] = 1; } if (argsAry[k] == false) { argsAry[k] = 0; } } var hourPart = Number(argsAry[0]); var minutePart = Number(argsAry[1]); var secondPart = Number(argsAry[2]); if (Ext.isNumber(hourPart) && Ext.isNumber(minutePart) && Ext.isNumber(secondPart) && hourPart < 32768 && minutePart < 32768 && secondPart < 32768) { minutePart += Math.floor(secondPart / 60); hourPart = Math.floor(hourPart); var sumMin = minutePart + hourPart * 60; var hsm = sumMin % 60; hourPart = (sumMin - hsm) / 60; minutePart = hsm % 60; var hm = hourPart % 24; var zone = "AM"; if (hm > 11) { zone = "PM"; } hourPart = hm % 12; if (hourPart == 0) { hourPart = 12; } minutePart = Math.floor(minutePart); if (minutePart < 10) { minutePart = "0" + minutePart; } secondPart = Math.floor(secondPart % 60); if (secondPart < 10) { secondPart = "0" + secondPart; } return hourPart + ":" + minutePart + ":" + secondPart + " " + zone; } else { throw "SS_ERROR_NUM"; } }, hour : function() { var maxDigNum = 0; var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len != 1) { throw "SS_ERROR_NA"; } var posOffset = arguments[0]; posOffset = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, posOffset); if (Ext.isBoolean(posOffset)) { return 0; } var posTmp = Number(posOffset); if (Ext.isNumber(posTmp) && posTmp > 0) { posTmp = posTmp.toString(); var as = posTmp.match(/(\.\d+)$/); if (as) { var sumSecond = Number(as[1]) * 1440; return (sumSecond - sumSecond % 60) / 60; } else { return 0; } } else if (posOffset.indexOf(".") > -1) { throw "SS_ERROR_VALUE"; } else { if (/(\d+)\s*:\s*(\d+)\s*:\s*(\d+)(\s+[P|A]M){0,1}/i .test(posOffset)) { var date = posOffset.replace( /(\d+)\s*:\s*(\d+)\s*:\s*(\d+)(\s+[P|A]M){0,1}/i, ""); date = date.replace(/\s+/g, ""); var pm = posOffset .match(/(\d+)\s*:\s*(\d+)\s*:\s*(\d+)(\s+[P|A]M){0,1}/i); if (!date) { if (!Ext.isDate(new Date(date))) { throw "SS_ERROR_VALUE"; } } var h = Number(pm[1]); var m = Number(pm[2]); var s = Number(pm[3]); if (pm[4]) { if (m > -1 && m < 60 && s > -1 && s < 60 && h > -1 && h < 13) { if (/pm/i.test(pm[4])) { if (h == 12) { return 12; } else { return h + 12; } } else { if (h == 12) { return 0; } else { return h; } } } else { throw "SS_ERROR_VALUE"; } } else { if (h > 24) { return h % 12; } else { return h; } } } else if (/(\d+)\s*:\s*(\d+)\s*(\s+[P|A]M){0,1}$/i.test(posOffset)) { var date = posOffset.replace( /(\d+)\s*:\s*(\d+)\s*(\s+[P|A]M){0,1}$/i, ""); date = date.replace(/\s+/g, ""); var pm = posOffset .match(/(\d+)\s*:\s*(\d+)\s*(\s+[P|A]M){0,1}$/i); if (!date) { if (!Ext.isDate(new Date(date))) { throw "SS_ERROR_VALUE"; } } var h = Number(pm[1]); var m = Number(pm[2]); if (pm[3]) { if (m > -1 && m < 60 && h > -1 && h < 13) { if (/pm/i.test(pm[3])) { if (h == 12) { return 12; } else { return h + 12; } } else { if (h == 12) { return 0; } else { return h; } } } else { throw "SS_ERROR_VALUE"; } } else { if (h > 24) { return h % 12; } else { return h; } } } } }, minute : function() { var maxDigNum = 0; var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len != 1) { throw "SS_ERROR_NA"; } var posOffset = arguments[0]; posOffset = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, posOffset); if (Ext.isBoolean(posOffset)) { return 0; } var posTmp = Number(posOffset); if (Ext.isNumber(posTmp) && posTmp > 0) { posTmp = posTmp.toString(); if (posTmp.indexOf(".") > -1) { return Math.floor(Number(posTmp) * 1440 % 60); } else { return 0; } } else if (posOffset.indexOf(".") > -1) { throw "SS_ERROR_VALUE"; } else { if (/(\d+)\s*:\s*(\d+)\s*:\s*(\d+)(\s+[P|A]M){0,1}/i .test(posOffset)) { var date = posOffset.replace( /(\d+)\s*:\s*(\d+)\s*:\s*(\d+)(\s+[P|A]M){0,1}/i, ""); date = date.replace(/\s+/g, ""); var pm = posOffset .match(/(\d+)\s*:\s*(\d+)\s*:\s*(\d+)(\s+[P|A]M){0,1}/i); if (date) { if (!Ext.isDate(new Date(date))) { throw "SS_ERROR_VALUE"; } } var h = Number(pm[1]); var m = Number(pm[2]); var s = Number(pm[3]); if (m > -1 && m < 60 && s > -1 && s < 60) { if (pm[4] && (h < 0 || h > 12)) { throw "SS_ERROR_VALUE"; } return m; } else { throw "SS_ERROR_VALUE"; } } else if (/(\d+)\s*:\s*(\d+)\s*(\s+[P|A]M){0,1}$/i.test(posOffset)) { var date = posOffset.replace( /(\d+)\s*:\s*(\d+)\s*(\s+[P|A]M){0,1}$/i, ""); date = date.replace(/\s+/g, ""); var pm = posOffset .match(/(\d+)\s*:\s*(\d+)\s*(\s+[P|A]M){0,1}$/i); if (date) { if (!Ext.isDate(new Date(date))) { throw "SS_ERROR_VALUE"; } } var h = Number(pm[1]); var m = Number(pm[2]); if (m > -1 && m < 60) { if (pm[3] && (h < 0 || h > 12)) { throw "SS_ERROR_VALUE"; } return m; } else { throw "SS_ERROR_VALUE"; } } } }, second : function() { var maxDigNum = 0; var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len != 1) { throw "SS_ERROR_NA"; } var posOffset = arguments[0]; posOffset = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, posOffset); if (Ext.isBoolean(posOffset)) { return 0; } var posTmp = Number(posOffset); if (Ext.isNumber(posTmp) && posTmp > 0) { posTmp = posTmp.toString(); if (posTmp.indexOf(".") > -1) { var mpos = Number(posTmp) * 1440 % 60; var s = Math.floor((mpos - Math.floor(mpos)) * 60); return s; } else { return 0; } } else if (posOffset.indexOf(".") > -1) { throw "SS_ERROR_VALUE"; } else { if (/(\d+)\s*:\s*(\d+)\s*:\s*(\d+)(\s+[P|A]M){0,1}/i .test(posOffset)) { var date = posOffset.replace( /(\d+)\s*:\s*(\d+)\s*:\s*(\d+)(\s+[P|A]M){0,1}/i, ""); date = date.replace(/\s+/g, ""); var pm = posOffset .match(/(\d+)\s*:\s*(\d+)\s*:\s*(\d+)(\s+[P|A]M){0,1}/i); if (date) { if (!Ext.isDate(new Date(date))) { throw "SS_ERROR_VALUE"; } } var h = Number(pm[1]); var m = Number(pm[2]); var s = Number(pm[3]); if (m > -1 && m < 60 && s > -1 && s < 60) { if (pm[4] && (h < 0 || h > 12)) { throw "SS_ERROR_VALUE"; } return s; } else { throw "SS_ERROR_VALUE"; } } else if (/(\d+)\s*:\s*(\d+)\s*(\s+[P|A]M){0,1}$/i.test(posOffset)) { var date = posOffset.replace( /(\d+)\s*:\s*(\d+)\s*(\s+[P|A]M){0,1}$/i, ""); date = date.replace(/\s+/g, ""); var pm = posOffset .match(/(\d+)\s*:\s*(\d+)\s*(\s+[P|A]M){0,1}$/i); if (date) { if (!Ext.isDate(new Date(date))) { throw "SS_ERROR_VALUE"; } } var h = Number(pm[1]); var m = Number(pm[2]); if (m > -1 && m < 60) { if (pm[3] && (h < 0 || h > 12)) { throw "SS_ERROR_VALUE"; } return 0; } else { throw "SS_ERROR_VALUE"; } } } }, days360 : function() { var len = arguments.length; var ds = arguments[len - 1]; var y = arguments[len - 2]; var x = arguments[len - 3]; var sheetIndex = arguments[len - 4]; len -= 4; if (2 == len) { var astart = arguments[0]; var aend = arguments[1]; var method = false; } else if (3 == len) { var astart = arguments[0]; var aend = arguments[1]; var method = arguments[2]; } else { throw "SS_ERROR_NA"; } var startdate = Ext.ss.common.FunctionBoxHelper.getDateObjValue(ds, x, y, sheetIndex, astart); var enddate = Ext.ss.common.FunctionBoxHelper.getDateObjValue(ds, x, y, sheetIndex, aend); var yeardiff = 0, monthdiff = 0, daydiff = 0, startday = 0, endday = 0; yeardiff = (enddate.getYear() - startdate.getYear()) * 360; monthdiff = (enddate.getMonth() - startdate.getMonth()) * 30; if (method) { if (startdate.getDate() == Ext.ss.common.Helper .getlastday(startdate)) { startday = 30; } else { startday = startdate.getDate(); } if (enddate.getDate() == Ext.ss.common.Helper.getlastday(enddate)) { endday = 30; } else { endday = enddate.getDate(); } daydiff = endday - startday; } else { if (startdate.getDate() == Ext.ss.common.Helper .getlastday(startdate)) { startday = 30; } else { startday = startdate.getDate(); } if (enddate.getDate() == Ext.ss.common.Helper.getlastday(enddate) && startday < 30) { monthdiff = monthdiff + 30; endday = 1; } else if (enddate.getDate() == Ext.ss.common.Helper .getlastday(enddate) && startday >= 30) { endday = 30; } else { endday = enddate.getDate(); } daydiff = endday - startday; } return yeardiff + monthdiff + daydiff; }, seriessum : function(xx, n, m, values, sheetIndex, x, y, ds) { if (8 == arguments.length) { xx = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, xx); if (!Ext.isNumber(xx)) { return "#VALUE"; } n = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, n); if (!Ext.isNumber(n)) { return "#VALUE"; } m = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, m); if (!Ext.isNumber(m)) { return "#VALUE"; } var coefs = []; if (Ext.isObject(values)) { coefs = Ext.ss.common.FunctionBoxHelper.getNumRangeVal(ds, x, y, sheetIndex, values); } else { coefs.push(Number(values)); } var result = 0; for (i = 0; i < coefs.length; i++) { if (!Ext.isNumber(coefs[i])) { throw "SS_ERROR_VALUE"; } result = result + coefs[i] * Math.pow(xx, n + i * m); } return result; } else { throw "SS_ERROR_NA"; } }, db : function() { var len = arguments.length; var ds = arguments[len - 1]; var y = arguments[len - 2]; var x = arguments[len - 3]; var sheetIndex = arguments[len - 4]; len -= 4; if (4 > len || 5 < len) { throw "SS_ERROR_NA"; } var cost, salvage, life, period, month; cost = arguments[0]; salvage = arguments[1]; life = arguments[2]; period = arguments[3]; if (4 == len) { month = 12; } if (5 == len) { month = arguments[4]; } cost = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, cost); salvage = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, salvage); life = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, life); period = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, period); month = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, month); var rate = Math.round((1 - Math.pow(salvage / cost, 1 / life)) * 1000) / 1000; var persum = 0, db = 0; for (var i = 1; i <= period; i++) { if (i == 1) { db = persum = cost * rate * month / 12; } else if (i == life) { db = (cost - persum) * rate * (12 - month) / 12; } else { db = (cost - persum) * rate; persum = persum + db; } } return Math.round(db * 10000) / 10000; }, ddb : function() { var len = arguments.length; var ds = arguments[len - 1]; var y = arguments[len - 2]; var x = arguments[len - 3]; var sheetIndex = arguments[len - 4]; len -= 4; if (4 > len || 5 < len) { throw "SS_ERROR_NA"; } var cost, salvage, life, period, factor; cost = arguments[0]; salvage = arguments[1]; life = arguments[2]; period = arguments[3]; if (4 == len) { factor = 2; } if (5 == len) { factor = arguments[4]; } cost = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, cost); salvage = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, salvage); life = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, life); period = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, period); factor = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, factor); var persum = 0, db = 0; for (var i = 1; i <= period; i++) { db = Math.min((cost - persum) * factor / life, cost - salvage - persum); persum = persum + db; } return Math.round(db * 100) / 100; }, vdb : function() { var len = arguments.length; var ds = arguments[len - 1]; var y = arguments[len - 2]; var x = arguments[len - 3]; var sheetIndex = arguments[len - 4]; len -= 4; if (5 > len || 7 < len) { throw "SS_ERROR_NA"; } var cost, salvage, life, startperiod, endperiod, factor, noswitch = false; cost = arguments[0]; salvage = arguments[1]; life = arguments[2]; startperiod = arguments[3]; endperiod = arguments[4]; if (5 == len) { factor = 2; } else if (6 == len) { factor = arguments[5]; } else if (7 == len) { factor = arguments[5]; noswitch = arguments[6]; } cost = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, cost); salvage = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, salvage); life = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, life); startperiod = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, startperiod); endperiod = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, endperiod); factor = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, factor); var persum = 0, db = 0, persum2 = 0; for (var i = 1; i <= startperiod; i++) { db = Math.min((cost - persum) * factor / life, cost - salvage - persum); persum = persum + db; } for (var i = 1; i <= endperiod; i++) { db = Math.min((cost - persum2) * factor / life, cost - salvage - persum2); persum2 = persum2 + db; } var vdb = persum2 - persum; return Math.round(vdb * 10000) / 10000; }, mirr : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (3 != len) { throw "SS_ERROR_NA"; } var values = arguments[0]; var frate = arguments[1]; var rrate = arguments[2]; var nums = [], positive = [], negative = []; if (Ext.isObject(values)) { nums = Ext.ss.common.FunctionBoxHelper.getNumRangeVal(ds, x, y, sheetIndex, values); } else if (Ext.isString(values)) { if (values.charAt(0) == "{" && values.charAt(values.length - 1) == "}") { var str = values.slice(1, values.length - 1); nums = str.split(","); } else { throw "SS_ERROR_NA"; } } frate = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, frate); rrate = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, rrate); for (var ii = 0; ii < nums.length; ii++) { if (!Ext.isNumber(nums[ii])) { throw "SS_ERROR_VALUE"; } if (nums[ii] < 0) { positive[positive.length] = 0; negative[negative.length] = nums[ii]; } else { negative[negative.length] = 0; positive[positive.length] = nums[ii]; } } frate = parseFloat(frate) ? parseFloat(frate) : 0; rrate = parseFloat(rrate) ? parseFloat(rrate) : 0; var fnpv = Ext.ss.common.FunctionBoxHelper.getnpv(frate, negative, ds, x, y, sheetIndex); var rnpv = Ext.ss.common.FunctionBoxHelper.getnpv(rrate, positive, ds, x, y, sheetIndex); var mirr = Math.pow(-rnpv * Math.pow(1 + rrate, nums.length) / (fnpv * (1 + frate)), 1 / (nums.length - 1)) - 1; return Math.round(mirr * 10000000) / 10000000; }, sln : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (3 != len) { throw "SS_ERROR_NA"; } var cost = arguments[0]; var salvage = arguments[1]; var life = arguments[2]; cost = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, cost); salvage = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, salvage); life = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, life); var sln = (cost - salvage) / life; return Math.round(sln * 10000) / 10000; }, syd : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (4 != len) { throw "SS_ERROR_NA"; } var cost = arguments[0]; var salvage = arguments[1]; var life = arguments[2]; var per = arguments[3]; cost = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, cost); salvage = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, salvage); life = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, life); per = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, per); var syd = (cost - salvage) * (life - per + 1) * 2 / (life * (life + 1)); return Math.round(syd * 10000) / 10000; }, ppmt : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (4 > len || len > 6) { throw "SS_ERROR_NA"; } var rate = arguments[0], per = arguments[1], nper = arguments[2], pv = arguments[3], fv = 0, type = 0; if (5 == len) { fv = arguments[4]; } if (6 == len) { fv = arguments[4]; type = arguments[5]; } rate = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, rate); per = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, per); nper = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, nper); pv = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, pv); fv = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, fv); type = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, type); rate = parseFloat(rate); nper = parseFloat(nper); per = parseFloat(per); pv = parseFloat(pv); type = parseFloat(type); fv = parseFloat(fv); pv = pv + fv; var ppmt = Math.round(pv * (rate * Math.pow(1 + rate, per - 1 - type)) / (Math.pow(1 + rate, nper) - 1) * 10000) / 10000; return -ppmt; }, ipmt : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (4 > len || len > 6) { throw "SS_ERROR_NA"; } var rate = arguments[0], per = arguments[1], nper = arguments[2], pv = arguments[3], fv = 0, type = 0; if (5 == len) { fv = arguments[4]; } if (6 == len) { fv = arguments[4]; type = arguments[5]; } rate = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, rate); per = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, per); nper = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, nper); pv = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, pv); fv = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, fv); type = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, type); rate = parseFloat(rate); nper = parseFloat(nper); per = parseFloat(per); pv = parseFloat(pv); type = parseFloat(type); fv = parseFloat(fv); pv = pv + fv; var ppmt = -Math.round(pv * (rate * Math.pow(1 + rate, per - 1 - type)) / (Math.pow(1 + rate, nper) - 1) * 100) / 100; var pmt1 = Math.round(pv * (rate * Math.pow(1 + rate, nper - type)) / (Math.pow(1 + rate, nper) - 1) * 100) / 100; var ir = 0; if (1 == type) { for (var i = 1; i <= nper; i++) { ir = ir + Math.pow(rate + 1, i); } } else { ir = 1; for (var i = 1; i < nper; i++) { ir = ir + Math.pow(rate + 1, i); } } var pmt2 = Math.round(fv / ir); var pmt = -(pmt1 + pmt2); return (pmt - ppmt) * 10000 / 10000; }, asc : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len != 1) { throw "SS_ERROR_NA"; } var posOffset = arguments[0]; var str = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, posOffset); var asc = (new String(str.substr(0, 1))).charCodeAt(0); return asc; }, 'char' : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len != 1) { throw "SS_ERROR_NA"; } var posOffset = arguments[0]; var asc = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, posOffset); var chr = String.fromCharCode(asc); return chr; }, clean : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len != 1) { throw "SS_ERROR_NA"; } var posOffset = arguments[0]; var text = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, posOffset); text = new String(text); var str = ""; for (var i = 0; i < text.length; i++) { var s = text.substr(i, 1); var asc = (new String(s)).charCodeAt(0); if (asc > 31) { str = str + s; } } return str; }, code : function() { return this.asc.apply(null, arguments); }, dollar : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len < 1 || len > 2) { throw "SS_ERROR_NA"; } var decimals = 2; if (len == 2) { decimals = arguments[1]; } var posOffset = arguments[0]; var num = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, posOffset); decimals = Number(decimals); if (!Ext.isNumber(decimals) || !Ext.isNumber(num)) { throw "SS_ERROR_VALUE"; } decimals = Math.floor(decimals); num = Math.round(num * Math.pow(10, decimals)) / Math.pow(10, decimals); var str = ""; var patten = []; var snum = num + ""; var asnum = snum.split("."); var decs = ""; if (asnum.length > 1) { decs = asnum[1] + ""; } if (decs != "" || decimals > 0) { patten.push("."); } for (var i = 0; i < decimals; i++) { if (i < decs.length) { patten.push(decs.substr(i, 1)); } else { patten.push("0"); } } var fm = patten.join(""); str = "$" + asnum[0] + fm; return str; }, exact : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len != 2) { throw "SS_ERROR_NA"; } var posOffset1 = arguments[0]; var posOffset2 = arguments[1]; var text1 = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, posOffset1); var text2 = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, posOffset2); if (text1 == text2) { return true; } else { return false; } }, fixed : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len < 2 || len > 3) { throw "SS_ERROR_NA"; } var nocommas = false; if (len == 3) { nocommas = arguments[2]; } var posOffset1 = arguments[0]; var posOffset2 = arguments[1]; var num = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, posOffset1); var decimals = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, posOffset2); if (!Ext.isNumber(decimals) || !Ext.isNumber(num)) { throw "SS_ERROR_VALUE"; } decimals = Math.floor(decimals); var str = []; num = Math.round(num * Math.pow(10, decimals)) / Math.pow(10, decimals); if (nocommas) { if (nocommas == "true" || nocommas) { nocommas = true; } else { nocommas = false; } } var text = new String(num); if (!nocommas) { var idx = text.length - text.indexOf("."); for (var i = text.length - 1; i >= 0; i--) { var s = text.substr(i, 1); str.unshift(s); var p1 = text.length - i; var p2 = text.length - i - idx; if (p1 > idx && (p2 - idx) % 3 == 1 && i > 0) { str.unshift(","); } } return str.join(""); } else { return text; } }, proper : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len != 1) { throw "SS_ERROR_NA"; } var posOffset1 = arguments[0]; var text = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, posOffset1); var preisword = false, isword = false; var arr = []; for (var i = 0; i < text.length; i++) { var s = text.substr(i, 1); if ((new String(s)).charCodeAt(0) <= 90 && (new String(s)).charCodeAt(0) >= 65 || (new String(s)).charCodeAt(0) <= 122 && (new String(s)).charCodeAt(0) >= 97) { isword = true; } else { isword = false; } if (!preisword && isword) { arr.push(s.toUpperCase()); } else { arr.push(s.toLowerCase()); } preisword = isword; } return arr.join(""); }, replace : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len != 4) { throw "SS_ERROR_NA"; } var posOffset1 = arguments[0]; var posOffset2 = arguments[1]; var posOffset3 = arguments[2]; var posOffset4 = arguments[3]; var old_text = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, posOffset1); var start_num = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, posOffset2); var num_chars = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, posOffset3); var new_text = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, posOffset4); var str = old_text.substr(0, start_num - 1) + new_text + old_text.substr(start_num + num_chars - 1, old_text.length); return str; }, search : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (2 == len || 3 == len) { var source = arguments[0], target = arguments[1], start = 2 == len ? 0 : arguments[2]; source = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, source); target = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, target); start = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, start); start = Number(start); if (!Ext.isNumber(start)) { throw "SS_ERROR_VALUE"; } if ((Ext.isNumber(source) || Ext.isString(source)) && (Ext.isNumber(target) || Ext.isString(target))) { source = source.toString(); source = source.toLowerCase(); target = target.toString(); target = target.toLowerCase(); if (0 < start) { start = start - 1; target = target.slice(start, target.length); } else { start = 0; } var index = target.indexOf(source); if (-1 == index) { throw "SS_ERROR_VALUE"; } return index + 1 + start; } else { throw "SS_ERROR_VALUE"; } } else { throw "SS_ERROR_NA"; } }, substitute : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len > 4 || len < 3) { throw "SS_ERROR_NA"; } var posOffset1 = arguments[0]; var posOffset2 = arguments[1]; var posOffset3 = arguments[2]; var instance_num = 0; if (len == 4) { instance_num = arguments[3]; } var text = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, posOffset1); var old_text = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, posOffset2); var new_text = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, posOffset3); var instance_num = Ext.ss.common.FunctionBoxHelper.getNumObjValue(ds, x, y, sheetIndex, instance_num); var str = ""; if (instance_num == 0) { str = text.replace(new RegExp(old_text, "g"), new_text); } else { var pos = 0; for (var i = 0; i < instance_num; i++) { pos = text.indexOf(old_text, pos) + 1; } if (pos > 0) { pos--; str = text.substr(0, pos) + new_text + text.substr(pos + old_text.length, text.length); } else { str = text; } } return str; }, t : function() { var len = arguments.length; var ds, x, y, sheetIndex; ds = arguments[len - 1]; y = arguments[len - 2]; x = arguments[len - 3]; sheetIndex = arguments[len - 4]; len -= 4; if (len != 1) { throw "SS_ERROR_NA"; } var posOffset1 = arguments[0]; var text = Ext.ss.common.FunctionBoxHelper.getObjVal(ds, x, y, sheetIndex, posOffset1); if (!Ext.isString(text)) { text = ""; } return text; }, isif : function() { var len = arguments.length; var ds = arguments[len - 1]; var y = arguments[len - 2]; var x = arguments[len - 3]; var sheetIndex = arguments[len - 4]; var cell = ds.getCellObj(x, y, sheetIndex) || {}; var iparams = cell.ISIParams, result = 0; if (iparams && iparams[ds.ISIFormulaIndex]) { result = iparams[ds.ISIFormulaIndex][2] || 0; ds.ISIFormulaIndex++; } if (ds.updteISFormulaFromServer) { len -= 4; var curSheetIndex = ds.activeSheet; var args = []; for (var i = 0; i < len; i++) { var it = arguments[i]; if (Ext.isObject(it)) { var sheetIndex = curSheetIndex; if (false != Ext.type(it.sheetIndex)) { sheetIndex = it.sheetIndex; } var minx = it.ox + x, miny = it.oy + y, maxx = it.oex + x, maxy = it.oey + y; var v = ds.getCellValue(minx, miny, sheetIndex) || 0; args.push(v); } else { args.push(it); } } ds.ISFCache.push(["isif", args]); return result; } return result; } }; Ext.ns("Ext.ss"); Ext.ss.HotKey = function(config) { Ext.apply(this, config); Ext.ss.HotKey.superclass.constructor.call(this) }; Ext.extend(Ext.ss.HotKey, Ext.util.Observable, { pendingInterval : 15, lookup : { 37 : "left", 39 : "right", 38 : "up", 40 : "down", 46 : "del", 33 : "pageUp", 34 : "pageDown", 36 : "home", 35 : "end", 27 : "esc", 9 : "tab", 13 : "enter", 19 : "break" }, onKeyupFn : function(e) { var ss = this.spreadsheet; var sm = ss.sm; var tg = e.getTarget(); var k = e.getKey(); if (k != 17 && !this.popupIsShow(tg)) { if (k != 16) { if ((9 == k) || (13 == k)) { e.stopEvent(); sm.setFocusCell(sm.focusCell.x, sm.focusCell.y) } } else { delete this.shiftKeyConfig } } sm.fireEvent("renderborder") }, onKeydownFn : function(e) { var tg = e.getTarget(); if (!this.keydownPending && !this.popupIsShow(tg)) { this.keydownPending = true; var k = e.getKey(); var ss = this.spreadsheet; var shift = e.shiftKey, ctrl = e.ctrlKey; var tgName = tg.tagName; if (shift && !this.shiftKeyConfig) { var focusCell = (ss.sm).focusCell; this.shiftKeyConfig = { x : focusCell.x, y : focusCell.y } } if (ctrl && shift) { if (37 == k) { this.onCtrlShiftNavigationFn("left") } else { if (39 == k) { this.onCtrlShiftNavigationFn("right") } else { if (38 == k) { this.onCtrlShiftNavigationFn("up") } else { if (40 == k) { this.onCtrlShiftNavigationFn("down") } } } } } else { if (true == ctrl) { if (!Ext.isIE && (118 != k && 86 != k) && (99 != k && 67 != k) && (120 != k && 88 != k)) { e.stopEvent() } if (120 == k || 88 == k) { this.onCutFn() } else { if (99 == k || 67 == k) { this.onCopyFn() } else { if (118 == k || 86 == k) { this.onPasteFn() } else { if (122 == k || 90 == k) { } else { if (121 == k || 89 == k) { } else { if (102 == k || 70 == k) { if (Ext.isIE) { e.stopEvent() } this.onFindFn() } else { if (66 == k) { if (Ext.isIE) { e.stopEvent() } this.onBold() } else { if (85 == k) { if (Ext.isIE) { e.stopEvent() } this.onUndrline() } else { if (73 == k) { if (Ext.isIE) { e.stopEvent() } this.onItalic() } else { if (79 == k) { if (Ext.isIE) { e.stopEvent() } this.stopDefault(e); this.onOpenFile() } else { if (80 == k) { if (Ext.isIE) { e .stopEvent() } this .stopDefault(e); this .onPrintFile() } else { if (83 == k) { if (Ext.isIE) { e .stopEvent() } this .stopDefault(e); this .onSaveFile() } else { if (k == 36) { if (Ext.isIE) { e .stopEvent() } this .stopDefault(e); this .onCtrlNavigationFn("home") } else { if (k == 35) { if (Ext.isIE) { e .stopEvent() } this .stopDefault(e); this .onCtrlEndFn() } else { if (37 == k) { this .onCtrlNavigationFn("left") } else { if (39 == k) { this .onCtrlNavigationFn("right") } else { if (38 == k) { this .onCtrlNavigationFn("up") } else { if (40 == k) { this .onCtrlNavigationFn("down") } } } } } } } } } } } } } } } } } } } else { if ("TEXTAREA" == tgName) { var isPasteArea = Ext.get(tg) .hasClass("x-spreadsheet-paste-textarea"); if (isPasteArea) { tgName = "DIV" } } if (46 == k && tgName != "TEXTAREA" && tgName != "INPUT") { this.spreadsheet.contextmenu.onClearAllFn() } else { if (37 == k && tgName != "INPUT" && tgName != "TEXTAREA") { e.stopEvent(); this.onLeftFn(shift) } else { if (38 == k && tgName != "INPUT" && tgName != "TEXTAREA") { e.stopEvent(); this.onUpFn(shift) } else { if ((39 == k || 9 == k) && tgName != "INPUT" && tgName != "TEXTAREA") { e.stopEvent(); this.onRightFn(shift) } else { if (40 == k && tgName != "TEXTAREA") { e.stopEvent(); this.onDownFn(shift) } else { if (13 == k) { e.stopEvent(); this.onDownFn(shift) } else { if (13 == k && false) { var ss = this.spreadsheet; var sm = ss.sm; var textCover = sm .getTextCover(); if ("none" == textCover.style.display) { e.stopEvent(); this.onEnterFn() } } else { if (k == 8) { if ((tgName != "TEXTAREA" && "INPUT" != tgName) || tg.value == "") { this.stopDefault(e) } } else { if (k == 36) { this.onHomeFn() } else { if (k == 33) { this.onPageUpFn() } else { if (k == 34) { this .onPageDownFn() } else { if (27 == k) { ss .resetCutStatus(); ss .hidePasteOptions() } } } } } } } } } } } } if (!e.altKey) { if (!Ext.isIE && shift) { if (k == 16) { this.stopDefault(e) } else { this.onKeypressFn(k, tg) } } else { if (k != 16) { this.onKeypressFn(k, tg) } } } } } (function () { delete(this.keydownPending) }).defer(this.pendingInterval, this) } }, onKeypressFn : function(k, tg) { var cName = tg.parentNode.className; if (!this.lookup[k]) { var editor = (this.spreadsheet).editor; if (k == 112) { window .open( "http://www.cubedrive.com/wordPublic?id=waGuAW04a-0_&viewStatus=publicView", "_blank") } else { if (k == 113) { if (cName == "x-spreadsheet-viewport") { this.onEnterFn(null, "db"); editor.inEditMode = true } } else { if (k == 116) { window.location.reload() } else { if (k > 113 && k <= 124) { } else { if (cName == "x-spreadsheet-viewport") { this.onEnterFn(true); editor.inEditMode = false } } } } } } return false }, onEnterFn : function(sv, where) { var ss = this.spreadsheet; var sm = ss.sm; var editor = ss.editor; if (sm.focusCell) { editor.startEditing(sm.focusCell, sv, where) } }, onUpFn : function(shift) { var ss = this.spreadsheet; var ds = ss.ds; var rows = ds.data.rows; var showRange = ss.showRange; var freezeRange = ss.freezeRange; var sm = ss.sm; sm.transferFocus(); var x, y; if (sm.focusCell) { var rs = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rs.minPos.x, miny = rs.minPos.y, maxx = rs.maxPos.x, maxy = rs.maxPos.y; x = sm.focusCell.x; y = sm.focusCell.y; var flag = (minx == x); if (shift) { if (flag) { x = maxx; y = maxy } else { x = minx; y = miny } } rows[x] = rows[x] || {}; var cell = rows[x][y] || {}; if (cell.wrap) { var wrap = cell.wrap; var span = ds.getVisiableSpan(wrap.minx, wrap.miny, wrap.maxx, wrap.maxy); y = span.miny } x--; var rt = ds.findVisiableCell(x, y, "row", "up"); x = rt.x; y = rt.y; if ("showRange" === sm.posFlag || "left" === sm.posFlag) { if (0 == x) { return } if (showRange.row.start <= x) { if (shift) { if (flag) { sm.selectRange(null, { x : minx, y : miny }, { x : x, y : y }) } else { sm.selectRange(null, { x : x, y : y }, { x : maxx, y : maxy }) } } else { sm.setFocusCell(x, y, true) } } else { if (ss.isRowSplit()) { ss.scrollingRow(ss.autoOffset, 1); if (shift) { if (flag) { sm.selectRange(null, { x : minx, y : miny }, { x : x, y : y }) } else { sm.selectRange(null, { x : x, y : y }, { x : maxx, y : maxy }) } } else { sm.setFocusCell(x, y, true) } } else { if (showRange.row.start > freezeRange.row.end + 1) { ss.scrollingRow(ss.autoOffset, 1) } if (shift) { if (flag) { sm.selectRange(null, { x : minx, y : miny }, { x : x, y : y }) } else { sm.selectRange(null, { x : x, y : y }, { x : maxx, y : maxy }) } } else { sm.setFocusCell(x, y, true) } } } } else { if ("top" === sm.posFlag || "left-top" === sm.posFlag) { if (0 === x) { return } if (ss.isRowSplit() && x < freezeRange.row.start && freezeRange.row.start > 1) { ss.scrollingURow(ss.autoOffset, 1) } if (shift) { if (flag) { sm.selectRange(null, { x : minx, y : miny }, { x : x, y : y }) } else { sm.selectRange(null, { x : x, y : y }, { x : maxx, y : maxy }) } } else { sm.setFocusCell(x, y, true) } } } } this.updateStatus() }, onDownFn : function(shift) { var ss = this.spreadsheet; var ds = ss.ds; var showRange = ss.showRange; var freezeRange = ss.freezeRange; var sm = ss.sm; var x, y; sm.transferFocus(); if (sm.focusCell) { var rs = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rs.minPos.x, miny = rs.minPos.y, maxx = rs.maxPos.x, maxy = rs.maxPos.y; var rows = ds.data.rows; x = sm.focusCell.x; y = sm.focusCell.y; var flag = (minx == x); if (shift) { if (flag) { x = maxx; y = maxy } else { x = minx; y = miny } } rows[x] = rows[x] || {}; var cell = rows[x][y] || {}; if (cell.wrap) { var wrap = cell.wrap; var span = ds.getVisiableSpan(wrap.minx, wrap.miny, wrap.maxx, wrap.maxy); y = span.miny; x = wrap.maxx + 1 } else { x++ } var rt = ds.findVisiableCell(x, y, "row"); x = rt.x; y = rt.y; if ("showRange" === sm.posFlag || "left" === sm.posFlag) { if (showRange.row.end <= x) { ss.scrollingRow(-ss.autoOffset, 1) } if (shift) { if (flag) { sm.selectRange(null, { x : minx, y : miny }, { x : x, y : y }) } else { sm.selectRange(null, { x : x, y : y }, { x : maxx, y : maxy }) } } else { sm.setFocusCell(x, y, true) } } else { if ("top" === sm.posFlag || "left-top" === sm.posFlag) { if (ss.isRowSplit()) { if (x > freezeRange.row.end) { ss.scrollingURow(-ss.autoOffset, 1) } if (shift) { if (flag) { sm.selectRange(null, { x : minx, y : miny }, { x : x, y : y }) } else { sm.selectRange(null, { x : x, y : y }, { x : maxx, y : maxy }) } } else { sm.setFocusCell(x, y, true) } } else { if (showRange.row.start > freezeRange.row.end + 1 && x > freezeRange.row.end) { ss.ylivescroller.dom.scrollTop = 0; if (shift) { if (flag) { sm.selectRange(null, { x : minx, y : miny }, { x : x, y : y }) } else { sm.selectRange(null, { x : x, y : y }, { x : maxx, y : maxy }) } } else { sm.focusCell = { x : x, y : y }; sm.fireEvent("focuscell", sm, x, y); sm.selectedStart = Ext.apply({}, sm.focusCell); sm.selectedEnd = Ext.apply({}, sm.focusCell) } } else { if (shift) { if (flag) { sm.selectRange(null, { x : minx, y : miny }, { x : x, y : y }) } else { sm.selectRange(null, { x : x, y : y }, { x : maxx, y : maxy }) } } else { sm.setFocusCell(x, y, true) } } } } } } this.updateStatus() }, onLeftFn : function(shift) { var ss = this.spreadsheet; var ds = ss.ds; var rows = ds.data.rows; var showRange = ss.showRange; var freezeRange = ss.freezeRange; var sm = ss.sm; sm.transferFocus(); var x, y; if (sm.focusCell) { var rs = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rs.minPos.x, miny = rs.minPos.y, maxx = rs.maxPos.x, maxy = rs.maxPos.y; x = sm.focusCell.x; y = sm.focusCell.y; var flag = (miny == y); if (shift) { if (flag) { x = maxx; y = maxy } else { x = minx; y = miny } } rows[x] = rows[x] || {}; var cell = rows[x][y] || {}; if (cell.wrap) { var wrap = cell.wrap; var span = ds.getVisiableSpan(wrap.minx, wrap.miny, wrap.maxx, wrap.maxy); x = span.minx } y--; var rt = ds.findVisiableCell(x, y, "col", "left"); x = rt.x; y = rt.y; if ("showRange" === sm.posFlag || "top" === sm.posFlag) { if (0 === y) { return } if (showRange.col.start > y) { if (ss.isColSplit()) { ss.scrollingCol(ss.autoOffset, 1) } else { if (showRange.col.start > freezeRange.col.end + 1) { ss.scrollingCol(ss.autoOffset, 1) } } } if (shift) { if (flag) { sm.selectRange(null, { x : minx, y : miny }, { x : x, y : y }) } else { sm.selectRange(null, { x : x, y : y }, { x : maxx, y : maxy }) } } else { sm.setFocusCell(x, y, true) } } else { if ("left" === sm.posFlag || "left-top" === sm.posFlag) { if (0 === y) { return } if (ss.isColSplit() && y < freezeRange.col.start && freezeRange.col.start > 1) { ss.scrollingLCol(ss.autoOffset, 1) } if (shift) { if (flag) { sm.selectRange(null, { x : minx, y : miny }, { x : x, y : y }) } else { sm.selectRange(null, { x : x, y : y }, { x : maxx, y : maxy }) } } else { sm.setFocusCell(x, y, true) } } } } this.updateStatus() }, onRightFn : function(shift) { var ss = this.spreadsheet; var ds = ss.ds; var showRange = ss.showRange; var freezeRange = ss.freezeRange; var sm = ss.sm; sm.transferFocus(); var x, y; if (sm.focusCell) { var rs = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rs.minPos.x, miny = rs.minPos.y, maxx = rs.maxPos.x, maxy = rs.maxPos.y; var rows = ds.data.rows; x = sm.focusCell.x; y = sm.focusCell.y; var flag = (miny == y); if (shift) { if (flag) { x = maxx; y = maxy } else { x = minx; y = miny } } rows[x] = rows[x] || {}; var cell = rows[x][y] || {}; if (cell.wrap) { var wrap = cell.wrap; var span = ds.getVisiableSpan(wrap.minx, wrap.miny, wrap.maxx, wrap.maxy); x = span.minx; y = wrap.maxy + 1 } else { y++ } var rt = ds.findVisiableCell(x, y, "col"); x = rt.x; y = rt.y; if ("showRange" === sm.posFlag || "top" === sm.posFlag) { if (showRange.col.end <= y) { ss.scrollingCol(-ss.autoOffset, 1) } if (shift) { if (flag) { sm.selectRange(null, { x : minx, y : miny }, { x : x, y : y }) } else { sm.selectRange(null, { x : x, y : y }, { x : maxx, y : maxy }) } } else { sm.setFocusCell(x, y, true) } } else { if ("left" === sm.posFlag || "left-top" === sm.posFlag) { if (ss.isColSplit()) { if (y > freezeRange.col.end) { ss.scrollingLCol(-ss.autoOffset, 1) } if (shift) { if (flag) { sm.selectRange(null, { x : minx, y : miny }, { x : x, y : y }) } else { sm.selectRange(null, { x : x, y : y }, { x : maxx, y : maxy }) } } else { sm.setFocusCell(x, y, true) } } else { if (showRange.col.start > freezeRange.col.end + 1 && y > freezeRange.col.end) { ss.xlivescroller.dom.scrollLeft = 0; if (shift) { if (flag) { sm.selectRange(null, { x : minx, y : miny }, { x : x, y : y }) } else { sm.selectRange(null, { x : x, y : y }, { x : maxx, y : maxy }) } } else { sm.focusCell = { x : x, y : y }; sm.fireEvent("focuscell", sm, x, y); sm.selectedStart = Ext.apply({}, sm.focusCell); sm.selectedEnd = Ext.apply({}, sm.focusCell) } } else { if (shift) { if (flag) { sm.selectRange(null, { x : minx, y : miny }, { x : x, y : y }) } else { sm.selectRange(null, { x : x, y : y }, { x : maxx, y : maxy }) } } else { sm.setFocusCell(x, y, true) } } } } } } this.updateStatus() }, updateStatus : function() { var ss = this.spreadsheet; var sm = ss.sm; ss.fireEvent("updatestate", sm.selectedStart, sm.selectedEnd); ss.fireEvent("updatefx", sm.focusCell.x, sm.focusCell.y); ss.fireEvent("updatepress", ss, sm.focusCell.x, sm.focusCell.y) }, onCutFn : function() { this.spreadsheet.contextmenu.onCutFn() }, onCopyFn : function() { this.spreadsheet.contextmenu.onCopyFn() }, onPasteFn : function() { this.spreadsheet.contextmenu.onPasteFn() }, onUndoFn : function() { this.spreadsheet.toolbar.onUndoFn() }, onRedoFn : function() { this.spreadsheet.toolbar.onRedoFn() }, onFindFn : function() { if (false === Ext.type(this.lookupwin)) { this.lookupwin = new Ext.ss.popup.LookupWin({ spreadsheet : this.spreadsheet }) } this.lookupwin.tabpanel.setActiveTab(0); this.lookupwin.show() }, onBold : function() { var ss = this.spreadsheet; var sm = ss.sm, ds = ss.ds; var focusCell = sm.focusCell; var cell = ds.getCell(focusCell.x, focusCell.y); if ("" == cell.b) { ss.toolbar.applyAttribute([["b", ""]]) } else { ss.toolbar.applyAttribute([["b", ""]]) } ss.updateStatus(focusCell.x, focusCell.y) }, onUndrline : function() { var ss = this.spreadsheet; var sm = ss.sm, ds = ss.ds; var focusCell = sm.focusCell; var cell = ds.getCell(focusCell.x, focusCell.y); if ("" == cell.u) { ss.toolbar.applyAttribute([["u", ""]]) } else { ss.toolbar.applyAttribute([["u", ""]]) } ss.updateStatus(focusCell.x, focusCell.y) }, onItalic : function() { var ss = this.spreadsheet; var sm = ss.sm, ds = ss.ds; var focusCell = sm.focusCell; var cell = ds.getCell(focusCell.x, focusCell.y); if ("" == cell.i) { ss.toolbar.applyAttribute([["i", ""]]) } else { ss.toolbar.applyAttribute([["i", ""]]) } ss.updateStatus(focusCell.x, focusCell.y) }, onReplaceFn : function() { if (false === Ext.type(this.lookupwin)) { this.lookupwin = new Ext.ss.popup.LookupWin({ spreadsheet : this.spreadsheet }) } this.lookupwin.tabpanel.setActiveTab(1); this.lookupwin.show() }, onOpenFile : function() { var ss = this.spreadsheet; var stb = ss.toolbar; feyaSoft.home.LoginCheck(function() { stb.onOpenFn() }, stb) }, onPrintFile : function() { var ss = this.spreadsheet; var stb = ss.toolbar; feyaSoft.home.LoginCheck(function() { stb.onPrintFn() }, stb) }, onSaveFile : function() { var ss = this.spreadsheet; var stb = ss.toolbar; feyaSoft.home.LoginCheck(function() { stb.onSaveFn() }, stb) }, stopDefault : function(e) { e.keyCode = 0; if (e && e.preventDefault) { e.preventDefault() } else { window.event.returnValue = false } return false }, onHomeFn : function() { var ss = this.spreadsheet; var ds = ss.ds; var rows = ds.data.rows; var showRange = ss.showRange; var freezeRange = ss.freezeRange; var sm = ss.sm; var x, y; if (sm.focusCell) { var rs = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rs.minPos.x, miny = rs.minPos.y, maxx = rs.maxPos.x, maxy = rs.maxPos.y; x = sm.focusCell.x; y = sm.focusCell.y; rows[x] = rows[x] || {}; var cell = rows[x][y] || {}; if (cell.wrap) { var wrap = cell.wrap; var span = ds.getVisiableSpan(wrap.minx, wrap.miny, wrap.maxx, wrap.maxy); y = span.miny } var rt = ds.findVisiableCell(x, y, "row", "up"); x = rt.x; y = rt.y; sm.setFocusCell(x, 1, true) } }, onPageUpFn : function() { var ss = this.spreadsheet; var ds = ss.ds; var rows = ds.data.rows; var showRange = ss.showRange; var freezeRange = ss.freezeRange; var sm = ss.sm; var x, y; if (sm.focusCell) { var rs = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rs.minPos.x, miny = rs.minPos.y, maxx = rs.maxPos.x, maxy = rs.maxPos.y; x = sm.focusCell.x; y = sm.focusCell.y; var flag = (minx == x); rows[x] = rows[x] || {}; var cell = rows[x][y] || {}; if (cell.wrap) { var wrap = cell.wrap; var span = ds.getVisiableSpan(wrap.minx, wrap.miny, wrap.maxx, wrap.maxy); y = span.miny } x--; var rt = ds.findVisiableCell(x, y, "row", "up"); x = rt.x; y = rt.y; var vs = showRange.row.start; var ve = showRange.row.end; var va = ve - vs; if ("showRange" === sm.posFlag || "left" === sm.posFlag) { if (vs <= va) { } else { if (ss.isRowSplit()) { ss.scrollingRow(ss.autoOffset, va); sm.setFocusCell(x - va, y, true) } else { if (showRange.row.start > freezeRange.row.end + 1) { ss.scrollingRow(ss.autoOffset, va) } } } } else { if ("top" === sm.posFlag || "left-top" === sm.posFlag) { if (vs <= va) { ss.scrollingURow(ss.autoOffset, vs) } if (ss.isRowSplit() && x < freezeRange.row.start && freezeRange.row.start > 1) { ss.scrollingURow(ss.autoOffset, va) } } } } }, onPageDownFn : function() { var ss = this.spreadsheet; var ds = ss.ds; var showRange = ss.showRange; var freezeRange = ss.freezeRange; var sm = ss.sm; var x, y; if (sm.focusCell) { var rs = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rs.minPos.x, miny = rs.minPos.y, maxx = rs.maxPos.x, maxy = rs.maxPos.y; var rows = ds.data.rows; x = sm.focusCell.x; y = sm.focusCell.y; var flag = (minx == x); rows[x] = rows[x] || {}; var cell = rows[x][y] || {}; if (cell.wrap) { var wrap = cell.wrap; var span = ds.getVisiableSpan(wrap.minx, wrap.miny, wrap.maxx, wrap.maxy); y = span.miny; x = wrap.maxx + 1 } else { } var rt = ds.findVisiableCell(x, y, "row"); x = rt.x; y = rt.y; var vs = showRange.row.start; var ve = showRange.row.end; var va = ve - vs; if ("showRange" === sm.posFlag || "left" === sm.posFlag) { ss.scrollingRow(-ss.autoOffset, va) } else { if ("top" === sm.posFlag || "left-top" === sm.posFlag) { if (ss.isRowSplit()) { if (x > freezeRange.row.end) { ss.scrollingURow(-ss.autoOffset, va) } } else { if (showRange.row.start > freezeRange.row.end + 1 && x > freezeRange.row.end) { ss.ylivescroller.dom.scrollTop = 0; sm.focusCell = { x : x, y : y }; sm.fireEvent("focuscell", sm, x + va, y); sm.selectedStart = Ext.apply({}, sm.focusCell); sm.selectedEnd = Ext.apply({}, sm.focusCell) } else { } } } } } }, onCtrlNavigationFn : function(nav) { var ss = this.spreadsheet; var ds = ss.ds; var showRange = ss.showRange; var freezeRange = ss.freezeRange; var sm = ss.sm; var x, y; if (sm.focusCell) { var rs = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rs.minPos.x, miny = rs.minPos.y, maxx = rs.maxPos.x, maxy = rs.maxPos.y; x = sm.focusCell.x; y = sm.focusCell.y; var bound = ds.getReachBounds(); var re = bound.row; var ce = bound.col; if ("left" === sm.posFlag || "left-top" === sm.posFlag) { ce = freezeRange.col.end } switch (nav) { case "home" : sm.setFocusCell(1, 1, true); break; case "up" : sm.setFocusCell(1, y, true); break; case "down" : sm.setFocusCell(re, y, true); break; case "left" : sm.setFocusCell(x, 1, true); break; case "right" : if (!Ext.isIE && ce == 14) { sm.setFocusCell(x, ce - 1, true) } else { sm.setFocusCell(x, ce, true) } break } } this.updateStatus() }, onCtrlEndFn : function() { var ss = this.spreadsheet; var ds = ss.ds; var sm = ss.sm; var showRange = ss.showRange; var vs = showRange.row.start; var ve = showRange.row.end; var cs = showRange.col.start; var ce = showRange.col.end; var lastData; for (var i = 1; i <= (ve - vs); i++) { for (var j = 1; j <= (ce - cs); j++) { var cell = ds.getOrignCellObj(i, j); if (cell && cell.data) { lastData = { minx : i, miny : j } } } } if (lastData) { sm.setFocusCell(lastData.minx, lastData.miny, true) } else { sm.setFocusCell(vs, cs, true) } }, onCtrlShiftNavigationFn : function(nav) { var ss = this.spreadsheet; var ds = ss.ds; var showRange = ss.showRange; var freezeRange = ss.freezeRange; var sm = ss.sm; sm.transferFocus(); var x, y; if (sm.focusCell) { var rs = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var sEndX = sm.selectedEnd.x, sEndY = sm.selectedEnd.y; var minx = rs.minPos.x, miny = rs.minPos.y, maxx = rs.maxPos.x, maxy = rs.maxPos.y; x = sm.focusCell.x; y = sm.focusCell.y; if ("showRange" === sm.posFlag || "top" === sm.posFlag) { switch (nav) { case "left" : sm.selectRange(null, { x : x, y : y }, { x : sEndX, y : 1 }); ss.scrollingCol(ss.autoOffset, showRange.col.end); break; case "right" : if (showRange.col.start > y) { ss.scrollingCol(-ss.autoOffset, showRange.col.start - y); (function () { sm.selectRange(null, { x : x, y : y }, { x : sEndX, y : showRange.col.end }) }).defer(10) } else { sm.selectRange(null, { x : x, y : y }, { x : sEndX, y : showRange.col.end }) } break; case "up" : sm.selectRange(null, { x : x, y : y }, { x : 1, y : sEndY }); ss.scrollingRow(ss.autoOffset, showRange.row.end); break; case "down" : if (showRange.row.start > x) { ss.scrollingRow(-ss.autoOffset, showRange.row.start - x); (function () { sm.selectRange(null, { x : x, y : y }, { x : showRange.row.end, y : sEndY }) }).defer(10) } else { sm.selectRange(null, { x : x, y : y }, { x : showRange.row.end, y : sEndY }) } break } } else { if ("left" === sm.posFlag || "left-top" === sm.posFlag) { switch (nav) { case "left" : sm.selectRange(null, { x : x, y : y }, { x : sEndX, y : 1 }); ss .scrollingLCol(ss.autoOffset, freezeRange.col.end); break; case "right" : var bound = ds.getReachBounds(); sm.setFocusCell(bound.row, bound.col, true); if (freezeRange.col.start > y) { ss.scrollingLCol(-ss.autoOffset, freezeRange.col.start - y); (function () { sm.selectRange(null, { x : x, y : y }, { x : sEndX, y : freezeRange.col.end }) }).defer(10) } else { sm.selectRange(null, { x : x, y : y }, { x : sEndX, y : freezeRange.col.end }) } break; case "up" : sm.selectRange(null, { x : x, y : y }, { x : 1, y : sEndY }); ss.scrollingRow(ss.autoOffset, freezeRange.row.end); break; case "down" : if (showRange.row.start > x) { ss.scrollingRow(-ss.autoOffset, showRange.row.start - x); (function () { sm.selectRange(null, { x : x, y : y }, { x : showRange.row.end, y : sEndY }) }).defer(10) } else { sm.selectRange(null, { x : x, y : y }, { x : showRange.row.end, y : sEndY }) } break } } } } this.updateStatus() }, popupIsShow : function(tg) { var pTagName = (tg.parentNode).tagName; if (pTagName == "LI") { return true } var tc = Ext.query("div[class=ext-el-mask]", document.body); for (var m = 0; m < tc.length; m++) { var it = tc[m]; if (it.style.display == "block") { return true } } }, mouseKeydown : function(e) { if (this.shiftKeyConfig && e.shiftKey) { var ss = this.spreadsheet; var ds = ss.ds; var sm = ss.sm; var firstFocusCell = this.shiftKeyConfig; var focusCell = sm.focusCell; sm.selectRange(null, { x : firstFocusCell.x, y : firstFocusCell.y }, { x : focusCell.x, y : focusCell.y }) } else { delete this.shiftKeyConfig } } }); window.onhelp = function() { return false }; Ext.ns("Ext.ss"); Ext.ss.SelectionModel = function(config) { Ext.apply(this, config); this.initAutoFillOptions(); Ext.ss.SelectionModel.superclass.constructor.call(this); this.addEvents("focuscell", "defocuscell", "selectcell", "deselectcell", "selecthdcell", "deselecthdcell", "selectrow", "deselectrow", "selectcol", "deselectcol", "updateselected", "renderborder", "xresize", "yresize", "selectup", "formulaeditingchanged", "selectionchanged"); this.on("formulaeditingchanged", this.onFormulaEditingChangedFn, this); this.on("updateselected", this.onUpdateSelectedFn, this); this.on("renderborder", this.renderBorder, this); this.initListeners(); this.initSelection(); }; Ext.extend(Ext.ss.SelectionModel, Ext.util.Observable, { posFlag : "showRange", selectedSet : {}, selectCoverBorder : "3px solid black", borderWidth : 3, onContextMenuFn : function(e) { e.stopEvent(); }, initListeners : function() { this.resetListeners(); Ext.EventManager.on(document, "mousedown", this.onMouseDownFn, this); Ext.EventManager.on(document, "mousemove", this.onMouseMoveFn, this); Ext.EventManager.on(document, "mouseup", this.onMouseUpFn, this); }, resetListeners : function() { Ext.EventManager.un(document, "mousedown", this.onMouseDownFn); Ext.EventManager.un(document, "mousemove", this.onMouseMoveFn); Ext.EventManager.un(document, "mouseup", this.onMouseUpFn); }, initAutoFillOptions : function() { var lanss = feyaSoft.ss.lang; this.autoFillOptions = new Ext.Button({ cls : "x-spreadsheet-autofill-option", hidden : true, iconCls : "icon_autofill_option", menu : new Ext.menu.Menu({ defaults : { group : Ext.id() + "-autofill", checked : false }, items : [{ checked : true, text : lanss.fillSequence, handler : this.fillStyleContent, scope : this }, { text : lanss.fillOnlyStyle, handler : this.fillOnlyStyle, scope : this }, { text : lanss.fillOnlyContent, handler : this.fillOnlyContent, scope : this }, { text : lanss.copyCell, handler : this.fillCopyCell, scope : this }] }), renderTo : Ext.getBody(), listeners : { render : { fn : function(btn) { btn.getEl().swallowEvent("mousedown"); } } } }); }, hideAutoFillOptions : function() { this.autoFillOptions.hide(); }, initSelection : function() { this.focusCell = { x : 1, y : 1 }; this.selectedStart = { x : 1, y : 1 }; this.selectedEnd = { x : 1, y : 1 }; }, onFormulaEditingChangedFn : function(ov, v, nofocus, border) { if (v) { this.initFormulaSelecting(nofocus, border); } else { this.resetFormulaSelecting(nofocus); } }, onUpdateSelectedFn : function(ss, flag) { if ("row" === flag) { if ("decrease" === this.scrollDir) { this.selectedEnd.x = parseInt(ss.showRange.row.start); this.fireEvent("selectionchanged"); } else { this.selectedEnd.x = parseInt(ss.showRange.row.end); this.fireEvent("selectionchanged"); } } else if ("urow" === flag) { if ("decrease" === this.scrollDir) { this.selectedEnd.x = parseInt(ss.freezeRange.row.start); this.fireEvent("selectionchanged"); } else { this.selectedEnd.x = parseInt(ss.freezeRange.row.end); this.fireEvent("selectionchanged"); } } else if ("col" === flag) { if ("decrease" === this.scrollDir) { this.selectedEnd.y = parseInt(ss.showRange.col.start); this.fireEvent("selectionchanged"); } else { this.selectedEnd.y = parseInt(ss.showRange.col.end); this.fireEvent("selectionchanged"); } } else if ("lcol" === flag) { if ("decrease" === this.scrollDir) { this.selectedEnd.y = parseInt(ss.freezeRange.col.start); this.fireEvent("selectionchanged"); } else { this.selectedEnd.y = parseInt(ss.freezeRange.col.end); this.fireEvent("selectionchanged"); } } }, isSingleSelected : function() { if (this.selectedStart.x == this.selectedEnd.x && this.selectedStart.y == this.selectedEnd.y || 0 == this.selectedStart.x && 0 == this.selectedEnd.x || 0 == this.selectedStart.y && 0 == this.selectedEnd.y) { return true; } return false; }, onMouseDownFn : function(e) { this.spreadsheet.hyperlinktip.showLink(e); this.downFlag = true; if (0 == e.button && ("col" == this.mdFlag || "row" == this.mdFlag || "cell" == this.mdFlag)) { this.m_evt = null; if (!this.task) { this.task = { run : function() { if (this.mdFlag) { this.autoScrolling(); return true; } else { this.spreadsheet.autoRowSelected = false; this.spreadsheet.autoColSelected = false; return false; } }, interval : 100, scope : this }; Ext.TaskMgr.start(this.task); } } }, handleMouseUp : function() { var ss = this.spreadsheet; ss.autoRowSelected = false; ss.autoColSelected = false; if (this.task) { Ext.TaskMgr.stop(this.task); } this.task = null; this.mdFlag = null; this.applyBrushFormat(); this.fireEvent("selectup", this); }, applyBrushFormat : function() { if (this.brushFormat) { var ss = this.spreadsheet; var ds = ss.ds; var rt = this.getMinMaxFromStartEnd(this.selectedStart, this.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; this.applyFormat2Range(minx, miny, maxx, maxy, this.brushFormat); ds.trace(feyaSoft.ss.lang.action_format_bush); ss.toolbar.stopBrushFormat(); } }, applyFormat2Range : function(minx, miny, maxx, maxy, bf) { var ss = this.spreadsheet; var ds = ss.ds; var rows = ds.data.rows; delete bf['origin-data']; if (0 == minx && 0 == maxx) { delete bf.wrap; var arr = Ext.ss.common.Mask.obj2arr(bf); for (var j = miny; j <= maxy; j++) { ds.fireEvent("colattributechange", j, arr); } ss.refreshRange(); var rt = this.getMinMaxFromStartEnd(this.selectedStart, this.selectedEnd); this.selectRange(this.focusCell, rt.minPos, rt.maxPos); } else if (0 == miny && 0 == maxy) { delete bf.wrap; var arr = Ext.ss.common.Mask.obj2arr(bf); for (var i = minx; i <= maxx; i++) { ds.fireEvent("rowattributechange", i, arr); } ss.refreshRange(); var rt = this.getMinMaxFromStartEnd(this.selectedStart, this.selectedEnd); this.selectRange(this.focusCell, rt.minPos, rt.maxPos); } else { var wrapRowSpan, wrapColSpan; if (bf.wrap) { wrapRowSpan = bf.wrap.maxx - bf.wrap.minx + 1; wrapColSpan = bf.wrap.maxy - bf.wrap.miny + 1; maxx = Math.ceil((maxx - minx + 1) / wrapRowSpan) * wrapRowSpan + minx - 1; maxy = Math.ceil((maxy - miny + 1) / wrapColSpan) * wrapColSpan + miny - 1; } for (var i = minx; i <= maxx; i++) { var xOffset, wminx; if (bf.wrap) { xOffset = Math.floor((i - minx) / wrapRowSpan); wminx = minx + wrapRowSpan * xOffset; } rows[i] = rows[i] || {}; var row = rows[i]; for (var j = miny; j <= maxy; j++) { row[j] = row[j] || {}; var cell = { 'origin-data' : row[j]['origin-data'], data : row[j].data, wrap : row[j].wrap, bb : row[j].bb, br : row[j].br, comment : row[j].comment }; Ext.apply(cell, bf); var yOffset; if (bf.wrap) { yOffset = Math.floor((j - miny) / wrapColSpan); var wminy = miny + wrapColSpan * yOffset; var wrap = { minx : wminx, maxx : wminx + wrapRowSpan - 1, miny : wminy, maxy : wminy + wrapColSpan - 1 }; cell.wrap = wrap; } ds.fireEvent("cellchange", i, j, cell); var obj = ds.getCell(i, j); obj.x = i; obj.y = j; ss.refreshCell(obj); } } } this.selectRange({ x : minx, y : miny }, { x : minx, y : miny }, { x : maxx, y : maxy }); }, resetBrushFormat : function() { delete this.brushFormat; this.brushEl.setStyle("display", "none"); }, getBrushFormat : function() { var ds = this.spreadsheet.ds; var obj; var rt = this.getMinMaxFromStartEnd(this.selectedStart, this.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; var x = this.focusCell.x, y = this.focusCell.y; if (0 == minx && 0 == maxx) { obj = ds.data.colSetting[y]; this.brushFormat = Ext.apply({ cw : null }, obj); } else if (0 == miny && 0 == maxy) { obj = ds.data.rowSetting[x]; this.brushFormat = Ext.apply({ ch : null }, obj); } else { obj = ds.getCell(x, y); this.brushFormat = Ext.apply({}, obj); if (this.brushFormat.wrap) { var wrap = Ext.apply({}, this.brushFormat.wrap); this.brushFormat.wrap = wrap; } } delete this.brushFormat.data; delete this.brushFormat.bb; delete this.brushFormat.br; delete this.brushFormat.comment; delete this.brushFormat.css; this.brushEl.setStyle("display", ""); }, onMouseUpFn : function(e) { this.downFlag = false; this.m_evt = null; if (this.mdFlag) { if ("drag-split-row" == this.mdFlag) { this.resetDragSplitRow(e.getXY()); } else if ("drag-split-col" == this.mdFlag) { this.resetDragSplitCol(e.getXY()); } else if ("drag-split-cross" == this.mdFlag) { this.resetDragSplitCross(e.getXY()); } else if ("col-resizer" == this.mdFlag) { this.handleColResize(); } else if ("row-resizer" == this.mdFlag) { this.handleRowResize(); } else { this.handleMouseUp(); } var ss = this.spreadsheet; var ds = ss.ds; } this.resetAutoContenting(true); }, handleColResize : function() { delete this.mdFlag; var ss = this.spreadsheet; var ds = ss.ds; var y = this.resizeColIndex; var cEl = ss.getCellEl(0, y, this.posFlag); var w = cEl.getWidth(); this.posFlag = this.lastPosFlag; if (w != this.resizeColWidth) { ss.yResizingCol(y, this.resizeColWidth); var l = ds.getLetter(y); ds.trace(feyaSoft.ss.lang.action_col_resize(l, l)); } this.resizeColWidth = cEl.getWidth(); ss.colline.dom.style.display = "none"; }, handleRowResize : function() { delete this.mdFlag; var ss = this.spreadsheet; var ds = ss.ds; var x = this.resizeRowIndex; var cEl = ss.getCellEl(x, 0, this.posFlag); var h = cEl.getHeight(); this.posFlag = this.lastPosFlag; if (h != this.resizeRowHeight) { ss.xResizingRow(x, this.resizeRowHeight); ds.trace(feyaSoft.ss.lang.action_row_resize(x, x)); } this.resizeRowHeight = cEl.getHeight(); ss.rowline.dom.style.display = "none"; }, adjustFocused : function() { var ss = this.spreadsheet; var ds = ss.ds; var rows = ds.data.rows; var fx = this.focusCell.x, fy = this.focusCell.y; if (rows[fx] && rows[fx][fy]) { var wrap = rows[fx][fy].wrap; if (wrap) { this.focusCell.x = wrap.minx; this.focusCell.y = wrap.miny; this.selectedStart.x = wrap.minx; this.selectedStart.y = wrap.miny; this.selectedEnd.x = wrap.maxx; this.selectedEnd.y = wrap.maxy; } } }, adjustSelected : function() { var ss = this.spreadsheet; var ds = ss.ds; var rows = ds.data.rows; var rt = this.getMinMaxFromStartEnd(this.selectedStart, this.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; var tminx, tminy, tmaxx, tmaxy; while (!(minx == tminx && miny == tminy && maxx == tmaxx && maxy == tmaxy)) { tminx = minx, tmaxx = maxx, tminy = miny, tmaxy = maxy; for (var i = tminx; i <= tmaxx; i++) { for (var j = tminy; j <= tmaxy; j++) { if (rows[i] && rows[i][j]) { var wrap = rows[i][j].wrap; if (wrap) { if (minx > wrap.minx) { minx = wrap.minx; } if (maxx < wrap.maxx) { maxx = wrap.maxx; } if (miny > wrap.miny) { miny = wrap.miny; } if (maxy < wrap.maxy) { maxy = wrap.maxy; } } } } } } if (this.selectedStart.x <= this.selectedEnd.x) { this.selectedStart.x = minx; this.selectedEnd.x = maxx; } else { this.selectedStart.x = maxx; this.selectedEnd.x = minx; } if (this.selectedStart.y <= this.selectedEnd.y) { this.selectedStart.y = miny; this.selectedEnd.y = maxy; } else { this.selectedStart.y = maxy; this.selectedEnd.y = miny; } if (!this.formulaEditing) { if (!(0 == minx && 0 == maxx) && !(minx <= this.focusCell.x && maxx >= this.focusCell.x)) { this.selectedStart.x = this.focusCell.x; } if (!(0 == miny && 0 == maxy) && !(miny <= this.focusCell.y && maxy >= this.focusCell.y)) { this.selectedStart.y = this.focusCell.y; } } }, resizingCol : function(xy) { var ss = this.spreadsheet; var cEl = ss.getCellEl(0, this.resizeColIndex, this.posFlag); var r = cEl.getRight(); var w = cEl.getWidth(); this.resizeColWidth = w + xy[0] - r; var min = ss.xpaddingOffset + 1; if (min > this.resizeColWidth) { this.resizeColWidth = min; } var cd = ss.colline.dom; cd.style.left = cEl.getLeft() + this.resizeColWidth - ss.sview.getLeft() + "px"; }, resizingRow : function(xy) { var ss = this.spreadsheet; var cEl = ss.getCellEl(this.resizeRowIndex, 0, this.posFlag); var b = cEl.getBottom(); var h = cEl.getHeight(); this.resizeRowHeight = h + xy[1] - b; var min = ss.ypaddingOffset + 1; if (min > this.resizeRowHeight) { this.resizeRowHeight = min; } var rd = ss.rowline.dom; rd.style.top = cEl.getTop() + this.resizeRowHeight - ss.sview.getTop() + "px"; }, recheckPos : function() { var pos = this.selectedEnd; if (this.autoContentFlag) { var minPos = this.autoContentFlag.minPos, maxPos = this.autoContentFlag.maxPos; var minRow = Math.abs(pos.x - minPos.x), maxRow = Math.abs(pos.x - maxPos.x); var minCol = Math.abs(pos.y - minPos.y), maxCol = Math.abs(pos.y - maxPos.y); var row = minRow > maxRow ? maxRow : minRow, col = minCol > maxCol ? maxCol : minCol; if (pos.x < minPos.x) { if (pos.y < minPos.y) { this.selectedStart = Ext.apply({}, maxPos); if (row > col) { pos.y = minPos.y; } else { pos.x = minPos.x; } } else if (minPos.y <= pos.y && pos.y <= maxPos.y) { this.selectedStart = Ext.apply({}, maxPos); pos.y = minPos.y; } else { this.selectedStart = { x : maxPos.x, y : minPos.y }; if (row > col) { pos.y = maxPos.y; } else { pos.x = minPos.x; } } } else if (minPos.x <= pos.x && pos.x <= maxPos.x) { if (pos.y < minPos.y) { this.selectedStart = Ext.apply({}, maxPos); pos.x = minPos.x; } else if (minPos.y <= pos.y && pos.y <= maxPos.y) { this.selectedStart = Ext.apply({}, minPos); pos = Ext.apply({}, maxPos); } else { this.selectedStart = { x : maxPos.x, y : minPos.y }; pos.x = minPos.x; } } else { if (pos.y < minPos.y) { this.selectedStart = { x : minPos.x, y : maxPos.y }; if (row > col) { pos.y = minPos.y; } else { pos.x = maxPos.x; } } else if (minPos.y <= pos.y && pos.y <= maxPos.y) { this.selectedStart = { x : minPos.x, y : maxPos.y }; pos.y = minPos.y; } else { this.selectedStart = Ext.apply({}, minPos); if (row > col) { pos.y = maxPos.y; } else { pos.x = maxPos.x; } } } } this.selectedEnd = pos; return pos; }, getValidPos : function(pos) { var ss = this.spreadsheet; var fr = ss.freezeRange; if (ss.isRowSplit()) { if (0 == pos.x && 0 == ss.uylivescroller.dom.scrollTop) { pos.x = fr.row.start; } } else { if (0 == pos.x && 0 == ss.ylivescroller.dom.scrollTop) { pos.x = fr.row.start; } } if (ss.isColSplit()) { if (0 == pos.y && 0 == ss.lxlivescroller.dom.scrollLeft) { pos.y = fr.col.start; } } else { if (0 == pos.y && 0 == ss.xlivescroller.dom.scrollLeft) { pos.y = fr.col.start; } } return pos; }, dragingSplitRow : function(xy) { var ss = this.spreadsheet; var ds = ss.ds; var xlimit = ss.ylivescroller.getLeft(); var ylimit = ss.xlivescroller.getTop(); if (xy[0] <= xlimit && xy[1] <= ylimit) { var pos = ds.getSplitPosFromXY(xy[0], xy[1]); if (0 < pos.y) { ss.dragRowSpliter.setStyle("top", pos.y); } } }, dragingSplitCol : function(xy) { var ss = this.spreadsheet; var ds = ss.ds; var xlimit = ss.ylivescroller.getLeft(); var ylimit = ss.xlivescroller.getTop(); if (xy[0] <= xlimit && xy[1] <= ylimit) { var pos = ds.getSplitPosFromXY(xy[0], xy[1]); if (0 < pos.x) { ss.dragColSpliter.setStyle("left", pos.x); } } }, dragingSplitCross : function(xy) { var ss = this.spreadsheet; var ds = ss.ds; var xlimit = ss.ylivescroller.getLeft(); var ylimit = ss.xlivescroller.getTop(); if (xy[0] <= xlimit && xy[1] <= ylimit) { var pos = ds.getSplitPosFromXY(xy[0], xy[1]); if (0 < pos.y) { ss.dragRowSpliter.setStyle("top", pos.y); } if (0 < pos.x) { ss.dragColSpliter.setStyle("left", pos.x); } } }, getValidEndPos : function(pos, posFlag) { var showRange = this.spreadsheet.showRange; if ("showRange" == this.posFlag) { if ("left-top" == posFlag) { pos = { x : showRange.row.start, y : showRange.col.start }; } else if ("left" == posFlag) { pos.y = showRange.col.start; } else { pos.x = showRange.row.start; } } else if ("left" == this.posFlag) { if ("left-top" == posFlag || "top" == posFlag) { pos.x = showRange.row.start; } } else if ("top" == this.posFlag) { if ("left-top" == posFlag || "left" == posFlag) { pos.y = showRange.col.start; } } return pos; }, onMouseMoveFn : function(e) { if (!Ext.isIE) { e.preventDefault(); } this.m_evt = e; if (this.mdFlag) { var ss = this.spreadsheet; var ds = ss.ds; var xy = e.getXY(); if ("drag-split-row" == this.mdFlag) { this.dragingSplitRow(xy); } else if ("drag-split-col" == this.mdFlag) { this.dragingSplitCol(xy); } else if ("drag-split-cross" == this.mdFlag) { this.dragingSplitCross(xy); } else if ("col-resizer" == this.mdFlag) { this.resizingCol(xy); } else if ("row-resizer" == this.mdFlag) { this.resizingRow(xy); } else if ("contextmenu" != this.mdFlag) { var pos = ds.getPosFromXY(xy[0], xy[1]); if (pos && !(this.lastPos && this.lastPos.x == pos.x && this.lastPos.y == pos.y)) { this.lastPos = Ext.apply({}, pos); var showRange = ss.showRange; var freezeRange = ss.freezeRange; var flag = false; var posFlag = this.whichRange(pos); pos = this.getValidPos(pos); if ("cell" == this.mdFlag) { if (posFlag != this.posFlag) { if (!ss.splitFlag) { if ("top" == this.posFlag && ("showRange" == posFlag && showRange.row.start == freezeRange.row.end + 1 || "left-top" == posFlag && showRange.col.start == freezeRange.col.end + 1)) { flag = true; } else if ("left" == this.posFlag && ("showRange" == posFlag && showRange.col.start == freezeRange.col.end + 1 || "left-top" == posFlag && showRange.row.start == freezeRange.row.end + 1)) { flag = true; } else if ("left-top" == this.posFlag && ("top" == posFlag && showRange.col.start === freezeRange.col.end + 1 || "left" == posFlag && showRange.row.start == freezeRange.row.end + 1 || showRange.col.start === freezeRange.col.end + 1 && showRange.row.start == freezeRange.row.end + 1)) { flag = true; } else { if ("top" == posFlag && showRange.row.start == freezeRange.row.end + 1) { flag = true; } else if ("left" == posFlag && showRange.col.start == freezeRange.col.end + 1) { flag = true; } else if ("left-top" == posFlag && showRange.col.start == freezeRange.col.end + 1 && showRange.row.start == freezeRange.row.end + 1) { flag = true; } } } else { pos = this.getValidEndPos(pos, posFlag); flag = true; } } else { flag = true; } if (true == flag) { var old = Ext.apply({}, this.selectedEnd); this.selectedEnd = Ext.apply({}, pos); if (this.checkSelectionChange(null, old)) { this.adjustSelected(); this.fireEvent("renderborder"); } } } else if ("row" === this.mdFlag) { var rflag = posFlag == this.posFlag; if (!rflag && ss.splitFlag) { rflag = true; pos = this.getValidEndPos(pos, posFlag); } if (rflag) { var old = Ext.apply({}, this.selectedEnd); this.selectedEnd = { x : pos.x, y : 0 }; if (this.checkSelectionChange(null, old)) { this.fireEvent("renderborder"); } } } else if ("col" === this.mdFlag) { var cflag = posFlag == this.posFlag; if (!cflag && ss.splitFlag) { cflag = true; pos = this.getValidEndPos(pos, posFlag); } if (cflag) { var old = Ext.apply({}, this.selectedEnd); this.selectedEnd = { x : 0, y : pos.y }; if (this.checkSelectionChange(null, old)) { this.fireEvent("renderborder"); } } } } } } if (this.brushFormat) { var xy = e.getXY(); xy[0] += 15; xy[1] -= 6; this.brushEl.setXY(xy); } }, autoScrolling : function() { if (this.mdFlag && this.m_evt) { var pos = this.m_evt.getXY(); if (0 != pos[0] || 0 != pos[1]) { this.m_pos = pos; } if (!this.m_pos) { return; } var ss = this.spreadsheet; var minx = ss.scroller.getLeft(); var miny = ss.scroller.getTop(); var maxx = ss.ylivescroller.getLeft(); var maxy = ss.xlivescroller.getTop(); var posx = this.m_pos[0]; var posy = this.m_pos[1]; if (ss.splitFlag) { var lx = ss.lhct.getLeft(); var ly = ss.lhct.getTop(); if ("row" != this.mdFlag) { if (posx <= lx) { if ("left" == this.posFlag || "left-top" == this.posFlag) { ss.autoColSelected = true; this.scrollDir = "decrease"; ss.scrollingLCol(ss.autoOffset); } } } if ("col" != this.mdFlag) { if (posy <= ly) { if ("top" == this.posFlag || "left-top" == this.posFlag) { ss.autoRowSelected = true; this.scrollDir = "decrease"; ss.scrollingURow(ss.autoOffset); } } } } if ("row" != this.mdFlag) { if (posx >= maxx) { ss.autoColSelected = true; this.scrollDir = "increase"; ss.scrollingCol(-ss.autoOffset); } else { if (posx <= minx) { if (0 != ss.xlivescroller.dom.scrollLeft && ("showRange" == this.posFlag || "top" == this.posFlag)) { ss.autoColSelected = true; this.scrollDir = "decrease"; ss.scrollingCol(ss.autoOffset); } } else if (posx >= minx && ("left" == this.posFlag || "left-top" == this.posFlag)) { if (ss.splitFlag) { ss.autoColSelected = true; this.scrollDir = "increase"; ss.scrollingLCol(-ss.autoOffset); } else { ss.xlivescroller.dom.scrollLeft = 0; } } } } if ("col" != this.mdFlag) { if (posy >= maxy) { ss.autoRowSelected = true; this.scrollDir = "increase"; ss.scrollingRow(-ss.autoOffset); } else { if (posy <= miny) { if (0 != ss.ylivescroller.dom.scrollTop && ("showRange" === this.posFlag || "left" == this.posFlag)) { ss.autoRowSelected = true; this.scrollDir = "decrease"; ss.scrollingRow(ss.autoOffset); } } else if (posy >= miny && ("top" == this.posFlag || "left-top" == this.posFlag)) { if (ss.splitFlag) { ss.autoRowSelected = true; this.scrollDir = "increase"; ss.scrollingURow(-ss.autoOffset); } else { ss.ylivescroller.dom.scrollTop = 0; } } } } } }, setFocusCell : function(x, y, update) { if (!this.isInRange({ x : x, y : y })) { this.spreadsheet.scroll2Pos(x, y, [10, 3]); } this.handleLeftClick({ x : x, y : y }, true, update); this.spreadsheet.hyperlinktip.showLink(); }, getMinMaxFromStartEnd : function(startPos, endPos) { var stx = startPos.x; var sty = startPos.y; var edx = endPos.x; var edy = endPos.y; var minx, maxx, miny, maxy; if (stx <= edx) { minx = stx; maxx = edx; } else { minx = edx; maxx = stx; } if (sty <= edy) { miny = sty; maxy = edy; } else { miny = edy; maxy = sty; } return { minPos : { x : minx, y : miny }, maxPos : { x : maxx, y : maxy } }; }, handleFocus : function(x, y, focusFlag, update) { var ss = this.spreadsheet; var ds = ss.ds; if (!focusFlag) { this.lastFocusCell = this.focusCell; this.focusCell = { x : x, y : y }; } this.getTextCover().blur(); var rows = ds.data.rows; var minx = x, miny = y; if (rows[x] && rows[x][y]) { var wrap = rows[x][y].wrap; if (wrap) { minx = wrap.minx; miny = wrap.miny; this.focusCell = { x : wrap.minx, y : wrap.miny }; } } if (!update) { ss.fireEvent("updatestate", this.focusCell, this.focusCell); ss.fireEvent("updatefx", minx, miny); ss.fireEvent("updatepress", ss, minx, miny); } }, clickAll : function(update) { this.mdFlag = "all"; var fr = this.spreadsheet.freezeRange; this.handleFocus(fr.row.start, fr.col.start, null, update); }, clickCell : function(x, y, focusFlag, update) { this.mdFlag = "cell"; this.handleFocus(x, y, focusFlag, update); }, clickRow : function(x, update) { this.mdFlag = "row"; var ss = this.spreadsheet; var rows = ss.ds.data.rows; var y = ss.freezeRange.col.start; while (rows[x] && rows[x][y]) { var wrap = rows[x][y].wrap; if (wrap) { y = wrap.maxy + 1; } else { break; } } this.handleFocus(x, y, null, update); }, clickCol : function(y, update) { this.mdFlag = "col"; var ss = this.spreadsheet; var rows = ss.ds.data.rows; var x = ss.freezeRange.row.start; while (rows[x] && rows[x][y]) { var wrap = rows[x][y].wrap; if (wrap) { x = wrap.maxx + 1; } else { break; } } this.handleFocus(x, y, null, update); }, transferFocus : function() { if (!this.formulaEditing) { var ss = this.spreadsheet; ss.hfocus.focus.defer(1, ss.hfocus); } }, initColResize : function(pos, rEl) { var ss = this.spreadsheet; this.mdFlag = "col-resizer"; this.resizeColIndex = pos.y; var cEl = ss.getCellEl(0, pos.y, this.posFlag); var l = cEl.getRight() - ss.sview.getLeft(); ss.colline.setLeft(l); ss.colline.dom.style.display = ""; this.resizeColWidth = cEl.getWidth(); }, initRowResize : function(pos, rEl) { var ss = this.spreadsheet; this.mdFlag = "row-resizer"; this.resizeRowIndex = pos.x; var cEl = ss.getCellEl(pos.x, 0, this.posFlag); var t = cEl.getBottom() - ss.sview.getTop(); ss.rowline.setTop(t); ss.rowline.dom.style.display = ""; this.resizeRowHeight = cEl.getHeight(); }, initDragSplitRow : function() { this.mdFlag = "drag-split-row"; var ss = this.spreadsheet; if ("none" != ss.leftsplit.dom.style.display) { ss.dragRowSpliter.setStyle("top", ss.leftsplit.getTop() - ss.sview.getTop()); } else { ss.dragRowSpliter .setStyle("top", ss.cellHeight + ss.ypaddingOffset); } ss.dragRowSpliter.setWidth(ss.availWidth); ss.dragRowSpliter.setStyle("display", ""); }, resetDragSplitRow : function(xy) { delete this.mdFlag; var ss = this.spreadsheet; var ds = ss.ds; var pos = ds.getSplitPosFromXY(xy[0], xy[1]); var fr = ss.copyRange(ss.freezeRange), ofr = ss .copyRange(ss.freezeRange), sr = ss.copyRange(ss.showRange); var flag = 0 == fr.row.len; fr.row.end = pos.r - 1; if (0 > fr.row.end) { fr.row.start = 1; fr.row.end = 0; fr.row.len = 0; } else { fr.row.len = fr.row.end - fr.row.start + 1; } if (flag) { sr.row.start = fr.row.end + 1; sr.row.len -= fr.row.len; sr.row.end = sr.row.start + sr.row.len - 1; } var splitFlag = Ext.ss.common.Mask.copy(ss.splitFlag); ss.cancelYSplit(); if (ss.splitFlag) { ss.splitFlag.splitHeight = null; } ss.reSplitRange(fr, sr, true); ds.fireEvent("splitchange", ofr, fr, splitFlag, ss.splitFlag); ds.trace(feyaSoft.ss.lang.action_split_grid_change); ss.dragRowSpliter.setStyle("display", "none"); }, initDragSplitCol : function() { this.mdFlag = "drag-split-col"; var ss = this.spreadsheet; if ("none" != ss.vsplittd.dom.style.display) { ss.dragColSpliter.setStyle("left", ss.uppersplit.getLeft() - ss.sview.getLeft()); } else { ss.dragColSpliter.setStyle("left", ss.ylivescroller.getLeft() - ss.sview.getLeft() - ss.SPLIT_BAR_SIZE); } ss.dragColSpliter.setHeight(ss.availHeight); ss.dragColSpliter.setStyle("display", ""); }, resetDragSplitCol : function(xy) { delete this.mdFlag; var ss = this.spreadsheet; var ds = ss.ds; var pos = ds.getSplitPosFromXY(xy[0], xy[1]); var fr = ss.copyRange(ss.freezeRange), ofr = ss .copyRange(ss.freezeRange), sr = ss.copyRange(ss.showRange); var flag = 0 == fr.col.len; fr.col.end = pos.c - 1; if (0 > fr.col.end) { fr.col.start = 1; fr.col.end = 0; fr.col.len = 0; } else { fr.col.len = fr.col.end - fr.col.start + 1; } if (flag) { sr.col.start = fr.col.end + 1; sr.col.len -= fr.col.len; sr.col.end = sr.col.start + sr.col.len - 1; } var splitFlag = Ext.ss.common.Mask.copy(ss.splitFlag); ss.cancelXSplit(); ss.footerWidth = null; if (ss.splitFlag) { ss.splitFlag.splitWidth = null; } ss.reSplitRange(fr, sr, true); ds.fireEvent("splitchange", ofr, fr, splitFlag, ss.splitFlag); ds.trace(feyaSoft.ss.lang.action_split_grid_change); ss.dragColSpliter.setStyle("display", "none"); }, initDragSplitCross : function() { this.mdFlag = "drag-split-cross"; var ss = this.spreadsheet; ss.dragRowSpliter.setStyle("top", ss.leftsplit.getTop() - ss.sview.getTop()); ss.dragRowSpliter.setWidth(ss.availWidth); ss.dragRowSpliter.setStyle("display", ""); ss.dragColSpliter.setStyle("left", ss.uppersplit.getLeft() - ss.sview.getLeft()); ss.dragColSpliter.setHeight(ss.availHeight); ss.dragColSpliter.setStyle("display", ""); }, resetDragSplitCross : function(xy) { delete this.mdFlag; var ss = this.spreadsheet; var ds = ss.ds; var pos = ds.getSplitPosFromXY(xy[0], xy[1]); var fr = ss.copyRange(ss.freezeRange), ofr = ss .copyRange(ss.freezeRange), sr = ss.copyRange(ss.showRange); fr.row.end = pos.r - 1; if (0 > fr.row.end) { fr.row.start = 1; fr.row.end = 0; fr.row.len = 0; } else { fr.row.len = fr.row.end - fr.row.start + 1; } ss.cancelYSplit(); ss.cancelXSplit(); fr.col.end = pos.c - 1; if (0 > fr.col.end) { fr.col.start = 1; fr.col.end = 0; fr.col.len = 0; } else { fr.col.len = fr.col.end - fr.col.start + 1; } var splitFlag = Ext.ss.common.Mask.copy(ss.splitFlag); ss.splitFlag = false; ss.footerWidth = null; ss.reSplitRange(fr, sr, true); ds.fireEvent("splitchange", ofr, fr, splitFlag, ss.splitFlag); ds.trace(feyaSoft.ss.lang.action_split_grid_change); ss.dragRowSpliter.setStyle("display", "none"); ss.dragColSpliter.setStyle("display", "none"); }, onBodyMouseDownFn : function(e) { if (0 != e.button) { return; } var ss = this.spreadsheet; var ds = ss.ds; var target = e.getTarget(); var tgEl = Ext.get(target); if (target.tagName.toUpperCase() == "A") { return; } var xy = e.getXY(); if (tgEl.hasClass("x-spreadsheet-hsplit") || tgEl.hasClass("x-spreadsheet-vsplit-bar")) { this.initDragSplitRow(); } else if (tgEl.hasClass("x-spreadsheet-vsplit") || tgEl.hasClass("x-spreadsheet-hsplit-bar")) { this.initDragSplitCol(); } else if (tgEl.hasClass("x-spreadsheet-split-cross")) { this.initDragSplitCross(); } else if (tgEl.hasClass("x-spreadsheet-select-cover-dot")) { if (!ss.settings.readOnlyView) { var pos = ds.getPosFromXY(xy[0], xy[1]); if (pos) { this.lastPosFlag = this.posFlag; this.posFlag = this.whichRange(pos); } this.initAutoContenting(); } } else { this.resetAutoContenting(); var xlimit = ss.ylivescroller.getLeft(); var ylimit = ss.xlivescroller.getTop(); if (xy[0] <= xlimit && xy[1] <= ylimit) { var pos = ds.getPosFromXY(xy[0], xy[1]); if (pos) { this.lastPosFlag = this.posFlag; this.posFlag = this.whichRange(pos); if (tgEl.hasClass("x-spreadsheet-col-resizer")) { this.initColResize(pos, tgEl); return; } if (tgEl.hasClass("x-spreadsheet-row-resizer")) { this.initRowResize(pos, tgEl); return; } if (!this.formulaEditing && 0 != pos.x * pos.y) { this.transferFocus(); } this.handleLeftClick(pos, undefined, undefined, e.ctrlKey); } } } }, initFormulaSelecting : function(nofocus, border) { this.selectCoverBorder = border || "1px solid red"; this.borderWidth = 1; this.formulaEditing = { focusCell : Ext.apply({}, this.focusCell), selectedStart : Ext.apply({}, this.selectedStart), selectedEnd : Ext.apply({}, this.selectedEnd) }; if (!nofocus) { this.on("selectionchanged", this.updateFormulaForSelectionChange, this); var editor = this.spreadsheet.editor; this.on("selectup", this.onFormulaSelectupFn, this); var textCoverEl = Ext.get(this.getTextCover()); textCoverEl.un("blur", editor.onTextCoverBlurFn, editor); } }, selectLastFrginFormula : function(textcover) { var posReg = this.spreadsheet.ds.posReg; var formula = textcover.value; var sindex, eindex, frg; formula.replace(posReg, function(f) { frg = f; return f; }); if (frg) { sindex = formula.lastIndexOf(frg); eindex = sindex + frg.length; Ext.ss.common.Mask.setCaretPosition(textcover, eindex, eindex); } }, onFormulaSelectupFn : function() { var ss = this.spreadsheet; var len = ss.focusObj.value.length; var pos = len; if (false != Ext.type(ss.cachedCursorPos)) { pos = ss.cachedCursorPos; } Ext.ss.common.Mask.setCaretPosition(ss.focusObj, pos, pos); delete ss.cachedCursorPos; }, updateFormulaForSelectionChange : function(selectedStart, selectedEnd, spos, epos, ctrlKey) { this.updateFormulaRange(ctrlKey); }, updateFormulaRange : function(notReplace) { var ss = this.spreadsheet; var ds = ss.ds; var textCover = this.getTextCover(); var pos = textCover.pos || { sheetIndex : ds.activeSheet }; this.adjustSelected(); var rt = this.getMinMaxFromStartEnd(this.selectedStart, this.selectedEnd); var minx = rt.minPos.x, miny = rt.minPos.y, maxx = rt.maxPos.x, maxy = rt.maxPos.y; var str = ""; if (0 == minx && 0 == maxx && 0 == miny && 0 == maxy) { } else if (0 == minx && 0 == maxx) { str = ds.getLetter(miny) + ":" + ds.getLetter(maxy); } else if (0 == miny && 0 == maxy) { str = minx + ":" + maxx; } else { var mins = ds.getLetter(miny) + minx; var maxs = ds.getLetter(maxy) + maxx; if (mins != maxs) { str = mins + ":" + maxs; } else { str = mins; } } if (pos.sheetIndex != ds.activeSheet) { var sheetName = ds.sheets[ds.activeSheet].name; str = sheetName + "!" + str; } textCover.where = "db"; str = ss.updateLastFormulaDataRange(str, notReplace); ss.sysFocusObj(str); }, sysTextCover : function(text) { var ss = this.spreadsheet, editor = ss.editor; var textCover = this.getTextCover(); textCover.value = text; var textCoverEl = Ext.get(textCover); editor.autosizeTextArea(textCoverEl); }, resetFormulaSelecting : function(nofocus) { this.selectCoverBorder = "3px solid black"; this.borderWidth = 3; if (this.formulaEditing) { this.focusCell = Ext.apply({}, this.formulaEditing.focusCell); this.selectedStart = Ext.apply({}, this.formulaEditing.selectedStart); this.selectedEnd = Ext.apply({}, this.formulaEditing.selectedEnd); delete this.formulaEditing; } if (!nofocus) { this.un("selectionchanged", this.updateFormulaForSelectionChange, this); var editor = this.spreadsheet.editor; this.un("selectup", this.onFormulaSelectupFn, this); var textCoverEl = Ext.get(this.getTextCover()); textCoverEl.on("blur", editor.onTextCoverBlurFn, editor); this.fireEvent("renderborder"); } }, initAutoContenting : function() { var ss = this.spreadsheet; var ds = ss.ds; var rt = this.getMinMaxFromStartEnd(this.selectedStart, this.selectedEnd); this.autoContentFlag = rt; var sls = rt.minPos, sle = rt.maxPos; var rows = ds.data.rows; if (0 == sls.x && 0 == sls.y && 0 == sle.x && 0 == sle.y) { this.mdFlag = "all"; } else if (0 == sls.x && 0 == sle.x) { this.mdFlag = "col"; } else if (0 == sls.y && 0 == sle.y) { this.mdFlag = "row"; } else { this.mdFlag = "cell"; } this.selectCoverBorder = "3px dashed black"; this.borderWidth = 3; var spans = this.getXYSpan(rt.minPos, rt.maxPos); if (spans) { Ext.apply(this.autoContentFlag, spans); } }, checkAutoContentValid : function(minPos, maxPos, spans) { spans = spans || this.getXYSpan(minPos, maxPos); if (spans) { var minx = spans.minx, miny = spans.miny, maxx = spans.maxx, maxy = spans.maxy; if (false != Ext.type(minx)) { if (0 != maxPos.x && !(minPos.x <= minx && maxPos.x >= maxx) || 0 != maxPos.y && !(minPos.y <= miny && maxPos.y >= maxy)) { return false; } } } return true; }, getXYSpan : function(minPos, maxPos) { var ss = this.spreadsheet; var ds = ss.ds; var rows = ds.data.rows; if (0 == minPos.x && 0 == maxPos.x) { var minx = false, miny = false, maxx = false, maxy = false; for (var i in rows) { i = Number(i); var row = rows[i]; for (var j = minPos.y; j <= maxPos.y; j++) { var cell = row[j]; if (cell && cell.wrap) { if (false === minx) { minx = cell.wrap.minx; } else if (minx > cell.wrap.minx) { minx = cell.wrap.minx; } if (false === maxx) { maxx = cell.wrap.maxx; } else if (maxx < cell.wrap.maxx) { maxx = cell.wrap.maxx; } if (false === miny) { miny = cell.wrap.miny; } else if (miny > cell.wrap.miny) { miny = cell.wrap.miny; } if (false === maxy) { maxy = cell.wrap.maxy; } else if (maxy < cell.wrap.maxy) { maxy = cell.wrap.maxy; } } } } if (false !== minx) { return { minx : minx, maxx : maxx, miny : miny, maxy : maxy, xSpan : maxx - minx + 1, ySpan : maxy - miny + 1 }; } } else if (0 == minPos.y && 0 == maxPos.y) { var minx = false, miny = false, maxx = false, maxy = false; for (var i = minPos.x; i <= maxPos.x; i++) { var row = rows[i]; if (row) { for (var j in row) { var cell = row[j]; if (cell.wrap) { if (false === minx) { minx = cell.wrap.minx; } else if (minx > cell.wrap.minx) { minx = cell.wrap.minx; } if (false === maxx) { maxx = cell.wrap.maxx; } else if (maxx < cell.wrap.maxx) { maxx = cell.wrap.maxx; } if (false === miny) { miny = cell.wrap.miny; } else if (miny > cell.wrap.miny) { miny = cell.wrap.miny; } if (false === maxy) { maxy = cell.wrap.maxy; } else if (maxy < cell.wrap.maxy) { maxy = cell.wrap.maxy; } } } } } if (false !== minx) { return { minx : minx, maxx : maxx, miny : miny, maxy : maxy, xSpan : maxx - minx + 1, ySpan : maxy - miny + 1 }; } } else { var minx = false, miny = false, maxx = false, maxy = false; for (var i = minPos.x; i <= maxPos.x; i++) { var row = rows[i]; if (row) { for (var j = maxPos.y; j <= maxPos.y; j++) { var cell = row[j]; if (cell && cell.wrap) { if (false === minx) { minx = cell.wrap.minx; } else if (minx > cell.wrap.minx) { minx = cell.wrap.minx; } if (false === maxx) { maxx = cell.wrap.maxx; } else if (maxx < cell.wrap.maxx) { maxx = cell.wrap.maxx; } if (false === miny) { miny = cell.wrap.miny; } else if (miny > cell.wrap.miny) { miny = cell.wrap.miny; } if (false === maxy) { maxy = cell.wrap.maxy; } else if (maxy < cell.wrap.maxy) { maxy = cell.wrap.maxy; } } } } } if (false !== minx) { return { minx : minx, maxx : maxx, miny : miny, maxy : maxy, xSpan : maxx - minx + 1, ySpan : maxy - miny + 1 }; } } }, resetAutoContenting : function(flag) { if (this.autoContentFlag) { var ss = this.spreadsheet; ss.maskUI(feyaSoft.ss.lang.processing); (function () { var rt = this.getMinMaxFromStartEnd(this.selectedStart, this.selectedEnd); var xSpan = this.autoContentFlag.xSpan, ySpan = this.autoContentFlag.ySpan; if (!this.checkAutoContentValid(this.autoContentFlag.minPos, this.autoContentFlag.maxPos, this.autoContentFlag)) { Ext.Msg.alert(feyaSoft.ss.lang.hint, feyaSoft.ss.lang.canNotChangePartMergedCell); this.cacheSelectedData(); delete this.autoContentFlag; this.selectCoverBorder = "3px solid black"; this.borderWidth = 3; this.fireEvent("renderborder"); ss.unmaskUI(); return; } this.selectCoverBorder = "3px solid black"; this.borderWidth = 3; var ss = this.spreadsheet, ds = ss.ds; if (xSpan || ySpan) { var minx = rt.minPos.x, miny = rt.minPos.y, maxx = rt.maxPos.x, maxy = rt.maxPos.y; if (xSpan && 0 !== minx) { maxx = Math.ceil((maxx - minx + 1) / xSpan) * xSpan + minx - 1; } if (ySpan && 0 !== miny) { maxy = Math.ceil((maxy - miny + 1) / ySpan) * ySpan + miny - 1; } this.selectedStart = { x : minx, y : miny }; this.selectedEnd = { x : maxx, y : maxy }; rt = this.getMinMaxFromStartEnd(this.selectedStart, this.selectedEnd); } if (!this.checkAutoContentValid(rt.minPos, rt.maxPos)) { Ext.Msg.alert(feyaSoft.ss.lang.hint, feyaSoft.ss.lang.canNotChangePartMergedCell); this.cacheSelectedData(); delete this.autoContentFlag; this.selectCoverBorder = "3px solid black"; this.borderWidth = 3; this.fireEvent("renderborder"); ss.unmaskUI(); return; } this.cacheSelectedData(); ds.doAutoContent(this.autoContentFlag.minPos, this.autoContentFlag.maxPos, this.autoContentFlag.minMaxRange, this.autoContentFlag); this.fireEvent("renderborder"); this.showAutoFillOptions(); ss.unmaskUI(); delete this.autoContentFlag; }).defer(100, this); } else { delete this.autoContentFlag; } }, cacheSelectedData : function() { this.autoContentFlag.selectedData = this.getSelectedData(); var span = this.autoContentFlag.selectedData.span; var rt = { minPos : { x : span.minx, y : span.miny }, maxPos : { x : span.maxx, y : span.maxy } }; this.autoContentFlag.minMaxRange = rt; }, showAutoFillOptions : function() { this.cacheAutoFill = Ext.apply({}, this.autoContentFlag); var ss = this.spreadsheet, ds = ss.ds; var freezed = ss.isFreezed(); var range = this.whichRange(this.selectedEnd); var ct, x = this.selectedEnd.x, y = this.selectedEnd.y; var width, height; var fr = ss.freezeRange, sr = ss.showRange; if ("left-top" == range) { ct = ss.lhctInner; width = ds.getSpanWidth(fr.col.start, y); height = ds.getSpanHeight(fr.row.start, x); } else if ("left" == range) { ct = ss.lsctInner; width = ds.getSpanWidth(fr.col.start, y); height = ds.getSpanHeight(fr.row.end + 1, x); } else if ("top" == range) { ct = ss.hctInner; width = ds.getSpanWidth(fr.col.end + 1, y); height = ds.getSpanHeight(fr.row.start, x); } else { ct = ss.sctInner; width = ds.getSpanWidth(fr.col.end + 1, y); height = ds.getSpanHeight(fr.row.end + 1, x); } this.autoFillOptions.show(); this.autoFillOptions.menu.items.get(0).setChecked(true, true); var el = this.autoFillOptions.getEl(); ct.appendChild(el); var pct = ct.parent(); var left = width + 10, top = height + 10; if (freezed) { if (("left-top" == range || "left" == range) && left + 45 > pct.getWidth()) { left = pct.getWidth() - 45; } if (("left-top" == range || "top" == range) && top + 25 > pct.getHeight()) { top = pct.getHeight() - 25; } } el.setLeft(left); el.setTop(top); }, whichRange : function(pos) { var ss = this.spreadsheet; var freezeRange = ss.freezeRange; var x = pos.x, y = pos.y, lf = pos.lf, tf = pos.tf; if (false != Ext.type(lf) && false != Ext.type(tf)) { if (!lf && !tf) { return "left-top"; } else if (!lf && tf) { return "left"; } else if (lf && !tf) { return "top"; } else { return "showRange"; } } else { if (freezeRange.row.end < x && freezeRange.col.end < y) { return "showRange"; } if (freezeRange.row.end >= x && freezeRange.col.end >= y) { return "left-top"; } if (freezeRange.row.end < x && freezeRange.col.end >= y) { return "left"; } if (freezeRange.row.end >= x && freezeRange.col.end < y) { return "top"; } } }, isEqualPos : function(o, t) { if (o.x == t.x && o.y == t.y) { return true; } else { return false; } }, checkSelectionChange : function(spos, epos, ctrlKey) { var flag = false; if (spos) { if (!this.isEqualPos(spos, this.selectedStart)) { flag = true; } } if (!flag) { if (epos) { if (!this.isEqualPos(epos, this.selectedEnd)) { flag = true; } } } if (flag) { this.fireEvent("selectionchanged", this.selectedStart, this.selectedEnd, spos, epos, ctrlKey); } return flag; }, handleLeftClick : function(pos, muFlag, update, ctrlKey) { var ss = this.spreadsheet, ds = ss.ds; var x = pos.x; var y = pos.y; if (0 == x && 0 == y && this.formulaEditing) { return; } this.mdFlag = null; var spos = Ext.apply({}, this.selectedStart); var epos = Ext.apply({}, this.selectedEnd); this.selectedStart = Ext.apply({}, pos); this.selectedEnd = Ext.apply({}, pos); var flag = this.checkSelectionChange(spos, epos, ctrlKey); if (0 === x && 0 === y) { this.clickAll(update); } else if (0 === y) { this.clickRow(x, update); } else if (0 === x) { this.clickCol(y, update); } else { if (!this.formulaEditing) { this.focusCell = Ext.apply({}, pos); this.adjustFocused(); } else { this.adjustSelected(); } this.clickCell(x, y, true, update); } if (muFlag) { this.mdFlag = "contextmenu"; } if (flag || this.lastPosFlag != this.posFlag) { this.fireEvent("renderborder"); } if (this.formulaEditing && !flag) { var fc = this.formulaEditing.focusCell; if (fc.x != x || fc.y != y) { this.updateFormulaRange.defer(10, this, [true, undefined, undefined, ctrlKey]); } } else { this.fireEvent("focuschange", this.focusCell, this.spreadsheet, this); } }, resetSelections : function() { this.focusCell = { x : 1, y : 1 }; this.selectedStart = { x : 1, y : 1 }; this.selectedEnd = { x : 1, y : 1 }; var ds = this.spreadsheet.ds; var row = ds.data.rows[1]; if (row) { var cell = row[1]; if (cell && cell.wrap) { this.selectedStart = { x : cell.wrap.minx, y : cell.wrap.miny }; this.selectedEnd = { x : cell.wrap.maxx, y : cell.wrap.maxy }; } } }, isSelected : function(x, y) { if (this.selectedStart && this.selectedEnd) { var rt = this.getMinMaxFromStartEnd(this.selectedStart, this.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; if (0 === minx && 0 === maxx && miny <= y && y <= maxy) { return true; } if (0 === miny && 0 === maxy && minx <= x && x <= maxx) { return true; } if (minx <= x && x <= maxx && miny <= y && y <= maxy) { return true; } } return false; }, getSelectedRange : function() { var rt = this.getMinMaxFromStartEnd(this.selectedStart, this.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; return { minx : minx, miny : miny, maxx : maxx, maxy : maxy }; }, getSelectedData : function(convertFlag) { var ss = this.spreadsheet; var ds = ss.ds; var rows = ds.data.rows, rs = ds.data.rowSetting, cs = ds.data.colSetting; var data = {}, rowSetting = {}, colSetting = {}, flag = "all"; var rt = this.getMinMaxFromStartEnd(this.selectedStart, this.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; if (0 == minx && 0 == maxx && 0 == miny && 0 == maxy) { Ext.apply(data, rows); return { flag : flag, span : { minx : 1, miny : 1, maxx : ds.data.rowNum - 1, maxy : ds.data.colNum - 1 }, data : data }; } else if (0 === minx && 0 === maxx) { flag = "cols"; for (var p in rows) { if (0 == p) { continue; } var row = rows[p]; for (var j = miny; j <= maxy; j++) { var cell = row[j]; if (cell) { data[p] = data[p] || {}; data[p][j] = ds.deepClone(cell); if (true == convertFlag && cell.data) { data[p][j].data = ds.getConvertData(p, j, cell); } } } } for (var j = miny; j <= maxy; j++) { var col = cs[j]; if (col) { colSetting[j] = Ext.apply({}, col); } } } else if (0 === miny && 0 === maxy) { flag = "rows"; for (var i = minx; i <= maxx; i++) { var row = rows[i]; if (row) { data[i] = data[i] || {}; for (var q in row) { var cell = row[q]; if (0 != q && cell) { data[i][q] = data[i][q] || {}; data[i][q] = ds.deepClone(cell); if (true == convertFlag && cell.data) { data[i][q].data = ds.getConvertData(i, q, cell); } } } } } for (var i = minx; i <= maxx; i++) { var row = rs[i]; if (row) { rowSetting[i] = Ext.apply({}, row); } } } else { flag = "cells"; for (var i = minx; i <= maxx; i++) { var row = rows[i] || {}; for (var j = miny; j <= maxy; j++) { var cell = row[j] || {}; data[i] = data[i] || {}; data[i][j] = ds.deepClone(cell); if (true == convertFlag && cell.data) { data[i][j].data = ds.getConvertData(i, j, cell); } } } } return { flag : flag, span : { minx : minx, miny : miny, maxx : maxx, maxy : maxy }, data : data, rowSetting : rowSetting, colSetting : colSetting }; }, clearRange : function(minx, miny, maxx, maxy, stop) { var ss = this.spreadsheet; var ds = ss.ds; var rows = ds.data.rows; if (0 == minx && 0 == maxx) { for (var p in rows) { for (var j = miny; j <= maxy; j++) { ds.fireEvent("datachange", p, j, ""); } } } else if (0 == miny && 0 == maxy) { for (var i = minx; i <= maxx; i++) { var row = rows[i]; for (var p in row) { ds.fireEvent("datachange", i, p, ""); } } } else { for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= maxy; j++) { ds.fireEvent("datachange", i, j, ""); } } } if (!stop) { ss.renderRange(ss.freezeRange, ss.showRange, false, true); } }, clearSelectedData : function() { var rt = this.getMinMaxFromStartEnd(this.selectedStart, this.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; this.clearRange(minx, miny, maxx, maxy); }, clearFormatRange : function(minx, miny, maxx, maxy, clearAll, stop) { var ss = this.spreadsheet; var ds = ss.ds; var rows = ds.data.rows; if (0 == minx && 0 == maxx) { for (var p in rows) { var row = rows[p]; for (var j = miny; j <= maxy; j++) { var cell = row[j] || {}; if (clearAll) { ds.fireEvent("cellchange", p, j, {}); } else { ds.fireEvent("cellchange", p, j, { data : cell.data }); } } } if (1 < miny) { var j = miny - 1; for (var p in rows) { var row = rows[p]; var cell = row[j] || {}; if (cell.br) { ds.fireEvent("attributechange", p, j, [["br", ""]]); } } } } else if (0 == miny && 0 == maxy) { for (var i = minx; i <= maxx; i++) { var row = rows[i]; for (var p in row) { var cell = row[p] || {}; if (clearAll) { ds.fireEvent("cellchange", i, p, {}); } else { ds.fireEvent("cellchange", i, p, { data : cell.data }); } } } if (1 < minx) { var i = minx - 1; var row = rows[i]; for (var p in row) { var cell = row[p] || {}; if (cell.bb) { ds.fireEvent("attributechange", i, p, [["bb", ""]]); } } } } else { for (var i = minx; i <= maxx; i++) { var row = rows[i]; var brow = rows[i + 1]; for (var j = miny; j <= maxy; j++) { var cell = row[j] || {}; var bb = ""; if (i === maxx) { var bcell = brow[j - 1] || {}; if (bcell.br) { bb = cell.bb; } } var br = ""; if (j === maxy) { var rrow = rows[i - 1] || {}; var rcell = rrow[j + 1] || {}; if (rcell.bb) { br = cell.br; } } if (clearAll) { ds.fireEvent("cellchange", i, j, { bb : bb, br : br }); } else { ds.fireEvent("cellchange", i, j, { data : cell.data, bb : bb, br : br }); } } } if (1 < minx) { var i = minx - 1; var row = rows[i]; for (var j = miny; j <= maxy; j++) { var cell = row[j] || {}; var bcell = row[j - 1] || {}; if (cell.bb && !(cell.br && bcell.br)) { ds.fireEvent("attributechange", i, j, [["bb", ""]]); } } } if (1 < miny) { var j = miny - 1; for (var i = minx; i <= maxx; i++) { var row = rows[i]; if (row) { var cell = row[j] || {}; if (cell.br && !cell.bb) { ds.fireEvent("attributechange", i, j, [["br", ""]]); } } } } } if (!stop) { ss.renderRange(ss.freezeRange, ss.showRange, false, true); } }, clearSelectedFormat : function() { var rt = this.getMinMaxFromStartEnd(this.selectedStart, this.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; this.clearFormatRange(minx, miny, maxx, maxy); }, clearSelectedAll : function() { var rt = this.getMinMaxFromStartEnd(this.selectedStart, this.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; this.clearFormatRange(minx, miny, maxx, maxy, true); }, stopProg : function(e) { e.stopPropagation(); }, createBorder : function() { var ss = this.spreadsheet; this.brushEl = Ext.DomHelper.append(document.body, "
", true); this.ufixedLefterCover = document.getElementById(ss.id + "-x-spreadsheet-upper-fixed-lefter-cover"); this.lfixedHeaderCover = document.getElementById(ss.id + "-x-spreadsheet-left-fixed-header-cover"); this.fixedHeaderCover = document.getElementById(ss.id + "-x-spreadsheet-fixed-header-cover"); this.fixedLefterCover = document.getElementById(ss.id + "-x-spreadsheet-fixed-lefter-cover"); this.fixedSelectCover = document.getElementById(ss.id + "-x-spreadsheet-fixed-select-cover"); this.ltfixedSelectCover = document.getElementById(ss.id + "-x-spreadsheet-fixed-left-top-select-cover"); this.tfixedSelectCover = document.getElementById(ss.id + "-x-spreadsheet-fixed-top-select-cover"); this.lfixedSelectCover = document.getElementById(ss.id + "-x-spreadsheet-fixed-left-select-cover"); this.fheaderCover = document.getElementById(ss.id + "-x-spreadsheet-freeze-header-cover"); this.flefterCover = document.getElementById(ss.id + "-x-spreadsheet-freeze-lefter-cover"); this.headerCover = document.getElementById(ss.id + "-x-spreadsheet-header-cover"); this.lefterCover = document.getElementById(ss.id + "-x-spreadsheet-lefter-cover"); this.lfrdotCover = document.getElementById(ss.id + "-x-spreadsheet-freeze-row-left-dot"); this.lfrselectCover = document.getElementById(ss.id + "-x-spreadsheet-freeze-row-left-select-cover"); this.frdotCover = document.getElementById(ss.id + "-x-spreadsheet-freeze-row-dot"); this.frselectCover = document.getElementById(ss.id + "-x-spreadsheet-freeze-row-select-cover"); this.frselectCoverEl = Ext.get(this.frselectCover); this.lrdotCover = document.getElementById(ss.id + "-x-spreadsheet-row-left-dot"); this.lrselectCover = document.getElementById(ss.id + "-x-spreadsheet-row-left-select-cover"); this.rdotCover = document.getElementById(ss.id + "-x-spreadsheet-row-dot"); this.rselectCover = document.getElementById(ss.id + "-x-spreadsheet-row-select-cover"); this.rselectCoverEl = Ext.get(this.rselectCover); this.ufcdotCover = document.getElementById(ss.id + "-x-spreadsheet-freeze-col-upper-dot"); this.ufcselectCover = document.getElementById(ss.id + "-x-spreadsheet-freeze-col-upper-select-cover"); this.fcdotCover = document.getElementById(ss.id + "-x-spreadsheet-freeze-col-dot"); this.fcselectCover = document.getElementById(ss.id + "-x-spreadsheet-freeze-col-select-cover"); this.fcselectCoverEl = Ext.get(this.fcselectCover); this.ucdotCover = document.getElementById(ss.id + "-x-spreadsheet-col-upper-dot"); this.ucselectCover = document.getElementById(ss.id + "-x-spreadsheet-col-upper-select-cover"); this.cdotCover = document.getElementById(ss.id + "-x-spreadsheet-col-dot"); this.cselectCover = document.getElementById(ss.id + "-x-spreadsheet-col-select-cover"); this.cselectCoverEl = Ext.get(this.cselectCover); this.lhdotCover = document.getElementById(ss.id + "-x-spreadsheet-lh-dot"); this.lhselectCover = document.getElementById(ss.id + "-x-spreadsheet-lh-select-cover"); this.lhselectCoverEl = Ext.get(this.lhselectCover); this.lhfocusCover = document.getElementById(ss.id + "-x-spreadsheet-lh-focus-cover"); this.lhfocusCoverEl = Ext.get(this.lhfocusCover); this.ldotCover = document.getElementById(ss.id + "-x-spreadsheet-left-dot"); this.lselectCover = document.getElementById(ss.id + "-x-spreadsheet-left-select-cover"); this.lselectCoverEl = Ext.get(this.lselectCover); this.lfocusCover = document.getElementById(ss.id + "-x-spreadsheet-left-focus-cover"); this.lfocusCoverEl = Ext.get(this.lfocusCover); this.hdotCover = document.getElementById(ss.id + "-x-spreadsheet-header-dot"); this.hselectCover = document.getElementById(ss.id + "-x-spreadsheet-header-select-cover"); this.hselectCoverEl = Ext.get(this.hselectCover); this.hfocusCover = document.getElementById(ss.id + "-x-spreadsheet-header-focus-cover"); this.hfocusCoverEl = Ext.get(this.hfocusCover); this.dotCover = document.getElementById(ss.id + "-x-spreadsheet-dot"); this.selectCover = document.getElementById(ss.id + "-x-spreadsheet-select-cover"); this.selectCoverEl = Ext.get(this.selectCover); this.focusCover = document.getElementById(ss.id + "-x-spreadsheet-focus-cover"); this.focusCoverEl = Ext.get(this.focusCover); this.textCover = document.getElementById(ss.id + "-x-spreadsheet-text-cover"); this.textCoverEl = Ext.get(this.textCover); this.textCoverEl.un("mousedown", this.stopProg, this); this.textCoverEl.on("mousedown", this.stopProg, this); this.textCoverEl.swallowEvent("dblclick", true); this.focusCoverEl.un("mouseover", this.onFocusCoverMouseOverFn, this); this.focusCoverEl.un("click", this.onFocusCoverClickFn, this); this.focusCoverEl.on("mouseover", this.onFocusCoverMouseOverFn, this); this.focusCoverEl.on("click", this.onFocusCoverClickFn, this); this.lhfocusCoverEl.un("mouseover", this.onFocusCoverMouseOverFn, this); this.lhfocusCoverEl.un("click", this.onFocusCoverClickFn, this); this.lhfocusCoverEl.on("mouseover", this.onFocusCoverMouseOverFn, this); this.lhfocusCoverEl.on("click", this.onFocusCoverClickFn, this); this.lfocusCoverEl.un("mouseover", this.onFocusCoverMouseOverFn, this); this.lfocusCoverEl.un("click", this.onFocusCoverClickFn, this); this.lfocusCoverEl.on("mouseover", this.onFocusCoverMouseOverFn, this); this.lfocusCoverEl.on("click", this.onFocusCoverClickFn, this); this.hfocusCoverEl.un("mouseover", this.onFocusCoverMouseOverFn, this); this.hfocusCoverEl.un("click", this.onFocusCoverClickFn, this); this.hfocusCoverEl.on("mouseover", this.onFocusCoverMouseOverFn, this); this.hfocusCoverEl.on("click", this.onFocusCoverClickFn, this); }, onFocusCoverMouseOverFn : function(e) { var ss = this.spreadsheet; var ds = ss.ds; var x = this.focusCell.x, y = this.focusCell.y; var row = ds.data.rows[x]; var flag; if (row) { var cell = row[y]; if (cell && cell.data) { flag = Ext.ss.common.Mask.isLink(cell.data); if (flag) { this.focusCoverEl.setStyle("cursor", "pointer"); } } } if (!flag) { this.focusCoverEl.setStyle("cursor", ""); } }, onFocusCoverClickFn : function(e) { var ss = this.spreadsheet; var ds = ss.ds; var x = this.focusCell.x, y = this.focusCell.y; var row = ds.data.rows[x]; if (row) { var cell = row[y]; if (cell && cell.data) { var o = Ext.ss.common.Helper.unwrapLink(cell.data); if (o.flag) { window.location = o.url; } } } }, hideBorder : function() { this.ufixedLefterCover.style.display = "none"; this.lfixedHeaderCover.style.display = "none"; this.fixedLefterCover.style.display = "none"; this.fixedHeaderCover.style.display = "none"; this.fixedSelectCover.style.display = "none"; this.ltfixedSelectCover.style.display = "none"; this.tfixedSelectCover.style.display = "none"; this.lfixedSelectCover.style.display = "none"; this.frselectCover.style.display = "none"; this.frdotCover.style.display = "none"; this.lfrselectCover.style.display = "none"; this.lfrdotCover.style.display = "none"; this.flefterCover.style.display = "none"; this.lrselectCover.style.display = "none"; this.lrdotCover.style.display = "none"; this.rselectCover.style.display = "none"; this.rdotCover.style.display = "none"; this.lefterCover.style.display = "none"; this.ufcselectCover.style.display = "none"; this.ufcdotCover.style.display = "none"; this.fcselectCover.style.display = "none"; this.fcdotCover.style.display = "none"; this.fheaderCover.style.display = "none"; this.ucselectCover.style.display = "none"; this.ucdotCover.style.display = "none"; this.cselectCover.style.display = "none"; this.cdotCover.style.display = "none"; this.headerCover.style.display = "none"; this.lhselectCover.style.display = "none"; this.lhdotCover.style.display = "none"; this.lselectCover.style.display = "none"; this.ldotCover.style.display = "none"; this.hselectCover.style.display = "none"; this.hdotCover.style.display = "none"; this.selectCover.style.display = "none"; this.dotCover.style.display = "none"; if (!this.formulaEditing) { this.lhfocusCover.style.display = "none"; this.lfocusCover.style.display = "none"; this.hfocusCover.style.display = "none"; this.focusCover.style.display = "none"; } }, renderBorder : function() { var ss = this.spreadsheet; if (ss.settings.readOnlyView) { return; } this.hideBorder(); var fr = ss.freezeRange, sr = ss.showRange; var ds = ss.ds; this.recheckPos(); var rt = this.getMinMaxFromStartEnd(this.selectedStart, this.selectedEnd); var span = ds.getVisiableSpan(rt.minPos.x, rt.minPos.y, rt.maxPos.x, rt.maxPos.y); var minx = span.minx, miny = span.miny, maxx = span.maxx, maxy = span.maxy; var fltx, flty, frbx, frby, ltx, lty, rbx, rby, sl, st, ltflag, lflag, tflag, sflag; fltx = ds.getColDistance(fr.col.start, miny, "before"); frbx = ds.getColDistance(fr.col.start, maxy); flty = ds.getRowDistance(fr.row.start, minx, "before"); frby = ds.getRowDistance(fr.row.start, maxx); ltx = ds.getColDistance(sr.col.start, miny, "before"); rbx = ds.getColDistance(sr.col.start, maxy); lty = ds.getRowDistance(sr.row.start, minx, "before"); rby = ds.getRowDistance(sr.row.start, maxx); if (ss.splitFlag) { ltflag = "left-top"; lflag = "left"; tflag = "top"; sflag = "showRange"; } else if (ss.freezeFlag) { ltflag = this.whichRange({ x : minx - 1, y : miny - 1 }); lflag = this.whichRange({ x : maxx + 1, y : miny - 1 }); tflag = this.whichRange({ x : minx - 1, y : maxy + 1 }); sflag = this.whichRange({ x : maxx + 1, y : maxy + 1 }); } else { ltflag = "showRange"; lflag = "showRange"; tflag = "showRange"; sflag = "showRange"; } var posFlag = this.posFlag; if (0 == minx && 0 == miny && 0 == maxx && 0 == maxy) { this.borderFlag = { lflag : true, rflag : false, tflag : true, bflag : false }; if (0 != fr.row.len && 0 != fr.col.len) { sl = ss.lhct.dom.scrollLeft, st = ss.lhct.dom.scrollTop; this.updateFocusCover(this.lhfocusCover, sl, st, fr, fr); } else if (0 != fr.col.len) { sl = ss.lsct.dom.scrollLeft, st = ss.lsct.dom.scrollTop; this.updateFocusCover(this.lfocusCover, sl, st, sr, fr); } else if (0 != fr.row.len) { sl = ss.hct.dom.scrollLeft, st = ss.hct.dom.scrollTop; this.updateFocusCover(this.hfocusCover, sl, st, fr, sr); } else { sl = ss.sct.dom.scrollLeft, st = ss.sct.dom.scrollTop; this.updateFocusCover(this.focusCover, sl, st, sr, sr); } var lh = ss.lhscroller.getHeight(), lw = ss.lhscroller.getWidth(); var ut = ss.cellHeight + ss.ypaddingOffset, ub = lh + ss.yborderOffset, t, b; t = lh; if (ss.isRowSplit()) { t += ss.SPLIT_BAR_SIZE; } b = ss.sh + t; this.updateSelectedLefter(this.ufixedLefterCover, ut, ub, 0, 0); this.updateSelectedLefter(this.fixedLefterCover, t, b, 0, 0); var ll = ss.lcWidth + ss.xpaddingOffset, lr = lw + ss.xborderOffset, l, r; l = lw; if (ss.isColSplit()) { l += ss.SPLIT_BAR_SIZE; } r = ss.sw + l; this.updateSelectedHeader(this.lfixedHeaderCover, ll, lr, 0, 0); this.updateSelectedHeader(this.fixedHeaderCover, l, r, 0, 0); if (ss.splitFlag) { this.updateSelectCover(ll, ut, lr, ub, this.ltfixedSelectCover, 0, 0); this.updateSelectCover(l, ut, r, ub, this.tfixedSelectCover, 0, 0); this.updateSelectCover(ll, t, lr, b, this.lfixedSelectCover, 0, 0); this.updateSelectCover(l, t, r, b, this.fixedSelectCover, 0, 0); } else { this.updateSelectCover(ll, ut, r, b, this.fixedSelectCover, 0, 0); } } else if (0 == minx && 0 == maxx) { this.borderFlag = { lflag : true, rflag : true, tflag : false, bflag : false }; var lh = ss.lhscroller.getHeight(); var ut = ss.cellHeight + ss.ypaddingOffset, ub = lh + ss.yborderOffset, t, b; t = lh; if (ss.isRowSplit()) { t += ss.SPLIT_BAR_SIZE; } b = ss.sh + t + ss.yborderOffset; if ("left" == lflag || "left-top" == ltflag) { sl = ss.fcolct.dom.scrollLeft, st = ss.fcolct.dom.scrollTop; this.updateSelectCover(fltx, ut, frbx, ub, this.ufcselectCover, sl, st); this.updateSelectCover(fltx, t, frbx, b, this.fcselectCover, sl, st); } if ("top" == tflag || "showRange" == sflag) { sl = ss.colct.dom.scrollLeft, st = ss.colct.dom.scrollTop; this.updateSelectCover(ltx, ut, rbx, ub, this.ucselectCover, sl, st); this.updateSelectCover(ltx, t, rbx, b, this.cselectCover, sl, st); } if (!this.formulaEditing) { this.updateDotCover(this.ufcdotCover); this.updateDotCover(this.ucdotCover); if (ss.splitFlag) { this.updateDotCover(this.fcdotCover); this.updateDotCover(this.cdotCover); } } if ("left-top" == ltflag && "left-top" == posFlag) { if (0 != fr.col.len && 0 != fr.row.len) { sl = ss.lhct.dom.scrollLeft, st = ss.lhct.dom.scrollTop; this.updateFocusCover(this.lhfocusCover, sl, st, fr, fr); } else { sl = ss.lsct.dom.scrollLeft, st = ss.lsct.dom.scrollTop; this.updateFocusCover(this.lfocusCover, sl, st, sr, fr); } } if ("left" == lflag && "left" == posFlag) { sl = ss.lsct.dom.scrollLeft, st = ss.lsct.dom.scrollTop; this.updateFocusCover(this.lfocusCover, sl, st, sr, fr); } if ("top" == tflag && "top" == posFlag) { if (0 != fr.row.len) { sl = ss.hct.dom.scrollLeft, st = ss.hct.dom.scrollTop; this.updateFocusCover(this.hfocusCover, sl, st, fr, sr); } else { sl = ss.sct.dom.scrollLeft, st = ss.sct.dom.scrollTop; this.updateFocusCover(this.focusCover, sl, st, sr, sr); } } if ("showRange" == sflag && "showRange" == posFlag) { sl = ss.sct.dom.scrollLeft, st = ss.sct.dom.scrollTop; this.updateFocusCover(this.focusCover, sl, st, sr, sr); } if ("left" == lflag || "left-top" == ltflag) { sl = ss.fcolct.dom.scrollLeft, st = ss.fcolct.dom.scrollTop; this .updateSelectedHeader(this.fheaderCover, fltx, frbx, sl, st); } if ("top" == tflag || "showRange" == sflag) { sl = ss.colct.dom.scrollLeft, st = ss.colct.dom.scrollTop; this.updateSelectedHeader(this.headerCover, ltx, rbx, sl, st); } this.updateSelectedLefter(this.ufixedLefterCover, ut, ub, 0, 0); this.updateSelectedLefter(this.fixedLefterCover, t, b, 0, 0); } else if (0 == miny && 0 == maxy) { this.borderFlag = { lflag : false, rflag : false, tflag : true, bflag : true }; var lw = ss.lhscroller.getWidth(); var ll = ss.lcWidth + ss.xpaddingOffset, lr = lw + ss.xborderOffset, l, r; l = lw; if (ss.isColSplit()) { l += ss.SPLIT_BAR_SIZE; } r = ss.sw + l + ss.xborderOffset; if ("top" == tflag || "left-top" == ltflag) { sl = ss.frowct.dom.scrollLeft, st = ss.frowct.dom.scrollTop; this.updateSelectCover(ll, flty, lr, frby, this.lfrselectCover, sl, st); this.updateSelectCover(l, flty, r, frby, this.frselectCover, sl, st); } if ("left" == lflag || "showRange" == sflag) { sl = ss.rowct.dom.scrollLeft, st = ss.rowct.dom.scrollTop; this.updateSelectCover(ll, lty, lr, rby, this.lrselectCover, sl, st); this.updateSelectCover(l, lty, r, rby, this.rselectCover, sl, st); } if (!this.formulaEditing) { this.updateDotCover(this.lfrdotCover); this.updateDotCover(this.lrdotCover); if (ss.splitFlag) { this.updateDotCover(this.frdotCover); this.updateDotCover(this.rdotCover); } } if ("left-top" == ltflag && "left-top" == posFlag) { if (0 != fr.col.len && 0 != fr.row.len) { sl = ss.lhct.dom.scrollLeft, st = ss.lhct.dom.scrollTop; this.updateFocusCover(this.lhfocusCover, sl, st, fr, fr); } else { sl = ss.hct.dom.scrollLeft, st = ss.hct.dom.scrollTop; this.updateFocusCover(this.hfocusCover, sl, st, fr, sr); } } if ("left" == lflag && "left" == posFlag) { if (0 != fr.col.len) { sl = ss.lsct.dom.scrollLeft, st = ss.lsct.dom.scrollTop; this.updateFocusCover(this.lfocusCover, sl, st, sr, fr); } else { sl = ss.sct.dom.scrollLeft, st = ss.sct.dom.scrollTop; this.updateFocusCover(this.focusCover, sl, st, sr, sr); } } if ("top" == tflag && "top" == posFlag) { sl = ss.hct.dom.scrollLeft, st = ss.hct.dom.scrollTop; this.updateFocusCover(this.hfocusCover, sl, st, fr, sr); } if ("showRange" == sflag && "showRange" == posFlag) { sl = ss.sct.dom.scrollLeft, st = ss.sct.dom.scrollTop; this.updateFocusCover(this.focusCover, sl, st, sr, sr); } if ("left-top" == ltflag || "top" == tflag) { sl = ss.frowct.dom.scrollLeft, st = ss.frowct.dom.scrollTop; this .updateSelectedLefter(this.flefterCover, flty, frby, sl, st); } if ("left" == lflag || "showRange" == sflag) { sl = ss.rowct.dom.scrollLeft, st = ss.rowct.dom.scrollTop; this.updateSelectedLefter(this.lefterCover, lty, rby, sl, st); } this.updateSelectedHeader(this.lfixedHeaderCover, ll, lr, 0, 0); this.updateSelectedHeader(this.fixedHeaderCover, l, r, 0, 0); } else { this.borderFlag = { lflag : true, rflag : true, tflag : true, bflag : true }; if ("left-top" == ltflag) { sl = ss.lhct.dom.scrollLeft, st = ss.lhct.dom.scrollTop; this.updateBorder(fltx, flty, frbx, frby, this.lhfocusCover, this.lhselectCover, this.lhdotCover, sl, st, fr, fr, "left-top" == this.posFlag); } if ("left" == lflag) { sl = ss.lsct.dom.scrollLeft, st = ss.lsct.dom.scrollTop; this.updateBorder(fltx, lty, frbx, rby, this.lfocusCover, this.lselectCover, this.ldotCover, sl, st, sr, fr, "left" == this.posFlag); } if ("top" == tflag) { sl = ss.hct.dom.scrollLeft, st = ss.hct.dom.scrollTop; this.updateBorder(ltx, flty, rbx, frby, this.hfocusCover, this.hselectCover, this.hdotCover, sl, st, fr, sr, "top" == this.posFlag); } if ("showRange" == sflag) { sl = ss.sct.dom.scrollLeft, st = ss.sct.dom.scrollTop; this.updateBorder(ltx, lty, rbx, rby, this.focusCover, this.selectCover, this.dotCover, sl, st, sr, sr, "showRange" == this.posFlag); } if ("top" == tflag || "left-top" == ltflag) { sl = ss.frowct.dom.scrollLeft, st = ss.frowct.dom.scrollTop; this .updateSelectedLefter(this.flefterCover, flty, frby, sl, st); } if ("left" == lflag || "showRange" == sflag) { sl = ss.rowct.dom.scrollLeft, st = ss.rowct.dom.scrollTop; this.updateSelectedLefter(this.lefterCover, lty, rby, sl, st); } if ("left" == lflag || "left-top" == ltflag) { sl = ss.fcolct.dom.scrollLeft, st = ss.fcolct.dom.scrollTop; this .updateSelectedHeader(this.fheaderCover, fltx, frbx, sl, st); } if ("top" == tflag || "showRange" == sflag) { sl = ss.colct.dom.scrollLeft, st = ss.colct.dom.scrollTop; this.updateSelectedHeader(this.headerCover, ltx, rbx, sl, st); } } if (this.formulaEditing) { this.dotCover.style.display = "none"; this.dotCover.style.marginLeft = "-1000px"; this.dotCover.style.marginTop = "-1000px"; this.lhdotCover.style.display = "none"; this.lhdotCover.style.marginLeft = "-1000px"; this.lhdotCover.style.marginTop = "-1000px"; this.hdotCover.style.display = "none"; this.hdotCover.style.marginLeft = "-1000px"; this.hdotCover.style.marginTop = "-1000px"; this.ldotCover.style.display = "none"; this.ldotCover.style.marginLeft = "-1000px"; this.ldotCover.style.marginTop = "-1000px"; this.fcdotCover.style.display = "none"; this.fcdotCover.style.marginLeft = "-1000px"; this.fcdotCover.style.marginTop = "-1000px"; this.cdotCover.style.display = "none"; this.cdotCover.style.marginLeft = "-1000px"; this.cdotCover.style.marginTop = "-1000px"; this.lfrdotCover.style.display = "none"; this.lfrdotCover.style.marginLeft = "-1000px"; this.lfrdotCover.style.marginTop = "-1000px"; this.frdotCover.style.display = "none"; this.frdotCover.style.marginLeft = "-1000px"; this.frdotCover.style.marginTop = "-1000px"; } }, updateSelectCover : function(ltx, lty, rbx, rby, selectCover, sl, st) { ltx += sl; lty += st; rbx += sl; rby += st; var w = rbx - ltx - this.borderWidth, h = rby - lty - this.borderWidth; var border = this.selectCoverBorder; if (this.borderFlag.lflag) { selectCover.style.borderLeft = border; ltx -= Math.ceil(this.borderWidth / 2); } else { w += 1; selectCover.style.borderLeft = "none"; } if (this.borderFlag.tflag) { selectCover.style.borderTop = border; lty -= Math.ceil(this.borderWidth / 2); } else { h += 1; selectCover.style.borderTop = "none"; } if (this.borderFlag.rflag) { selectCover.style.borderRight = border; } else { selectCover.style.borderRight = "none"; } if (this.borderFlag.bflag) { selectCover.style.borderBottom = border; } else { selectCover.style.borderBottom = "none"; } selectCover.style.left = ltx + "px"; selectCover.style.top = lty + "px"; if (Number(w) && 0 < w) { selectCover.style.width = w + "px"; } if (Number(h) && 0 < h) { selectCover.style.height = h + "px"; } selectCover.style.display = ""; }, updateBorder : function(ltx, lty, rbx, rby, focuseCover, selectCover, dotCover, sl, st, rr, cr, focusFlag) { if (focusFlag) { this.updateFocusCover(focuseCover, sl, st, rr, cr); } if (!this.formulaEditing) { this.updateDotCover(dotCover); } this.updateSelectCover(ltx, lty, rbx, rby, selectCover, sl, st); }, updateDotCover : function(dotCover) { if (this.borderFlag.rflag && this.borderFlag.bflag) { dotCover.style.left = ""; dotCover.style.top = ""; dotCover.style.right = "0px"; dotCover.style.bottom = "0px"; dotCover.style.marginLeft = ""; dotCover.style.marginTop = ""; dotCover.style.marginRight = "-5px"; dotCover.style.marginBottom = "-5px"; if (Ext.isIE) { dotCover.style.overflow = "hidden"; } dotCover.style.display = ""; } else if (this.borderFlag.rflag) { if (0 == this.selectedStart.x && 0 == this.selectedEnd.x) { if (Ext.isIE) { if (!this.spreadsheet.splitFlag) { dotCover = this.cdotCover; } dotCover.style.overflow = "hidden"; } dotCover.style.left = ""; dotCover.style.top = "0px"; dotCover.style.right = "0px"; dotCover.style.bottom = ""; dotCover.style.marginLeft = ""; dotCover.style.marginTop = "-5px"; dotCover.style.marginRight = "-5px"; dotCover.style.marginBottom = ""; dotCover.style.display = ""; } else { dotCover.style.display = "none"; } } else if (this.borderFlag.bflag) { if (0 == this.selectedStart.y && 0 == this.selectedEnd.y) { if (Ext.isIE) { if (!this.spreadsheet.splitFlag) { dotCover = this.rdotCover; } dotCover.style.overflow = "hidden"; } dotCover.style.left = "0px"; dotCover.style.top = ""; dotCover.style.right = ""; dotCover.style.bottom = "0px"; dotCover.style.marginLeft = "-5px"; dotCover.style.marginTop = ""; dotCover.style.marginRight = ""; dotCover.style.marginBottom = "-5px"; dotCover.style.display = ""; } else { dotCover.style.display = "none"; } } else { dotCover.style.display = "none"; } }, updateFocusCover : function(focusCover, sl, st, rr, cr) { if (this.formulaEditing) { return; } var ss = this.spreadsheet; var ds = ss.ds; var x = this.focusCell.x, y = this.focusCell.y; var minx = x, miny = y, maxx = x, maxy = y; var rows = ds.data.rows; if (rows[x] && rows[x][y]) { var wrap = rows[x][y].wrap; if (wrap) { minx = wrap.minx; miny = wrap.miny; maxx = wrap.maxx; maxy = wrap.maxy; } } var h = ds.getSpanHeight(minx, maxx), w = ds.getSpanWidth(miny, maxy); var left = ds.getColDistance(cr.col.start, miny, "before") + sl; var top = ds.getRowDistance(rr.row.start, minx, "before") + st; if (!Ext.isIE) { w -= 3; h -= 3; } left -= 1; top -= 1; focusCover.style.left = left + "px"; focusCover.style.top = top + "px"; focusCover.style.width = w + "px"; focusCover.style.height = h + "px"; focusCover.style.display = ""; }, isInRange : function(pos) { var ss = this.spreadsheet; var fr = ss.freezeRange, sr = ss.showRange; var x = pos.x, y = pos.y; if (sr.row.start <= x && sr.row.end >= x && sr.col.start <= y && sr.col.end >= y) { return true; } if (fr.row.start <= x && fr.row.end >= x && fr.col.start <= y && fr.col.end >= y) { return true; } if (fr.row.start <= x && fr.row.end >= x && sr.col.start <= y && sr.col.end >= y) { return true; } if (sr.row.start <= x && sr.row.end >= x && fr.col.start <= y && fr.col.end >= y) { return true; } return false; }, updateSelectedHeader : function(headerCover, ltx, rbx, sl, st) { if (!this.formulaEditing) { if (0 == this.selectedStart.x && 0 == this.selectedEnd.x) { if (headerCover.className != "x-spreadsheet-header-col-cover") { headerCover.className = "x-spreadsheet-header-col-cover"; } } else if (headerCover.className != "x-spreadsheet-header-cover") { headerCover.className = "x-spreadsheet-header-cover"; } headerCover.style.left = ltx + sl + "px"; var w = rbx - ltx; if (headerCover.style.width != w && Number(w)) { headerCover.style.width = w + "px"; } headerCover.style.display = ""; } }, updateSelectedLefter : function(lefterCover, lty, rby, sl, st) { if (!this.formulaEditing) { if (0 == this.selectedStart.y && 0 == this.selectedEnd.y) { if (lefterCover.className != "x-spreadsheet-lefter-row-cover") { lefterCover.className = "x-spreadsheet-lefter-row-cover"; } } else if (lefterCover.className != "x-spreadsheet-lefter-cover") { lefterCover.className = "x-spreadsheet-lefter-cover"; } if (!lty) { lty = 0; } lefterCover.style.top = lty + st + "px"; var h = rby - lty; if (lefterCover.style.height != h && Number(h)) { lefterCover.style.height = h + "px"; } lefterCover.style.display = ""; } }, onAfterResizeFn : function(p, x, y) { if (this.selectedStart && this.selectedEnd) { this.fireEvent("renderborder"); } }, selectRange : function(focusCell, minPos, maxPos) { this.focusCell = focusCell || this.focusCell; this.selectedStart = minPos || this.selectedStart; this.selectedEnd = maxPos || this.selectedEnd; this.fireEvent("renderborder"); }, isContainHideCol : function() { var ds = this.spreadsheet.ds; var cs = ds.data.colSetting; var rs = this.getMinMaxFromStartEnd(this.selectedStart, this.selectedEnd); var miny = rs.minPos.y, maxy = rs.maxPos.y; var offset = ds.getVisibleColOffset(miny, 1); if (0 == offset && 1 != miny) { return true; } else { for (var j = miny; j <= maxy; j++) { var c = cs[j]; if (!ds.isVisible(c)) { return true; } } } }, isContainHideRow : function() { var ds = this.spreadsheet.ds; var rs = ds.data.rowSetting; var rt = this.getMinMaxFromStartEnd(this.selectedStart, this.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x; var offset = ds.getVisibleRowOffset(minx, 1); if (0 == offset && 1 != minx) { return true; } else { for (var i = minx; i <= maxx; i++) { var r = rs[i]; if (!ds.isVisible(r)) { return true; } } } }, compareSelectionRange : function(o, t) { var omin = o.minPos, omax = o.maxPos, tmin = t.minPos, tmax = t.maxPos; var row = omin.x == tmin.x && omax.x == tmax.x; var col = omin.y == tmin.y && omax.y == tmax.y; if (row && col) { return "all"; } else if (row) { return "col"; } else if (col) { return "row"; } }, checkFormulaEditing : function(v, nofocus, border) { var ss = this.spreadsheet; var flag = false; if (Ext.ss.common.Mask.isFormula(v)) { flag = true; } if (!(flag && this.formulaEditing) && (flag || this.formulaEditing)) { this.fireEvent("formulaeditingchanged", this.formulaEditing, flag, nofocus, border); return flag; } }, renderDataRangeOutBorder : function(range, br, bb, saveflag) { br = br || ""; bb = bb || ""; var minx = range.minPos.x, miny = range.minPos.y, maxx = range.maxPos.x, maxy = range.maxPos.y; var ss = this.spreadsheet; var i = minx - 1, j; for (j = miny; j <= maxy; j++) { var els = ss.getCellHEls(i, j); if (els) { for (var k = 0, len = els.length; k < len; k++) { Ext.get(els[k]).setStyle("border-bottom", bb); } } } j = miny - 1; for (i = minx; i <= maxx; i++) { var els = ss.getCellHEls(i, j); if (els) { for (var k = 0, len = els.length; k < len; k++) { Ext.get(els[k]).setStyle("border-right", br); } } } i = maxx; for (j = miny; j <= maxy; j++) { var els = ss.getCellHEls(i, j); if (els) { for (var k = 0, len = els.length; k < len; k++) { Ext.get(els[k]).setStyle("border-bottom", bb); } } } j = maxy; for (i = minx; i <= maxx; i++) { var els = ss.getCellHEls(i, j); if (els) { for (var k = 0, len = els.length; k < len; k++) { Ext.get(els[k]).setStyle("border-right", br); } } } }, renderDataRangeFullBorder : function(range, br, bb, saveflag) { br = br || ""; bb = bb || ""; var minx = range.minPos.x, miny = range.minPos.y, maxx = range.maxPos.x, maxy = range.maxPos.y; var ss = this.spreadsheet; var i = minx - 1, j; for (j = miny; j <= maxy; j++) { var els = ss.getCellHEls(i, j); if (els) { for (var k = 0, len = els.length; k < len; k++) { Ext.get(els[k]).setStyle("border-bottom", bb); } } } j = miny - 1; for (i = minx; i <= maxx; i++) { var els = ss.getCellHEls(i, j); if (els) { for (var k = 0, len = els.length; k < len; k++) { Ext.get(els[k]).setStyle("border-right", br); } } } for (i = minx; i <= maxx; i++) { for (j = miny; j <= maxy; j++) { var els = ss.getCellHEls(i, j); if (els) { for (var k = 0, len = els.length; k < len; k++) { var El = Ext.get(els[k]); El.setStyle("border-bottom", bb); El.setStyle("border-right", br); } } } } }, showDataRangeBorder : function(setting, flag, saveflag) { var bb = "", br = ""; if (flag) { bb = "1px solid blue"; br = "1px solid blue"; } else { if (Ext.isIE) { var ss = this.spreadsheet; ss.renderRange(); return; } } this.hideBorder(); var sposition = setting.series_position; if ("row" == sposition) { var nameRange, valueRange; if (setting.rowCategories) { nameRange = setting.rowCategories.data.name_range; valueRange = setting.rowCategories.data.value_range; } if (!setting.col_label && nameRange && valueRange) { if (nameRange.maxPos.y + 1 == valueRange.minPos.y) { valueRange = Ext.applyIf({ minPos : nameRange.minPos }, valueRange); } else if (setting.row_label) { this.renderDataRangeFullBorder(nameRange, br, bb, saveflag); } } if (setting.row_label && valueRange) { this.renderDataRangeFullBorder(valueRange, br, bb, saveflag); } for (var i = 0, len = setting.rowSeries.length; i < len; i++) { var rd = setting.rowSeries[i]; nameRange = rd.data.name_range; valueRange = rd.data.value_range; if (nameRange) { if (setting.col_label) { this.renderDataRangeOutBorder(nameRange, br, bb, saveflag); } else { if (nameRange.maxPos.y + 1 == valueRange.minPos.y) { valueRange = Ext.applyIf({ minPos : nameRange.minPos }, valueRange); } else { this.renderDataRangeOutBorder(nameRange, br, bb, saveflag); } } } if (valueRange) { this.renderDataRangeOutBorder(valueRange, br, bb, saveflag); } } } else if ("col" == sposition) { var nameRange, valueRange; if (setting.colCategories) { nameRange = setting.colCategories.data.name_range; valueRange = setting.colCategories.data.value_range; } if (!setting.row_label && nameRange && valueRange) { if (nameRange.maxPos.x + 1 == valueRange.minPos.x) { valueRange = Ext.applyIf({ minPos : nameRange.minPos }, valueRange); } else if (setting.col_label) { this.renderDataRangeFullBorder(nameRange, br, bb, saveflag); } } if (setting.col_label && valueRange) { this.renderDataRangeFullBorder(valueRange, br, bb, saveflag); } for (var i = 0, len = setting.colSeries.length; i < len; i++) { var rd = setting.colSeries[i]; nameRange = rd.data.name_range; valueRange = rd.data.value_range; if (nameRange) { if (setting.row_label) { this.renderDataRangeOutBorder(nameRange, br, bb, saveflag); } else { if (nameRange.maxPos.x + 1 == valueRange.minPos.x) { valueRange = Ext.applyIf({ minPos : nameRange.minPos }, valueRange); } else { this.renderDataRangeOutBorder(nameRange, br, bb, saveflag); } } } if (valueRange) { this.renderDataRangeOutBorder(valueRange, br, bb, saveflag); } } } }, showDataRangeBorder : function(span, flag, saveflag) { var ds = this.spreadsheet.ds; var bb = "", br = ""; if (flag) { bb = "1px solid blue"; br = "1px solid blue"; } else { if (Ext.isIE) { var ss = this.spreadsheet; ss.renderRange(); return; } } this.hideBorder(); for (var i = 0, len = span.length; i < len; i++) { var it = span[i]; if (it.sheetIndex == ds.activeSheet) { this.renderDataRangeFullBorder({ minPos : { x : it.x, y : it.y }, maxPos : { x : it.ex, y : it.ey } }, br, bb, saveflag); } } }, getTextCover : function() { return this.textCover; }, getFocusCover : function() { if ("left-top" == this.posFlag) { return this.lhfocusCover; } else if ("left" == this.posFlag) { return this.lfocusCover; } else if ("top" == this.posFlag) { return this.hfocusCover; } else { return this.focusCover; } }, findFocusCover : function() { var ss = this.spreadsheet; if (!ss.splitFlag) { var posFlag = this.posFlag; this.posFlag = this.whichRange(this.focusCell); if (posFlag != this.posFlag) { this.fireEvent("renderborder"); } } return this.getFocusCover(); }, fillStyleContent : function() { var ss = this.spreadsheet, ds = ss.ds; var cache = this.cacheAutoFill, span = cache.selectedData.span; var rt = cache.minMaxRange; cache.flag = "stylecontent"; ds.doAutoContent(cache.minPos, cache.maxPos, rt, cache); }, fillOnlyStyle : function() { var ss = this.spreadsheet, ds = ss.ds; var cache = this.cacheAutoFill, span = cache.selectedData.span; var rt = cache.minMaxRange; cache.flag = "style"; ds.doAutoContent(cache.minPos, cache.maxPos, rt, cache); }, fillOnlyContent : function() { var ss = this.spreadsheet, ds = ss.ds; var cache = this.cacheAutoFill, span = cache.selectedData.span; var rt = cache.minMaxRange; cache.flag = "content"; ds.doAutoContent(cache.minPos, cache.maxPos, rt, cache); }, fillCopyCell : function() { var ss = this.spreadsheet, ds = ss.ds; var cache = this.cacheAutoFill, span = cache.selectedData.span; var rt = cache.minMaxRange; cache.flag = "copy"; ds.doAutoContent(cache.minPos, cache.maxPos, rt, cache); } }); Ext.ns("Ext.ss"); /**Sheet的定义*/ Ext.ss.SpreadSheet = Ext.extend(Ext.Panel, { settings : {}, zoom : 1, dataStore:null, maskDisabled : true, freezeRange : { row : { start : 1, end : 0, len : 0 }, col : { start : 1, end : 0, len : 0 } }, showRange : { row : { start : 1, end : 20, len : 20 }, col : { start : 1, end : 12, len : 12 } }, cls : "x-spreadsheet-ct", MAX_PIXEL : 10000000, SPLIT_BAR_SIZE : 6, resizerCache : {}, footerToolWidth : 86, footerWidth : 500, lineHeight : 13, xborderOffset : 1, xpaddingOffset : 7, yborderOffset : 1, ypaddingOffset : 7, maxhfNum : 10, maxlfNum : 8, lastPosx : 27, lastPosy : 101, xScrollOffset : Ext.isChrome ? 40 : 10, yScrollOffset : Ext.isChrome ? 40 : 18, requestQueue : null, loadMask : true, autoOffset : 1, rowInc : 3, colInc : 2, hselectedColor : "rgb(255,215,166)", freezeColor : "rgb(242,242,242)", selectedColor : "#B8CFEE", fixColor : "rgb(241,238,209)", fbColor : "gray", fzColor : "#c3daf9", ddGroup : "x-spreadsheet-dd", editorMaxWidth : 400, editorMaxHeight : 300, scrollOffset : 18, border : false, lfWidth : 7, hfHeight : 7, rowNum : 101, colNum : 27, cellWidth : 100, cellHeight : 13, lcWidth : 35, selectedSet : {}, selectedHdSet : {}, cssSet : {}, getCellCode : function(pos) { var code = this.ds.getLetter(pos.y); code += pos.x; return code; }, /**f(x)*/ generateTopBar : function() { var lan_ss = feyaSoft.ss.lang; var lan_common = feyaSoft.lang.common; this.undoList = new Ext.ss.DoList({ defaultDisplay : lan_ss.no_action }); this.undoList.on("mouseover", this.onUndoMouseOverFn, this); this.undoList.on("beforeshow", this.onUndoBefroeShowFn, this); this.redoList = new Ext.ss.DoList({ defaultDisplay : lan_ss.no_action }); this.redoList.on("mouseover", this.onRedoMouseOverFn, this); this.redoList.on("beforeshow", this.onRedoBefroeShowFn, this); this.undoBtn = new Ext.SplitButton({ disabled : true, iconCls : "icon_undo", tooltip : "撤销", menu : this.undoList, handler : this.onUndoFn, scope : this }); this.redoBtn = new Ext.SplitButton({ disabled : true, iconCls : "icon_redo", tooltip : "重做", menu : this.redoList, handler : this.onRedoFn, scope : this }); this.stateField = new Ext.form.TextField({ width:100, readOnly : true, style : "text-align:center;" }); this.searchField=new Ext.ux.form.SearchField({ fieldLabel:'数据集', width : 150, name:'ds_tablename', id:'ds_tablename', onTrigger1Click :this.onTrigger1Click.createDelegate(this), onTrigger2Click :this.onTrigger2Click.createDelegate(this) }); this.hideField=new Ext.form.TextField({ hidden:true, name:'ds_id', id:'ds_id', readOnly : true, style : "text-align:center;" }); this.fxField = new Ext.form.TextArea({ width:850, height : 20, enableKeyEvents : true }); this.fxField.un("keydown", this.onFxKeydownFn, this); this.fxField.un("focus", this.onFxFocusFn, this); this.fxField.un("blur", this.onFxBlurFn, this); this.fxField.on("keydown", this.onFxKeydownFn, this); this.fxField.on("focus", this.onFxFocusFn, this); this.fxField.on("blur", this.onFxBlurFn, this); this.aboutBtn = new Ext.Button({ iconCls : "icon_feyasoft", text : "About FeyaSoft MySpreadsheet", handler : this.onAboutFn, scope : this }); this.expandBtn = new Ext.Button({ iconCls : "icon_expand", handler : this.toggleFx, scope : this }); this.fxLabel = new Ext.form.Label({ html : "
" }); this.searchLabel = new Ext.form.Label({ html : "

数据集

" }); this.tbar = new Ext.Toolbar({ hidden : this.settings.readOnlyView, layoutConfig : { lastOverflow : true }, enableOverflow : false, items : [this.undoBtn, this.redoBtn, "-", this.stateField, "-",this.searchLabel,this.searchField,"-",this.fxLabel, this.fxField, this.expandBtn,this.hideField] }); }, toggleFx : function(btn) { if ("icon_expand" == btn.iconCls) { btn.setIconClass("icon_collapse"); this.fxField.setHeight(50); var tbar = this.getTopToolbar(); tbar.doLayout(); } else { btn.setIconClass("icon_expand"); this.fxField.setHeight(20); var tbar = this.getTopToolbar(); tbar.doLayout(); } }, onFxBlurFn : function(e) { var sm = this.sm; if (!sm.formulaEditing && this.fxCell) { var ds = this.ds; var x = this.fxCell.x, y = this.fxCell.y; var cell = ds.getCellObj(x, y, this.fxCell.sheetIndex) || {}; var data = cell.data || ""; if (data != sm.textCover.value) { this.enterFx(true); } else { sm.getTextCover().style.display = "none"; } } }, enterFx : function(stayFlag) { var sm = this.sm; var hk = this.hotkey; var editor = this.editor; if (sm.formulaEditing) { sm.fireEvent("formulaeditingchanged", true, false); } editor.onTextCoverBlurFn(); if (!stayFlag) { hk.onDownFn(); } }, onTrigger1Click:function(){ var sf = this.searchField; if (sf.hasSearch) { sf.reset(); sf.triggers[0].hide(); sf.hasSearch = false } }, onTrigger2Click: function(trigger) { var key = "ds_tablename";// name属性 var id="ds_tablename"; var dbfind=""; var caller="ExcelTemplate"; var keyValue = Ext.getCmp('ds_tablename').getValue();// 当前值 keyValue = keyValue == null ? '' : keyValue; var dbwin = new Ext.Window({ id : 'dbwin', title: '查找', height: "500", width: "700", maximizable : true, buttonAlign : 'center', layout : 'anchor', items: [{ tag : 'iframe', frame : true, anchor : '100% 100%', layout : 'fit', html : '' }], buttons : [{ text : '关 闭', iconCls: 'x-button-icon-close', cls: 'x-btn-gray', handler : function(){ Ext.getCmp('dbwin').close(); } },{ text: '重置条件', id: 'reset', cls: 'x-btn-gray', hidden: true, handler: function(){ var grid = Ext.getCmp('dbwin').el.dom.getElementsByTagName('iframe')[0].contentWindow.document.defaultView.Ext.getCmp('dbfindGridPanel'); grid.resetCondition(); grid.getCount(); } }] }); dbwin.show(); var sf = this.searchField; sf.hasSearch = true; sf.triggers[0].show(); trigger.lastTriggerId = null; }, onFxKeydownFn : function(fxfield, e) { if (!Ext.isIE) { e.stopPropagation(); } var key = e.getKey(); var sm = this.sm, ds = this.ds, editor = this.editor; var text = fxfield.getValue(); if (!this.fxCell) { this.fxCell = Ext.apply({}, sm.focusCell); this.fxCell.sheetIndex = ds.activeSheet; } var pos = this.fxCell; pos = Ext.apply({}, pos); if (key == Ext.EventObject.ENTER) { e.stopEvent(); if (text.charAt(0) == "=") { editor.fxInputEnter(fxfield); } else { this.enterFx(); } } else if (Ext.EventObject.ESC == key) { textCover = sm.getTextCover(); textCover.value = this.fxOv; fxfield.setValue(this.fxOv); if (sm.formulaEditing) { if (editor.dropList) { editor.dropList.hide(); } sm.fireEvent("formulaeditingchanged", true, false); } textCover.style.display = "none"; fxfield.blur(); } else { var keyStr = ",37,38,39,33,40,34,36,35,27,9,19"; if (e.ctrlKey && (key == 83 || key == 79 || key == 80)) { e.stopEvent(); var hk = this.hotkey; hk.onKeydownFn(e); } else if (keyStr.indexOf("," + key + ",") == -1) { (function () { var text = fxfield.getValue(); this.presetTextCover(pos, text); sm.sysTextCover(text); sm.checkFormulaEditing(text); if (text.charAt(0) == "=") { this.editor.fxShowFormulaDropList(text, fxfield); } }).defer(10, this); } else if (40 == key) { e.stopEvent(); this.editor.dropList.selectDown(); } else if (38 == key) { e.stopEvent(); this.editor.dropList.selectUp(); } else if (37 == key || 39 == key) { if (text.charAt(0) == "=") { this.editor.fxShowFormulaDropList(text, fxfield); } } } }, sysFxField : function(text) { this.fxField.setValue(text); }, sysFocusObj : function(text) { var sm = this.sm; if (this.focusObj == sm.textCover) { this.sysFxField(text); } else { sm.sysTextCover(text); } }, presetTextCover : function(pos, text) { var sm = this.sm; var editor = this.editor; var textCover = sm.getTextCover(); editor.prepareTextCover(pos, text); }, onFxFocusFn : function(f) { var sm = this.sm, ds = this.ds; var v = f.getValue(); this.fxOv = v; if (!this.fxCell) { this.fxCell = Ext.apply({}, sm.focusCell); this.fxCell.sheetIndex = ds.activeSheet; } var flag = sm.checkFormulaEditing(v); this.presetTextCover(this.fxCell, v); this.focusObj = this.fxField.getEl().dom; if (flag) { var text = this.selectDataRange(); this.showDataRangeBorder(text); } }, showDataRangeBorder : function(text) { try { var sm = this.sm; var ds = this.ds; var pos = ds.parseText2Pos(text); if (pos.sheetIndex == ds.activeSheet || false == Ext.type(pos.sheetIndex) || "" == pos.sheetIndex) { var sr = this.showRange; if (sr.row.start <= pos.x && pos.x <= sr.row.end && sr.col.start <= pos.y && pos.y <= sr.col.end || sr.row.start <= pos.ex && pos.ex <= sr.row.end && sr.col.start <= pos.ey && pos.ey <= sr.col.end) { sm.selectRange(null, { x : pos.x, y : pos.y }, { x : pos.ex, y : pos.ey }); } } } catch (e) { } }, selectDataRange : function() { var ds = this.ds; var posReg = ds.posReg; var v = this.focusObj.value; var spos = -1, epos = -1; v.replace(posReg, function(w) { spos = arguments[arguments.length - 2]; epos = spos + w.length; }); if (-1 != spos && -1 != epos) { Ext.ss.common.Mask.setCaretPosition.defer(1, this, [this.focusObj, epos, epos]); return v.slice(spos, epos); } }, getNearestFormulaSpan : function() { var ds = this.ds, sm = this.sm; var posReg = ds.posReg; var focusObj = this.focusObj; var v = focusObj.value; var oldLen = v.length; if (false == Ext.type(this.cachedCursorPos)) { var cursorPos = Ext.ss.common.Mask.getCursorPos(focusObj); this.cachedCursorPos = cursorPos; } var first = v.slice(0, this.cachedCursorPos); first.replace(posReg, function(w) { var pos = ds.parseText2Pos(w); sm.selectedStart = { x : pos.x, y : pos.y }; sm.selectedEnd = { x : pos.ex, y : pos.ey }; }); }, updateLastFormulaDataRange : function(str, notReplace) { var focusObj = this.focusObj; if (!focusObj) { return; } var v = focusObj.value; var oldLen = v.length; if (false == Ext.type(this.cachedCursorPos)) { var cursorPos = Ext.ss.common.Mask.getCursorPos(focusObj); this.cachedCursorPos = cursorPos; } var first = v.slice(0, this.cachedCursorPos), last = v.slice( this.cachedCursorPos, oldLen); var ds = this.ds; var posReg = ds.posReg; var spos = -1, epos = -1; var fLen = first.length; first.replace(posReg, function(w) { spos = arguments[arguments.length - 2]; epos = spos + w.length; }); if (fLen != epos && !(epos + 1 == fLen && ":" == first.charAt(fLen - 1))) { spos = fLen; epos = fLen; } var pre = first.slice(0, spos); var parts = str.split("!"); if (2 == parts.length) { var sheetName = parts[0]; var endPiece = pre.slice(pre.length - sheetName.length - 1, pre.length); if (endPiece.toUpperCase() == sheetName.toUpperCase() + "!") { str = parts[1]; } } var pos = first.slice(epos + 1, fLen); if (notReplace) { pre = first.slice(0, epos + 1); var lastChr = pre.charAt(pre.length - 1); if (!/[,\(\+\-\*\/]/gi.test(lastChr)) { pre = pre + ","; } } first = pre + str + pos; this.cachedCursorPos = first.length; focusObj.value = first + last; return focusObj.value; }, generateCSS : function(data) { this.sw = data.sw; this.sh = data.sh; this.slw = data.slw; this.slh = data.slh; var cellWidth = this.cellWidth; var cellHeight = this.cellHeight; if (Ext.isIE) { } var cssText = ".x-spreadsheet-cell-default-width{width:" + cellWidth + "px;}" + ".x-spreadsheet-cell-default-height{height:" + cellHeight + "px;}"; var lcw = this.lcWidth; if (Ext.isIE) { } cssText += "." + this.id + "-x-spreadsheet-col-0{width:" + lcw + "px;text-align:center;}"; cssText += "." + this.id + "-x-spreadsheet-row-0{text-align:center;}"; cssText += "." + this.id + "-x-spreadsheet-cell-state{}"; cssText += ".x-spreadsheet-right-silver{border-right:1px solid rgb(212,216,218);}.x-spreadsheet-bottom-silver{border-bottom:1px solid rgb(212,216,218);}"; var cid = this.id + "-x-spreadsheet-css"; this.cssSet[cid] = Ext.util.CSS.createStyleSheet(cssText, cid); }, removeCSS : function() { for (var p in this.cssSet) { Ext.util.CSS.removeStyleSheet(p); } }, initTemplates : function() { var left = this.lcWidth + this.xpaddingOffset; var top = this.cellHeight + this.ypaddingOffset; var ts = this.templates || {}; if (!ts.viewport) { ts.viewport = new Ext.XTemplate([ "
", "", "
", "
", "", "", "", "", "", "", "
", "{slheader}", "
", "{lscroller}", "
", "{sheader}", "
", "{scroller}", "
", "", "
", "
", "
", "
", "
", "
  
", "
", "
", "
", "
  
", "
", "
", "
", "
", "
", "
", "
", "
  
", "
", "
", "
", "
  
", "
", "
", "
", "
", "
", "
", "
", "
  
", "
", "
", "
", "
  
", "
", "
", "
", "
", "
", "
", "
", "
  
", "
", "
", "
", "
  
", "
", "
", "
", "
", "
", "
", "
  
", "
", "
", "
", "
", "
", "
", "
", "
  
", "
", "
", "
", "
", "
", "
", "
", "
  
", "
", "
", "
", "
", "
", "
", "
", "
  
", "
", "
", "", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "", "
", "
", "
"].join("")); } if (!ts.slheader) { ts.slheader = new Ext.XTemplate([ "
", "
", "{lhrows}", "
", "
"].join("")); } if (!ts.lhrows) { ts.lhrows = new Ext.XTemplate([ "", "
", "", "", "", "", "
", "
", "{data}", "", "      
      
", "
", "
", "
", "
"].join("")); } if (!ts.lscroller) { ts.lscroller = new Ext.XTemplate([ "
", "
", "{lrows}", "
", "
"].join("")); } if (!ts.lrows) { ts.lrows = new Ext.XTemplate([ "", "
", "", "", "", "", "
", "
", "{data}", "", "      
      
", "
", "
", "
", "
", "
"].join("")); } if (!ts.sheader) { ts.sheader = new Ext.XTemplate([ "
", "
", "{hrows}", "
", "
"].join("")); } if (!ts.htd) { ts.htd = new Ext.XTemplate([ "", "", "", "
", "{data}", "", "      
      
", "
", "
", "", "
", "
"].join("")); } if (!ts.hrows) { ts.hrows = new Ext.XTemplate([ "", "
", "", "", "", "", "
", "
", "{data}", "", "      
      
", "
", "
", "
", "
"].join("")); } if (!ts.scroller) { ts.scroller = new Ext.XTemplate(["
", "
", "{rows}", "
", "
"].join("")); } if (!ts.std) { ts.std = new Ext.XTemplate([ "", "", "", "
", "{data}", "", "      
      
", "
", "
", "", "
", "
"].join("")); } if (!ts.rows) { ts.rows = new Ext.XTemplate([ "", "
", "", "", "", "", "
", "
", "{data}", "", "      
      
", "
", "
", "
", "
", "
"].join("")); } if (!ts.cell) { ts.cell = new Ext.XTemplate([ "
", "{data}", "", "      
      
", "
", "
"].join("")); } for (var k in ts) { var t = ts[k]; if (t && typeof t.compile == "function" && !t.compiled) { t.compile(); } } this.templates = ts; }, getCellEl : function(x, y, region) { var name = this.id + "-x-spreadsheet-cell-" + x + "-" + y; if (!region) { var El = this.sview.child("div[name=" + name + "]"); return El; } else { var rtEl; if ("left-top" == region) { rtEl = this.slheader; } else if ("top" == region) { rtEl = this.sheader; } else if ("left" == region) { rtEl = this.slbody; } else { rtEl = this.sbody; } var el = Ext.DomQuery .selectNode("div[name=" + name + "]", rtEl.dom); var El = Ext.get(el); return El; } }, getCellHEls : function(x, y) { var els = Ext.DomQuery.select("*[name=" + this.id + "-x-spreadsheet-cell-" + x + "-" + y + "]", this.body.dom); if (0 < els.length) { return els; } }, getCellTdHEls : function(x, y) { var els = Ext.DomQuery.select("td[name=" + this.id + "-x-spreadsheet-cell-td-" + x + "-" + y + "]", this.body.dom); if (0 < els.length) { return els; } }, generateHTML : function(data) { this.generateCSS(data); var ts = this.templates; var lhrows = ts.lhrows.apply(data.slheader); var slheader = ts.slheader.apply({ lhrows : lhrows }); var lrows = ts.lrows.apply(data.lscroller); var lscroller = ts.lscroller.apply({ lrows : lrows }); var hrows = ts.hrows.apply(data.sheader); var sheader = ts.sheader.apply({ hrows : hrows }); var rows = ts.rows.apply(data.scroller); var scroller = ts.scroller.apply({ rows : rows }); var sheets = this.generateSheets(); var html = ts.viewport.apply({ slheader : slheader, lscroller : lscroller, sheader : sheader, scroller : scroller, sheets : sheets }); return html; }, generateSheets : function() { var ds = this.ds; var sheets = ds.sheets; var str = ""; for (var i = 0, len = sheets.length; i < len; i++) { var s = sheets[i]; if (ds.activeSheet == i) { str += this.generateActiveSheet(s.name, 0 < i, i < len - 1); } else { var left = false, right = false; if (0 < i) { if (ds.activeSheet + 1 == i) { left = "active"; } else { left = "inactive"; } } if (i < len - 1) { if (ds.activeSheet - 1 == i) { right = "active"; } else { right = "inactive"; } } str += this.generateInActiveSheet(s.name, left, right); } } return str; }, generateInActiveSheet : function(name, left, right) { var str = ""; if (!left) { str += "
 
"; } else if ("active" == left) { str += "
 
"; } else if ("inactive" == left) { str += "
 
"; } str += "" + name + ""; if (!right) { str += "
 
"; } return str; }, generateActiveSheet : function(name, left, right) { var str = ""; if (!left) { str += "
 
"; } else { str += "
 
"; } str += "" + name + ""; if (!right) { str += "
 
"; } return str; }, generateUI : function() { var data = this.ds.getRange({ rowStart : this.showRange.row.start, colStart : this.showRange.col.start, rowNum : this.showRange.row.len, colNum : this.showRange.col.len, adjustWidth : this.adjustWidth, adjustHeight : this.adjustHeight }); this.freezeRange = this.copyRange(data.freezeRange); this.showRange.row.start = data.rowStart; this.showRange.row.len = data.rowNum; this.showRange.row.end = data.rowEnd; this.showRange.col.start = data.colStart; this.showRange.col.len = data.colNum; this.showRange.col.end = data.colEnd; return this.generateHTML(data); }, reloadUI : function(fr) { var sm = this.sm; this.cancelYSplit(); this.cancelXSplit(); if (this.splitFlag) { this.reSplitRange(this.freezeRange, this.showRange, true); } else { if (!fr || 0 == this.freezeRange.col.len && 0 == this.freezeRange.row.len || this.isEqualRange(fr, this.freezeRange)) { this.renderRange(this.freezeRange, this.showRange, true); } else { this.reFreezeRange(this.freezeRange, this.showRange, true); } } this.adjustLiveScroller(); sm.fireEvent("renderborder"); this.updateStatus(sm.focusCell.x, sm.focusCell.y); this.changeSheetStatus(this.ds.activeSheet); sm.transferFocus(); this.tryLoadCharts(); }, refreshRange : function() { if (this.splitFlag) { this.adjustShowRange(this.availWidth, this.availHeight, true); } else { this.renderRange(this.freezeRange, this.showRange, true); } }, setupRange : function(fr, sf) { if (false != Ext.type(sf)) { this.splitFlag = sf; } this.cancelYSplit(); this.cancelXSplit(); if (this.splitFlag) { this.showRange = this.checkShowRange(fr, this.freezeRange, this.showRange); this.freezeRange = this.copyRange(fr); this.reSplitRange(this.freezeRange, this.showRange, true); this.adjustShowRange(this.availWidth, this.availHeight); } else { if (this.isEqualRange(fr, this.freezeRange)) { this.refreshRange(); } else { this.showRange = this.checkShowRange(fr, this.freezeRange, this.showRange); this.freezeRange = this.copyRange(fr); this.reFreezeRange(this.freezeRange, this.showRange, true); } } }, /**sheet 定义*/ initComponent : function() { this.splitFlag = false; this.id = Ext.id(); this.initTemplates(); this.ds = new Ext.ss.DataSource({ spreadsheet : this }); this.sm = new Ext.ss.SelectionModel({ spreadsheet : this }); this.editor = new Ext.ss.Editor({ spreadsheet : this }); this.hotkey = new Ext.ss.HotKey({ spreadsheet : this }); this.contextmenu = new Ext.ss.menu.ContextMenu({ spreadsheet : this }); this.chartManager = new Ext.ss.ChartManager({ spreadsheet : this }); this.chartSelector = new Ext.ss.popup.chart.ChartSelector({ spreadsheet : this }); this.dataRangeSelector = new Ext.ss.popup.chart.DataRangeSelector({ spreadsheet : this }); this.commenteditor = new Ext.ss.CommentEditor({ spreadsheet : this }); this.commenttip = new Ext.ss.popup.CommentTip({ spreadsheet : this }); this.hyperlinktip = new Ext.ss.popup.HyperlinkTip({ spreadsheet : this }); this.hyperlinkwin = new Ext.ss.HyperlinkWin({ spreadsheet : this }); this.sheetEditor = new Ext.Editor(new Ext.form.TextField({ allowBlank : false, growMin : 90, growMax : 240, grow : true, selectOnFocus : true }), { alignment : "tl-tl", shim : false, autoSize : "width", cancelOnEsc : true, completeOnEnter : true, spreadsheet : this }); this.initSheetMenu(); this.initPasteOptions(); this.addSheetWin = new Ext.ss.popup.AddSheetWin({ spreadsheet : this }); this.publicLinkWin = new Ext.ux.dialog.PublicLinkWin({}); this.generateTopBar(); if (this.file && this.file.sheets) { this.ds.setSheets(this.file.sheets, this.file.extraInfo, this.file.activeSheet); } else { this.ds.loadSheets(); this.sm.initSelection(); } this.html = this.generateUI(); Ext.ss.SpreadSheet.superclass.initComponent.call(this); this.addEvents("movefreezer", "updateBeforeLeftBody", "updateBeforeBody", "updateEndLeftBody", "updateEndBody", "updateBeforeHeaderCol", "updateBeforeBodyCol", "updateEndHeaderCol", "updateEndBodyCol", "updateBeforeLeftHeaderCol", "updateBeforeLeftBodyCol", "updateEndLeftHeaderCol", "updateEndLeftBodyCol", "updateLeftBody", "updateBody", "updateHeader", "updateBeforeHeader", "updateEndHeader", "updateLeftHeader", "updateBeforeLeftHeader", "updateEndLeftHeader", "removeLeftBodyRows", "removeBodyRows", "removeLeftHeaderRows", "removeHeaderRows", "removeHeaderCols", "removeBodyCols", "removeLeftHeaderCols", "removeLeftBodyCols", "updatecss", "afterresize", "beforecut", "cut", "beforecopy", "copy", "beforepaste", "paste", "updatefx", "poststatus", "updatestate", "updatepress", "yscrolling", "uyscrolling", "xscrolling", "lxscrolling", "containerupdated", "freezechanged", "splitchanged"); this.on("afterrender", this.onAfterRenderFn, this, { single : true }); this.on("bodyresize", function() { if (this.splitFlag) { this.reloadUI(); } }, this, { delay : 500, single : true }); this.on("movefreezer", this.MoveFreezer, this); this.on("updateBeforeLeftBody", this.onUpdateBeforeLeftBodyFn, this); this.on("updateBeforeBody", this.onUpdateBeforeBodyFn, this); this.on("updateEndLeftBody", this.onUpdateEndLeftBodyFn, this); this.on("updateEndBody", this.onUpdateEndBodyFn, this); this.on("updateBeforeHeaderCol", this.onUpdateBeforeHeaderColFn, this); this.on("updateBeforeBodyCol", this.onUpdateBeforeBodyColFn, this); this.on("updateEndHeaderCol", this.onUpdateEndHeaderColFn, this); this.on("updateEndBodyCol", this.onUpdateEndBodyColFn, this); this.on("updateBeforeLeftHeaderCol", this.onUpdateBeforeLeftHeaderColFn, this); this.on("updateBeforeLeftBodyCol", this.onUpdateBeforeLeftBodyColFn, this); this .on("updateEndLeftHeaderCol", this.onUpdateEndLeftHeaderColFn, this); this.on("updateEndLeftBodyCol", this.onUpdateEndLeftBodyColFn, this); this.on("updateLeftBody", this.onUpdateLeftBodyFn, this); this.on("updateBody", this.onUpdateBodyFn, this); this.on("updateHeader", this.onUpdateHeaderFn, this); this.on("updateBeforeHeader", this.onUpdateBeforeHeaderFn, this); this.on("updateEndHeader", this.onUpdateEndHeaderFn, this); this.on("updateLeftHeader", this.onUpdateLeftHeaderFn, this); this .on("updateBeforeLeftHeader", this.onUpdateBeforeLeftHeaderFn, this); this.on("updateEndLeftHeader", this.onUpdateEndLeftHeaderFn, this); this.on("removeLeftBodyRows", this.onRemoveLeftBodyRowsFn, this); this.on("removeBodyRows", this.onRemoveBodyRowsFn, this); this.on("removeLeftHeaderRows", this.onRemoveLeftHeaderRowsFn, this); this.on("removeHeaderRows", this.onRemoveHeaderRowsFn, this); this.on("removeHeaderCols", this.onRemoveHeaderColsFn, this); this.on("removeBodyCols", this.onRemoveBodyColsFn, this); this.on("removeLeftHeaderCols", this.onRemoveLeftHeaderColsFn, this); this.on("removeLeftBodyCols", this.onRemoveLeftBodyColsFn, this); this.on("updatecss", this.ds.onUpdateCssFn, this.ds); this.on("afterresize", this.sm.onAfterResizeFn, this.sm); this.on("bodyresize", this.onBodyResizeFn, this, { buffer : 100 }); this.on("paste", this.onPasteFn, this); this.editor.on("complete", this.onEditCompleteFn, this); this.on("updatestate", this.updateStateField, this); this.on("updatefx", this.updateFxField, this); this.on("yscrolling", this.onYScrollingFn, this); this.on("uyscrolling", this.onUYScrollingFn, this); this.on("xscrolling", this.onXScrollingFn, this); this.on("lxscrolling", this.onLXScrollingFn, this); this.on("freezechanged", this.onFreezeChangedFn, this); this.sheetEditor.on("complete", this.onSheetEditorCompleteFn, this); this.sm.on("renderborder", this.chartManager.deselectChart, this.chartManager); this.ds.on("hstackchange", this.onHStackChangeFn, this); }, onSheetEditorCompleteFn : function(ed, v, sv) { var ds = this.ds, sheets = ds.sheets; if (!v || ds.findSheetName(v)) { Ext.Msg.alert(feyaSoft.lang.common.hint, feyaSoft.ss.lang.nameDuplicated); return; } if (/[\+\-\*\/\%\)\(\{\}\[\]\\]+/gi.test(v)) { Ext.Msg.alert(feyaSoft.lang.common.hint, feyaSoft.ss.lang.nameInvalid); return; } var bs = ed.bindSheet; ds.renameSheet(v, bs.index); bs.El.dom.innerHTML = v; }, firebugWarning : function() { var cp = new Ext.state.CookieProvider; var tpl, msg, bg, bc, t; if (window.console && window.console.firebug && !cp.get("hideFBWarning")) { t = "Warning"; msg = " Firebug is known to cause performance issues with MySpreadSheet. "; } else if (!Ext.isChrome && !cp.get("hideFBWarning")) { t = "Notice"; msg = " MySpreadSheet is known to run more smoothly in Google Chrome. "; } if (msg) { tpl = new Ext.Template("" + t + ": " + msg + "[ Hide ]"); var html = tpl.apply({ t : t, msg : msg }); this.setStatus({ text : html, iconCls : "x-status-error" }); Ext.fly(this.id + "-x-spreadsheet-hide-warning").on("click", function() { cp.set("hideFBWarning", true); this.setStatus({ text : "Ready", iconCls : "x-status-valid" }); }, this); } }, tryLoadCharts : function() { var ds = this.ds; var data = ds.data; if (data.charts && !data.chartSet) { this.chartManager.generateCharts(data.charts); } }, onYScrollingFn : function(offset) { if (0 != offset) { var fr = this.freezeRange; var ds = this.ds; var st; if (this.splitFlag) { st = ds.getHeight(1, this.showRange.row.start - 1); } else { st = ds.getHeight(fr.row.end + 1, this.showRange.row.start - 1); } this.sct.dom.scrollTop = st; if (0 != fr.col.len) { this.lsct.dom.scrollTop = st; } this.rowct.dom.scrollTop = st; } }, onUYScrollingFn : function(offset) { if (0 != offset) { var fr = this.freezeRange; var ds = this.ds; var st = ds.getHeight(1, this.freezeRange.row.start - 1); this.hct.dom.scrollTop = st; if (0 != fr.col.len) { this.lhct.dom.scrollTop = st; } this.frowct.dom.scrollTop = st; } }, onLXScrollingFn : function(offset) { if (0 != offset) { var fr = this.freezeRange; var ds = this.ds; var sl = ds.getWidth(1, fr.col.start - 1); this.lsct.dom.scrollLeft = sl; if (0 != fr.row.len) { this.lhct.dom.scrollLeft = sl; } this.fcolct.dom.scrollLeft = sl; } }, onXScrollingFn : function(offset) { if (0 != offset) { var fr = this.freezeRange; var ds = this.ds; var sl; if (this.splitFlag) { sl = ds.getWidth(1, this.showRange.col.start - 1); } else { sl = ds.getWidth(fr.col.end + 1, this.showRange.col.start - 1); } this.sct.dom.scrollLeft = sl; if (0 != fr.row.len) { this.hct.dom.scrollLeft = sl; } this.colct.dom.scrollLeft = sl; } }, onBodyResizeFn : function(p, w, h) { var wd = w - this.stateField.getWidth() - 405; this.fxField.setWidth(wd); this.handleResize(w, h); }, onEditCompleteFn : function(ed, pos, v) { this.ds.trace(feyaSoft.ss.lang.action_input_cell(v, this.ds .getNameFromPos(pos))); }, onAfterRenderFn : function(p) { this.initEls(); this.tryLoadCharts(); var sm = this.sm; sm.fireEvent("renderborder"); this.updateStatus(sm.focusCell.x, sm.focusCell.y); return; if (Ext.isIE) { (function () { this.adjustLiveScroller(); this.sysContainerRange(); }).defer(1000, this); } else { this.adjustLiveScroller(); this.sysContainerRange(); } }, resetRange : function() { this.freezeRange = { row : { start : 1, end : 0, len : 0 }, col : { start : 1, end : 0, len : 0 } }; this.showRange = { row : { start : 1, end : 20, len : 20 }, col : { start : 1, end : 12, len : 12 } }; }, copyRange : function(or) { var obj = { row : { start : or.row.start, end : or.row.end, len : or.row.len }, col : { start : or.col.start, end : or.col.end, len : or.col.len } }; return obj; }, CancelSpliter : function(stop) { var ofr = this.freezeRange; var osr = this.showRange; var offseth = 0 - ofr.row.len, offsetl = 0 - ofr.col.len; if (0 === offseth && 0 === offsetl) { return; } var ds = this.ds; var freezeRange = this.copyRange(ofr), ofr = this.copyRange(ofr); var showRange = this.copyRange(osr); showRange.row.len -= offseth; showRange.col.len -= offsetl; showRange.row.start = freezeRange.row.start; showRange.col.start = freezeRange.col.start; showRange.row.end = showRange.row.start + showRange.row.len - 1; showRange.col.end = showRange.col.start + showRange.col.len - 1; freezeRange.row.start = 1; freezeRange.col.start = 1; freezeRange.row.end = 0; freezeRange.col.end = 0; freezeRange.row.len = 0; freezeRange.col.len = 0; var splitFlag = Ext.ss.common.Mask.copy(this.splitFlag); this.splitFlag = false; this.reSplitRange(freezeRange, showRange, true); if (!stop) { ds.fireEvent("splitchange", ofr, freezeRange, splitFlag, false); } }, MoveSpliter : function(x, y, stop) { if (1 == x && 1 == y) { return; } x--; y--; var freezeRange = this.copyRange(this.freezeRange), ofr = this .copyRange(this.freezeRange); var showRange = this.copyRange(this.showRange); var offseth, offsetl; if (0 == freezeRange.row.end) { freezeRange.row.start = showRange.row.start; offseth = x - showRange.row.start + 1; } else { offseth = x - freezeRange.row.end + 1; } if (0 == freezeRange.col.end) { freezeRange.col.start = showRange.col.start; offsetl = y - showRange.col.start + 1; } else { offsetl = y - freezeRange.col.end + 1; } freezeRange.row.end = x; freezeRange.col.end = y; freezeRange.row.len = x - freezeRange.row.start + 1; freezeRange.col.len = y - freezeRange.col.start + 1; showRange.row.len -= offseth; showRange.col.len -= offsetl; showRange.row.start = x + 1; showRange.col.start = y + 1; showRange.row.end = showRange.row.start + showRange.row.len - 1; showRange.col.end = showRange.col.start + showRange.col.len - 1; var splitFlag = Ext.ss.common.Mask.copy(this.splitFlag); this.reSplitRange(freezeRange, showRange, true); if (!stop) { this.ds.fireEvent("splitchange", ofr, freezeRange, splitFlag, this.splitFlag); } }, CancelFreezer : function(stop) { var ofr = this.freezeRange; var osr = this.showRange; var offseth = 0 - ofr.row.len, offsetl = 0 - ofr.col.len; if (0 === offseth && 0 === offsetl) { return; } var freezeRange = this.copyRange(ofr), ofr = this.copyRange(ofr); var showRange = this.copyRange(osr); showRange.row.len -= offseth; showRange.col.len -= offsetl; showRange.row.start = freezeRange.row.start; showRange.col.start = freezeRange.col.start; showRange.row.end = showRange.row.start + showRange.row.len - 1; showRange.col.end = showRange.col.start + showRange.col.len - 1; freezeRange.row.start = 1; freezeRange.col.start = 1; freezeRange.row.end = 0; freezeRange.col.end = 0; freezeRange.row.len = 0; freezeRange.col.len = 0; this.reFreezeRange(freezeRange, showRange, true); if (!stop) { this.ds.fireEvent("freezechange", ofr, freezeRange); } }, MoveFreezer : function(x, y, stop) { var freezeRange = this.copyRange(this.freezeRange), ofr = this .copyRange(this.freezeRange); var showRange = this.copyRange(this.showRange); var ox = showRange.row.start, oy = showRange.col.start; if (0 != freezeRange.row.len) { ox = freezeRange.row.start + 1; } if (0 != freezeRange.col.len) { oy = freezeRange.col.start + 1; } if (ox == x && oy == y) { return; } var ds = this.ds; x--; y--; var offseth, offsetl; if (0 == freezeRange.row.end) { freezeRange.row.start = showRange.row.start; offseth = x - showRange.row.start + 1; } else { offseth = x - freezeRange.row.end + 1; } if (0 == freezeRange.col.end) { freezeRange.col.start = showRange.col.start; offsetl = y - showRange.col.start + 1; } else { offsetl = y - freezeRange.col.end + 1; } freezeRange.row.end = x; freezeRange.col.end = y; freezeRange.row.len = x - freezeRange.row.start + 1; freezeRange.col.len = y - freezeRange.col.start + 1; showRange.row.len -= offseth; showRange.col.len -= offsetl; showRange.row.start = x + 1; showRange.col.start = y + 1; showRange.row.end = showRange.row.start + showRange.row.len - 1; showRange.col.end = showRange.col.start + showRange.col.len - 1; this.reFreezeRange(freezeRange, showRange, true); if (!stop) { ds.fireEvent("freezechange", ofr, freezeRange); } }, renderRange : function(freezeRange, showRange, updated, fixed) { freezeRange = freezeRange || this.freezeRange; showRange = showRange || this.showRange; var obj = { freezeRange : freezeRange, rowStart : showRange.row.start, rowEnd : showRange.row.end, colStart : showRange.col.start, colEnd : showRange.col.end }; if (!fixed) { this.adjustScrollBody(); Ext.apply(obj, { adjustWidth : this.adjustWidth, adjustHeight : this.adjustHeight }); } var data = this.ds.getRange(obj); showRange.row.len = data.rowNum; showRange.row.end = data.rowEnd; showRange.col.len = data.colNum; showRange.col.end = data.colEnd; var ts = this.templates; var lhrows = ts.lhrows.apply(data.slheader); var lrows = ts.lrows.apply(data.lscroller); var hrows = ts.hrows.apply(data.sheader); var rows = ts.rows.apply(data.scroller); this.fireEvent("updateLeftHeader", this, lhrows); this.fireEvent("updateHeader", this, hrows); this.fireEvent("updateLeftBody", this, lrows); this.fireEvent("updateBody", this, rows); if (true == updated) { this.slw = data.slw; this.sh = data.sh; this.slh = data.slh; this.sw = data.sw; this.updateContainerRange(data); } return data; }, sysContainerRange : function() { var freezeRange = this.freezeRange, showRange = this.showRange; var obj = { freezeRange : freezeRange, rowStart : showRange.row.start, rowNum : showRange.row.len, colStart : showRange.col.start, colNum : showRange.col.len }; var data = this.ds.getRange(obj); this.updateContainerRange(data); }, updateContainerRange : function(data) { var ch = this.cellHeight + this.ypaddingOffset; var lc = this.lcWidth + this.xpaddingOffset; var slh, slw; if (this.isRowSplited()) { slh = this.splitFlag.splitHeight; } else { slh = data.slh; } var lh = slh - ch; this.lhct.setHeight(lh); this.frowct.setHeight(lh); if (this.isRowSplit()) { var top = slh + this.SPLIT_BAR_SIZE; this.rowct.setTop(top); this.lsct.setTop(top); this.sct.setTop(top); } else { this.rowct.setTop(slh); this.lsct.setTop(slh); this.sct.setTop(slh); } this.hct.setHeight(lh); this.fbrow.setHeight(slh); if (this.isColSplited()) { slw = this.splitFlag.splitWidth; } else { slw = data.slw; } var lw = slw - lc; this.lhct.setWidth(lw); this.fcolct.setWidth(lw); if (this.isColSplit()) { var left = slw + this.SPLIT_BAR_SIZE; this.colct.setLeft(left); this.hct.setLeft(left); this.sct.setLeft(left); } else { this.colct.setLeft(slw); this.hct.setLeft(slw); this.sct.setLeft(slw); } this.lsct.setWidth(lw); this.fbcol.setWidth(slw); this.fireEvent("containerupdated"); }, updateCSS : function(obj) { if (obj.nw) { this.setScrollerWidth(obj.nw); } if (obj.nh) { this.setScrollerHeight(obj.nh); } if (obj.slw) { if (this.isColSplited()) { this.lscroller.setWidth(this.splitFlag.splitWidth); } else { this.lscroller.setWidth(obj.slw); } } }, cancelYSplit : function() { this.hscroller.setHeight("auto"); this.lhscroller.setHeight("auto"); this.leftsplit.setStyle("display", "none"); this.hsplit.setStyle("display", "none"); this.vsplitcross.setStyle("display", "none"); this.uylivescroller.setStyle("display", "none"); this.ylivesplit.setStyle("display", "none"); this.ylivescroller.setTop(this.SPLIT_BAR_SIZE); this.ylivescroller.setHeight(this.availHeight - this.SPLIT_BAR_SIZE); }, cancelXSplit : function() { this.lhscroller.setWidth("auto"); this.hsplittd.setStyle("display", "none"); this.vsplittd.setStyle("display", "none"); this.xlivesplit.setStyle("display", ""); this.lxlivescroller.setStyle("display", "none"); this.xlivescroller.setWidth(this.setFooterWidth(this.availWidth) - this.SPLIT_BAR_SIZE); }, sysnLiveScroller : function() { var ds = this.ds, fr = this.freezeRange, sr = this.showRange; if (this.splitFlag) { if (fr.row.start != fr.row.end) { this.uylivescroller.dom.scrollTop = this.yScrollOffset * ds.getVisibleRowOffset(fr.row.start, 1); } if (fr.col.start != fr.col.end) { this.lxlivescroller.dom.scrollLeft = this.yScrollOffset * ds.getVisibleRowOffset(fr.col.start, 1); } this.ylivescroller.dom.scrollTop = this.yScrollOffset * ds.getVisibleRowOffset(sr.row.start, 1); this.xlivescroller.dom.scrollLeft = this.xScrollOffset * ds.getVisibleColOffset(sr.col.start, 1); } else { this.ylivescroller.dom.scrollTop = this.yScrollOffset * ds.getVisibleRowOffset(sr.row.start, fr.row.end + 1); this.xlivescroller.dom.scrollLeft = this.xScrollOffset * ds.getVisibleColOffset(sr.col.start, fr.col.end + 1); } }, reSplitRange : function(freezeRange, showRange, updated, fixed) { var ofr = this.copyRange(this.freezeRange); this.freezeRange = freezeRange; var osr = this.copyRange(this.showRange); this.showRange = showRange; this.uylivescroller.un("scroll", this.onUYLiveScrollFn, this, { buffer : this.scrollDelay }); this.lxlivescroller.un("scroll", this.onLXLiveScrollFn, this, { buffer : this.scrollDelay }); this.ylivescroller.un("scroll", this.onYLiveScrollFn, this, { buffer : this.scrollDelay }); this.xlivescroller.un("scroll", this.onXLiveScrollFn, this, { buffer : this.scrollDelay }); var splitWidth = null, splitHeight = null; if (this.splitFlag) { splitWidth = this.splitFlag.splitWidth; splitHeight = this.splitFlag.splitHeight; } else { this.splitFlag = true; } var data = this.renderRange(freezeRange, showRange, updated, fixed); this.slw = data.slw; this.sh = data.sh; this.slh = data.slh; this.sw = data.sw; if (null === splitWidth) { splitWidth = this.lhscroller.getWidth(); } if (null === splitHeight) { splitHeight = this.hscroller.getHeight(); } this.splitFlag = { splitWidth : splitWidth, splitHeight : splitHeight }; var t = splitHeight + this.SPLIT_BAR_SIZE; var h = this.availHeight - t; this.fbrow.setStyle("display", "none"); this.fbcol.setStyle("display", "none"); if (0 != freezeRange.row.len) { this.hscroller.setHeight(splitHeight); this.lhscroller.setHeight(splitHeight); this.leftsplit.setStyle("display", ""); this.hsplit.setStyle("display", ""); this.uylivescroller.setHeight(splitHeight); this.uylivescroller.setStyle("display", ""); this.sysUpYFakebody(freezeRange, showRange); this.ylivesplit.setTop(splitHeight); this.ylivesplit.setStyle("display", ""); this.ylivescroller.setTop(t); this.ylivescroller.setHeight(h); this.vsplitcross.setStyle("display", ""); } else { this.cancelYSplit(); } if (0 != freezeRange.col.len) { this.lhscroller.setWidth(splitWidth); this.hsplittd.setStyle("display", ""); this.vsplittd.setStyle("display", ""); this.xlivesplit.setStyle("display", "none"); this.lxlivescroller.setStyle("display", ""); this.uppersplit.setHeight(splitHeight); this.vsplit.setHeight(this.availHeight); this.lxlivescroller.setWidth(this.setFooterWidth(splitWidth)); this.sysLeftXFakebody(freezeRange, showRange); this.xlivescroller.setWidth(this.availWidth - splitWidth - this.SPLIT_BAR_SIZE); } else { this.cancelXSplit(); } this.fireEvent("splitchanged", this, freezeRange, showRange, ofr, osr); this.sm.fireEvent.defer(1, this.sm, ["renderborder"]); this.sysXFakebody(freezeRange, showRange); this.sysYFakebody(freezeRange, showRange); this.sysnLiveScroller(); this.onUYScrollingFn(); this.onLXScrollingFn(); this.onXScrollingFn(); this.onYScrollingFn(); this.uylivescroller.on("scroll", this.onUYLiveScrollFn, this, { buffer : this.scrollDelay }); this.lxlivescroller.on("scroll", this.onLXLiveScrollFn, this, { buffer : this.scrollDelay }); this.ylivescroller.on("scroll", this.onYLiveScrollFn, this, { buffer : this.scrollDelay }); this.xlivescroller.on("scroll", this.onXLiveScrollFn, this, { buffer : this.scrollDelay }); if (0 == freezeRange.row.len && 0 == freezeRange.col.len) { this.splitFlag = false; } this.fireEvent("splitchanged", this, freezeRange, showRange, ofr, osr); this.sm.fireEvent.defer(1, this.sm, ["renderborder"]); }, setFooterWidth : function(splitWidth) { var footerToolWidth = this.sftool.getWidth(); var sw = Ext.get(this.fcontainer.dom).getWidth() - this.frest.getWidth(); if (false != Ext.type(this.footerWidth)) { var offset = this.footerWidth - footerToolWidth; if (this.SPLIT_BAR_SIZE <= offset) { this.fcontainer.setWidth(offset); } else { this.fcontainer.setWidth(this.SPLIT_BAR_SIZE); this.sftool.setWidth(this.footerWidth - this.SPLIT_BAR_SIZE); } return splitWidth - this.footerWidth; } else { var lw = splitWidth - footerToolWidth - this.SPLIT_BAR_SIZE - sw; var minw = this.lcWidth + this.xpaddingOffset - this.SPLIT_BAR_SIZE; if (lw < minw) { lw = minw; } var fw = splitWidth - footerToolWidth - lw; if (this.SPLIT_BAR_SIZE > fw) { footerToolWidth += fw - this.SPLIT_BAR_SIZE; if (footerToolWidth < minw) { lw += footerToolWidth - 1; footerToolWidth = 1; } this.sftool.setWidth(footerToolWidth); fw = this.SPLIT_BAR_SIZE; } this.fcontainer.setWidth(fw); this.footerWidth = footerToolWidth + fw; return lw; } }, reFreezeRange : function(freezeRange, showRange, updated, fixed) { var ofr = this.copyRange(this.freezeRange); this.freezeRange = freezeRange; var osr = this.copyRange(this.showRange); this.showRange = showRange; var data = this.renderRange(freezeRange, showRange, updated, fixed); this.slw = data.slw; this.sh = data.sh; this.slh = data.slh; this.sw = data.sw; this.fbrow.setStyle("display", ""); this.fbcol.setStyle("display", ""); this.ylivescroller.un("scroll", this.onYLiveScrollFn, this, { buffer : this.scrollDelay }); this.xlivescroller.un("scroll", this.onXLiveScrollFn, this, { buffer : this.scrollDelay }); this.sysXFakebody(freezeRange, showRange); this.sysYFakebody(freezeRange, showRange); this.sysnLiveScroller(); this.onXScrollingFn(); this.onYScrollingFn(); this.ylivescroller.on("scroll", this.onYLiveScrollFn, this, { buffer : this.scrollDelay }); this.xlivescroller.on("scroll", this.onXLiveScrollFn, this, { buffer : this.scrollDelay }); this.fireEvent("freezechanged", this, freezeRange, showRange, ofr, osr); this.sm.fireEvent.defer(1, this.sm, ["renderborder"]); }, sysXFakebody : function(freezeRange, showRange) { freezeRange = freezeRange || this.freezeRange; showRange = showRange || this.showRange; var flen = freezeRange.col.len; if (this.splitFlag) { flen = 0; } var colNum = this.colNum > showRange.col.end ? this.colNum : showRange.col.end; var w = this.xlivescroller.getWidth() + this.ds.getOffsetWidth(this.xScrollOffset, flen, showRange.col.len, colNum) + 1; this.xfakebody.setWidth(w); return w; }, sysLeftXFakebody : function(freezeRange, showRange) { freezeRange = freezeRange || this.freezeRange; showRange = showRange || this.showRange; var colNum = this.colNum > freezeRange.col.end ? this.colNum : freezeRange.col.end; var w = this.lxlivescroller.getWidth() + this.ds.getOffsetWidth(this.xScrollOffset, 0, freezeRange.col.len, colNum) + 1; this.lxfakebody.setWidth(w); return w; }, sysYFakebody : function(freezeRange, showRange) { freezeRange = freezeRange || this.freezeRange; showRange = showRange || this.showRange; var flen = freezeRange.row.len; if (this.splitFlag) { flen = 0; } var rowNum = this.rowNum > showRange.row.end ? this.rowNum : showRange.row.end; var h = this.ylivescroller.getHeight() + this.ds.getOffsetHeight(this.yScrollOffset, flen, showRange.row.len, rowNum) + 1; this.yfakebody.setHeight(h); return h; }, sysUpYFakebody : function(freezeRange, showRange) { freezeRange = freezeRange || this.freezeRange; showRange = showRange || this.showRange; var rowNum = this.rowNum > freezeRange.row.end ? this.rowNum : freezeRange.row.end; var h = this.uylivescroller.getHeight() + this.ds.getOffsetHeight(this.yScrollOffset, 0, freezeRange.row.len, rowNum) + 1; this.uyfakebody.setHeight(h); return h; }, encode : function(name) { if ("height" === name) { return "ch"; } else if ("width" == name) { return "cw"; } else { return name; } }, decode : function(name) { if ("ch" === name) { return "height"; } else if ("cw" == name) { return "width"; } else { return name; } }, generateRows : function(startRow, endRow, fillHeight) { var startCol = this.showRange.col.start; var endCol = this.showRange.col.end; var addlist = ""; var laddlist = ""; var data = this.ds.getRowRange({ freezeRange : this.freezeRange, rowStart : startRow, rowEnd : endRow, fillHeight : fillHeight, colStart : startCol, colEnd : endCol }); var ts = this.templates; laddlist = ts.lrows.apply(data.lscroller); addlist = ts.rows.apply(data.scroller); return { rh : data.rh, rowNum : data.rowNum, rowEnd : data.rowEnd, laddlist : laddlist, addlist : addlist }; }, generateURows : function(startRow, endRow, fillHeight) { var startCol = this.showRange.col.start; var endCol = this.showRange.col.end; var addlist = ""; var laddlist = ""; var data = this.ds.getURowRange({ freezeRange : this.freezeRange, rowStart : startRow, rowEnd : endRow, fillHeight : fillHeight, colStart : startCol, colEnd : endCol }); var ts = this.templates; laddlist = ts.lrows.apply(data.lheader); addlist = ts.rows.apply(data.header); return { rh : data.rh, rowNum : data.rowNum, rowEnd : data.rowEnd, laddlist : laddlist, addlist : addlist }; }, generateCols : function(startCol, endCol, fillWidth) { var startRow = this.showRange.row.start; var endRow = this.showRange.row.end; var addlist = ""; var haddlist = ""; var data = this.ds.getColRange({ freezeRange : this.freezeRange, rowStart : startRow, rowEnd : endRow, colStart : startCol, colEnd : endCol, fillWidth : fillWidth }); var ts = this.templates; haddlist = ts.hrows.apply(data.sheader); addlist = ts.rows.apply(data.scroller); return { rw : data.rw, colNum : data.colNum, colEnd : data.colEnd, haddlist : haddlist, addlist : addlist }; }, generateLCols : function(startCol, endCol, fillWidth) { var startRow = this.showRange.row.start; var endRow = this.showRange.row.end; var addlist = ""; var haddlist = ""; var data = this.ds.getLColRange({ freezeRange : this.freezeRange, rowStart : startRow, rowEnd : endRow, colStart : startCol, colEnd : endCol, fillWidth : fillWidth }); var ts = this.templates; haddlist = ts.hrows.apply(data.lheader); addlist = ts.rows.apply(data.lscroller); return { rw : data.rw, colNum : data.colNum, colEnd : data.colEnd, haddlist : haddlist, addlist : addlist }; }, generateTdCols : function(startCol, endCol, fillWidth) { var startRow = this.showRange.row.start; var endRow = this.showRange.row.end; var addlist = []; var haddlist = []; var data = this.ds.getColRange({ freezeRange : this.freezeRange, rowStart : startRow, rowEnd : endRow, colStart : startCol, colEnd : endCol, fillWidth : fillWidth }); var ts = this.templates; var sheader = data.sheader; for (var i = 0, len = sheader.length; i < len; i++) { var o = sheader[i]; haddlist.push(ts.htd.apply(o)); } var scroller = data.scroller; for (var i = 0, len = scroller.length; i < len; i++) { var o = scroller[i]; addlist.push(ts.std.apply(o)); } return { rw : data.rw, colNum : data.colNum, colEnd : data.colEnd, haddlist : haddlist, addlist : addlist }; }, isColSplited : function() { return "object" == Ext.type(this.splitFlag) && null !== this.splitFlag.splitWidth; }, isRowSplited : function() { return "object" == Ext.type(this.splitFlag) && null !== this.splitFlag.splitHeight; }, adjustScrollBody : function() { var ds = this.ds, fr = this.freezeRange, obj = {}; var fh, fw; if (this.isRowSplited()) { fh = this.splitFlag.splitHeight; } else { fh = ds.getHeight(fr.row.start, fr.row.end); fh += this.cellHeight + this.ypaddingOffset; } if (fh != this.sheader.getHeight()) { this.adjustHeight = this.body.getHeight() - this.scrollOffset - fh; obj.nh = this.adjustHeight; } if (this.isColSplited()) { fw = this.splitFlag.splitWidth; } else { fw = ds.getWidth(fr.col.start, fr.col.end); fw += this.lcWidth + this.xpaddingOffset; } if (fw != this.lscroller.getWidth()) { this.adjustWidth = this.body.getWidth() - this.scrollOffset - fw; obj.nw = this.adjustWidth; obj.slw = fw; } this.updateCSS(obj); }, handleResize : function(bw, bh) { var adjustWidth, adjustHeight, availWidth, availHeight; var footerToolWidth = this.sftool.getWidth(); availWidth = bw - this.scrollOffset; var fw; adjustWidth = availWidth - this.lhscroller.getWidth(); if (this.isColSplit()) { fw = adjustWidth; } else { if (0 < adjustWidth && adjustWidth - this.footerWidth < adjustWidth / 3) { this.footerWidth = adjustWidth * 2 / 3; } this.fcontainer.setWidth(this.footerWidth - footerToolWidth); fw = availWidth - this.footerWidth; } this.setScrollerWidth(adjustWidth); this.sline.dom.lastChild.style.width = "100%"; this.xlivescroller.setWidth(fw - this.SPLIT_BAR_SIZE); availHeight = bh - this.scrollOffset; adjustHeight = availHeight - this.lhscroller.getHeight(); this.setScrollerHeight(adjustHeight); this.ylivescroller.setHeight(availHeight - this.uylivescroller.getHeight() - this.SPLIT_BAR_SIZE); this.sview.setHeight(bh); this.frowct.setWidth(availWidth); this.rowct.setWidth(availWidth); this.fcolct.setHeight(availHeight); this.colct.setHeight(availHeight); this.adjustShowRange(availWidth, availHeight, false); this.fireEvent("afterresize", this, availWidth, availHeight); }, initEls : function() { this.dragRowSpliter = Ext.get(this.id + "-x-spreadsheet-draging-split-row"); this.dragColSpliter = Ext.get(this.id + "-x-spreadsheet-draging-split-col"); this.hsplittd = Ext.get(this.id + "-x-spreadsheet-hsplit-td"); this.xlivesplit = Ext.get(this.id + "-x-spreadsheet-live-split-x"); this.vsplittd = Ext.get(this.id + "-x-spreadsheet-vsplit-td"); this.vsplitcross = Ext.get(this.id + "-x-spreadsheet-vsplit-cross"); this.uppersplit = Ext.get(this.id + "-x-spreadsheet-upper-vsplit"); this.vsplit = Ext.get(this.id + "-x-spreadsheet-vsplit"); this.ylivesplit = Ext.get(this.id + "-x-spreadsheet-live-split-y"); this.leftsplit = Ext.get(this.id + "-x-spreadsheet-left-split"); this.hsplit = Ext.get(this.id + "-x-spreadsheet-split"); this.footresizer = Ext.get(this.id + "-x-spreadsheet-footer-resizer"); this.sline = Ext.get(this.id + "-x-spreadsheet-footer-sheets-line"); this.fcontainer = Ext.get(this.id + "-x-spreadsheet-footer-container"); this.colline = Ext.get(this.id + "-x-spreadsheet-col-line"); this.rowline = Ext.get(this.id + "-x-spreadsheet-row-line"); this.toy = Ext.get(this.id + "-x-spreadsheet-toy"); this.fbrow = Ext.get(this.id + "-x-spreadsheet-freeze-row-bg"); this.fbcol = Ext.get(this.id + "-x-spreadsheet-freeze-col-bg"); this.frowct = Ext.get(this.id + "-x-spreadsheet-freeze-row-container"); this.frowctInner = Ext.get(this.frowct.dom.firstChild); this.frowctInner.dom.style.width = this.MAX_PIXEL + "px"; this.frowctInner.dom.style.height = this.MAX_PIXEL + "px"; this.fcolct = Ext.get(this.id + "-x-spreadsheet-freeze-col-container"); this.fcolctInner = Ext.get(this.fcolct.dom.firstChild); this.fcolctInner.dom.style.width = this.MAX_PIXEL + "px"; this.fcolctInner.dom.style.height = this.MAX_PIXEL + "px"; this.rowct = Ext.get(this.id + "-x-spreadsheet-row-container"); this.rowctInner = Ext.get(this.rowct.dom.firstChild); this.rowctInner.dom.style.width = this.MAX_PIXEL + "px"; this.rowctInner.dom.style.height = this.MAX_PIXEL + "px"; this.colct = Ext.get(this.id + "-x-spreadsheet-col-container"); this.colctInner = Ext.get(this.colct.dom.firstChild); this.colctInner.dom.style.width = this.MAX_PIXEL + "px"; this.colctInner.dom.style.height = this.MAX_PIXEL + "px"; this.lhct = Ext.get(this.id + "-x-spreadsheet-left-header-container"); this.lhctInner = Ext.get(this.lhct.dom.firstChild); this.lhctInner.dom.style.width = this.MAX_PIXEL + "px"; this.lhctInner.dom.style.height = this.MAX_PIXEL + "px"; this.lsct = Ext.get(this.id + "-x-spreadsheet-left-scroller-container"); this.lsctInner = Ext.get(this.lsct.dom.firstChild); this.lsctInner.dom.style.width = this.MAX_PIXEL + "px"; this.lsctInner.dom.style.height = this.MAX_PIXEL + "px"; this.hct = Ext.get(this.id + "-x-spreadsheet-header-container"); this.hctInner = Ext.get(this.hct.dom.firstChild); this.hctInner.dom.style.width = this.MAX_PIXEL + "px"; this.hctInner.dom.style.height = this.MAX_PIXEL + "px"; this.sct = Ext.get(this.id + "-x-spreadsheet-scroller-container"); this.sctInner = Ext.get(this.sct.dom.firstChild); this.sctInner.dom.style.width = this.MAX_PIXEL + "px"; this.sctInner.dom.style.height = this.MAX_PIXEL + "px"; this.sview = Ext.get(this.id + "-x-spreadsheet-viewport"); this.ylivescroller = Ext .get(this.id + "-x-spreadsheet-live-scroller-y"); this.xlivescroller = Ext .get(this.id + "-x-spreadsheet-live-scroller-x"); this.uylivescroller = Ext.get(this.id + "-x-spreadsheet-upper-live-scroller-y"); this.lxlivescroller = Ext.get(this.id + "-x-spreadsheet-left-live-scroller-x"); this.yfakebody = Ext.get(this.id + "-x-spreadsheet-fake-body-y"); this.xfakebody = Ext.get(this.id + "-x-spreadsheet-fake-body-x"); this.lxfakebody = Ext.get(this.id + "-x-spreadsheet-left-fake-body-x"); this.uyfakebody = Ext.get(this.id + "-x-spreadsheet-upper-fake-body-y"); this.scroller = Ext.get(this.id + "-x-spreadsheet-scroller"); this.sheader = Ext.get(this.id + "-x-spreadsheet-header"); this.sbody = Ext.get(this.id + "-x-spreadsheet-body"); this.lscroller = Ext.get(this.id + "-x-spreadsheet-left-scroller"); this.hscroller = Ext.get(this.id + "-x-spreadsheet-header-scroller"); this.lhscroller = Ext.get(this.id + "-x-spreadsheet-lh-scroller"); this.slheader = Ext.get(this.id + "-x-spreadsheet-left-header"); this.slbody = Ext.get(this.id + "-x-spreadsheet-left-body"); this.sfooter = Ext.get(this.id + "-x-spreadsheet-footer"); this.sftool = Ext.get(this.id + "-x-spreadsheet-footer-tool"); this.fadd = Ext.get(this.id + "-x-spreadsheet-footer-add"); this.ffirst = Ext.get(this.id + "-x-spreadsheet-footer-first"); this.fpre = Ext.get(this.id + "-x-spreadsheet-footer-pre"); this.fnext = Ext.get(this.id + "-x-spreadsheet-footer-next"); this.flast = Ext.get(this.id + "-x-spreadsheet-footer-last"); this.frest = Ext.get(this.id + "-x-spreadsheet-footer-rest"); this.hfocus = Ext.get(this.id + "-x-spreadsheet-hidefocus"); this.hfocus.swallowEvent("click", true); this.initSheetNavEvents(); this.initScrollEvents(); this.initSViewEvents(); this.initHotKey(); var sm = this.sm; sm.createBorder(); this.initSMEvents(); this.initSheetDragZone(); this.initFooterResizer(); if (this.settings.readOnlyView) { this.fadd.dom.style.display = "none"; sm.hideBorder(); } else { this.fadd.dom.style.display = ""; sm.handleFocus(sm.focusCell.x, sm.focusCell.y); this.hfocus.focus(); } }, initHotKey : function() { var hk = this.hotkey; if (!this.settings.readOnlyView) { var docBody = Ext.getBody(); docBody.un("keydown", hk.onKeydownFn, hk); docBody.un("keyup", hk.onKeyupFn, hk); docBody.on("keydown", hk.onKeydownFn, hk); docBody.on("keyup", hk.onKeyupFn, hk); document.body.onkeypress = function(ev) { if (ev) { var obj = ev.srcElement || ev.target; if (obj.tagName != "TEXTAREA" && obj.tagName != "INPUT") { ev.preventDefault(); return false; } else { return true; } } }; if (Ext.isIE) { document.onselectstart = function() { var tagName = event.srcElement.tagName.toLowerCase(); var formtags = "input,textarea"; if (formtags.indexOf(tagName) == -1) { return false; } }; } } }, initSMEvents : function() { var sm = this.sm; var editor = this.editor; var textCoverEl = Ext.get(sm.getTextCover()); textCoverEl.un("keydown", editor.onTextCoverKeyDownFn, editor); textCoverEl.un("keyup", editor.onTextCoverKeyUpFn, editor); textCoverEl.un("keypress", editor.onTextCoverKeyPressFn, editor); textCoverEl.un("blur", editor.onTextCoverBlurFn, editor); textCoverEl.un("focus", editor.onTextCoverFocusFn, editor); textCoverEl.un("click", editor.onTextCoverClickFn, editor); textCoverEl.on("click", editor.onTextCoverClickFn, editor); textCoverEl.on("keydown", editor.onTextCoverKeyDownFn, editor); textCoverEl.on("keyup", editor.onTextCoverKeyUpFn, editor); textCoverEl.on("keypress", editor.onTextCoverKeyPressFn, editor); textCoverEl.on("blur", editor.onTextCoverBlurFn, editor); textCoverEl.on("focus", editor.onTextCoverFocusFn, editor); }, initSViewEvents : function() { this.sview.un("mousewheel", this.onMouseWheelFn, this); this.body.un("mousedown", this.onBodyMouseDown, this); this.sview.un("mousedown", this.chartManager.deselectChart, this.chartManager); this.sview .un("mousemove", this.commenttip.onMouseMove, this.commenttip); this.sview.un("dblclick", this.editor.onBodyDbClickFn, this.editor); this.sview.on("mousewheel", this.onMouseWheelFn, this); this.body.on("mousedown", this.onBodyMouseDown, this); this.sview .on("mousemove", this.commenttip.onMouseMove, this.commenttip); this.sview.on("mousedown", this.chartManager.deselectChart, this.chartManager); this.sview.on("dblclick", this.editor.onBodyDbClickFn, this.editor); if (!this.settings.readOnlyView) { this.sview.un("contextmenu", this.contextmenu.onBodyContextMenuFn, this.contextmenu); this.sview.on("contextmenu", this.contextmenu.onBodyContextMenuFn, this.contextmenu); } }, initScrollEvents : function() { this.ylivescroller.un("scroll", this.onYLiveScrollFn, this, { buffer : this.scrollDelay }); this.xlivescroller.un("scroll", this.onXLiveScrollFn, this, { buffer : this.scrollDelay }); this.uylivescroller.un("scroll", this.onUYLiveScrollFn, this, { buffer : this.scrollDelay }); this.lxlivescroller.un("scroll", this.onLXLiveScrollFn, this, { buffer : this.scrollDelay }); this.ylivescroller.dom.scrollTop = 0; this.xlivescroller.dom.scrollLeft = 0; this.ylivescroller.on("scroll", this.onYLiveScrollFn, this, { buffer : this.scrollDelay }); this.xlivescroller.on("scroll", this.onXLiveScrollFn, this, { buffer : this.scrollDelay }); this.uylivescroller.on("scroll", this.onUYLiveScrollFn, this, { buffer : this.scrollDelay }); this.lxlivescroller.on("scroll", this.onLXLiveScrollFn, this, { buffer : this.scrollDelay }); }, initSheetNavEvents : function() { if (this.ffirst) { this.ffirst.addClassOnOver("x-spreadsheet-footer-over"); this.ffirst.addClassOnClick("x-spreadsheet-footer-selected"); this.ffirst.un("click", this.onFFirstClickFn, this); this.ffirst.on("click", this.onFFirstClickFn, this); } if (this.fpre) { this.fpre.addClassOnOver("x-spreadsheet-footer-over"); this.fpre.addClassOnClick("x-spreadsheet-footer-selected"); this.fpre.un("click", this.onFPreClickFn, this); this.fpre.on("click", this.onFPreClickFn, this); } if (this.fnext) { this.fnext.addClassOnOver("x-spreadsheet-footer-over"); this.fnext.addClassOnClick("x-spreadsheet-footer-selected"); this.fnext.un("click", this.onFNextClickFn, this); this.fnext.on("click", this.onFNextClickFn, this); } if (this.flast) { this.flast.addClassOnOver("x-spreadsheet-footer-over"); this.flast.addClassOnClick("x-spreadsheet-footer-selected"); this.flast.un("click", this.onFLastClickFn, this); this.flast.on("click", this.onFLastClickFn, this); } if (this.fadd) { this.fadd.addClassOnOver("x-spreadsheet-footer-over"); this.fadd.addClassOnClick("x-spreadsheet-footer-selected"); this.fadd.un("click", this.onFAddClickFn, this); this.fadd.on("click", this.onFAddClickFn, this); } this.fcontainer.un("click", this.onFContainerClickFn, this); this.fcontainer.un("dblclick", this.onFContainerDblClickFn, this); this.fcontainer.un("contextmenu", this.onFContainerContextMenuFn, this); this.fcontainer.on("click", this.onFContainerClickFn, this); this.fcontainer.on("dblclick", this.onFContainerDblClickFn, this); this.fcontainer.on("contextmenu", this.onFContainerContextMenuFn, this); }, onBodyMouseDown : function(e) { var tgEl = e.getTarget(null, null, true); if (tgEl.hasClass("x-spreadsheet-filter")) { var xy = e.getXY(); var pos = this.ds.getPosFromXY(xy[0], xy[1]); this.showFilterMenu(pos, e); } else { var ds = this.ds, sm = this.sm; var isGroup = tgEl.hasClass("x-spreadsheet-group"); if (isGroup || tgEl.hasClass("x-spreadsheet-group-pin")) { var dir = tgEl.getAttribute("dirtype"), min = tgEl .getAttribute("min"), max = tgEl.getAttribute("max"); min = Number(min); max = Number(max); if (!isGroup) { tgEl = tgEl.parent(); } if ("col" == dir) { var colSetting = ds.data.colSetting; var groupCollapsed = colSetting[min].groupCollapsed; if (groupCollapsed) { for (var i = min; i <= max; i++) { var arr = [["groupCollapsed", false]]; if (i != min) { arr.push(["display", ""]); } ds.fireEvent("colattributechange", i, arr); } this.refreshRange(); ds.trace(feyaSoft.ss.lang.expand_col_group); sm.fireEvent("renderborder"); } else { for (var i = min; i <= max; i++) { var arr = [["groupCollapsed", true]]; if (i != min) { arr.push(["display", "none"]); } ds.fireEvent("colattributechange", i, arr); } ds.trace(feyaSoft.ss.lang.collapse_col_group); this.refreshRange(); sm.fireEvent("renderborder"); } } else { var rowSetting = ds.data.rowSetting; var groupCollapsed = rowSetting[min].groupCollapsed; if (groupCollapsed) { for (var i = min; i <= max; i++) { var arr = [["groupCollapsed", false]]; if (i != min) { arr.push(["display", ""]); } ds.fireEvent("rowattributechange", i, arr); } ds.trace(feyaSoft.ss.lang.expand_row_group); this.refreshRange(); sm.fireEvent("renderborder"); } else { for (var i = min; i <= max; i++) { var arr = [["groupCollapsed", true]]; if (i != min) { arr.push(["display", "none"]); } ds.fireEvent("rowattributechange", i, arr); } ds.trace(feyaSoft.ss.lang.collapse_row_group); this.refreshRange(); sm.fireEvent("renderborder"); } } } else { this.sm.onBodyMouseDownFn(e); this.hotkey.mouseKeydown(e); } } }, onFootresizerMouseDownFn : function(e) { e.stopEvent(); this.footResizing = true; }, onFootresizerMouseUpFn : function(e) { delete this.footResizing; }, onFootresizerMouseMoveFn : function(e) { if (this.footResizing) { var footerToolWidth = this.sftool.getWidth(); var left = e.getXY()[0] - this.fcontainer.getLeft(); if (left < 0) { var sw = this.sftool.getWidth() + left; if (sw < 1) { sw = 1; } this.sftool.setWidth(sw); footerToolWidth = this.sftool.getWidth(); left = 0; } else if (footerToolWidth < this.footerToolWidth) { var sw = footerToolWidth + left; if (sw > this.footerToolWidth) { left = sw - this.footerToolWidth; sw = this.footerToolWidth; } else { left = 0; } this.sftool.setWidth(sw); footerToolWidth = this.sftool.getWidth(); } if (this.isColSplit()) { var width = this.availWidth - this.xlivescroller.getWidth() - this.SPLIT_BAR_SIZE; var ml = width - footerToolWidth - this.SPLIT_BAR_SIZE; if (left > ml - 1) { left = ml - 1; } var w = left + this.SPLIT_BAR_SIZE; this.fcontainer.setWidth(w); this.footerWidth = w + footerToolWidth; var fw = width - this.footerWidth; this.lxlivescroller.setWidth(fw); this.sysLeftXFakebody(this.freezeRange, this.showRange); } else { var ml = this.availWidth - footerToolWidth - this.SPLIT_BAR_SIZE * 2; if (left > ml) { left = ml; } var w = left + this.SPLIT_BAR_SIZE; this.fcontainer.setWidth(w); this.footerWidth = w + footerToolWidth; var fw = this.availWidth - this.footerWidth; this.xlivescroller.setWidth(fw - this.SPLIT_BAR_SIZE); this.sysXFakebody(this.freezeRange, this.showRange); } } }, resetFooterResizer : function() { this.footresizer.un("mousedown", this.onFootresizerMouseDownFn, this); Ext.EventManager.un(document, "mouseup", this.onFootresizerMouseUpFn, this); Ext.EventManager.un(document, "mousemove", this.onFootresizerMouseMoveFn, this); }, initFooterResizer : function() { this.resetFooterResizer(); this.footresizer.on("mousedown", this.onFootresizerMouseDownFn, this); Ext.EventManager.on(document, "mouseup", this.onFootresizerMouseUpFn, this); Ext.EventManager.on(document, "mousemove", this.onFootresizerMouseMoveFn, this); }, initSheetDragZone : function() { if (this.sheetDragZone) { this.sheetDragZone.unreg(); } var proxy = new Ext.dd.StatusProxy({ dropNotAllowed : "x-dd-drop-ok" }); this.sheetDragZone = new Ext.dd.DragZone(this.fcontainer, { ddGroup : "x-spreadsheet-sheet", proxy : proxy, scroll : false, proxyOffsets : [-4, -9], spreadsheet : this, onInitDrag : function(x, y) { this.proxyTop = Ext.DomHelper.append(document.body, { cls : "col-move-top", html : " " }, true); this.proxyTop.hide = function() { this.setLeftTop(-100, -100); this.setStyle("visibility", "hidden"); }; var clone = this.dragData.ddel.cloneNode(true); this.proxy.update(clone); this.onStartDrag(x, y); return true; }, getDragData : function(e) { var target = e.getTarget(); var tgEl = Ext.get(target); if (tgEl .hasClass("x-spreadsheet-sheet-inactive-center") || tgEl .hasClass("x-spreadsheet-sheet-active-center")) { this.dragSheetIndex = this.spreadsheet .getIndexForSheet(tgEl.dom); var ddel = tgEl.dom.cloneNode(true); return { ddel : ddel }; } else { return false; } }, getRepairXY : function(e, data) { return null; }, onDrag : function(e) { var ss = this.spreadsheet; ss.dragingSheet = true; var xy = e.getXY(); var x = xy[0]; ss.scrollSheet(x); var pos = ss.getIndicatorPosFromX(x); var l = pos.l + this.proxyOffsets[0]; var t = pos.t + this.proxyOffsets[1]; this.dropSheetIndex = pos.index; this.proxyTop.setLeftTop(l, t); this.proxyTop.show(); }, endDrag : function(e) { var ss = this.spreadsheet; e.stopEvent(); this.proxyTop.hide(); ss.moveSheet(this.dragSheetIndex, this.dropSheetIndex); (function () { ss.dragingSheet = false; }).defer(1); } }); }, scrollSheet : function(x) { var l = this.fcontainer.getLeft(); var r = this.fcontainer.getRight(); if (x < l) { if ("none" == this.sline.dom.firstChild.style.display) { this.onFPreClickFn(); } } else if (x > r) { this.onFNextClickFn(); } }, getIndicatorPosFromX : function(x) { var sn = this.sline.dom.childNodes; var len = sn.length; var lstEl = Ext.get(sn[len - 2]); var l = lstEl.getRight(), t = lstEl.getTop(), index = Math.floor(len / 2) - 1; var cEl, lEl, rEl; for (var i = 0; i < len - 1; i++) { var td = sn[i]; if ("none" != td.style.display && ("x-spreadsheet-sheet-inactive-center" == td.className || "x-spreadsheet-sheet-active-center" == td.className)) { cEl = Ext.get(td); lEl = cEl.prev(); rEl = cEl.next(); var left = lEl.getRight(); var right = rEl.getRight(); if (x <= right) { index = Math.floor((i - 1) / 2); if (x > (right + left) / 2) { l = right; t = rEl.getTop(); index++; } else { l = left; t = lEl.getTop(); } break; } } } return { index : index, l : l, t : t }; }, onRenameSheetFn : function(item) { var bindSheet = item.parentMenu.bindSheet; this.sheetEditor.bindSheet = bindSheet; this.sheetEditor.startEdit(bindSheet.El, bindSheet.name); }, onInsertSheetFn : function(item) { this.onFAddClickFn(); }, onDeleteSheetFn : function(item) { Ext.Msg.show({ title : "Confirm", msg : "Are you sure you want to permanently delete this sheet?", buttons : Ext.Msg.YESNO, icon : Ext.MessageBox.QUESTION, fn : function(bid, text) { if ("yes" == bid) { var bindSheet = item.parentMenu.bindSheet; var ds = this.ds; this.chartManager.cleanCharts(); ds.deleteSheet(bindSheet.index, function() { this.chartManager.displayCharts( ds.activeSheet, ""); this.updateSheetStatus(); this.reloadUI(); }, this); } }, scope : this }); }, onCopySheetFn : function(item) { var ds = this.ds; var bindSheet = item.parentMenu.bindSheet; this.addSheetWin.popup({ title : "Copy " + bindSheet.name + " into a new sheet as", bindSheet : bindSheet }); }, initSheetMenu : function() { this.insertSheetItem = new Ext.menu.Item({ iconCls : "icon_insert_sheet", text : "Insert Sheet", handler : this.onInsertSheetFn, scope : this }); this.renameSheetItem = new Ext.menu.Item({ iconCls : "icon_rename_sheet", text : "Rename Sheet", handler : this.onRenameSheetFn, scope : this }); this.deleteSheetItem = new Ext.menu.Item({ iconCls : "icon_delete_sheet", text : "Delete Sheet", handler : this.onDeleteSheetFn, scope : this }); this.copySheetItem = new Ext.menu.Item({ iconCls : "icon_copy_sheet", text : "Copy Sheet", handler : this.onCopySheetFn, scope : this }); this.smenu = new Ext.menu.Menu({ items : [this.insertSheetItem, this.renameSheetItem, this.deleteSheetItem, this.copySheetItem] }); }, onFContainerContextMenuFn : function(e) { e.stopEvent(); var ds = this.ds; var target = e.getTarget(); var tgEl = Ext.get(target); if (tgEl.hasClass("x-spreadsheet-sheet-inactive-center") || tgEl.hasClass("x-spreadsheet-sheet-active-center")) { var index = this.getIndexForSheet(tgEl.dom); var sname = ds.sheets[index].name; this.smenu.bindSheet = { index : index, name : sname, El : tgEl }; if (1 < ds.sheets.length) { this.deleteSheetItem.show(); } else { this.deleteSheetItem.hide(); } this.smenu.show(target, "bl-tl"); } }, onFContainerDblClickFn : function(e) { var ds = this.ds; var target = e.getTarget(); var tgEl = Ext.get(target); if (tgEl.hasClass("x-spreadsheet-sheet-active-center")) { var index = this.getIndexForSheet(target); var sname = ds.sheets[index].name; this.sheetEditor.bindSheet = { index : index, name : sname, El : tgEl }; this.sheetEditor.startEdit(target, sname); } }, onFAddClickFn : function(e) { this.addSheetWin.popup(); }, onFFirstClickFn : function(e) { for (var i = 0; i < this.sline.dom.childNodes.length - 1; i++) { var td = this.sline.dom.childNodes[i]; td.style.display = ""; } }, onFPreClickFn : function(e) { var p = -1; for (var i = this.sline.dom.childNodes.length - 2; i >= 0; i--) { var td = this.sline.dom.childNodes[i]; if ("none" == td.style.display) { td.style.display = ""; if (-1 == p) { p = Math.floor(i / 2) * 2; } if (i == p) { break; } } } }, onFNextClickFn : function(e) { var fw = this.fcontainer.getWidth(); var rw = this.sline.getWidth(); var w = fw - rw; if (0 > w) { var p = -1; for (var i = 0, len = this.sline.dom.childNodes.length - 4; i < len; i++) { var td = this.sline.dom.childNodes[i]; if ("none" != td.style.display) { td.style.display = "none"; if (-1 == p) { p = Math.floor(i / 2 + 1) * 2 - 1; } if (i == p) { break; } } } } }, onFLastClickFn : function(e) { this.locateSheetPosition(); }, onFContainerClickFn : function(e) { if (!this.dragingSheet) { var target = e.getTarget(); var tgEl = Ext.get(target); if (tgEl.hasClass("x-spreadsheet-sheet-inactive-center")) { var index = this.getIndexForSheet(target); this.changeSheet(index, tgEl); } } }, getIndexForSheet : function(target) { var pn = target.parentNode; var index = 0; for (var i = 0, len = pn.childNodes.length; i < len; i++) { var cn = pn.childNodes[i]; if (cn == target) { break; } if ("x-spreadsheet-sheet-active-center" == cn.className || "x-spreadsheet-sheet-inactive-center" == cn.className) { index++; } } return index; }, turnOffActive : function() { var els = Ext.DomQuery.select( "td[class=x-spreadsheet-sheet-active-center]", this.fcontainer.dom); for (var i = 0, len = els.length; i < len; i++) { var el = els[i]; el.className = "x-spreadsheet-sheet-inactive-center"; var txt = el.innerHTML; el.innerHTML = txt; } els = Ext.DomQuery.select("div[class=x-spreadsheet-sheet-active-left]", this.fcontainer.dom); for (var i = 0, len = els.length; i < len; i++) { var el = els[i]; el.className = "x-spreadsheet-sheet-inactive-left"; } els = Ext.DomQuery.select( "div[class=x-spreadsheet-sheet-active-right]", this.fcontainer.dom); for (var i = 0, len = els.length; i < len; i++) { var el = els[i]; el.className = "x-spreadsheet-sheet-inactive-right-inactive"; } els = Ext.DomQuery.select( "div[class=x-spreadsheet-sheet-active-right-none]", this.fcontainer.dom); for (var i = 0, len = els.length; i < len; i++) { var el = els[i]; el.className = "x-spreadsheet-sheet-inactive-right"; } els = Ext.DomQuery.select( "div[class=x-spreadsheet-sheet-inactive-right-active]", this.fcontainer.dom); for (var i = 0, len = els.length; i < len; i++) { var el = els[i]; el.className = "x-spreadsheet-sheet-inactive-right-inactive"; } }, locateSheetPosition : function(max) { if (0 != max) { max = max || this.sline.dom.childNodes.length; } var fw = this.fcontainer.getWidth(); var rw = this.sline.getWidth(); var w = fw - rw; if (0 > w) { w = -1 * w; var a = 0; for (var i = 0; i < max; i++) { var td = this.sline.dom.childNodes[i]; a += Ext.get(td).getWidth(); td.style.display = "none"; if (a > w) { break; } } } }, changeSheetStatus : function(index, tgEl) { this.turnOffActive(); if (!tgEl) { tgEl = Ext.get(this.sline.dom.childNodes[1 + 2 * index]); } tgEl.dom.className = "x-spreadsheet-sheet-active-center"; var txt = tgEl.dom.innerHTML; tgEl.dom.innerHTML = txt; var rEl = tgEl.next(); var r = rEl.dom.firstChild; var name = r.className; if ("x-spreadsheet-sheet-inactive-right-inactive" == name) { r.className = "x-spreadsheet-sheet-active-right"; } else if ("x-spreadsheet-sheet-inactive-right" == name) { r.className = "x-spreadsheet-sheet-active-right-none"; } var lEl = tgEl.prev(); var l = lEl.dom.firstChild; name = l.className; if ("x-spreadsheet-sheet-inactive-right-inactive" == name) { l.className = "x-spreadsheet-sheet-inactive-right-active"; } else if ("x-spreadsheet-sheet-inactive-left" == name) { l.className = "x-spreadsheet-sheet-active-left"; } this.locateSheetPosition(2 * index); }, changeSheet : function(index, tgEl) { var ds = this.ds, sm = this.sm; var oldIndex = ds.activeSheet; this.resetCutStatus(); this.chartManager.displayCharts(ds.activeSheet, "none"); this.maskUI(feyaSoft.ss.lang.loadSheet); (function() { var fr = this.copyRange(this.freezeRange); ds.changeSheet(index, function() { this.chartManager.displayCharts(ds.activeSheet, ""); this.reloadUI(fr); this.processCrossSheetEditing(oldIndex, index); this.checkEditorForCrossEditing(oldIndex, index); this.unmaskUI(); }, this); }).defer(10, this); }, checkEditorForCrossEditing : function(oldSheetIndex, sheetIndex) { var sm = this.sm, ds = this.ds; var textCover = sm.getTextCover(); var textCoverEl = Ext.get(textCover); if (textCoverEl.isVisible() && Ext.ss.common.Mask.isFormula(textCover.value)) { var pos = textCover.pos; var focusEl = textCoverEl.parent(), pnode = focusEl.parent(); var labelEl = pnode.child(".x-spreadsheet-focus-label"); if (pos.sheetIndex != ds.activeSheet) { var sheetName = ds.sheets[pos.sheetIndex].name; var posStr = sheetName + "!" + ds.getLetter(pos.y) + pos.x; if (!labelEl) { labelEl = Ext.DomHelper.append(pnode, "
", true); } labelEl.update(posStr); labelEl.setLeft(focusEl.getLeft() - pnode.getLeft()); labelEl.setTop(focusEl.getTop() - pnode.getTop() - labelEl.getHeight()); } else if (labelEl) { Ext.removeNode(labelEl.dom); } } }, initEvents : function() { Ext.ss.SpreadSheet.superclass.initEvents.call(this); if (this.loadMask) { this.loadMask = new Ext.LoadMask(this.getEl(), Ext.apply({ msg : "Loading data and rendering UI..." }, this.loadMask)); } }, calculateRange : function(availWidth, availHeight, flag) { this.availWidth = availWidth; this.availHeight = availHeight; this.adjustWidth = this.ylivescroller.getWidth() + this.scroller.getWidth(); this.adjustHeight = this.scroller.getHeight() + this.xlivescroller.getHeight(); var fr = this.freezeRange, sr = this.showRange; var rt, rowNum, colNum; if (this.splitFlag) { var freezeWidth = this.lhct.getWidth(), freezeHeight = this.lhct .getHeight(); rt = this.ds.calculateShowRange(fr.row.start, fr.col.start, freezeWidth, freezeHeight); rowNum = rt.rowNum; colNum = rt.colNum; if (fr.row.len !== rowNum) { fr.row.len = rowNum; fr.row.end = fr.row.start + rowNum - 1; flag = true; } if (fr.col.len !== colNum) { fr.col.len = colNum; fr.col.end = fr.col.start + colNum - 1; flag = true; } } rt = this.ds.calculateShowRange(sr.row.start, sr.col.start, this.adjustWidth, this.adjustHeight); rowNum = rt.rowNum; colNum = rt.colNum; if (sr.row.len !== rowNum) { sr.row.len = rowNum; sr.row.end = sr.row.start + rowNum - 1; flag = true; } if (sr.col.len !== colNum) { sr.col.len = colNum; sr.col.end = sr.col.start + colNum - 1; flag = true; } return flag; }, adjustShowRange : function(availWidth, availHeight, flag, fixed) { flag = this.calculateRange(availWidth, availHeight, flag); if (true == flag) { this.renderRange(this.freezeRange, this.showRange, true, fixed); } this.adjustLiveScroller(); }, onScrollUBottomFn : function(inc) { this.uyfakebody.setHeight(this.uyfakebody.getHeight() + (inc + 1) * this.yScrollOffset); this.uylivescroller.dom.scrollTop += inc * this.yScrollOffset; this.uLastPosy += inc; }, onScrollBottomFn : function(inc) { this.yfakebody.setHeight(this.yfakebody.getHeight() + (inc + 1) * this.yScrollOffset); this.ylivescroller.dom.scrollTop += inc * this.yScrollOffset; this.lastPosy += inc; }, onScrollLRightFn : function(inc) { this.lxfakebody.setWidth(this.lxfakebody.getWidth() + (inc + 1) * this.xScrollOffset); this.lxlivescroller.dom.scrollLeft += inc * this.xScrollOffset; this.lLastPosx += inc; }, onScrollRightFn : function(inc) { this.xfakebody.setWidth(this.xfakebody.getWidth() + (inc + 2) * this.xScrollOffset); this.xlivescroller.dom.scrollLeft += inc * this.xScrollOffset; this.lastPosx += inc; }, onYLiveScrollFn : function(e) { e.stopEvent(); this.ylivescroller.un("scroll", this.onYLiveScrollFn, this, { buffer : this.scrollDelay }); var fr = this.freezeRange, sr = this.showRange; var sm = this.sm, ds = this.ds; var pos; if (Math.abs(this.ylivescroller.dom.scrollTop - this.lastScrollPosy) < this.yScrollOffset) { if (this.ylivescroller.dom.scrollTop < this.lastScrollPosy) { this.ylivescroller.dom.scrollTop = this.lastScrollPosy - this.yScrollOffset; } else if (this.ylivescroller.dom.scrollTop > this.lastScrollPosy || this.ylivescroller.dom.scrollTop == 0) { this.ylivescroller.dom.scrollTop = this.lastScrollPosy + this.yScrollOffset; } } pos = Math.floor(this.ylivescroller.dom.scrollTop / this.yScrollOffset); var fn = function() { var sIndex; if (this.splitFlag) { sIndex = ds.walkVisibleRow(1, pos); } else { sIndex = ds.walkVisibleRow(fr.row.end + 1, pos); } this.renderRows(sIndex); }; var span = this.ylivescroller.dom.scrollTop + this.ylivescroller.getHeight(); var xh = this.yfakebody.getHeight(); var renderFlag = false; if (true == this.autoRowSelected) { fn.call(this); sm.fireEvent("updateselected", this, "row"); this.autoRowSelected = false; renderFlag = true; } else { if (sm.downFlag) { if (xh - span <= this.yScrollOffset) { this.onScrollBottomFn(this.rowInc); pos += this.rowInc; } } fn.call(this); } this.ylivescroller.dom.scrollTop = pos * this.yScrollOffset; this.fireEvent("yscrolling", this.ylivescroller.dom.scrollTop - this.lastScrollPosy); this.lastScrollPosy = this.ylivescroller.dom.scrollTop; if (renderFlag) { sm.fireEvent("renderborder"); } this.ylivescroller.on("scroll", this.onYLiveScrollFn, this, { buffer : this.scrollDelay }); }, onUYLiveScrollFn : function(e) { e.stopEvent(); this.uylivescroller.un("scroll", this.onUYLiveScrollFn, this, { buffer : this.scrollDelay }); var fr = this.freezeRange, sr = this.showRange; var sm = this.sm, ds = this.ds; var pos; if (Math.abs(this.uylivescroller.dom.scrollTop - this.uLastScrollPosy) < this.yScrollOffset) { if (this.uylivescroller.dom.scrollTop < this.uLastScrollPosy) { this.uylivescroller.dom.scrollTop = this.uLastScrollPosy - this.yScrollOffset; } else if (this.uylivescroller.dom.scrollTop > this.uLastScrollPosy || this.uylivescroller.dom.scrollTop == 0) { this.uylivescroller.dom.scrollTop = this.uLastScrollPosy + this.yScrollOffset; } } pos = Math .floor(this.uylivescroller.dom.scrollTop / this.yScrollOffset); var fn = function() { var sIndex = ds.walkVisibleRow(1, pos); this.renderURows(sIndex); }; var span = this.uylivescroller.dom.scrollTop + this.uylivescroller.getHeight(); var xh = this.uyfakebody.getHeight(); var renderFlag = false; if (true == this.autoRowSelected) { fn.call(this); sm.fireEvent("updateselected", this, "urow"); this.autoRowSelected = false; renderFlag = true; } else { if (sm.downFlag) { if (xh - span <= this.yScrollOffset) { this.onScrollUBottomFn(this.rowInc); pos += this.rowInc; } } fn.call(this); } this.uylivescroller.dom.scrollTop = pos * this.yScrollOffset; this.fireEvent("uyscrolling", this.uylivescroller.dom.scrollTop - this.uLastScrollPosy); this.uLastScrollPosy = this.uylivescroller.dom.scrollTop; if (renderFlag) { sm.fireEvent("renderborder"); } this.uylivescroller.on("scroll", this.onUYLiveScrollFn, this, { buffer : this.scrollDelay }); }, onLXLiveScrollFn : function(e) { e.stopEvent(); var fr = this.freezeRange; this.lxlivescroller.un("scroll", this.onLXLiveScrollFn, this, { buffer : this.scrollDelay }); var sm = this.sm, ds = this.ds; var pos; if (Math.abs(this.lxlivescroller.dom.scrollLeft - this.lLastScrollPosx) < this.xScrollOffset) { if (this.lxlivescroller.dom.scrollLeft < this.lLastScrollPosx) { this.lxlivescroller.dom.scrollLeft = this.lLastScrollPosx - this.xScrollOffset; } else if (this.lxlivescroller.dom.scrollLeft > this.lLastScrollPosx) { this.lxlivescroller.dom.scrollLeft = this.lLastScrollPosx + this.xScrollOffset; } } pos = Math.floor(this.lxlivescroller.dom.scrollLeft / this.xScrollOffset); var fn = function() { var sIndex = ds.walkVisibleCol(1, pos); this.renderLCols(sIndex); }; var span = this.lxlivescroller.dom.scrollLeft + this.lxlivescroller.getWidth(); var xw = this.lxfakebody.getWidth(); var renderFlag = false; if (true === this.autoColSelected) { fn.call(this); sm.fireEvent("updateselected", this, "lcol"); this.autoColSelected = false; renderFlag = true; } else { if (sm.downFlag) { if (xw - span <= this.xScrollOffset) { this.onScrollLRightFn(this.colInc); pos += this.colInc; } } fn.call(this); } this.lxlivescroller.dom.scrollLeft = pos * this.xScrollOffset; this.fireEvent("lxscrolling", this.lxlivescroller.dom.scrollLeft - this.lLastScrollPosx); this.lLastScrollPosx = this.lxlivescroller.dom.scrollLeft; if (renderFlag) { sm.fireEvent("renderborder"); } this.lxlivescroller.on("scroll", this.onLXLiveScrollFn, this, { buffer : this.scrollDelay }); }, onXLiveScrollFn : function(e) { var fr = this.freezeRange, sr = this.showRange; this.xlivescroller.un("scroll", this.onXLiveScrollFn, this, { buffer : this.scrollDelay }); var sm = this.sm, ds = this.ds; var pos; if (Math.abs(this.xlivescroller.dom.scrollLeft - this.lastScrollPosx) < this.xScrollOffset) { if (this.xlivescroller.dom.scrollLeft < this.lastScrollPosx) { this.xlivescroller.dom.scrollLeft = this.lastScrollPosx - this.xScrollOffset; } else if (this.xlivescroller.dom.scrollLeft > this.lastScrollPosx) { this.xlivescroller.dom.scrollLeft = this.lastScrollPosx + this.xScrollOffset; } } pos = Math .floor(this.xlivescroller.dom.scrollLeft / this.xScrollOffset); var fn = function() { var sIndex; if (this.splitFlag) { sIndex = ds.walkVisibleCol(1, pos); } else { sIndex = ds.walkVisibleCol(fr.col.end + 1, pos); } this.renderCols(sIndex); }; var span = this.xlivescroller.dom.scrollLeft + this.xlivescroller.getWidth(); var xw = this.xfakebody.getWidth(); var renderFlag = false; if (true === this.autoColSelected) { fn.call(this); sm.fireEvent("updateselected", this, "col"); this.autoColSelected = false; renderFlag = true; } else { if (sm.downFlag) { if (xw - span <= this.xScrollOffset) { this.onScrollRightFn(this.colInc); pos += this.colInc; } } fn.call(this); } this.xlivescroller.dom.scrollLeft = pos * this.xScrollOffset; this.fireEvent("xscrolling", this.xlivescroller.dom.scrollLeft - this.lastScrollPosx); this.lastScrollPosx = this.xlivescroller.dom.scrollLeft; if (renderFlag) { sm.fireEvent("renderborder"); } this.xlivescroller.on("scroll", this.onXLiveScrollFn, this, { buffer : this.scrollDelay }); }, onRemoveLeftHeaderColsFn : function(sp, start, end) { var headerChildren = this.slheader.dom.childNodes; var len = headerChildren.length; for (var j = start; j <= end; j++) { for (var i = 0; i < len; i++) { var row = headerChildren[i].firstChild.firstChild.firstChild; var children = row.childNodes; Ext.removeNode(children[start]); } } }, onRemoveHeaderColsFn : function(sp, start, end) { var headerChildren = this.sheader.dom.childNodes; var len = headerChildren.length; for (var j = start; j <= end; j++) { for (var i = 0; i < len; i++) { var row = headerChildren[i].firstChild.firstChild.firstChild; var children = row.childNodes; Ext.removeNode(children[start]); } } }, onRemoveLeftBodyColsFn : function(sp, start, end) { var bodyChildren = this.slbody.dom.childNodes; var len = bodyChildren.length; for (var j = start; j <= end; j++) { for (var i = 0; i < len; i++) { var row = bodyChildren[i].firstChild.firstChild.firstChild; var children = row.childNodes; Ext.removeNode(children[start]); } } }, onRemoveBodyColsFn : function(sp, start, end) { var bodyChildren = this.sbody.dom.childNodes; var len = bodyChildren.length; for (var j = start; j <= end; j++) { for (var i = 0; i < len; i++) { var row = bodyChildren[i].firstChild.firstChild.firstChild; var children = row.childNodes; Ext.removeNode(children[start]); } } }, removeCols : function(start, end, fillWidth) { var ds = this.ds; if (fillWidth) { var eIndex = this.showRange.col.end; end = eIndex; start = end + 1; var cw = w = ds.getColWidth(eIndex), dw = 0; while (cw <= fillWidth) { if (0 !== w) { start--; } eIndex--; dw = cw; w = ds.getColWidth(eIndex); cw += w; } if (start <= end) { var len = this.sheader.dom.firstChild.firstChild.firstChild.firstChild.childNodes.length; start = len - (end - start) - 1; end = len - 1; this.fireEvent("removeHeaderCols", this, start, end); this.fireEvent("removeBodyCols", this, start, end); } return { dw : dw, colEnd : eIndex }; } else { var base = this.showRange.col.start; this.fireEvent("removeHeaderCols", this, start, end); this.fireEvent("removeBodyCols", this, start, end); var span = end - start; start += base; return { dw : ds.getWidth(start, ds.walkVisibleCol(start, span)) }; } }, removeLCols : function(start, end, fillWidth) { var ds = this.ds; if (fillWidth) { var eIndex = this.freezeRange.col.end; end = eIndex; start = end + 1; var cw = w = ds.getColWidth(eIndex), dw = 0; while (cw <= fillWidth) { if (0 !== w) { start--; } eIndex--; dw = cw; w = ds.getColWidth(eIndex); cw += w; } if (start <= end) { var len = this.slheader.dom.firstChild.firstChild.firstChild.firstChild.childNodes.length; start = len - (end - start + 1); end = len - 1; this.fireEvent("removeLeftHeaderCols", this, start, end); this.fireEvent("removeLeftBodyCols", this, start, end); } return { dw : dw, colEnd : eIndex }; } else { var base = this.freezeRange.col.start - 1; this.fireEvent("removeLeftHeaderCols", this, start, end); this.fireEvent("removeLeftBodyCols", this, start, end); var span = end - start; start += base; return { dw : ds.getWidth(start, ds.walkVisibleCol(start, span)) }; } }, removeURows : function(start, end, fillHeight) { var ds = this.ds; if (fillHeight) { var eIndex = this.freezeRange.row.end; end = eIndex; start = end + 1; var rh = h = ds.getRowHeight(eIndex), dh = 0; while (rh <= fillHeight) { if (0 !== h) { start--; } eIndex--; dh = rh; h = ds.getRowHeight(eIndex); rh += h; } if (start <= end) { var len = this.sheader.dom.childNodes.length; start = len - (end - start) - 1; end = len - 1; this.fireEvent("removeLeftHeaderRows", this, start, end); this.fireEvent("removeHeaderRows", this, start, end); } return { dh : dh, rowEnd : eIndex }; } else { var base = this.freezeRange.row.start - 1; this.fireEvent("removeLeftHeaderRows", this, start, end); this.fireEvent("removeHeaderRows", this, start, end); var span = end - start; start += base; return { dh : ds.getHeight(start, ds.walkVisibleRow(start, span)) }; } }, removeRows : function(start, end, fillHeight) { var ds = this.ds; if (fillHeight) { var eIndex = this.showRange.row.end; end = eIndex; start = end + 1; var rh = h = ds.getRowHeight(eIndex), dh = 0; while (rh <= fillHeight) { if (0 !== h) { start--; } eIndex--; dh = rh; h = ds.getRowHeight(eIndex); rh += h; } if (start <= end) { var len = this.sbody.dom.childNodes.length; start = len - (end - start + 1); end = len - 1; this.fireEvent("removeLeftBodyRows", this, start, end); this.fireEvent("removeBodyRows", this, start, end); } return { dh : dh, rowEnd : eIndex }; } else { var base = this.showRange.row.start; this.fireEvent("removeLeftBodyRows", this, start, end); this.fireEvent("removeBodyRows", this, start, end); var span = end - start; start += base; return { dh : ds.getHeight(start, ds.walkVisibleRow(start, span)) }; } }, onRemoveLeftHeaderRowsFn : function(sp, start, end) { var children = this.slheader.dom.childNodes; for (var i = start; i <= end; i++) { Ext.removeNode(children[start]); } }, onRemoveLeftBodyRowsFn : function(sp, start, end) { var children = this.slbody.dom.childNodes; for (var i = start; i <= end; i++) { Ext.removeNode(children[start]); } }, onRemoveHeaderRowsFn : function(sp, start, end) { var children = this.sheader.dom.childNodes; for (var i = start; i <= end; i++) { Ext.removeNode(children[start]); } }, onRemoveBodyRowsFn : function(sp, start, end) { var children = this.sbody.dom.childNodes; for (var i = start; i <= end; i++) { Ext.removeNode(children[start]); } }, renderURows : function(start) { var ds = this.ds; var fr = this.freezeRange; var spill = ds.getVisibleRowOffset(start, fr.row.start); if (0 === spill) { return; } var append = spill > 0; spill = Math.abs(spill); var fh = this.lhscroller.getHeight(); if (spill >= fr.row.len) { var lists = this.generateURows(start, null, fh); this.slh = lists.rh; this.fireEvent("updateLeftHeader", this, lists.laddlist); this.fireEvent("updateHeader", this, lists.addlist); fr.row.end = lists.rowEnd; } else { if (append) { var rt = this.removeURows(1, spill); this.slh -= rt.dh; fh -= this.slh; if (0 >= fh && 1 == sr.row.len - spill) { fh = 1; } if (0 < fh) { var lists = this.generateRows(fr.row.end + 1, null, fh); this.fireEvent("updateEndLeftHeader", this, lists.laddlist); this.fireEvent("updateEndHeader", this, lists.addlist); this.slh += lists.rh; fr.row.end = lists.rowEnd; } } else { var lists = this.generateRows(start, fr.row.start - 1); this.fireEvent("updateBeforeLeftHeader", this, lists.laddlist); this.fireEvent("updateBeforeHeader", this, lists.addlist); this.slh += lists.rh; fh = this.slh - fh; if (0 < fh) { var rt = this.removeURows(null, null, fh); this.slh -= rt.dh; fr.row.end = rt.rowEnd; if (fr.row.end == start) { var lists = this.generateRows(fr.row.end + 1, fr.row.end + 1); this.fireEvent("updateEndLeftHeader", this, lists.laddlist); this.fireEvent("updateEndHeader", this, lists.addlist); this.slh += lists.rh; fr.row.end = lists.rowEnd; } } } } fr.row.start = start; fr.row.len = fr.row.end - fr.row.start + 1; if (fr.row.end >= this.rowNum) { this.rowNum = fr.row.end + 1; } }, renderRows : function(start) { var ds = this.ds; var sr = this.showRange; var spill = ds.getVisibleRowOffset(start, sr.row.start); if (0 === spill) { return; } var append = spill > 0; spill = Math.abs(spill); var fh = this.scroller.getHeight(); if (spill >= sr.row.len) { var lists = this.generateRows(start, null, fh); this.sh = lists.rh; this.fireEvent("updateLeftBody", this, lists.laddlist); this.fireEvent("updateBody", this, lists.addlist); sr.row.end = lists.rowEnd; } else { if (append) { var rt = this.removeRows(0, spill - 1); this.sh -= rt.dh; fh -= this.sh; if (0 >= fh && 1 == sr.row.len - spill) { fh = 1; } if (0 < fh) { var lists = this.generateRows(sr.row.end + 1, null, fh); this.fireEvent("updateEndLeftBody", this, lists.laddlist); this.fireEvent("updateEndBody", this, lists.addlist); this.sh += lists.rh; sr.row.end = lists.rowEnd; } } else { var lists = this.generateRows(start, sr.row.start - 1); this.fireEvent("updateBeforeLeftBody", this, lists.laddlist); this.fireEvent("updateBeforeBody", this, lists.addlist); this.sh += lists.rh; fh = this.sh - fh; if (0 < fh) { var rt = this.removeRows(null, null, fh); this.sh -= rt.dh; sr.row.end = rt.rowEnd; if (sr.row.end == start) { var lists = this.generateRows(sr.row.end + 1, sr.row.end + 1); this.fireEvent("updateEndLeftBody", this, lists.laddlist); this.fireEvent("updateEndBody", this, lists.addlist); this.sh += lists.rh; sr.row.end = lists.rowEnd; } } } } sr.row.start = start; sr.row.len = sr.row.end - sr.row.start + 1; if (sr.row.end >= this.rowNum) { this.rowNum = sr.row.end + 1; } }, renderLCols : function(start) { var ds = this.ds; var fr = this.freezeRange; var spill = ds.getVisibleColOffset(start, fr.col.start); if (0 === spill) { return; } var append = spill > 0; spill = Math.abs(spill); var fw = this.lscroller.getWidth(); if (spill >= fr.col.len || Ext.isIE && spill != 0) { var lists = this.generateLCols(start, null, fw); this.slw = lists.rw; this.fireEvent("updateLeftBody", this, lists.addlist); this.fireEvent("updateLeftHeader", this, lists.haddlist); fr.col.end = lists.colEnd; } else { if (append) { var rt = this.removeLCols(1, spill); this.slw -= rt.dw; fw -= this.slw; if (0 >= fw && 1 == fr.col.len - spill) { fw = 1; } if (0 < fw) { var lists = this.generateTdCols(fr.col.end + 1, null, fw); this.fireEvent("updateEndLeftHeaderCol", this, lists.haddlist); this.fireEvent("updateEndLeftBodyCol", this, lists.addlist); this.slw += lists.rw; fr.col.end = lists.colEnd; } } else { var lists = this.generateTdCols(start, fr.col.start - 1); this.fireEvent("updateBeforeLeftHeaderCol", this, lists.haddlist); this.fireEvent("updateBeforeLeftBodyCol", this, lists.addlist); this.slw += lists.rw; fw = this.slw - fw; if (0 < fw) { var rt = this.removeLCols(null, null, fw); this.slw -= rt.dw; fr.col.end = rt.colEnd; if (fr.row.end == start) { var lists = this.generateTdCols(fr.col.end + 1, fr.col.end + 1); this.fireEvent("updateEndLeftHeaderCol", this, lists.haddlist); this.fireEvent("updateEndLeftBodyCol", this, lists.addlist); this.slw += lists.rw; fr.col.end = lists.colEnd; } } } } fr.col.start = start; fr.col.len = fr.col.end - fr.col.start + 1; if (fr.col.end >= this.colNum) { this.colNum = fr.col.end + 1; } }, renderCols : function(start) { var ds = this.ds; var sr = this.showRange; var spill = ds.getVisibleColOffset(start, sr.col.start); if (0 === spill) { return; } var append = spill > 0; spill = Math.abs(spill); var fw = this.scroller.getWidth(); if (spill >= sr.col.len || Ext.isIE && spill != 0) { var lists = this.generateCols(start, null, fw); this.sw = lists.rw; this.fireEvent("updateBody", this, lists.addlist); this.fireEvent("updateHeader", this, lists.haddlist); sr.col.end = lists.colEnd; } else { if (append) { var rt = this.removeCols(0, spill - 1); this.sw -= rt.dw; fw -= this.sw; if (0 >= fw && 1 == sr.col.len - spill) { fw = 1; } if (0 < fw) { var lists = this.generateTdCols(sr.col.end + 1, null, fw); this.fireEvent("updateEndHeaderCol", this, lists.haddlist); this.fireEvent("updateEndBodyCol", this, lists.addlist); this.sw += lists.rw; sr.col.end = lists.colEnd; } } else { var lists = this.generateTdCols(start, sr.col.start - 1); this.fireEvent("updateBeforeHeaderCol", this, lists.haddlist); this.fireEvent("updateBeforeBodyCol", this, lists.addlist); this.sw += lists.rw; fw = this.sw - fw; if (0 < fw) { var rt = this.removeCols(null, null, fw); this.sw -= rt.dw; sr.col.end = rt.colEnd; if (sr.row.end == start) { var lists = this.generateTdCols(sr.col.end + 1, sr.col.end + 1); this.fireEvent("updateEndHeaderCol", this, lists.haddlist); this.fireEvent("updateEndBodyCol", this, lists.addlist); this.sw += lists.rw; sr.col.end = lists.colEnd; } } } } sr.col.start = start; sr.col.len = sr.col.end - sr.col.start + 1; if (sr.col.end >= this.colNum) { this.colNum = sr.col.end + 1; } }, onUpdateLeftBodyFn : function(sp, html) { this.slbody.update(html); }, onUpdateHeaderFn : function(sp, html) { this.sheader.update(html); }, onUpdateLeftHeaderFn : function(sp, html) { this.slheader.update(html); }, onUpdateBodyFn : function(sp, html) { this.sbody.update(html); }, onUpdateEndLeftBodyFn : function(sp, html) { Ext.DomHelper.insertHtml("beforeEnd", this.slbody.dom, html); }, onUpdateEndBodyFn : function(sp, html) { Ext.DomHelper.insertHtml("beforeEnd", this.sbody.dom, html); }, onUpdateBeforeLeftBodyFn : function(sp, html) { Ext.DomHelper.insertHtml("beforeBegin", this.slbody.dom.firstChild, html); }, onUpdateBeforeBodyFn : function(sp, html) { Ext.DomHelper .insertHtml("beforeBegin", this.sbody.dom.firstChild, html); }, onUpdateBeforeHeaderFn : function(sp, html) { Ext.DomHelper.insertHtml("beforeBegin", this.sheader.dom.childNodes[1], html); }, onUpdateEndHeaderFn : function(sp, html) { Ext.DomHelper.insertHtml("beforeEnd", this.sheader.dom, html); }, onUpdateBeforeLeftHeaderFn : function(sp, html) { Ext.DomHelper.insertHtml("beforeBegin", this.slheader.dom.childNodes[1], html); }, onUpdateEndLeftHeaderFn : function(sp, html) { Ext.DomHelper.insertHtml("beforeEnd", this.slheader.dom, html); }, onUpdateEndHeaderColFn : function(sp, list) { var headerChildren = this.sheader.dom.childNodes; for (var i = 0, len = list.length; i < len; i++) { var trEl = headerChildren[i].firstChild.firstChild.firstChild; if (trEl) { if (Ext.isIE) { var td = trEl.insertCell(); td.innerHTML = "
SJ
"; } else if (trEl.insertAdjacentHTML) { trEl.insertAdjacentHTML("beforeEnd", list[i]); } } else { Ext.DomHelper.insertHtml("beforeEnd", trEl, list[i]); } } }, onUpdateEndLeftHeaderColFn : function(sp, list) { var headerChildren = this.slheader.dom.childNodes; for (var i = 0, len = list.length; i < len; i++) { var trEl = headerChildren[i].firstChild.firstChild.firstChild; if (trEl) { if (Ext.isIE) { var fn = function(td, attr) { td.className = attr.replace(/class="(.*)"/, "$1"); }; this.setTRHtmlForIE(trEl, list[i], -1, fn); } else if (trEl.insertAdjacentHTML) { trEl.insertAdjacentHTML("beforeEnd", list[i]); } else { Ext.DomHelper.insertHtml("beforeEnd", trEl, list[i]); } } } }, onUpdateEndBodyColFn : function(sp, list) { var bodyChildren = this.sbody.dom.childNodes; for (var i = 0, len = list.length; i < len; i++) { var trEl = bodyChildren[i].firstChild.firstChild.firstChild; if (trEl) { if (trEl.insertAdjacentHTML) { if (Ext.isIE) { var td = trEl.insertCell(); td.innerHTML = "
"; } else { trEl.insertAdjacentHTML("beforeEnd", list[i]); } } else { Ext.DomHelper.insertHtml("beforeEnd", trEl, list[i]); } } } }, onUpdateEndLeftBodyColFn : function(sp, list) { var bodyChildren = this.slbody.dom.childNodes; for (var i = 0, len = list.length; i < len; i++) { var trEl = bodyChildren[i].firstChild.firstChild.firstChild; if (trEl) { if (Ext.isIE) { var fn = function(td, attr) { td.className = attr.replace(/class="(.*)"/, "$1"); }; this.setTRHtmlForIE(trEl, list[i], -1, fn); } else if (trEl.insertAdjacentHTML) { trEl.insertAdjacentHTML("beforeEnd", list[i]); } else { Ext.DomHelper.insertHtml("beforeEnd", trEl, list[i]); } } } }, onUpdateBeforeHeaderColFn : function(sp, list) { var headerChildren = this.sheader.dom.childNodes; for (var i = 0, len = list.length; i < len; i++) { var trEl = headerChildren[i].firstChild.firstChild.firstChild; if (trEl) { var td = trEl.firstChild; if (Ext.isIE) { var tr = td.parentNode; var cellobj = tr.insertCell(td.cellIndex); cellobj.innerHTML = "
AC
"; } else if (td.insertAdjacentHTML) { td.insertAdjacentHTML("beforeBegin", list[i]); } } else { Ext.DomHelper.insertHtml("beforeBegin", td, list[i]); } } }, onUpdateBeforeLeftHeaderColFn : function(sp, list) { var headerChildren = this.slheader.dom.childNodes; for (var i = 0, len = list.length; i < len; i++) { var trEl = headerChildren[i].firstChild.firstChild.firstChild; if (trEl) { var td = trEl.childNodes[1]; if (Ext.isIE) { var fn = function(td, attr) { td.className = attr.replace(/class="(.*)"/, "$1"); }; this.setTRHtmlForIE(trEl, list[i], td.cellIndex, fn); } else if (td.insertAdjacentHTML) { td.insertAdjacentHTML("beforeBegin", list[i]); } else { Ext.DomHelper.insertHtml("beforeBegin", td, list[i]); } } } }, onUpdateBeforeBodyColFn : function(sp, list) { var bodyChildren = this.sbody.dom.childNodes; for (var i = 0, len = list.length; i < len; i++) { var trEl = bodyChildren[i].firstChild.firstChild.firstChild; if (trEl) { var td = trEl.firstChild; if (Ext.isIE) { var fn = function(td, attr) { td.className = attr.replace(/class="(.*)"/, "$1"); }; this.setTRHtmlForIE(trEl, list[i], td.cellIndex, fn); } else if (td.insertAdjacentHTML) { td.insertAdjacentHTML("beforeBegin", list[i]); } else { Ext.DomHelper.insertHtml("beforeBegin", td, list[i]); } } } }, onUpdateBeforeLeftBodyColFn : function(sp, list) { var bodyChildren = this.slbody.dom.childNodes; for (var i = 0, len = list.length; i < len; i++) { var trEl = bodyChildren[i].firstChild.firstChild.firstChild; if (trEl) { var td = trEl.childNodes[1]; if (Ext.isIE) { var fn = function(td, attr) { td.className = attr.replace(/class="(.*)"/, "$1"); }; this.setTRHtmlForIE(trEl, list[i], td.cellIndex, fn); } else if (td.insertAdjacentHTML) { td.insertAdjacentHTML("beforeBegin", list[i]); } else { Ext.DomHelper.insertHtml("beforeBegin", td, list[i]); } } } }, onMouseWheelFn : function(e) { e.stopEvent(); var sm = this.sm; var d = e.getWheelDelta(); if (0 > d) { d = -1; } else { d = 1; } if (this.splitFlag && ("left-top" == sm.posFlag || "top" == sm.posFlag)) { this.scrollingURow(d); } else { this.scrollingRow(d); } }, scrollingURow : function(d, rowInc) { rowInc = rowInc || this.rowInc; var span = this.uylivescroller.dom.scrollTop + this.uylivescroller.getHeight(); var xh = this.uyfakebody.getHeight(); if (span + 1 >= xh && 0 > d) { this.onScrollUBottomFn(rowInc); } else { this.uylivescroller.dom.scrollTop += -d * rowInc * this.yScrollOffset; } }, scrollingRow : function(d, rowInc) { rowInc = rowInc || this.rowInc; var span = this.ylivescroller.dom.scrollTop + this.ylivescroller.getHeight(); var xh = this.yfakebody.getHeight(); if (span + 1 >= xh && 0 > d) { this.onScrollBottomFn(rowInc); } else { this.ylivescroller.dom.scrollTop += -d * rowInc * this.yScrollOffset; } }, scrollingLCol : function(d, colInc) { colInc = colInc || this.colInc; var span = this.lxlivescroller.dom.scrollLeft + this.lxlivescroller.getWidth(); var xw = this.lxfakebody.getWidth(); if (span + 1 >= xw && 0 > d) { this.onScrollLRightFn(colInc); } else { this.lxlivescroller.dom.scrollLeft += -d * colInc * this.xScrollOffset; } }, scrollingCol : function(d, colInc) { colInc = colInc || this.colInc; var span = this.xlivescroller.dom.scrollLeft + this.xlivescroller.getWidth(); var xw = this.xfakebody.getWidth(); if (span + 1 >= xw && 0 > d) { this.onScrollRightFn(colInc); } else { this.xlivescroller.dom.scrollLeft += -d * colInc * this.xScrollOffset; } }, scroll2Pos : function(x, y, offset) { var sr = this.showRange; var xoff = yoff = 0; if (x < sr.row.start) { xoff = x - sr.row.start; } else if (x > sr.row.end) { xoff = x - sr.row.end; } if (y < sr.col.start) { yoff = y - sr.col.start; } else if (y > sr.col.end) { yoff = y - sr.col.end; } if (yoff) { if (0 > yoff) { yoff -= offset[1]; } else { yoff += offset[1]; } this.scrollingCol(-yoff, 1); } if (xoff) { if (0 > xoff) { xoff -= offset[0]; } else { xoff += offset[0]; } this.scrollingRow(-xoff, 1); } }, xResizingRow : function(x, h, onlyOne, notRefresh, autoHeight) { var ds = this.ds; var rh = this.ds.getRowHeight(x); var offset = h - rh; h = h - this.ypaddingOffset; var sm = this.sm; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x; if (minx <= x && x <= maxx && !onlyOne) { for (var j = minx; j <= maxx; j++) { this.fireEvent("updatecss", "rowSetting", j, "ch", h); if (!autoHeight) { this.fireEvent("updatecss", "rowSetting", j, "hchanged", true); } else { this.fireEvent("updatecss", "rowSetting", j, "hchanged", false); } } } else { this.fireEvent("updatecss", "rowSetting", x, "ch", h); if (!autoHeight) { this.fireEvent("updatecss", "rowSetting", x, "hchanged", true); } else { this.fireEvent("updatecss", "rowSetting", x, "hchanged", false); } } if (x <= this.freezeRange.row.end) { if (!this.isRowSplit()) { this.slh += offset; var nh = this.scroller.getHeight() - offset; this.setScrollerHeight(nh); } else { } } else { this.sh += offset; } if (!notRefresh) { this.adjustShowRange(this.availWidth, this.availHeight, true); this.sm.fireEvent("renderborder"); var wraps = ds.getWrapCellInRow(x); for (var p in wraps) { this.refreshWrapCell(wraps[p]); } } }, yResizingCol : function(y, w) { var ds = this.ds; var cw = this.ds.getColWidth(y); var offset = w - cw; var rw = w - this.xpaddingOffset; var sm = this.sm; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var miny = rt.minPos.y, maxy = rt.maxPos.y; if (miny <= y && y <= maxy) { for (var j = miny; j <= maxy; j++) { this.fireEvent("updatecss", "colSetting", j, "cw", rw); } } else { this.fireEvent("updatecss", "colSetting", y, "cw", rw); } if (y <= this.freezeRange.col.end) { if (!this.isColSplit()) { this.slw += offset; this.lscroller.setWidth(this.slw); var nw = this.scroller.getWidth() - offset; this.setScrollerWidth(nw); } else { } } else { this.sw += offset; } this.adjustShowRange(this.availWidth, this.availHeight, true); this.sm.fireEvent("renderborder"); var wraps = ds.getWrapCellInCol(y); for (var p in wraps) { this.refreshWrapCell(wraps[p]); } }, getInnerText : function(x, y) { var v = ""; var ds = this.ds; var cell = ds.getCell(x, y); v = cell['origin-data'] || cell.data; if ("percent" == cell.format && !Ext.ss.common.Mask.isFormula(cell.data)) { v = cell.data; } else { var date = ds.transfer2Date(v); if (date) { v = date.format(cell.dateFormat || ds.defaultDateFormat); } } if (typeof v == "string") { v = v.replace(//gi, "\n"); } v = Ext.ss.common.Mask.cleanTag(v); v = Ext.ss.common.Helper.unwrapLink(v).url; return v; }, prepareOrigin2Data : function(intxt, x, y) { var ds = this.ds, editor = this.editor; var origintxt; if (!Ext.ss.common.Mask.isFormula(intxt)) { if (Ext.ss.common.Mask.isLink(intxt)) { intxt = ds.wrapLink(intxt); } else if (!Ext.ss.common.Mask.isImage(intxt)) { intxt = Ext.util.Format.htmlEncode(intxt); intxt = intxt.replace(/\n/gi, "
"); } } else { intxt = intxt.replace(/[\w\s]+!/gi, function(w) { var index = arguments[arguments.length - 2]; var inQuote = Ext.ss.common.Helper.whetherInQuote( intxt, index + 1); if (!inQuote) { index += w.length; var chr = intxt.charAt(index); if (/[a-zA-Z]/gi.test(chr)) { var v = w.slice(0, w.length - 1); v = v.trim(); return "\"" + v + "\"!"; } else { return w; } } else { return w; } }); origintxt = intxt; intxt = ds.adjustFormula(x, y, intxt); } return intxt; }, setInnerText : function(intxt, x, y, skipRefreshFlag) { var ds = this.ds, editor = this.editor; var origintxt; if (!Ext.ss.common.Mask.isFormula(intxt)) { if (Ext.ss.common.Mask.isLink(intxt)) { intxt = ds.wrapLink(intxt); } else if (!Ext.ss.common.Mask.isImage(intxt)) { intxt = Ext.util.Format.htmlEncode(intxt); intxt = intxt.replace(/\n/gi, "
"); } } else { intxt = intxt.replace(/[\w\s]+!/gi, function(w) { var index = arguments[arguments.length - 2]; var inQuote = Ext.ss.common.Helper.whetherInQuote( intxt, index + 1); if (!inQuote) { index += w.length; var chr = intxt.charAt(index); if (/[a-zA-Z]/gi.test(chr)) { var v = w.slice(0, w.length - 1); v = v.trim(); return "\"" + v + "\"!"; } else { return w; } } else { return w; } }); origintxt = intxt; intxt = ds.adjustFormula(x, y, intxt); } ds.fireEvent("datachange", x, y, intxt, origintxt); var obj = ds.getCell(x, y); if (!skipRefreshFlag) { obj.x = x; obj.y = y; this.refreshCell(obj); var row = ds.data.rows[x]; if (row) { var cell = row[y]; if (cell) { var wrap = cell.wrap; if (wrap) { this.refreshWrapCell(wrap); } } } } editor.fitRow(x, true); return obj.data; }, refreshCell : function(obj) { var x = obj.x, y = obj.y; var cels = this.getCellTdHEls(x, y); if (cels) { var data; for (var i = 0, len = cels.length; i < len; i++) { var td = cels[i]; data = this.templates.cell.apply(obj); td.style.backgroundColor = obj.bg; td.className = obj.tdcss; td.style.display = obj.display; td.innerHTML = data; } return data; } }, refreshWrapCell : function(wrap) { var ds = this.ds; for (var i = wrap.minx; i <= wrap.maxx; i++) { for (var j = wrap.miny; j <= wrap.maxy; j++) { var obj = ds.getCell(i, j); obj.x = i; obj.y = j; this.refreshCell(obj); } } }, updateStateField : function(s, e) { var ds = this.ds; var code = ""; if (0 == s.x && 0 == e.x) { code = Math.abs(s.y - e.y) + 1 + "C"; } else if (0 == s.y && 0 == e.y) { code = Math.abs(s.x - e.x) + 1 + "R"; } else { if (s.x == e.x && s.y == e.y) { s = ds.findVisiableCell(s.x, s.y); code = this.getCellCode(s); } else { code = Math.abs(s.x - e.x) + 1 + "R x " + (Math.abs(s.y - e.y) + 1) + "C"; } } this.stateField.setValue(code); }, updateFxField : function(x, y) { if (!this.sm.formulaEditing) { var v = this.getInnerText(x, y); v = Ext.util.Format.htmlDecode(v); this.fxField.setValue(v); } }, maskUI : function(msg) { this.setStatus({ text : msg || "Processing...", iconCls : "x-status-busy" }); this.loadMask.msg = msg || this.loadMask.defaultMsg; this.loadMask.show(); }, setStatus : function(o) { this.fireEvent("poststatus", { text : o.text, iconCls : o.iconCls }); }, unmaskUI : function(msg) { this.setStatus({ text : msg || "Ready", iconCls : "x-status-valid" }); this.loadMask.hide(); }, setFreezeRange : function(freezeRange) { freezeRange = freezeRange || this.ds.getDefaultFreezeRange(); this.freezeRange = { row : { start : freezeRange.row.start, end : freezeRange.row.end, len : freezeRange.row.len }, col : { start : freezeRange.col.start, end : freezeRange.col.end, len : freezeRange.col.len } }; }, setShowRange : function(showRange) { showRange = showRange || this.ds.getDefaultShowRange(); this.showRange = { row : { start : showRange.row.start, end : showRange.row.end, len : showRange.row.len }, col : { start : showRange.col.start, end : showRange.col.end, len : showRange.col.len } }; }, adjustLiveScroller : function() { var ds = this.ds; var freezeRange = this.freezeRange, showRange = this.showRange; this.uylivescroller.un("scroll", this.onUYLiveScrollFn, this, { buffer : this.scrollDelay }); this.lxlivescroller.un("scroll", this.onLXLiveScrollFn, this, { buffer : this.scrollDelay }); this.ylivescroller.un("scroll", this.onYLiveScrollFn, this, { buffer : this.scrollDelay }); this.xlivescroller.un("scroll", this.onXLiveScrollFn, this, { buffer : this.scrollDelay }); this.sysXFakebody(freezeRange, showRange); this.sysYFakebody(freezeRange, showRange); if (this.isRowSplit()) { this.uylivescroller.dom.scrollTop = ds.getVisibleRowOffset( freezeRange.row.start, 1) * this.yScrollOffset; this.ylivescroller.dom.scrollTop = ds.getVisibleRowOffset( showRange.row.start, 1) * this.yScrollOffset; this.onUYScrollingFn(); } else { this.ylivescroller.dom.scrollTop = ds.getVisibleRowOffset( showRange.row.start, freezeRange.row.end + 1) * this.yScrollOffset; } this.onYScrollingFn(); if (this.isColSplit()) { this.lxlivescroller.dom.scrollLeft = ds.getVisibleColOffset( freezeRange.col.start, 1) * this.xScrollOffset; this.xlivescroller.dom.scrollLeft = ds.getVisibleColOffset( showRange.col.start, 1) * this.xScrollOffset; this.onLXScrollingFn(); } else { this.xlivescroller.dom.scrollLeft = ds.getVisibleColOffset( showRange.col.start, freezeRange.col.end + 1) * this.xScrollOffset; } this.onXScrollingFn(); this.uylivescroller.on("scroll", this.onUYLiveScrollFn, this, { buffer : this.scrollDelay }); this.lxlivescroller.on("scroll", this.onLXLiveScrollFn, this, { buffer : this.scrollDelay }); this.ylivescroller.on("scroll", this.onYLiveScrollFn, this, { buffer : this.scrollDelay }); this.xlivescroller.on("scroll", this.onXLiveScrollFn, this, { buffer : this.scrollDelay }); }, setComment : function(x, y, obj) { if (obj.comment && "" !== obj.comment) { var cels = this.getCellHEls(x, y); if (cels) { for (var i = 0, len = cels.length; i < len; i++) { var cellEl = Ext.get(cels[i]); if (!cellEl.hasClass(Ext.ss.CONST.cssHash[3])) { cellEl.addClass(Ext.ss.CONST.cssHash[3]); } } } this.ds.addCommentFn(x, y, obj.comment); } }, pasteCell : function(cell, ox, oy, transpose, x, y) { var ds = this.ds; var posReg = ds.posReg; var obj = ds.deepClone(cell); delete obj.relativeWrap; var origin = cell['origin-data']; if (origin) { obj['origin-data'] = ds.refreshOriginFormula(origin, ox, oy); obj.data = ds.adjustFormula(x, y, obj['origin-data']); } else { if (Ext.ss.common.Mask.isFormula(cell.data)) { var cellData = cell.data.replace(/"/g, "\""); obj['origin-data'] = ds.refreshOriginFormula(cellData, 0, 0); obj.data = ds.adjustFormula(x, y, obj['origin-data']); } else { Ext.ss.common.Helper.generateHyperlink(obj.data, obj); } } if (cell.wrap) { obj.wrap = { minx : cell.wrap.minx + ox, miny : cell.wrap.miny + oy, maxx : cell.wrap.maxx + ox, maxy : cell.wrap.maxy + oy }; if (transpose) { var wp = Ext.apply({}, obj.wrap); obj.wrap = { minx : wp.minx, miny : wp.miny, maxx : wp.minx + wp.maxy - wp.miny, maxy : wp.miny + wp.maxx - wp.minx }; } } delete obj.ISIParams; delete obj.lastOriginData; obj.status = "dynamic"; return obj; }, isValidPaste : function(fromRange) { var ds = this.ds; var sm = this.sm; var currentSheetIndex = ds.activeSheet; var xspan, yspan; if (fromRange) { ds.data = ds.sheets[fromRange.sheetIndex]; var wflag = false; if (0 == fromRange.maxx) { var rows = ds.data.rows; for (var i in rows) { var row = rows[i]; if (row) { for (var j = fromRange.miny; j <= fromRange.maxy; j++) { if (ds.isWraped(i, j)) { var cellObj = ds.getCell(i, j); var wrap = cellObj.wrap; if (wrap.miny < fromRange.miny || wrap.maxy > fromRange.maxy) { wflag = true; break; } } } } } if (wflag) { return true; } } else if (0 == fromRange.maxy) { var rows = ds.data.rows; for (var i = fromRange.minx; i <= fromRange.maxx; i++) { var row = rows[i]; if (row) { for (var j in row) { if (ds.isWraped(i, j)) { var cellObj = ds.getCell(i, j); var wrap = cellObj.wrap; if (wrap.minx < fromRange.minx || wrap.maxx > fromRange.maxx) { wflag = true; break; } } } } } if (wflag) { return true; } } ds.data = ds.sheets[currentSheetIndex]; xspan = fromRange.maxx - fromRange.minx + 1; yspan = fromRange.maxy - fromRange.miny + 1; } else { xspan = 1; yspan = 1; } var startPos = sm.selectedStart, endPos = sm.selectedEnd; var rt = sm.getMinMaxFromStartEnd(startPos, endPos); var minPos = rt.minPos, maxPos = rt.maxPos; var minx = minPos.x, miny = minPos.y, maxx = maxPos.x, maxy = maxPos.y; if (0 == maxx) { if (maxy < miny + yspan - 1) { maxy = miny + yspan - 1; } var rows = ds.data.rows; for (var i in rows) { var row = rows[i]; if (row) { for (var j = miny; j <= maxy; j++) { if (ds.isWraped(i, j)) { var cellObj = ds.getCell(i, j); var wrap = cellObj.wrap; if (wrap.miny < miny || wrap.maxy > maxy) { wflag = true; break; } } } } } } else if (0 == maxy) { if (maxx < minx + xspan - 1) { maxx = minx + xspan - 1; } var rows = ds.data.rows; for (var i = minx; i <= maxx; i++) { var row = rows[i]; if (row) { for (var j in row) { if (ds.isWraped(i, j)) { var cellObj = ds.getCell(i, j); var wrap = cellObj.wrap; if (wrap.minx < minx || wrap.maxx > maxx) { wflag = true; break; } } } } } } else { if (maxx < minx + xspan - 1) { maxx = minx + xspan - 1; } if (maxy < miny + yspan - 1) { maxy = miny + yspan - 1; } for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= maxy; j++) { if (ds.isWraped(i, j)) { var cellObj = ds.getCell(i, j); var wrap = cellObj.wrap; if (wrap.minx < minx || wrap.maxx > maxx || wrap.miny < miny || wrap.maxy > maxy) { wflag = true; break; } } } } } return wflag; }, pasteDataFromBoard2SS : function(ss, type, pasteType, board, outside) { var ds = ss.ds; var sm = ss.sm; var board = board || Ext.util.GlobalBoard.getBoard(); board = ds.deepClone(board); if (board) { var content = board.content; var fromRange = board.fromRange; if (".ss" == type && content) { var data = content.data; var rs = content.rowSetting; var cs = content.colSetting; var span = content.span; var flag = content.flag; var startPos = sm.selectedStart, endPos = sm.selectedEnd; var rt = sm.getMinMaxFromStartEnd(startPos, endPos); var minPos = rt.minPos, maxPos = rt.maxPos; var wflag = ss.isValidPaste(fromRange); if (wflag) { Ext.Msg.show({ title : feyaSoft.ss.lang.hint, msg : feyaSoft.ss.lang.can_not_change_combine, buttons : Ext.Msg.OK, icon : Ext.MessageBox.INFO }); return; } if ("rows" == flag) { if (0 == minPos.y && 0 == maxPos.y) { var xoffset = minPos.x - span.minx; var xspan = span.maxx - span.minx + 1, yspan = span.maxy - span.miny + 1; if (xoffset < span.maxx - span.minx) { ss.resetCutStatus(); } if (0 == (maxPos.x - minPos.x + 1) % xspan) { minPos.y = 0; maxPos.y = 0; } else { minPos = { x : span.minx + xoffset, y : 0 }; maxPos = { x : span.maxx + xoffset, y : 0 }; } var curRows = ds.data.rows; for (var i = minPos.x; i <= maxPos.x; i++) { var abXoffset = i - xoffset - span.minx; var oldx = abXoffset % xspan + span.minx; var row = data[oldx] || {}; var curRow = curRows[i]; for (var q in curRow) { if (!row[q]) { ds.fireEvent("cellchange", i, q, {}); } } for (var q in row) { var cell = ss.pasteCell(row[q], i - oldx, 0, false, i, q); delete cell.tdcss; if ("value" == pasteType) { if (Ext.ss.common.Mask.isFormula(cell.data)) { delete cell['origin-data']; cell.data = oldCell.result || ""; } } else if ("style" == pasteType) { var old = ds.getCell(i, j); cell['origin-data'] = old['origin-data']; cell.data = old.data; cell.format = old.format; } else if ("content" == pasteType) { cell = { 'origin-data' : cell['origin-data'], data : cell.data, format : cell.format, wrap : cell.wrap }; } ds.fireEvent("cellchange", i, q, cell); } } for (var i = minPos.x; i <= maxPos.x; i++) { var abXoffset = i - xoffset - span.minx; var oldx = abXoffset % xspan + span.minx; if (0 == oldx) { oldx = 1; } if (rs[oldx]) { var row = Ext.apply({}, rs[oldx]); delete row.tdcss; ds.fireEvent("rowchange", i, row); } } if (fromRange && 1 < minPos.x && "content" != pasteType) { var currentSheetIndex = ds.activeSheet; ds.data = ds.sheets[fromRange.sheetIndex]; var abXoffset = minPos.x - 1 - xoffset - span.minx; var oldx = abXoffset % xspan + span.minx; var row = ds.data.rows[oldx] || {}; for (var j in row) { ds.data = ds.sheets[fromRange.sheetIndex]; var oldCell = ds.getCell(oldx, j); ds.data = ds.sheets[currentSheetIndex]; if ("x-spreadsheet-bottom-black" == oldCell.bb && (!oldCell.wrap || oldCell.wrap.maxx == oldx)) { ds.fireEvent("attributechange", minPos.x - 1, j, [["bb", oldCell.bb]]); } } ds.data = ds.sheets[currentSheetIndex]; } } else { Ext.Msg.show({ title : "Notice", msg : "Please select row(s) to paste!", buttons : Ext.Msg.OK, icon : Ext.MessageBox.INFO }); return; } } else if ("cols" == flag) { if (0 == minPos.x && 0 == maxPos.x) { var yoffset = minPos.y - span.miny; var xspan = span.maxx - span.minx + 1, yspan = span.maxy - span.miny + 1; if (yoffset < span.maxy - span.miny) { ss.resetCutStatus(); } if (0 == (maxPos.y - minPos.y + 1) % yspan) { minPos.x = 0; maxPos.x = 0; } else { minPos = { x : 0, y : span.miny + yoffset }; maxPos = { x : 0, y : span.maxy + yoffset }; } var curRows = ds.data.rows; for (var p in curRows) { if (!data[p]) { for (var j = minPos.y; j <= maxPos.y; j++) { ds.fireEvent("cellchange", p, j, {}); } } } for (var p in data) { var row = data[p]; for (var j = minPos.y; j <= maxPos.y; j++) { var abYoffset = j - yoffset - span.miny; var oldy = abYoffset % yspan + span.miny; if (row[oldy]) { var cell = ss.pasteCell(row[oldy], 0, j - oldy, false, p, j); delete cell.tdcss; if ("value" == pasteType) { if (Ext.ss.common.Mask .isFormula(cell.data)) { delete cell['origin-data']; cell.data = oldCell.result || ""; } } else if ("style" == pasteType) { var old = ds.getCell(i, j); cell['origin-data'] = old['origin-data']; cell.data = old.data; cell.format = old.format; } else if ("content" == pasteType) { cell = { 'origin-data' : cell['origin-data'], data : cell.data, format : cell.format, wrap : cell.wrap }; } ds.fireEvent("cellchange", p, j, cell); } } } for (var j = minPos.y; j <= maxPos.y; j++) { var abYoffset = j - yoffset - span.miny; var oldy = abYoffset % yspan + span.miny; if (cs[oldy]) { var col = Ext.apply({}, cs[oldy]); delete col.tdcss; ds.fireEvent("colchange", j, col); } } if (fromRange && 1 < minPos.y && "content" != pasteType) { var currentSheetIndex = ds.activeSheet; ds.data = ds.sheets[fromRange.sheetIndex]; var abYoffset = minPos.y - 1 - yoffset - span.miny; var oldy = abYoffset % yspan + span.miny; if (0 == oldy) { oldy = 1; } var rows = ds.data.rows; for (var i in rows) { ds.data = ds.sheets[fromRange.sheetIndex]; var oldCell = ds.getCell(i, oldy); if ("x-spreadsheet-right-black" == oldCell.br && (!oldCell.wrap || oldCell.wrap.maxy == oldy)) { ds.data = ds.sheets[currentSheetIndex]; ds.fireEvent("attributechange", i, minPos.y - 1, [["br", oldCell.br]]); } } ds.data = ds.sheets[currentSheetIndex]; } } else { Ext.Msg.show({ title : "Notice", msg : "Please select column(s) to paste!", buttons : Ext.Msg.OK, icon : Ext.MessageBox.INFO }); return; } } else if ("cells" == flag) { var xoffset = minPos.x - span.minx; var yoffset = minPos.y - span.miny; var xspan = span.maxx - span.minx + 1, yspan = span.maxy - span.miny + 1; if (xoffset < span.maxx - span.minx || yoffset < span.maxy - span.miny) { ss.resetCutStatus(); } if (0 == (maxPos.x - minPos.x + 1) % xspan && 0 == (maxPos.y - minPos.y + 1) % yspan) { } else { minPos = { x : span.minx + xoffset, y : span.miny + yoffset }; maxPos = { x : span.maxx + xoffset, y : span.maxy + yoffset }; } if ("transpose" == pasteType) { var xoff = maxPos.x - minPos.x, yoff = maxPos.y - minPos.y; for (var i = minPos.x; i <= maxPos.x; i++) { var abXoffset = i - xoffset - span.minx; var oldx = abXoffset % xspan + span.minx; var row = data[oldx] || {}; for (var j = minPos.y; j <= maxPos.y; j++) { var abYoffset = j - yoffset - span.miny; var oldy = abYoffset % yspan + span.miny; var oldCell = row[oldy] || {}; var nj = minPos.y + i - minPos.x, ni = minPos.x + j - minPos.y; var cell = ss.pasteCell(oldCell, ni - oldx, nj - oldy, true, ni, nj); delete cell.tdcss; if ("value" == pasteType) { if (Ext.ss.common.Mask.isFormula(cell.data)) { delete cell['origin-data']; cell.data = oldCell.result || ""; } } else if ("style" == pasteType) { var old = ds.getCell(ni, nj); cell['origin-data'] = old['origin-data']; cell.data = old.data; cell.format = old.format; } else if ("content" == pasteType) { cell = { 'origin-data' : cell['origin-data'], data : cell.data, format : cell.format, wrap : cell.wrap }; } ds.fireEvent("cellchange", ni, nj, cell); } ss.editor.fitRow(ni, true, true); } maxPos.x = minPos.x + yoff; maxPos.y = minPos.y + xoff; } else { for (var i = minPos.x; i <= maxPos.x; i++) { var abXoffset = i - xoffset - span.minx; var oldx = abXoffset % xspan + span.minx; var row = data[oldx] || {}; for (var j = minPos.y; j <= maxPos.y; j++) { var abYoffset = j - yoffset - span.miny; var oldy = abYoffset % yspan + span.miny; var oldCell = row[oldy] || {}; oldCell = Ext.apply({}, oldCell); var cell = ss.pasteCell(oldCell, i - oldx, j - oldy, false, i, j); delete cell.tdcss; if ("value" == pasteType) { if (Ext.ss.common.Mask.isFormula(cell.data)) { delete cell['origin-data']; cell.data = oldCell.result || ""; } } else if ("style" == pasteType) { var old = ds.getCell(i, j); cell['origin-data'] = old['origin-data']; cell.data = old.data; cell.format = old.format; } else if ("content" == pasteType) { cell = { 'origin-data' : cell['origin-data'], data : cell.data, format : cell.format, wrap : cell.wrap }; } ds.fireEvent("cellchange", i, j, cell); } ss.editor.fitRow(i, true, true); } } if (fromRange && "content" != pasteType) { var currentSheetIndex = ds.activeSheet; ds.data = ds.sheets[fromRange.sheetIndex]; if (1 < minPos.x) { var abXoffset = minPos.x - 1 - xoffset - span.minx; var oldx = abXoffset % xspan + span.minx; if (0 == oldx) { oldx = 1; } for (var j = minPos.y; j <= maxPos.y; j++) { var abYoffset = j - yoffset - span.miny; var oldy = abYoffset % yspan + span.miny; ds.data = ds.sheets[fromRange.sheetIndex]; var oldCell = ds.getCell(oldx, oldy); if ("x-spreadsheet-bottom-black" == oldCell.bb && (!oldCell.wrap || oldCell.wrap.maxx == oldx)) { ds.data = ds.sheets[currentSheetIndex]; ds.fireEvent("attributechange", minPos.x - 1, j, [["bb", oldCell.bb]]); } } } if (1 < minPos.y) { var abYoffset = minPos.y - 1 - yoffset - span.miny; var oldy = abYoffset % yspan + span.miny; if (0 == oldy) { oldy = 1; } for (var i = minPos.x; i <= maxPos.x; i++) { var abXoffset = i - xoffset - span.minx; var oldx = abXoffset % xspan + span.minx; ds.data = ds.sheets[fromRange.sheetIndex]; var oldCell = ds.getCell(oldx, oldy); if ("x-spreadsheet-right-black" == oldCell.br && (!oldCell.wrap || oldCell.wrap.maxy == oldy)) { ds.data = ds.sheets[currentSheetIndex]; ds.fireEvent("attributechange", i, minPos.y - 1, [["br", oldCell.br]]); } } } ds.data = ds.sheets[currentSheetIndex]; } } ds.trace(feyaSoft.ss.lang.action_paste); var cb = board.cb; var scope = board.scope || ss; if (cb) { cb.call(scope, content); } ss.renderRange(ss.freezeRange, ss.showRange, true); sm.selectRange(sm.focusCell, minPos, maxPos); ds.fireEvent("checkformula"); ss.fireEvent("updatefx", sm.focusCell.x, sm.focusCell.y); ss.fireEvent("paste", ss, board, outside); } } }, onPasteFn : function(ss, board, outside) { var ds = ss.ds; if (!outside) { this.showPasteOptions(); } else { this.hidePasteOptions(); } }, getResultPos : function(minPos, maxPos) { if (minPos.x === maxPos.x) { return { x : maxPos.x, y : maxPos.y + 1 }; } else if (minPos.y === maxPos.y) { return { x : maxPos.x + 1, y : maxPos.y }; } else { return { x : maxPos.x + 1, y : maxPos.y + 1 }; } }, onFreezeChangedFn : function(ss, fr, sr, ofr, osr) { this.chartManager.sysnChartPos(fr, sr, ofr, osr); }, setCutStatus : function(minx, miny, maxx, maxy) { this.resetCutStatus(); var el = this.sm.selectCover.cloneNode(); el.id = Ext.id(); this.sm.selectCover.parentNode.appendChild(el); el.innerHTML = "
"; el = Ext.get(el); el.setStyle("border", "0px"); el.setHeight(el.getHeight() + 5); el.setWidth(el.getWidth() + 5); el.addClass("x-spreadsheet-cut-top"); this.cutRange = { minx : minx, miny : miny, maxx : maxx, maxy : maxy, el : el.dom }; }, resetCutStatus : function() { this.sm.hideAutoFillOptions(); this.hidePasteOptions(); if (this.cutRange) { Ext.removeNode(this.cutRange.el); } delete this.cutRange; }, setBorderStatus : function(minx, miny, maxx, maxy, t, r, b, l) { var ds = this.ds; var rows = ds.data.rows; if (0 == minx && 0 == maxx && 0 == miny && 0 == maxy) { } else if (0 == minx && 0 == maxx) { var cs = ds.data.colSetting; var y = miny - 1; cs[y] = cs[y] || {}; cs[y].tdcss = l; y = maxy + 1; cs[y] = cs[y] || {}; cs[y].tdcss = r; this.renderRange(this.freezeRange, this.showRange, false, true); } else if (0 == miny && 0 == maxy) { var rs = ds.data.rowSetting; var x = minx - 1; rs[x] = rs[x] || {}; rs[x].tdcss = t; x = maxx + 1; rs[x] = rs[x] || {}; rs[x].tdcss = b; this.renderRange(this.freezeRange, this.showRange, false, true); } else { var x = minx - 1; rows[x] = rows[x] || {}; var row = rows[x]; for (var j = miny; j <= maxy; j++) { row[j] = row[j] || {}; var cell = row[j]; cell.tdcss = t; var obj; if (0 == x) { obj = ds.getHeadText(j); } else { obj = ds.getCell(x, j); } obj.x = x; obj.y = j; this.refreshCell(obj); } x = maxx + 1; rows[x] = rows[x] || {}; row = rows[x]; for (var j = miny; j <= maxy; j++) { row[j] = row[j] || {}; var cell = row[j]; cell.tdcss = b; var obj = ds.getCell(x, j); obj.x = x; obj.y = j; this.refreshCell(obj); } var y = miny - 1; for (var i = minx; i <= maxx; i++) { rows[i] = rows[i] || {}; rows[i][y] = rows[i][y] || {}; rows[i][y].tdcss = l; var obj; if (0 == y) { obj = ds.getLeftText(i); } else { obj = ds.getCell(i, y); } obj.x = i; obj.y = y; this.refreshCell(obj); } y = maxy + 1; for (var i = minx; i <= maxx; i++) { rows[i] = rows[i] || {}; rows[i][y] = rows[i][y] || {}; rows[i][y].tdcss = r; var obj = ds.getCell(i, y); obj.x = i; obj.y = y; this.refreshCell(obj); } } }, isEqualRange : function(or, r) { if (or.col.start == r.col.start && or.col.end == r.col.end && or.row.start == r.row.start && or.row.end == r.row.end) { return true; } else { return false; } }, checkShowRange : function(fr, ofr, osr) { var rs; var cs; if (0 == fr.col.len) { if (0 == ofr.col.len) { cs = osr.col.start; } else { cs = ofr.col.start; } } else { cs = fr.col.end + 1; } if (0 == fr.row.len) { if (0 == ofr.row.len) { rs = osr.row.start; } else { rs = ofr.row.start; } } else { rs = fr.row.end + 1; } var obj = { row : { start : rs, end : rs + osr.row.len - 1, len : osr.row.len }, col : { start : cs, end : cs + osr.col.len - 1, len : osr.col.len } }; return obj; }, onAboutFn : function() { var myHtml = "
" + "
" + " FeyaSoft MySpreadSheet
" + " Version 1.1.1" + "

" + " Copyright © 2006-2010 FeyaSoft Inc. All right reserved
" + " http://www.feyasoft.com

" + "
" + "
" + " To query license" + " information, please send the email to: info@feyasoft.com." + "


" + " Warning: This computer program is protected by the copyright law and international treaties. Unauthorized " + " reproduction or distribution this program, or any portion of it, maybe result in severe civil and " + " criminal penalties, and will be prosecuted to the maximum extent possible under the law."; var aboutUsWin = new Ext.Window({ iconCls : "icon_feyasoft", title : "About FeyaSoft MySpreadsheet", width : 600, height : 300, closable : true, resizable : false, modal : true, html : myHtml }); aboutUsWin.show(); }, resetSpreadSheet : function() { var ds = this.ds; this.chartManager.cleanCharts(); delete this.file; delete this.splitFlag; var sm = this.sm; ds.loadSheets(true); ds.resetModifiedCache(); this.resetRange(); sm.resetSelections(); this.updateSheetStatus(); this.reloadUI(); }, updateSheetStatus : function() { var str = this.generateSheets(); if (Ext.isIE) { this.fcontainer.dom.innerHTML = "" + "" + "" + str + "
" + "
"; this.footresizer = Ext.get(this.id + "-x-spreadsheet-footer-resizer"); this.sline = Ext.get(this.id + "-x-spreadsheet-footer-sheets-line"); this.footresizer.on("mousedown", this.onFootresizerMouseDownFn, this); } else { this.sline.dom.innerHTML = str + ""; } }, insertActiveSheet : function(name, pos) { var ds = this.ds; var sheets = ds.sheets; this.turnOffActive(); var left = 0 == pos ? false : "inactive", right = pos == sheets.length - 1; var str = this.generateInActiveSheet(name, left, right); var ctd; if (!left) { Ext.get(this.sline.dom.firstChild).remove(); ctd = this.sline.dom.childNodes[1]; Ext.DomHelper.insertBefore(ctd, str); } else if (right) { Ext.get(this.sline.dom.childNodes[this.sline.dom.childNodes.length - 2]).remove(); ctd = this.sline.dom.lastChild; Ext.DomHelper.insertBefore(ctd, str); } else { pos--; ctd = this.sline.dom.childNodes[pos * 2 + 1]; var rtd = this.sline.dom.childNodes[pos * 2 + 2]; Ext.get(rtd).remove(); Ext.DomHelper.insertAfter(ctd, str); } }, addSheet : function(name, pos) { var ds = this.ds; var i; if ("first" == pos) { i = 0; } else if ("before" == pos) { i = ds.activeSheet; } else if ("after" == pos) { i = ds.activeSheet + 1; } else { i = ds.sheets.length; } this.chartManager.displayCharts(ds.activeSheet, "none"); ds.addSheet(name, i, function() { this.chartManager.displayCharts(ds.activeSheet, ""); this.updateSheetStatus(); this.reloadUI(); }, this); }, copySheet : function(name, pos, index) { var ds = this.ds; var i; if ("first" == pos) { i = 0; } else if ("before" == pos) { i = ds.activeSheet; } else if ("after" == pos) { i = ds.activeSheet + 1; } else { i = ds.sheets.length; } this.chartManager.displayCharts(ds.activeSheet, "none"); ds.copySheet(name, i, index, function() { this.chartManager.displayCharts(ds.activeSheet, ""); this.updateSheetStatus(); this.reloadUI(); }, this); }, moveSheet : function(sIndex, tIndex) { var ds = this.ds; if (sIndex != tIndex && sIndex + 1 != tIndex) { ds.moveSheet(sIndex, tIndex); this.updateSheetStatus(); this.reloadUI(); } }, setScrollerWidth : function(w) { this.colct.setWidth(w); this.hct.setWidth(w); this.sct.setWidth(w); this.sheader.setWidth(w); this.scroller.setWidth(w); }, setScrollerHeight : function(h) { this.rowct.setHeight(h); this.lsct.setHeight(h); this.sct.setHeight(h); this.lscroller.setHeight(h); this.scroller.setHeight(h); }, insertImageInCell : function(url, setting, x, y) { var sm = this.sm; x = x || sm.focusCell.x; y = y || sm.focusCell.y; var data = ""; this.setInCellImage(x, y, data); }, setInCellImage : function(x, y, data) { var ds = this.ds; ds.fireEvent("datachange", x, y, data); ds.trace(feyaSoft.ss.lang.action_incell_image(ds.getNameFromPos({ x : x, y : y }))); var obj = ds.getCell(x, y); var wrap = obj.wrap; if (wrap) { this.refreshWrapCell(wrap); } else { obj.x = x; obj.y = y; this.refreshCell(obj); } this.updateStatus(x, y); }, updateStatus : function(x, y) { this.fireEvent("updatefx", x, y); this.fireEvent("updatepress", this, x, y); }, getDataRange : function(format) { var sm = this.sm; var rs = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); return this.encodeDataRange(rs, format); }, encodeDataRange : function(range, format) { var str = ""; if (range) { var minPos = range.minPos, maxPos = range.maxPos; var ds = this.ds; var sl = ds.getLetter(minPos.y); var el = ds.getLetter(maxPos.y); if (0 == minPos.x && 0 == minPos.y) { } else if (0 == minPos.x) { if ("local" == format) { str = sl + ":" + el; } else { str = ds.sheets[ds.activeSheet].name + "!$" + sl + ":$" + el; } } else if (0 == minPos.y) { if ("local" == format) { str = minPos.x + ":" + maxPos.x; } else { str = ds.sheets[ds.activeSheet].name + "!$" + minPos.x + ":$" + maxPos.x; } } else { if ("local" == format) { str = sl + minPos.x + ":" + el + maxPos.x; } else { str = ds.sheets[ds.activeSheet].name + "!$" + sl + "$" + minPos.x + ":$" + el + "$" + maxPos.x; } } } return str; }, isRowSplit : function(pf, fr) { pf = pf || this.splitFlag; fr = fr || this.freezeRange; return pf && 0 != fr.row.len; }, isColSplit : function(pf, fr) { pf = pf || this.splitFlag; fr = fr || this.freezeRange; return pf && 0 != fr.col.len; }, isFreezed : function() { var fr = this.freezeRange; return 0 < fr.col.len || 0 < fr.row.len; }, scroll2Show : function(x, y) { var sm = this.sm; var pf = sm.posFlag; var sr = this.showRange, fr = this.freezeRange; var offset = this.autoOffset; var cellEl = this.getCellEl(x, y, pf); if (cellEl) { var b = cellEl.getBottom(); if ("showRange" == pf || "left" == pf) { if (b > this.xlivescroller.getTop() && x != sr.row.start) { this.scrollingRow(-offset, 1); } } else if ("left-top" == pf || "top" == pf) { if (b > this.lsct.getTop() && x != fr.row.start) { this.scrollingURow(-offset, 1); } } var r = cellEl.getRight(); if ("showRange" == pf || "top" == pf) { if (r > this.ylivescroller.getLeft() && y != sr.col.start) { this.scrollingCol(-offset, 1); } } else if ("left-top" == pf || "left" == pf) { if (r > this.hct.getLeft() && y != fr.col.start) { this.scrollingLCol(-offset, 1); } } } }, showFilterMenu : function(pos, e) { if (!this.filterMenu) { this.initFilterMenu(); } this.filterMenu.show(e.getTarget(), pos); }, initFilterMenu : function(e) { this.filterMenu = new Ext.ss.menu.FilterMenu({ spreadsheet : this }); }, getDistinctValue : function(col, minrow, maxrow, filters) { var id = [col, minrow, maxrow].join("-"); var otherFilters = {}; for (var p in filters) { if (p != id) { otherFilters[p] = filters[p]; } } var ds = this.ds, cache = {}, flag; for (var i = minrow; i <= maxrow; i++) { if (ds.doFilterChecking(i, otherFilters)) { var cell = ds.getCell(i, col); var val = cell.data; if (cell.wrap) { val = ds.getCellValue(cell.wrap.minx, cell.wrap.miny, ds.activeSheet, true); } else { val = ds.getCellValue(i, col, ds.activeSheet, true); } if (false !== Ext.type(val)) { val = val.toString(); } if (false != Ext.type(val) && "" !== val) { flag = true; cache[val] = "none" == cell.display ? false : true; } } } if (flag) { return cache; } }, extendSelection : function() { var sm = this.sm, ds = this.ds; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, miny = rt.minPos.y, maxx = rt.maxPos.x, maxy = rt.maxPos.y; if (minx == maxx && miny == maxy) { var visited = {}, rest = {}, top = false, bottom = false, left = false, right = false; var extending = function(x, y, first) { var id = x + "-" + y; if (true === first) { var cell = ds.getCell(x, y); first = false == Ext.type(cell.data) || "" === cell.data; } if (!first) { if (false === left || y < left) { left = y; } if (false === right || y > right) { right = y; } if (false === top || x < top) { top = x; } if (false === bottom || x > bottom) { bottom = x; } } if (!visited[id]) { visited[id] = true; delete rest[id]; var fromx = 1 < x ? x - 1 : x, tox = x + 1, fromy = 1 < y ? y - 1 : y, toy = y + 1; for (var j = fromy; j <= toy; j++) { for (var i = fromx; i <= tox; i++) { var cell = ds.getCellObj(i, j); if (false != Ext.type(cell.data) && "" != cell.data) { id = i + "-" + j; if (!visited[id]) { rest[id] = [i, j]; } } } } } else { delete rest[id]; } for (var p in rest) { if (rest.hasOwnProperty(p)) { var it = rest[p]; extending(it[0], it[1], false); break; } } }; extending(minx, miny, true); return { minx : top, miny : left, maxx : bottom, maxy : right }; } else { return { minx : minx, miny : miny, maxx : maxx, maxy : maxy }; } }, createFilterForSelection : function() { var lan_com = feyaSoft.lang.common, lan_ss = feyaSoft.ss.lang; var ds = this.ds, sm = this.sm; var rows = ds.data.rows; var selectedRange = this.extendSelection(); var minx = selectedRange.minx, miny = selectedRange.miny, maxx = selectedRange.maxx, maxy = selectedRange.maxy; var flag = false; var row = rows[minx]; for (var i = miny; i <= maxy; i++) { var distinct = this.getDistinctValue(i, minx + 1, maxx); if (distinct) { flag = true; var cell = {}; if (row) { cell = Ext.apply({}, row[i]); } ds.fireEvent("cellchange", minx, i, Ext.apply(cell, { filter : { minx : 1, maxx : maxx - minx } })); } } ds.trace(lan_ss.createFilter); if (flag) { this.refreshRange(); } else { Ext.Msg.alert(lan_com.hint, lan_ss.no_data_in_selection); } }, cancelFilter : function() { var ds = this.ds, lan_ss = feyaSoft.ss.lang; var rows = ds.data.rows, flag; for (var p in rows) { p = Number(p); var row = rows[p]; for (var q in row) { q = Number(q); var cell = row[q]; if (cell.filter) { ds .fireEvent("attributechange", p, q, [[ "filterCheck", ""]]); this.doFilter({ x : p, y : q }, null, true); ds.fireEvent("attributechange", p, q, [["filter", ""]]); flag = true; } } } ds.trace(lan_ss.cancelFilter); if (flag) { this.refreshRange(); } }, doFilter : function(pos, notmatch, notTrace) { var ds = this.ds; var cell = ds.getCell(pos.x, pos.y); if (notmatch) { ds.fireEvent("attributechange", pos.x, pos.y, [["filterCheck", { notmatch : [].concat(notmatch) }], ["filter-trigger", "x-spreadsheet-filtered"]]); } else { ds.fireEvent("attributechange", pos.x, pos.y, [["filterCheck", ""], ["filter-trigger", ""]]); } var minrow = cell.filter.minx + pos.x, maxrow = cell.filter.maxx + pos.x; ds.doFiltering(minrow, maxrow); if (!notTrace) { ds.trace(feyaSoft.ss.lang.filtering); this.refreshRange(); } }, initPasteOptions : function() { var lan_ss = feyaSoft.ss.lang; this.pasteOptions = new Ext.Button({ cls : "x-spreadsheet-autofill-option", hidden : true, iconCls : "icon_paste", menu : new Ext.menu.Menu({ defaults : { group : Ext.id() + "-paste", checked : false }, items : [{ checked : true, text : lan_ss.paste, handler : this.onPasteNormalFn, scope : this }, { text : lan_ss.paste_value_style, handler : this.onPasteValueFn, scope : this }, { text : lan_ss.only_paste_style, handler : this.onPasteStyleFn, scope : this }, { text : lan_ss.only_paste_content, handler : this.onPasteContentFn, scope : this }, { text : lan_ss.transpose_paste, handler : this.onPasteTransposeFn, scope : this }] }), renderTo : Ext.getBody(), listeners : { render : { fn : function(btn) { btn.getEl().swallowEvent("mousedown"); } } } }); }, hidePasteOptions : function() { this.pasteOptions.hide(); }, showPasteOptions : function() { var sm = this.sm, ds = this.ds; var freezed = this.isFreezed(); var range = sm.whichRange(sm.selectedEnd); var ct, x = sm.selectedEnd.x, y = sm.selectedEnd.y; var board = Ext.util.GlobalBoard.getBoard(); var wrap = false, isCell = true; if (board) { var content = board.content; if (content) { var span = content.span; if (0 == span.maxx || 0 == span.maxy) { isCell = false; } var data = content.data; for (var p in data) { var it = data[p], stopFlag = false; for (var q in it) { var cell = it[q]; if (cell.wrap) { wrap = true; stopFlag = true; break; } } if (stopFlag) { break; } } } } var items = this.pasteOptions.menu.items; items.get(0).setChecked(true, true); if (wrap || !isCell) { items.get(items.getCount() - 1).hide(); } else { items.get(items.getCount() - 1).show(); } var fr = this.freezeRange, sr = this.showRange; var width, height; if ("left-top" == range) { ct = this.lhctInner; width = ds.getSpanWidth(fr.col.start, y); height = ds.getSpanHeight(fr.row.start, x); } else if ("left" == range) { ct = this.lsctInner; width = ds.getSpanWidth(fr.col.start, y); height = ds.getSpanHeight(fr.row.end + 1, x); } else if ("top" == range) { ct = this.hctInner; width = ds.getSpanWidth(fr.col.end + 1, y); height = ds.getSpanHeight(fr.row.start, x); } else { ct = this.sctInner; width = ds.getSpanWidth(fr.col.end + 1, y); height = ds.getSpanHeight(fr.row.end + 1, x); } this.pasteOptions.show(); var el = this.pasteOptions.getEl(); ct.appendChild(el); var pct = ct.parent(); var left = width + 10, top = height + 10; if (freezed) { if ("left-top" == range || "left" == range) { if (left + 40 > pct.getWidth()) { left = pct.getWidth() - 40; } } if ("left-top" == range || "top" == range) { if (top + 25 > pct.getHeight()) { top = pct.getHeight() - 25; } } } el.setLeft(left); el.setTop(top); }, onPasteNormalFn : function() { this.ds.undo(); Ext.util.GlobalBoard.getBoard().paste2Fn(this, ".ss"); }, onPasteValueFn : function() { this.ds.undo(); Ext.util.GlobalBoard.getBoard().paste2Fn(this, ".ss", "value"); }, onPasteStyleFn : function() { this.ds.undo(); Ext.util.GlobalBoard.getBoard().paste2Fn(this, ".ss", "style"); }, onPasteContentFn : function() { this.ds.undo(); Ext.util.GlobalBoard.getBoard().paste2Fn(this, ".ss", "content"); }, onPasteTransposeFn : function() { this.ds.undo(); Ext.util.GlobalBoard.getBoard().paste2Fn(this, ".ss", "transpose"); }, isChanged : function() { return this.ds.isChanged(); }, isReadOnly : function() { if (!this.file) { return false; } else if (2 == this.file.permission) { if (this.file.lockedBy && !this.file.isLockedBySelf) { return "locked"; } return false; } return true; }, isEmptyFile : function() { return !this.file; }, getFileId : function() { if (this.file) { return this.file.id; } }, updateFile : function(fileId, name, tabIds) { this.file.id = fileId; this.file.name = name; this.ds.updateTabIds(tabIds); }, setTRHtmlForIE : (function() { var re = /(.*?)<\/td>/gi; return function(tr, html, index, fn) { if (typeof index != "number") { index = -1; } var arr; while ((arr = re.exec(html)) != null) { var td = tr.insertCell(index); if (Ext.isFunction(fn)) { fn.call(this, td, arr[1]); } td.innerHTML = arr[2]; if (index != -1) { index++; } } }; })(), processCrossSheetEditing : function(oldSheetIndex, sheetIndex) { //sheet切换 var me = this; var sm = this.sm, ds = this.ds; var textCover = sm.getTextCover(); var textCoverEl = Ext.get(textCover); if (textCoverEl.isVisible()) { var pos = textCover.pos; var relatedSheetIndex = pos.sheetIndex; if (relatedSheetIndex != sheetIndex) { var relatedSheetName = ds.sheets[relatedSheetIndex].name; var val = textCover.value; var posReg = ds.posReg; var newVal = val.replace(posReg, function(w) { var idx = arguments[arguments.length - 2]; var oldIdx = idx; idx += w.length; if (-1 == w.indexOf("!") && "!" != val.charAt(idx)) { var addLen = relatedSheetName.length + 1; w = relatedSheetName + "!" + w; } return w; }); textCover.value = newVal; this.stateField.setValue(relatedSheetName + "!" + ds.getLetter(pos.y) + pos.x); } else { this.stateField.setValue(ds.getLetter(pos.y) + pos.x); } textCoverEl.focus(50); (function () { sm.onFormulaSelectupFn(); me.sysFocusObj(textCover.value); }).defer(100, this); } else { var focusCell = sm.focusCell; //处理dataStore 清空 this.stateField.setValue(ds.getLetter(focusCell.y) + focusCell.x); } }, combineRanges : function(ranges, dir) { var ds = this.ds; if ("x" == dir) { } else { var xSpan = 0, len = ranges.length; for (var i = 0; i < len; i++) { var it = ranges[i]; var off = it.ex - it.x + 1; if (xSpan < off) { xSpan = off; } } var col = []; for (var j = 0; j < xSpan; j++) { col.push(0); } var data = []; for (var k = 0; k < len; k++) { var it = ranges[k]; for (var j = it.y; j <= it.ey; j++) { var ncol = [].concat(col); for (var i = it.x; i <= it.ex; i++) { var val = ds.getCellValue(i, j, it.sheetIndex, true); val = Ext.num(val, val) || ""; if (Ext.isString(val)) { val = val.replace("
", " "); val = val.replace("
", " "); val = val.replace(/\s/gi, " "); } ncol[i - it.x] = val; } data.push(ncol); } } return data; } }, changeConfig : function(config) { if (config) { Ext.apply(this, config); var ss = this, ds = ss.ds, sct = ss.scontainer; if (config.file && config.file.sheets) { var file = this.file; ss.chartManager.cleanCharts(); var fr = ss.copyRange(ss.freezeRange); ds.resetModifiedCache(); ds.setSheets(file.sheets, file.extraInfo, file.activeSheet); ss.updateSheetStatus(); ss.reloadUI(fr); var title = file.name; sct.fireEvent("changetitle", title); } } }, onUndoMouseOverFn : function(dolist, e, item, index) { var lan_ss = feyaSoft.ss.lang; var foot = dolist.foot; var index = dolist.activeCount; var step = lan_ss.step; if (1 < index) { step = lan_ss.steps; } foot.update(lan_ss.undo + " " + index + " " + step); }, onRedoMouseOverFn : function(dolist, e, item) { var lan_ss = feyaSoft.ss.lang; var foot = dolist.foot; var index = dolist.activeCount; var step = lan_ss.step; if (1 < index) { step = lan_ss.steps; } foot.update(lan_ss.redo + " " + index + " " + step); }, onUndoBefroeShowFn : function(m) { var ss = this; var ds = ss.ds; var hs = ds.getActiveHStack(); var ul = this.undoList; ul.removeAll(); for (var i = hs.index, start = hs.start; i > start; i--) { var index = i - 1; var rd = hs.records[index]; var action = rd.action || "Step" + i; ul.add({ text : action, handler : this.onUndoMoreFn, scope : this }); } return 0 < ul.items.getCount(); }, onRedoBefroeShowFn : function(m) { var ss = this; var ds = ss.ds; var hs = ds.getActiveHStack(); var rl = this.redoList; rl.removeAll(); for (var i = hs.index, end = hs.max; i < end; i++) { var rd = hs.records[i]; var action = rd.action || "Step" + (i + 1); rl.add({ text : action, handler : this.onRedoMoreFn, scope : this }); } return 0 < rl.items.getCount(); }, onUndoFn : function() { var ss = this; ss.resetCutStatus(); ss.ds.undo(); }, onRedoFn : function() { var ss = this; ss.resetCutStatus(); ss.ds.redo(); }, onUndoMoreFn : function(item) { var ss = this; var ds = ss.ds; ds.undo(this.undoList.activeCount); ss.sm.transferFocus(); }, onRedoMoreFn : function(item) { var ss = this; var ds = ss.ds; ds.redo(this.redoList.activeCount); ss.sm.transferFocus(); }, onHStackChangeFn : function(hs) { if (hs == null) { this.undoBtn.disable(); this.redoBtn.disable(); } else { if (hs.index > hs.start) { this.undoBtn.enable(); } else { this.undoBtn.disable(); } if (hs.index < hs.max) { this.redoBtn.enable(); } else { this.redoBtn.disable(); } } }, updateConditionFormat : function(changed, deleted) { var ds = this.ds; var sheet = ds.sheets[ds.activeSheet]; var oldCfm = sheet.conditionFormat || []; changed = changed || []; var og = { action : "set-cfm", type : "undo", cfm : ds.deepClone(oldCfm) }; var md = { action : "set-cfm", type : "redo", cfm : ds.deepClone(changed) }; var sm = this.sm; ds.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }, true); sheet.conditionFormat = changed; ds.prepareConditionFormat(changed, sheet); ds.saveExtraInfo(); this.renderRange(this.freezeRange, this.showRange); ds.trace(feyaSoft.ss.lang.setConditionFormat); }, getCompanyReferenceCell : function(withSheetName, asPos, far) { var sm = this.sm, ds = this.ds; var focusCell = sm.focusCell; var x = focusCell.x, y = focusCell.y; var rows = ds.data.rows; var row = rows[x]; var pos; for (var i = y - 1; i > 0; i--) { var cell = row[i]; if (cell) { if (ds.isCompanyCell(cell)) { pos = { x : x, y : i }; pos.ex = pos.x; pos.ey = pos.y; pos.sheetIndex = ds.activeSheet; if (!far) { if (!asPos) { return ds.transfer5TplPos2Text(pos, false, !withSheetName); } return pos; } } else if (far && pos) { if (!asPos) { return ds.transfer5TplPos2Text(pos, false, !withSheetName); } return pos; } } else if (far && pos) { if (!asPos) { return ds.transfer5TplPos2Text(pos, false, !withSheetName); } return pos; } } if (pos) { if (!asPos) { return ds.transfer5TplPos2Text(pos, false, !withSheetName); } return pos; } for (var i = x - 1; i > 0; i--) { var row = rows[i]; if (row) { var cell = row[y]; if (cell) { if (ds.isCompanyCell(cell)) { pos = { x : i, y : y }; pos.ex = pos.x; pos.ey = pos.y; pos.sheetIndex = ds.activeSheet; if (!far) { if (!asPos) { return ds.transfer5TplPos2Text(pos, false, !withSheetName); } return pos; } } else if (far && pos) { if (!asPos) { return ds.transfer5TplPos2Text(pos, false, !withSheetName); } return pos; } } else if (far && pos) { if (!asPos) { return ds.transfer5TplPos2Text(pos, false, !withSheetName); } return pos; } } } if (pos) { if (!asPos) { return ds.transfer5TplPos2Text(pos, false, !withSheetName); } return pos; } }, autoSelectCompanyCell : function() { var pos = this.getCompanyReferenceCell(false, true); if (pos) { var sm = this.sm; sm.selectRange({ x : pos.x, y : pos.y }, { x : pos.x, y : pos.y }, { x : pos.ex, y : pos.ey }); } }, findCompanyReferenceCellInRow : function(x, y, dir) { var sm = this.sm, ds = this.ds; var rows = ds.data.rows; var row = rows[x]; var pos; if ("pos" == dir) { var max = ds.getMaxColumnNumber(); for (var i = y + 1; i <= max; i++) { var cell = row[i]; if (cell) { if (ds.isCompanyCell(cell)) { pos = { x : x, y : i }; pos.ex = pos.x; pos.ey = pos.y; pos.sheetIndex = ds.activeSheet; } else { break; } } else { break; } } return pos; } else { for (var i = y - 1; i > 0; i--) { var cell = row[i]; if (cell) { if (ds.isCompanyCell(cell)) { pos = { x : x, y : i }; pos.ex = pos.x; pos.ey = pos.y; pos.sheetIndex = ds.activeSheet; } else { break; } } else { break; } } return pos; } }, findCompanyReferenceCellInColumn : function(x, y, dir) { var sm = this.sm, ds = this.ds; var rows = ds.data.rows; var pos; if ("pos" == dir) { var max = ds.getMaxRowNumber(); for (var i = x + 1; i <= max; i++) { var row = rows[i]; if (row) { var cell = row[y]; if (cell) { if (ds.isCompanyCell(cell)) { pos = { x : i, y : y }; pos.ex = pos.x; pos.ey = pos.y; pos.sheetIndex = ds.activeSheet; } else { break; } } else { break; } } else { break; } } return pos; } else { for (var i = x - 1; i > 0; i--) { var row = rows[i]; if (row) { var cell = row[y]; if (cell) { if (ds.isCompanyCell(cell)) { pos = { x : i, y : y }; pos.ex = pos.x; pos.ey = pos.y; pos.sheetIndex = ds.activeSheet; } else { break; } } else { break; } } else { break; } } return pos; } }, getCompanyReferenceCellRange : function(withSheetName, asPos) { var sm = this.sm, ds = this.ds; var focusCell = sm.focusCell; var x = focusCell.x, y = focusCell.y; var pos = this.getCompanyReferenceCell(false, true, true); if (pos) { if (pos.x === x) { var minPos = this.findCompanyReferenceCellInColumn(pos.x, pos.y, "pre"); if (minPos) { pos.x = minPos.x; pos.y = minPos.y; } var maxPos = this.findCompanyReferenceCellInColumn(pos.x, pos.y, "pos"); if (maxPos) { pos.ex = maxPos.ex; pos.ey = maxPos.ey; } if (pos.x === pos.ex && pos.y === pos.ey) { minPos = this.findCompanyReferenceCellInRow(pos.x, pos.y, "pre"); if (minPos) { pos.x = minPos.x; pos.y = minPos.y; } maxPos = this.findCompanyReferenceCellInRow(pos.x, pos.y, "pos"); if (maxPos) { pos.ex = maxPos.ex; pos.ey = maxPos.ey; } } if (!asPos) { var text = ds.transfer5TplPos2Text(pos, false, !withSheetName); var arr = text.split(":"); if (1 == arr.length) { arr.push(arr[0]); } arr.push(pos.x === pos.ex ? "horizontal" : "vertical"); return arr; } return pos; } else { var minPos = this.findCompanyReferenceCellInRow(pos.x, pos.y, "pre"); if (minPos) { pos.x = minPos.x; pos.y = minPos.y; } var maxPos = this.findCompanyReferenceCellInRow(pos.x, pos.y, "pos"); if (maxPos) { pos.ex = maxPos.ex; pos.ey = maxPos.ey; } if (pos.x === pos.ex && pos.y === pos.ey) { minPos = this.findCompanyReferenceCellInColumn(pos.x, pos.y, "pre"); if (minPos) { pos.x = minPos.x; pos.y = minPos.y; } maxPos = this.findCompanyReferenceCellInColumn(pos.x, pos.y, "pos"); if (maxPos) { pos.ex = maxPos.ex; pos.ey = maxPos.ey; } } if (!asPos) { var text = ds.transfer5TplPos2Text(pos, false, !withSheetName); var arr = text.split(":"); if (1 == arr.length) { arr.push(arr[0]); } arr.push(pos.x === pos.ex ? "horizontal" : "vertical"); return arr; } return pos; } } else { return false; } }, updateCells : function(json, startPos) { startPos = startPos || { row : 0, col : 0 }; var me = this; var ds = this.ds; var dsRows = ds.data.rows; var x = startPos.row, y = startPos.col; var rows = json.rows; for (var p in rows) { var r = Number(p) + x; var row = rows[p]; if (!dsRows[r]) { dsRows[r] = {}; } var dsRow = dsRows[r]; for (var q in row) { var c = Number(q) + y; var cellObj = row[q]; dsRow[c] = ds.deepClone(cellObj); var origin = cellObj['origin-data']; if (false == Ext.type(origin)) { origin = cellObj.data; if (false == Ext.type(origin)) { origin = cellObj.d; } } origin = this.prepareOrigin2Data(origin, r, c); ds.setCellData(r, c, origin, true); } } ds.fireEvent("checkformula", ds.activeSheet); (function() { me.refreshRange(); }).defer(500); }, getCell : function(row, col, sheetIndex) { var ds = this.ds; var tmp = ds.activeSheet; if (false !== Ext.type(sheetIndex)) { ds.activeSheet = sheetIndex; ds.data = ds.sheets[sheetIndex]; } var cell = ds.getCell(row, col); ds.activeSheet = tmp; ds.data = ds.sheets[tmp]; return cell; } }); Ext.ns("Ext.ss"); Ext.ss.Toolbar = function(config) { var needHidden = false; if (feyaSoft.home.CONST.CLIENT_NAME == "pradac") { needHidden = true; } Ext.apply(this, config); this.spreadsheet.toolbar = this; var lan_ss = feyaSoft.ss.lang; var lan_common = feyaSoft.lang.common; var lan_lock = feyaSoft.lang.lock; this.newBtn = new Ext.SplitButton({ hidden : needHidden, iconCls : "icon_new", text : lan_common['new'], tooltip : "New", handler : function() { feyaSoft.home.LoginCheck(function() { this.onNewFn(); }, this); }, scope : this, menu : new Ext.menu.Menu({ items : [{ text : lan_ss.newSpreadsheet, handler : function() { feyaSoft.home.LoginCheck( function() { this.onNewFn(); }, this); }, scope : this }, { text : lan_ss.newfileFromTemp, handler : function() { feyaSoft.home.LoginCheck( function() { this .onNewFromTemplateFn(); }, this); }, scope : this }, { iconCls : "icon_new", text : lan_ss.newtemplate, handler : function() { feyaSoft.home.LoginCheck( function() { this.onNewFn(true); }, this); }, scope : this }] }) }); /**打开模板*/ this.openBtn = new Ext.SplitButton({ hidden : needHidden, iconCls : "icon_open", tooltip : lan_common.open, text : lan_common.open, handler : function() { feyaSoft.home.LoginCheck(function() { this.onOpenFn(); }, this); }, scope : this, menu : new Ext.menu.Menu({ items : [{ text : lan_common.open, handler : function() { feyaSoft.home.LoginCheck( function() { this.onOpenFn(); }, this); }, scope : this }, { text : lan_ss.openTemplate, handler : function() { var me=this; me.onOpenFn(true); /**feyaSoft.home.LoginCheck( function() { this.onOpenFn(true); }, this);**/ }, scope : this }] }) }); this.saveMenu = new Ext.menu.Menu({ items : [{ iconCls : "icon_save", text : lan_common.save, handler : function() { feyaSoft.home.LoginCheck(function() { this.onSaveFn(); }, this); }, scope : this }, { iconCls : "icon_save_as", text : lan_common.saveAs, handler : function() { feyaSoft.home.LoginCheck(function() { this.onSaveAsFn(); }, this); }, scope : this }, { iconCls : "icon_save_as", text : lan_ss.saveAsTemplate, handler : function() { feyaSoft.home.LoginCheck(function() { this.onSaveTemplateAsFn(); }, this); }, scope : this }] }); this.saveBtn = new Ext.SplitButton({ iconCls : "icon_ss_save", scale : "large", rowspan : 3, colspan : 3, iconAlign : "top", text : lan_common.save, tooltip : "保存", handler : this.onSaveFn, scope : this, arrowAlign : "right", menu : this.saveMenu }); this.closeBtn = new Ext.Button({ iconCls : "icon_close", text : lan_common.close, tooltip : "关闭", handler : this.onCloseFn, scope : this }); this.printBtn = new Ext.Button({ iconCls : "printer", text : lan_common.print, tooltip : lan_common.print_tip, handler : function() { feyaSoft.home.LoginCheck(function() { this.onPrintFn(); }, this); }, scope : this }); if (feyaSoft.home.CONST.CLIENT_NAME == "pradac") { this.saveBtn = new Ext.Button({ iconCls : "icon_ss_save", scale : "large", rowspan : 3, colspan : 3, iconAlign : "top", text : "  " + lan_common.save + "  ", tooltip : "Save", handler : this.onSaveFn, scope : this }); } this.fileGroup = new Ext.ButtonGroup({ title : lan_common.file, columns : 4, items : [this.saveBtn, this.newBtn, this.openBtn, this.printBtn] }); this.cutBtn = new Ext.Button({ iconCls : "icon_cut", tooltip : lan_common.cut, handler : this.onCutFn, scope : this }); this.copyBtn = new Ext.Button({ iconCls : "icon_copy", tooltip : lan_common.copy, handler : this.onCopyFn, scope : this }); this.pasteBtn = new Ext.SplitButton({ iconCls : "icon_ss_paste", iconAlign : "top", text : "  " + lan_common.paste + "  ", scale : "large", colspan : 3, rowspan : 3, tooltip : "粘贴", handler : this.onPasteFn, scope : this, menu : [{ text : lan_ss.only_paste_value, handler : this.onPasteValueFn, scope : this }, { text : lan_ss.only_paste_style, handler : this.onPasteStyleFn, scope : this }, { text : lan_ss.only_paste_content, handler : this.onPasteContentFn, scope : this }, { text : lan_ss.transpose_paste, handler : this.onPasteTransposeFn, scope : this }] }); this.brushBtn = new Ext.Button({ iconCls : "icon_brush", tooltip : "格式刷", handler : this.onBrushFn, scope : this }); this.clipGroup = new Ext.ButtonGroup({ title : lan_common.clipboard, columns : 4, items : [this.pasteBtn, this.cutBtn, this.copyBtn, this.brushBtn] }); this.formulaMenu = new Ext.menu.Menu({ items : [{ iconCls : "icon_sum", text : lan_common.sum, handler : this.onSumFn, scope : this }, { iconCls : "icon_average", text : lan_common.average, handler : this.onAverageFn, scope : this }, { iconCls : "icon_count", text : lan_common.count, handler : this.onCountFn, scope : this }, { iconCls : "icon_min", text : lan_common.min, handler : this.onMinFn, scope : this }, { iconCls : "icon_max", text : lan_common.max, handler : this.onMaxFn, scope : this }, "-", { text : lan_ss.insertFormula, iconCls : "icon_fx", handler : this.onInsertFormula, scope : this }, "-", { text : lan_ss.nameManager, iconCls : "icon_edit", handler : this.onNameMgr, scope : this }] }); this.formulaBtn = new Ext.SplitButton({ iconCls : "icon_formula32", iconAlign : "top", scale : "large", text : lan_ss.formula, colspan : 3, rowspan : 3, tooltip : "Insert Formula", handler : this.onInsertFormula, scope : this, menu : this.formulaMenu }); this.formulaGroup = new Ext.ButtonGroup({ title : lan_ss.formula, columns : 3, items : [this.formulaBtn] }); this.deleteRangeMenu = new Ext.menu.Menu({ items : [{ iconCls : "icon_delete_row", text : lan_ss.deleteRows, handler : this.onDeleteRowFn, scope : this }, { iconCls : "icon_delete_col", text : lan_ss.deleteColumns, handler : this.onDeleteColFn, scope : this }] }); this.deleteRangeBtn = new Ext.SplitButton({ iconCls : "icon_ss_delete", iconAlign : "top", scale : "large", text : lan_common['delete'], colspan : 1, rowspan : 3, tooltip : "Delete selected range", handler : this.onDeleteFn, scope : this, menu : this.deleteRangeMenu }); this.insertRangeMenu = new Ext.menu.Menu({ items : [{ iconCls : "icon_insert_row_above", text : lan_ss.insertRowAbove, handler : this.onInsertRowAboveFn, scope : this }, { iconCls : "icon_insert_row_below", text : lan_ss.insertRowBelow, handler : this.onInsertRowBelowFn, scope : this }, { iconCls : "icon_insert_col_before", text : lan_ss.insertColBefore, handler : this.onInsertColBeforeFn, scope : this }, { iconCls : "icon_insert_col_after", text : lan_ss.insertColAfter, handler : this.onInsertColAfterFn, scope : this }] }); this.insertRangeBtn = new Ext.SplitButton({ iconCls : "icon_ss_insert", iconAlign : "top", scale : "large", text : "  " + lan_common.insert, colspan : 1, rowspan : 3, tooltip : "Insert", handler : this.onInsertRowAboveFn, scope : this, menu : this.insertRangeMenu }); this.dataRangeGroup = new Ext.ButtonGroup({ title : lan_ss.rowColumn, columns : 2, items : [this.insertRangeBtn, this.deleteRangeBtn] }); this.insertChartBtn = new Ext.Button({ iconCls : "icon_ss_insert_chart", iconAlign : "top", rowspan : 3, colspan : 3, scale : "large", text : "  " + lan_common.chart + "  ", tooltip : "Insert Chart", handler : this.onInsertChartFn, scope : this }); this.insertPictureBtn = new Ext.Button({ iconCls : "icon_insert_picture", text : lan_common.image, menu : new Ext.menu.Menu({ items : [{ iconCls : "icon_insert_picture_open", text : lan_ss.selectImage, handler : this.onInsertImageByOpenFn, scope : this }, { iconCls : "icon_insert_picture_link", text : lan_ss.linkImage, menu : { items : [{ xtype : "textarea", width : 300, height : 150, emptyText : "输入图片的网络地址", allowBlank : false, enableKeyEvents : true, listeners : { keydown : { fn : this.onInsertImageByLinkFn, scope : this } } }] } }] }) }); this.insertIncellImageBtn = new Ext.Button({ iconCls : "icon_insert_image", text : lan_ss.incell, tooltip : lan_ss.inCellImage, menu : new Ext.menu.Menu({ items : [{ iconCls : "icon_insert_image_open", text : lan_ss.selectImage, handler : this.onInsertIncellImageByOpenFn, scope : this }, { iconCls : "icon_insert_image_link", text : lan_ss.linkImage, menu : { items : [{ xtype : "textarea", width : 300, height : 150, emptyText : "输入图片的网络地址", allowBlank : false, enableKeyEvents : true, listeners : { keydown : { fn : this.onInsertIncellImageByLinkFn, scope : this } } }] } }] }) }); this.conditionFormatBtn = new Ext.Button({ iconCls : "icon_ss_conditionformat", text : feyaSoft.ss.lang.condition, tooltip : feyaSoft.ss.lang.conditionFormat, handler : this.onConditionFormat, scope : this }); this.insertGroup = new Ext.ButtonGroup({ title : lan_common.insert, columns : 4, items : [this.insertChartBtn, this.insertPictureBtn, this.insertIncellImageBtn, this.conditionFormatBtn] }); this.findReplaceBtn = new Ext.SplitButton({ iconCls : "icon_find32", iconAlign : "top", scale : "large", colspan : 3, rowspan : 3, text : "  " + lan_common.find + "  ", tooltip : lan_common.find_tip, handler : this.onFindFn, scope : this, menu : [{ iconCls : "icon_find", text : lan_common.find, tooltip : lan_common.find_tip, handler : this.onFindFn, scope : this }, { iconCls : "icon_replace", text : lan_common.replace, tooltip : lan_common.replace_tip, handler : this.onReplaceFn, scope : this }] }); this.clearBtn = new Ext.Button({ iconCls : "icon_remove_format", text : feyaSoft.lang.common.clear, menu : [{ text : feyaSoft.lang.common.clearAll, handler : this.onClearAllFn, scope : this }, { text : feyaSoft.lang.common.clearContent, handler : this.onClearContentFn, scope : this }, { text : feyaSoft.word.lang.remove_format, handler : this.onRemoveFormatFn, scope : this }] }); this.commentBtn = new Ext.Button({ iconCls : "icon_comment", text : lan_common.comments, tooltip : "添加/编辑 批注", handler : this.onCommentFn, scope : this }); this.filterItem = new Ext.menu.CheckItem({ checked : false, text : lan_common.filter, tooltip : lan_ss.filter_tip, handler : this.onFilterFn, scope : this }); this.filterBtn = new Ext.Button({ iconCls : "icon_filter_sort", text : lan_common.filter, tooltip : lan_ss.filter_tip, menu : new Ext.menu.Menu({ items : [this.filterItem, { iconCls : "icon_asc", text : lan_ss.asc_tip, handler : this.onAscFn, scope : this }, { iconCls : "icon_desc", text : lan_ss.desc_tip, handler : this.onDescFn, scope : this }], listeners : { show : { fn : this.onFilterMenuShow, scope : this } } }) }); this.findFilterGroup = new Ext.ButtonGroup({ title : lan_ss.findFilter, columns : 4, items : [this.findReplaceBtn, this.filterBtn, this.commentBtn, this.clearBtn] }); this.helpBtn = new Ext.Button({ iconCls : "icon_info32", iconAlign : "top", rowspan : 3, colspan : 3, scale : "large", tooltip : "Help", handler : function() { var newWindow = window .open( "http://www.feyasoft.com/wordPublic?id=waGuAW04a-0_&viewStatus=publicView", "_blank"); newWindow.focus(); }, scope : this }); this.helpGroup = new Ext.ButtonGroup({ title : "  " + lan_common.help, columns : 2, items : [this.helpBtn] }); this.fontFamilyCombo = new Ext.form.ComboBox({ width : 120, colspan : 4, store : new Ext.ss.common.Mask.getFontFamilyStore, displayField : "text", valueField : "id", value : "Arial", typeAhead : true, mode : "local", triggerAction : "all", selectOnFocus : true, tpl : "
{text}
" }); this.fontFamilyCombo.on("select", this.onFontFamilySelectFn, this); this.fontSizeCombo = new Ext.form.ComboBox({ width : 120, minListWidth : 200, colspan : 4, store : Ext.ss.common.Mask.getFontSizeStore(), displayField : "id", valueField : "id", value : "10pt", typeAhead : true, mode : "local", triggerAction : "all", selectOnFocus : true, tpl : "
{id}
" }); this.fontSizeCombo.on("select", this.onFontSizeSelectFn, this); this.boldBtn = new Ext.Button({ iconCls : "icon_bold", tooltip : "加粗", handler : this.onBoldFn, scope : this }); this.italicBtn = new Ext.Button({ iconCls : "icon_italic", tooltip : "斜体", handler : this.onItalicFn, scope : this }); this.underlineBtn = new Ext.Button({ iconCls : "icon_underline", tooltip : "下划线", handler : this.onUnderlineFn, scope : this }); this.strikeBtn = new Ext.Button({ iconCls : "icon_strike", tooltip : "剔除", handler : this.onStrikeFn, scope : this }); this.fontColorPalette = new Ext.ColorPalette({ allowReselect : true }); this.fontColorPalette.on("select", this.onFontColorSelectFn, this); this.fontColorMenu = new Ext.menu.Menu({ items : [this.fontColorPalette] }); this.fontColorBtn = new Ext.SplitButton({ colspan : 1, iconCls : "icon_font_color", iconAlign : top, tooltip : "字体颜色", menu : this.fontColorMenu, handler : this.onFontColorFn, scope : this, listeners : { afterrender : { fn : function(p) { var El = p.getEl(); var bEl = El.child("button"); bEl.setStyle("border-bottom", "4px solid #000000"); } } } }); this.bgColorPalette = new Ext.ColorPalette({ allowReselect : true }); this.bgColorPalette.on("select", this.onBgColorSelectFn, this); this.bgTransparentBtn = new Ext.menu.Item({ text : lan_common.transparent, style : "text-align:center;", handler : this.onBgTransparentFn, scope : this }); this.bgColorMenu = new Ext.menu.Menu({ items : [this.bgTransparentBtn, this.bgColorPalette] }); this.bgColorBtn = new Ext.SplitButton({ colspan : 1, cls : "x-background-color", iconCls : "icon_back_color", tooltip : "背景颜色", menu : this.bgColorMenu, handler : this.onBgColorFn, scope : this, listeners : { afterrender : { fn : function(p) { var El = p.getEl(); var bEl = El.child("button"); bEl.setStyle("border-bottom", "4px solid transparent"); } } } }); this.borderMenu = new Ext.menu.Menu({ items : [{ iconCls : "icon_border_all", text : "所有框线", handler : this.onBorderAllFn, scope : this }, { iconCls : "icon_border_outside", text : "外框线", handler : this.onBorderOutsideFn, scope : this }, { iconCls : "icon_border_inside", text : "内框线", handler : this.onBorderInsideFn, scope : this }, { iconCls : "icon_border_none", text : "无边框", handler : this.onBorderNoneFn, scope : this }, { iconCls : "icon_border_left", text : "左边框", handler : this.onBorderLeftFn, scope : this }, { iconCls : "icon_border_top", text : "上边框", handler : this.onBorderTopFn, scope : this }, { iconCls : "icon_border_right", text : "右边框", handler : this.onBorderRightFn, scope : this }, { iconCls : "icon_border_bottom", text : "下边框", handler : this.onBorderBottomFn, scope : this }] }); this.borderBtn = new Ext.SplitButton({ colspan : 2, iconCls : "icon_border_bottom", tooltip : "Border", menu : this.borderMenu, handler : this.onBorderButtonFn, scope : this }); this.combineBtn = new Ext.Button({ iconCls : "icon_combine_cell", tooltip : "合并单元格", handler : this.onCombineFn, scope : this }); this.wordWrapBtn = new Ext.Button({ iconCls : "icon_wordwrap", tooltip : "自动换行", enableToggle : true, handler : this.onWordWrapFn, scope : this }); this.fontGroup = new Ext.ButtonGroup({ title : lan_common.font, columns : 9, defaults : { scale : "small" }, items : [this.fontFamilyCombo, this.boldBtn, this.fontColorBtn, this.underlineBtn, this.strikeBtn, this.wordWrapBtn, this.fontSizeCombo, this.italicBtn, this.bgColorBtn, this.borderBtn, this.combineBtn] }); this.alignLeftBtn = new Ext.Button({ iconCls : "icon_align_left", tooltip : "左对齐", handler : this.onAlignLeftFn, scope : this }); this.alignCenterBtn = new Ext.Button({ iconCls : "icon_align_center", tooltip : "居中", handler : this.onAlignCenterFn, scope : this }); this.alignRightBtn = new Ext.Button({ iconCls : "icon_align_right", tooltip : "右对齐", handler : this.onAlignRightFn, scope : this }); this.alignTopBtn = new Ext.Button({ iconCls : "icon_align_top", tooltip : "顶端对齐", handler : this.onAlignTopFn, scope : this }); this.alignMiddleBtn = new Ext.Button({ iconCls : "icon_align_middle", tooltip : "垂直居中", handler : this.onAlignMiddleFn, scope : this }); this.alignBottomBtn = new Ext.Button({ iconCls : "icon_align_bottom", tooltip : "底端对齐", handler : this.onAlignBottomFn, scope : this }); this.alignGroup = new Ext.ButtonGroup({ title : lan_common.align, columns : 3, defaults : { scale : "small" }, items : [this.alignLeftBtn, this.alignCenterBtn, this.alignRightBtn, this.alignTopBtn, this.alignMiddleBtn, this.alignBottomBtn] }); this.formatCombo = new Ext.form.ComboBox({ width : 155, minListWidth : 200, colspan : 6, store : new Ext.ss.common.Mask.getFormatStore, tpl : (new Ext.XTemplate([ "
", "{text}
", "{preview}", "
", "
"].join(""))) .compile(), displayField : "text", valueField : "id", value : "regular", typeAhead : true, mode : "local", triggerAction : "all", selectOnFocus : true }); this.formatCombo.on("select", this.onFormatSelect, this); this.moneyBtn = new Ext.SplitButton({ colspan : 1, tooltip : feyaSoft.ss.lang.moneyFormat, iconCls : "icon_money", menu : new Ext.menu.Menu({ defaults : { group : Ext.id() + "-money", checked : false }, items : [{ text : "$ " + lan_ss.usdollar, handler : this.onDollarFn, scope : this }, { text : String.fromCharCode(165) + " " + lan_ss.rmb, handler : this.onRMBFn, scope : this }, { text : String.fromCharCode(8364) + " " + lan_ss.euro, handler : this.onEuroFn, scope : this }, { text : String.fromCharCode(8356) + " " + lan_ss.pound, handler : this.onPoundFn, scope : this }] }), handler : this.onMoneyFn, scope : this }); this.percentBtn = new Ext.Button({ iconCls : "icon_percent", tooltip : feyaSoft.ss.lang.percentFormat, handler : this.onPercentFn, scope : this }); this.commaBtn = new Ext.Button({ iconCls : "icon_comma", tooltip : feyaSoft.ss.lang.commaFormat, handler : this.onCommaFn, scope : this }); this.dotMoveLeftBtn = new Ext.Button({ iconCls : "icon_dot_move_left", tooltip : feyaSoft.ss.lang.moveLeftFormat, handler : this.onDotMoveLeftFn, scope : this }); this.dotMoveRightBtn = new Ext.Button({ iconCls : "icon_dot_move_right", tooltip : feyaSoft.ss.lang.moveRightFormat, handler : this.onDotMoveRightFn, scope : this }); this.initDateFormatMenu(); this.dateBtn = new Ext.Button({ iconCls : "meeting", tooltip : feyaSoft.ss.lang.dateFormat, colspan : 1, menu : this.dateFormatMenu }); this.numberGroup = new Ext.ButtonGroup({ title : lan_common.number, columns : 6, items : [this.formatCombo, this.moneyBtn, this.percentBtn, this.commaBtn, this.dotMoveLeftBtn, this.dotMoveRightBtn, this.dateBtn] }); this.publicBtn = new Ext.Button({ iconCls : "icon_public32", iconAlign : "top", text : lan_common.publicFile, rowspan : 3, scale : "large", tooltip : lan_common.publicFile_tip, handler : this.onPublicReadOnlyFn, scope : this }); this.shareBtn = new Ext.Button({ iconCls : "icon_share32", iconAlign : "top", text : lan_common.shareFile, rowspan : 3, scale : "large", tooltip : lan_common.shareFile_tip, handler : this.onShareFn, scope : this }); var locked = FPROXY.isLocked(this.getFile()); this.lockBtn = new Ext.Button({ disabled : !FPROXY.canChangeLockStatus(this.getFile()), iconCls : locked ? "icon_unlock32" : "icon_lock32", iconAlign : "top", text : locked ? feyaSoft.lang.lock.unlockFile : feyaSoft.lang.lock.lockFile, rowspan : 3, scale : "large", tooltip : feyaSoft.lang.lock.lockFile_tip, handler : this.onLockFn, scope : this }); this.revisionBtn = new Ext.Button({ disabled : !FPROXY.isEditable(this.getFile()) || FPROXY.isLockedForMe(this.getFile()), iconCls : "icon_history32", iconAlign : "top", text : lan_common.history, rowspan : 3, scale : "large", tooltip : lan_common.history_tip, handler : this.onRevisionFn, scope : this }); this.shieldBtn = new Ext.Button({ iconCls : "icon_shield32", iconAlign : "top", text : feyaSoft.lang.common.additionalAccess, rowspan : 3, scale : "large", tooltip : feyaSoft.lang.common.setAccessDesc, handler : this.onShieldFn, scope : this }); this.publicGroup = new Ext.ButtonGroup({ title : lan_common['public'], columns : 5, items : [this.publicBtn, this.shareBtn, this.lockBtn, this.shieldBtn] }); this.fzItem = new Ext.menu.Item({ text : lan_ss.freezeGrid, handler : this.onFreezeFn, scope : this }); this.fzrowItem = new Ext.menu.Item({ text : lan_ss.freeze_first_row, handler : this.onFreezeRowFn, scope : this }); this.fzcolItem = new Ext.menu.Item({ text : lan_ss.freeze_first_col, handler : this.onFreezeColFn, scope : this }); this.freezeMenu = new Ext.menu.Menu({ items : [this.fzItem, this.fzrowItem, this.fzcolItem] }); this.freezeBtn = new Ext.Button({ iconCls : "icon_ss_freeze32", iconAlign : "top", text : lan_ss.freezeGrid, rowspan : 3, colspan : 3, scale : "large", tooltip : lan_ss.freezeGrid, menu : this.freezeMenu }); this.gridLineBtn = new Ext.Button({ iconCls : "icon_border_hide", text : lan_ss.hideGridLine, tooltip : "隐藏/显示网络线", handler : this.onGridLineFn, scope : this }); this.headerFooterBtn = new Ext.SplitButton({ iconCls : "document", text : lan_ss.header_footer, menu : [{ text : lan_ss.editHeadFoot, handler : function() { this.fireEvent("editheadfoot", this); }, scope : this }, { text : lan_ss.showHeadFoot, handler : function() { this.fireEvent("showheadfoot", this); }, scope : this }, { text : lan_ss.hideHeadFoot, handler : function() { this.fireEvent("hideheadfoot", this); }, scope : this }], handler : this.onHeaderFooter, scope : this }); this.splitBtn = new Ext.Button({ iconCls : "icon_ss_split", text : lan_ss.splitGrid, tooltip : "分割表格", handler : this.onSplitFn, scope : this }); this.gridGroup = new Ext.ButtonGroup({ title : lan_ss.grid, columns : 4, items : [this.freezeBtn, this.splitBtn, this.gridLineBtn, this.headerFooterBtn] }); this.importBtn = new Ext.Button({ iconCls : "icon_ss_import32", iconAlign : "top", rowspan : 3, colspan : 3, scale : "large", text : lan_ss.importExcel, tooltip : feyaSoft.lang.file.importExcel, handler : this.onImportExcelFn, scope : this }); this.importGroup = new Ext.ButtonGroup({ title : lan_common['import'], columns : 3, hidden : needHidden, items : [this.importBtn] }); this.exportExcel2007Menu = new Ext.menu.Item({ text : lan_ss.exportExcel2007, iconCls : "excel", handler : function() { feyaSoft.home.LoginCheck(function() { this.onExportExcel2007Fn(); }, this); }, scope : this }); this.exportExcelMenu = new Ext.menu.Item({ text : lan_ss.exportExcel, iconCls : "excel", handler : function() { feyaSoft.home.LoginCheck(function() { this.onExportExcelFn(); }, this); }, scope : this }); this.exportPDFmenu = new Ext.menu.Item({ text : lan_ss.exportPDF, iconCls : "pdf", handler : function() { feyaSoft.home.LoginCheck(function() { this.onExportPDFFn(); }, this); }, scope : this }); this.exportCSVmenu = new Ext.menu.Item({ text : lan_ss.exportCSV, iconCls : "csv", handler : function() { feyaSoft.home.LoginCheck(function() { this.onExportCSVFn(); }, this); }, scope : this }); this.exportHTMLmenu = new Ext.menu.Item({ text : lan_ss.exportHTML, iconCls : "html", handler : function() { feyaSoft.home.LoginCheck(function() { this.onExportHTMLFn(); }, this); }, scope : this }); this.exportMenu = new Ext.menu.Menu({ items : [this.exportExcelMenu,this.exportExcel2007Menu, this.exportCSVmenu, "-", this.exportPDFmenu, this.exportHTMLmenu] }); this.exportBtn = new Ext.Button({ iconCls : "icon_ss_export32", iconAlign : "top", rowspan : 3, colspan : 3, scale : "large", text : "  " + feyaSoft.lang.common['export'] + "  ", menu : this.exportMenu, scope : this }); this.exportGroup = new Ext.ButtonGroup({ title : " " + feyaSoft.lang.common['export'] + " ", columns : 2, items : [this.exportBtn] }); this.restoreBtn = new Ext.Button({ iconCls : "icon_ss_restore32", iconAlign : "top", rowspan : 3, colspan : 3, scale : "large", text : "  " + feyaSoft.lang.common.revision + "  ", handler : this.onRestoreFn, scope : this }); this.restoreGroup = new Ext.ButtonGroup({ hidden : needHidden, title : "  " + feyaSoft.lang.common.revision + "  ", columns : 2, items : [this.restoreBtn] }); this.gridGroup = new Ext.ButtonGroup({ title : lan_ss.grid, columns : 4, items : [this.freezeBtn, this.splitBtn, this.gridLineBtn, this.headerFooterBtn] }); Ext.ss.Toolbar.superclass.constructor.call(this, { cls : "x-ribbon-toolbar", items : [{ title : feyaSoft.lang.common.start, border : false, autoHeight : true, tbar : new Ext.Toolbar({ cls : "x-ribbon-toolbar", enableOverflow : true, items : [this.fileGroup, this.clipGroup, this.fontGroup, this.alignGroup, this.numberGroup, this.formulaGroup, this.dataRangeGroup, this.insertGroup, this.findFilterGroup] }) }, { title : feyaSoft.lang.common.data, border : false, autoHeight : true, tbar : new Ext.Toolbar({ cls : "x-ribbon-toolbar", enableOverflow : true, items : [this.importGroup, this.exportGroup, this.restoreGroup, this.gridGroup] }) }] }); this.addEvents("filesaved", "toolswitch", "lockchanged"); var ss = this.spreadsheet; ss.on("updatepress", this.updatePress, this); ss.on("splitchanged", this.onSplitChangedFn, this); ss.on("freezechanged", this.onFreezeChangedFn, this); this.freezeMenu.on("beforeshow", this.onFreezeMenuShowFn, this); this.on("lockchanged", this.updateToolbarStatus, this); ss.on("freezechanged", function() { var file = this.getFile(); if (file && !file.isTemp) { this.save(null, null, true); } }, this); ss.on("splitchanged", function() { var file = this.getFile(); if (file && !file.isTemp) { this.save(null, null, true); } }, this); }; Ext.extend(Ext.ss.Toolbar, Ext.TabPanel, { createEmptyUrl :basePath+'excel/ResetUI.action', onNewFn : function(isTemplate) { var ss = this.spreadsheet; ss.scontainer.toolbar.saveBtn.setDisabled(false); var file = this.getFile(); var readOnlyView = !FPROXY.isEditable(file); var me = this; var newFn = function() { ss.maskUI("恢复界面,请稍后..."); me.createEmptyFile(function(file) { ss.resetSpreadSheet(); me.setFile(file); file.isTemplate = isTemplate; ss.unmaskUI(); var fileName = feyaSoft.ss.lang.newSpreadsheet; if (isTemplate) { fileName = fileName + " [" + feyaSoft.ss.lang.template + "]"; } ss.scontainer.fireEvent("changetitle", fileName); me.fireEvent("newfile", this); me.backToolbarNormal(); }, me); }; if (!readOnlyView && ss.isChanged()) { Ext.Msg.show({ title : feyaSoft.lang.common.hint, msg : feyaSoft.lang.common.fileChanged, buttons : Ext.Msg.YESNOCANCEL, fn : function(bid) { if ("yes" == bid) { me.save(false, false, false, function() { newFn(); }, me); } else if ("no" == bid) { newFn(); } }, scope : this, icon : Ext.MessageBox.QUESTION }); } else { newFn(); } }, onNewFromTemplateFn : function() { var ss = this.spreadsheet, ds = ss.ds; ss.scontainer.toolbar.saveBtn.setDisabled(false); var me = this; Ext.ux.dialog.OpenDialog.popup(function(fileId, data) { ss.maskUI("加载数据,请稍后..."); var IdField=Ext.getCmp('Id'); fileId = fileId || this.getFileId(); if(IdField){ fileId=IdField.getValue(); } Ext.Ajax.request({ timeout : 300000, url : feyaSoft.home.CONST.spreadSheetUrl.createFileFromTemplate, params : { id : fileId, isTemplate:"false" }, success : function(response) { var me=this; var res=Ext.decode(response.responseText); if(res.success){ ss.maskUI("加载数据,请稍等..."); Ext.Ajax.request({ url :basePath+'Excel/LoadJson', method:'POST', success:function(response,options){ var jsonData = Ext.decode(response.responseText); if (jsonData.success == "true") { if (jsonData.sheets) { var templateName = jsonData.name; ss.chartManager.cleanCharts(); ss.file = jsonData; ss.file.id = jsonData.id; ss.file.isTemp = true; var fr = ss.copyRange(ss.freezeRange); ds.resetModifiedCache(); ds.setSheets(jsonData.sheets, jsonData.extraInfo, jsonData.activeSheet); ss.updateSheetStatus(); ss.reloadUI(fr); ss.scontainer .fireEvent( "changetitle", feyaSoft.ss.lang.newSpreadsheet + " [From 模板: " + templateName + "]"); } ss.unmaskUI(); me.fireEvent("newfile", this); me.backToolbarNormal(); } }, failure:function(response,options){ } }); }else { Ext.Msg.alert('提示','加载失败!请查看条件是否输入正确,月份格式:如201301'); ss.unmaskUI(); } }, scope : me }); }, this, "myXls", true); }, onOpenFn : function(isTemplate) { Ext.ux.dialog.OpenDialog .popup(this.openFile, this, "myXls", isTemplate); }, openCallback : function(response, isTemplate) { var ss = this.spreadsheet, sct = ss.scontainer; var ds = ss.ds; var jsonData = Ext.decode(response.responseText); if(isTemplate){ //不是模板 不让保存 sct.toolbar.saveBtn.setDisabled(true); }else { sct.toolbar.saveBtn.setDisabled(false); } if (jsonData.success == "true") { if (jsonData.sheets) { ss.chartManager.cleanCharts(); ss.file = jsonData; var fr = ss.copyRange(ss.freezeRange); ds.resetModifiedCache(); if(isTemplate!=undefined){ Ext.getCmp('ds_tablename').setValue(jsonData.storename); Ext.getCmp('ds_id').setValue(jsonData.storeid); } ds.setSheets(jsonData.sheets, jsonData.extraInfo, jsonData.activeSheet); ss.updateSheetStatus(); ss.reloadUI(fr); var title = jsonData.name; if (isTemplate) { title += " [" + feyaSoft.ss.lang.template + "]"; } sct.fireEvent("changetitle", title); } if ("MYSELF_REPLACE" !== ss.file.sharing) { this.fireEvent("showeditinglist", new Date, this); } else { this.fireEvent("hideeditinglist", this); } ss.unmaskUI(); } }, /**打开模板*/ openFile : function(fileId, data, isTemplate) { var me = this; var ss = this.spreadsheet; var file = this.getFile(); var readOnlyView = !FPROXY.isEditable(file); var ColCondition=null; var CellCondition=null; var opentemplate=isTemplate?isTemplate:false; var IdField=Ext.getCmp('Id'); fileId = fileId || this.getFileId(); if(IdField){ fileId=IdField.getValue(); } var loadFn = function(condition) { ss.maskUI("加载数据,请稍等..."); Ext.Ajax.request({ timeout : 300000, url : feyaSoft.home.CONST.spreadSheetUrl.loadJson, params : { id : fileId, colcondition:ColCondition, cellcondition:CellCondition, isTemplate:opentemplate }, success : function(response, options) { var me=this; var res=Ext.decode(response.responseText); if(res.success){ ss.maskUI("加载数据,请稍等..."); Ext.Ajax.request({ url :basePath+'Excel/LoadJson', method:'POST', success:function(response,options){ me.openCallback(response, isTemplate); }, failure:function(response,options){ } }); }else { Ext.Msg.alert('提示','加载失败!请查看条件是否输入正确,月份格式:如201301'); ss.unmaskUI(); } }, failure : function(response, options) { var backObj = Ext.decode(response.responseText); ss.unmaskUI(); }, scope : me }); }; var openFn = function() { var me=this; //打开之前先判断是否有条件 if(isTemplate){ var Id=Ext.getCmp('Id').getValue(); Ext.Ajax.request({ timeout : 300000, url : feyaSoft.home.CONST.documentUrl.ishaveCondition, params : { id : Id }, success:function(response,options){ var rec=Ext.decode(response.responseText); if(rec.havecondition){ //存在条件 Ext.Ajax.request({//拿到form的items url : basePath +'excel/getTemplateCondition.action', params : { id : Id }, method : 'post', callback : function(options,success,response){ var res = new Ext.decode(response.responseText); if(res.exceptionInfo != null){ showError(res.exceptionInfo);return; } var items=res.items; var form=new Ext.FormPanel({ id:'excelform', //anchor:'100% 100%', frame:true, layout:'form', bodyStyle:'padding:5px 5px 0', defaults: { autoScroll:true, margins:{ top: 5, right: 5, bottom: 5, left: 5 } }, autoScroll : true, defaultType : 'textfield', labelSeparator : '', buttonAlign : 'center', items:items, title:res.title }); var win = new Ext.Window({ id : 'win', title: '条件', height: "500", width: "700", maximizable : true, buttonAlign : 'center', layout : 'fit', items: form, buttons : [{ text : '提交', iconCls: 'x-button-icon-close', handler : function(){ var items= Ext.getCmp('excelform').items.items; var colarr=""; var cellarr="" for(var i=0;i"; } scontainer.fireEvent("changetitle", name); delete file.isTemp; ds.disableCallingBackEnd = false; delete file.isFake; delete file.onceChanged; ss.unmaskUI(feyaSoft.ss.lang.saved + " " + feyaSoft.lang.common.at + " " + (new Date) .format("H:i:s d/m Y")); if (callback) { callback.call(scope); } }, this, true); } else { ss.unmaskUI(); if (json.info == "relogin") { new feyaSoft.home.Login; } else { Ext.MessageBox.alert( feyaSoft.lang.common.error, json.info); } ss.unmaskUI(); if (callback) { callback.call(scope); } } }, scope : this }); } } else { var param = { oldFileId : file.id, folderId : folderId, name : name }; var url = feyaSoft.home.CONST.spreadSheetUrl.saveAs; if (isTemplate) { param.isTemplate = isTemplate; } if (file.isFake) { param = { folderId : folderId, name : name }; Ext.apply(param, this.prepareSheetsForSave(ds .getSheets())); param.sheets = Ext.encode(param.sheets); var datastoretablename=Ext.getCmp('ds_tablename').getValue(); var datastoreid=Ext.getCmp('ds_id').getValue(); if(!datastoretablename) return; param.tablename=datastoretablename; param.dsId=datastoreid; url = feyaSoft.home.CONST.spreadSheetUrl.saveJsonAs; param = { inJson : Ext.encode(param) }; } Ext.Ajax.request({ timeout : 300000, url : url, params : param, success : function(response) { var json = Ext.decode(response.responseText); if ("true" == json.success) { ss.updateFile(json.id, name, json.tabIds); ds.saveChanges(function() { var scontainer = ss.scontainer; if (isTemplate) { name += "[Template]"; } scontainer.fireEvent("changetitle", name); delete file.isTemp; ds.disableCallingBackEnd = false; delete file.isFake; delete file.onceChanged; ss.unmaskUI(feyaSoft.ss.lang.saved + " " + feyaSoft.lang.common.at + " " + (new Date).format("H:i:s d/m Y")); }, this, true); } else { ss.unmaskUI(); Ext.MessageBox.alert( '提示', '保存成功'); ss.unmaskUI(); } if (callback) { callback.call(scope); } }, scope : this }); } }, this, "myXls", isTemplate); } else { if (!silent) { ss.maskUI(feyaSoft.ss.lang.saveChanges); } FPROXY.checkLockStatus(file.id, function(lockedForMe, data) { var lanLock = feyaSoft.lang.lock, text; Ext.apply(file, data); if (lockedForMe == null) { ss.unmaskUI(); } else if (lockedForMe) { text = lanLock.lockedBy + " [" + file.lockedBy + "], " + lanLock.notChange; Ext.Msg.alert(feyaSoft.lang.common.Hint, text); ss.unmaskUI(); ds.resetModifiedCache(); if (callback) { callback.call(scope); } } else { ds.saveChanges(function() { ss.unmaskUI(feyaSoft.ss.lang.saved + " " + feyaSoft.lang.common.at + " " + (new Date) .format("H:i:s d/m Y")); if (callback) { callback.call(scope); } }, this, true); } }, this); } }, onSaveFn : function() { this.save(); }, onSaveAsFn : function() { var file = this.getFile(); delete file.isTemplate; this.save(null, true); }, onSaveTemplateAsFn : function() { this.save(null, true, null, null, null, true); }, onCutFn : function() { this.spreadsheet.contextmenu.onCutFn(); }, onCopyFn : function() { this.spreadsheet.contextmenu.onCopyFn(); }, onPasteFn : function() { this.spreadsheet.contextmenu.onPasteFn(); }, onPasteValueFn : function() { Ext.util.GlobalBoard.getBoard().paste2Fn(this.spreadsheet, ".ss", "value"); }, onPasteStyleFn : function() { Ext.util.GlobalBoard.getBoard().paste2Fn(this.spreadsheet, ".ss", "style"); }, onPasteContentFn : function() { Ext.util.GlobalBoard.getBoard().paste2Fn(this.spreadsheet, ".ss", "content"); }, onPasteTransposeFn : function() { Ext.util.GlobalBoard.getBoard().paste2Fn(this.spreadsheet, ".ss", "transpose"); }, onFindFn : function() { this.spreadsheet.hotkey.onFindFn(); }, onReplaceFn : function() { this.spreadsheet.hotkey.onReplaceFn(); }, onCommentFn : function() { var ss = this.spreadsheet; var sm = ss.sm; var focusCell = sm.focusCell; var x = focusCell.x, y = focusCell.y; var tEl = ss.getCellEl(x, y, sm.posFlag); if (tEl) { if (!tEl.hasClass(Ext.ss.CONST.cssHash[3])) { this.spreadsheet.contextmenu.onAddCommentFn(); } else { this.spreadsheet.contextmenu.onEditCommentFn(); } } }, applyFunction : function(name) { var ss = this.spreadsheet; var sm = ss.sm; var ds = ss.ds; var drSelector = ss.dataRangeSelector; var rpos = Ext.apply({}, sm.focusCell); sm.fireEvent("formulaeditingchanged", false, true, true); drSelector.popup(null, "", function(v, dataRange) { var data = "=" + name + "(" + v + ")"; ss.editor.resize2FitText(data, rpos); ds.trace(feyaSoft.ss.lang.action_apply_function(ds .getNameFromPos(rpos))); sm.fireEvent("formulaeditingchanged", true, false, true); sm.fireEvent("renderborder"); ss.updateStatus(rpos.x, rpos.y); }, this, "local"); }, onSumFn : function() { this.applyFunction("sum"); }, onAverageFn : function() { this.applyFunction("average"); }, onCountFn : function() { this.applyFunction("count"); }, onMinFn : function() { this.applyFunction("min"); }, onMaxFn : function() { this.applyFunction("max"); }, onOtherFn : function() { }, onBoldFn : function(btn) { if (btn && btn.el.hasClass("x-btn-pressed")) { btn.el.removeClass("x-btn-pressed"); this.applyAttribute([["b", ""]]); } else { btn.el.addClass("x-btn-pressed"); this.applyAttribute([["b", ""]]); } }, onItalicFn : function(btn) { if (btn && btn.el.hasClass("x-btn-pressed")) { btn.el.removeClass("x-btn-pressed"); this.applyAttribute([["i", ""]]); } else { btn.el.addClass("x-btn-pressed"); this.applyAttribute([["i", ""]]); } }, onUnderlineFn : function(btn) { if (btn && btn.el.hasClass("x-btn-pressed")) { btn.el.removeClass("x-btn-pressed"); this.applyAttribute([["u", ""]]); } else { btn.el.addClass("x-btn-pressed"); this.applyAttribute([["u", ""]]); } }, onStrikeFn : function(btn) { if (btn && btn.el.hasClass("x-btn-pressed")) { btn.el.removeClass("x-btn-pressed"); this.applyAttribute([["s", ""]]); } else { btn.el.addClass("x-btn-pressed"); this.applyAttribute([["s", ""]]); } }, applyBgStyle : function(sn, sv) { var ss = this.spreadsheet; var fr = ss.freezeRange, sr = ss.showRange; var sm = ss.sm; var ds = ss.ds; var rs = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minPos = rs.minPos, maxPos = rs.maxPos; var minx = minPos.x, miny = minPos.y, maxx = maxPos.x, maxy = maxPos.y; if ("transparent" == sv) { sv = ""; } if (0 == minx && 0 == maxx && 0 == miny && 0 == maxy) { ds.fireEvent("wholeattributechange", [["bg", sv]]); for (var y = fr.col.start; y <= fr.col.end; y++) { for (var x = fr.row.start; x <= fr.row.end; x++) { var tds = ss.getCellTdHEls(x, y); var bg = ds.getCell(x, y).bg; if (tds) { for (var i = 0, len = tds.length; i < len; i++) { var td = tds[i]; td.style.backgroundColor = bg; } } } for (var x = sr.row.start; x <= sr.row.end; x++) { var tds = ss.getCellTdHEls(x, y); var bg = ds.getCell(x, y).bg; if (tds) { for (var i = 0, len = tds.length; i < len; i++) { var td = tds[i]; td.style.backgroundColor = bg; } } } } for (var y = sr.col.start; y <= sr.col.end; y++) { for (var x = fr.row.start; x <= fr.row.end; x++) { var tds = ss.getCellTdHEls(x, y); var bg = ds.getCell(x, y).bg; if (tds) { for (var i = 0, len = tds.length; i < len; i++) { var td = tds[i]; td.style.backgroundColor = bg; } } } for (var x = sr.row.start; x <= sr.row.end; x++) { var tds = ss.getCellTdHEls(x, y); var bg = ds.getCell(x, y).bg; if (tds) { for (var i = 0, len = tds.length; i < len; i++) { var td = tds[i]; td.style.backgroundColor = bg; } } } } } else if (0 == minx && 0 == maxx) { for (var y = miny; y <= maxy; y++) { ds.fireEvent("colattributechange", y, [["bg", sv]]); for (var x = fr.row.start; x <= fr.row.end; x++) { var tds = ss.getCellTdHEls(x, y); var bg = ds.getCell(x, y).bg; if (tds) { for (var i = 0, len = tds.length; i < len; i++) { var td = tds[i]; td.style.backgroundColor = bg; } } } for (var x = sr.row.start; x <= sr.row.end; x++) { var tds = ss.getCellTdHEls(x, y); var bg = ds.getCell(x, y).bg; if (tds) { for (var i = 0, len = tds.length; i < len; i++) { var td = tds[i]; td.style.backgroundColor = bg; } } } } } else if (0 == miny && 0 == maxy) { for (var x = minx; x <= maxx; x++) { ds.fireEvent("rowattributechange", x, [["bg", sv]]); for (var y = fr.col.start; y <= fr.col.end; y++) { var tds = ss.getCellTdHEls(x, y); var bg = ds.getCell(x, y).bg; if (tds) { for (var i = 0, len = tds.length; i < len; i++) { var td = tds[i]; td.style.backgroundColor = bg; } } } for (var y = sr.col.start; y <= sr.col.end; y++) { var tds = ss.getCellTdHEls(x, y); var bg = ds.getCell(x, y).bg; if (tds) { for (var i = 0, len = tds.length; i < len; i++) { var td = tds[i]; td.style.backgroundColor = bg; } } } } } else { for (var x = minx; x <= maxx; x++) { for (var y = miny; y <= maxy; y++) { ds.fireEvent("attributechange", x, y, [["bg", sv]]); var tds = ss.getCellTdHEls(x, y); var bg = ds.getCell(x, y).bg; if (tds) { for (var i = 0, len = tds.length; i < len; i++) { var td = tds[i]; td.style.backgroundColor = bg; } } } } } ds.trace(feyaSoft.ss.lang.action_change_background); sm.transferFocus(); }, getStyle : function(style, sn) { var m; if ("text-align" == sn) { m = style.match(/text-align:[^;]+;/); } else if ("color" == sn) { m = style.match(/color:[^;]+;/); } else if ("font-family" == sn) { m = style.match(/font-family:[^;]+;/); } else if ("font-size" == sn) { m = style.match(/font-size:[^;]+;/); } else if ("background-color" == sn) { m = style.match(/background-color:[^;]+;/); } return m; }, getStyleValue : function(style, sn) { var str = this.getStyle(style, sn); if (str) { var parts = str.toString().split(":"); return parts[1].split(";")[0]; } }, updateStyle : function(style, sn, sv) { var str = sn + ":" + sv + ";"; if (style && "" !== style) { var m, n, str1 = ""; m = this.getStyle(style, sn); if ("font-size" == sn) { n = style.match(/line-height:[^;]+;/); str1 = "line-height:" + sv + ";"; } if (m) { var s = style.replace(m, str); if (n) { s = s.replace(n, str1); } return s; } else { return style + str + str1; } } else { var str1 = ""; if ("font-size" == sn) { str1 = "line-height:" + sv + ";"; } return str + str1; } }, applyAttribute : function(pairs, skipTrace) { var ss = this.spreadsheet; var fr = ss.freezeRange, sr = ss.showRange; var sm = ss.sm; var ds = ss.ds; var rs = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minPos = rs.minPos, maxPos = rs.maxPos; var minx = minPos.x, miny = minPos.y, maxx = maxPos.x, maxy = maxPos.y; if (0 == minx && 0 == maxx && 0 == miny && 0 == maxy) { ds.fireEvent("wholeattributechange", pairs); ss.renderRange(fr, sr, null, true); } else if (0 == minx && 0 == maxx) { for (var y = miny; y <= maxy; y++) { ds.fireEvent("colattributechange", y, pairs); for (var x = fr.row.start; x <= fr.row.end; x++) { var El = ss.getCellEl(x, y); if (El) { var obj = ds.getCell(x, y); Ext.apply(obj, { x : x, y : y }); ss.refreshCell(obj); } } for (var x = sr.row.start; x <= sr.row.end; x++) { var El = ss.getCellEl(x, y); if (El) { var obj = ds.getCell(x, y); Ext.apply(obj, { x : x, y : y }); ss.refreshCell(obj); } } } } else if (0 == miny && 0 == maxy) { for (var x = minx; x <= maxx; x++) { ds.fireEvent("rowattributechange", x, pairs); for (var y = fr.col.start; y <= fr.col.end; y++) { var El = ss.getCellEl(x, y); if (El) { var obj = ds.getCell(x, y); Ext.apply(obj, { x : x, y : y }); ss.refreshCell(obj); } } for (var y = sr.col.start; y <= sr.col.end; y++) { var El = ss.getCellEl(x, y); if (El) { var obj = ds.getCell(x, y); Ext.apply(obj, { x : x, y : y }); ss.refreshCell(obj); } } } } else { for (var x = minx; x <= maxx; x++) { for (var y = miny; y <= maxy; y++) { ds.fireEvent("attributechange", x, y, pairs); var El = ss.getCellEl(x, y); if (El) { var obj = ds.getCell(x, y); Ext.apply(obj, { x : x, y : y }); ss.refreshCell(obj); } } } } if (!skipTrace) { ds.trace(feyaSoft.ss.lang.action_change_attribute); } sm.transferFocus(); }, clearAlginPress : function(flag) { if (true === flag) { this.alignTopBtn.removeClass("x-btn-pressed"); this.alignMiddleBtn.removeClass("x-btn-pressed"); this.alignBottomBtn.removeClass("x-btn-pressed"); } else { this.alignLeftBtn.removeClass("x-btn-pressed"); this.alignCenterBtn.removeClass("x-btn-pressed"); this.alignRightBtn.removeClass("x-btn-pressed"); } }, onAlignLeftFn : function(btn) { this.clearAlginPress(); btn.el.addClass("x-btn-pressed"); this.applyAttribute([["text-align", "text-align:left;"]]); }, onAlignCenterFn : function(btn) { this.clearAlginPress(); btn.el.addClass("x-btn-pressed"); this.applyAttribute([["text-align", "text-align:center;"]]); }, onAlignRightFn : function(btn) { this.clearAlginPress(); btn.el.addClass("x-btn-pressed"); this.applyAttribute([["text-align", "text-align:right;"]]); }, onAlignMiddleFn : function(btn) { this.clearAlginPress(true); btn.el.addClass("x-btn-pressed"); this.applyAttribute([["align", "middle"]]); }, onAlignTopFn : function(btn) { this.clearAlginPress(true); btn.el.addClass("x-btn-pressed"); this.applyAttribute([["align", "top"]]); }, onAlignBottomFn : function(btn) { this.clearAlginPress(true); btn.el.addClass("x-btn-pressed"); this.applyAttribute([["align", "bottom"]]); }, sortSelection : function(dir) { var lan_com = feyaSoft.lang.common; var lan_ss = feyaSoft.ss.lang; var ss = this.spreadsheet; ss.resetCutStatus(); var ds = ss.ds; var sm = ss.sm; var rs = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rs.minPos.x, miny = rs.minPos.y, maxx = rs.maxPos.x, maxy = rs.maxPos.y; if (!(minx == maxx && miny == maxy && 0 != minx) && !(0 == miny && 0 == maxy)) { var flag = ds.sortRange(minx, miny, maxx, maxy, dir); if (!flag) { Ext.Msg.show({ title : lan_com.notice, msg : lan_ss.canNotSortMerge, buttons : Ext.Msg.OK, icon : Ext.MessageBox.INFO }); return; } ss.renderRange(ss.freezeRange, ss.showRange, null, true); ds.trace(1 == dir ? feyaSoft.ss.lang.action_sort_asc : feyaSoft.ss.lang.action_sort_desc); } sm.transferFocus(); }, onAscFn : function() { this.sortSelection(1); }, onDescFn : function() { this.sortSelection(-1); }, onCloseFn : function() { var ss = this.spreadsheet; ss.scontainer.fireEvent("closewindow"); var sm = ss.sm; }, onBgTransparentFn : function() { var El = this.bgColorBtn.getEl(); var bEl = El.child("button"); if (bEl) { bEl.setStyle("border-bottom-color", "transparent"); this.applyBgStyle("border-bottom-color", "transparent"); } }, onBgColorFn : function() { var El = this.bgColorBtn.getEl(); var bEl = El.child("button"); if (bEl) { var color = bEl.getStyle("border-bottom-color"); this.applyBgStyle("background-color", color); } }, onBgColorSelectFn : function(cp, color) { var El = this.bgColorBtn.getEl(); var bEl = El.child("button"); if (bEl) { bEl.setStyle("border-bottom", "4px solid #" + color); this.applyBgStyle("background-color", "#" + color); } this.bgColorMenu.hide(); }, onFontColorFn : function() { var El = this.fontColorBtn.getEl(); var bEl = El.child("button"); if (bEl) { var color = bEl.getStyle("border-bottom-color"); this.applyAttribute([["color", "color:" + color + ";"]]); } }, onFontColorSelectFn : function(cp, color) { var El = this.fontColorBtn.getEl(); var bEl = El.child("button"); if (bEl) { bEl.setStyle("border-bottom", "4px solid #" + color); this.applyAttribute([["color", "color:#" + color + ";"]]); } this.fontColorMenu.hide(); }, onFontFamilySelectFn : function(combo, rd, index) { var ff = rd.data.id; this.applyAttribute([["font-family", "font-family:" + ff + ";"]]); }, onFontSizeSelectFn : function(combo, rd, index) { var fs = rd.data.id; this.applyAttribute([["font-size", "font-size:" + fs + ";line-height:" + fs + ";"]], true); var ss = this.spreadsheet; var editor = ss.editor, sm = ss.sm, ds = ss.ds; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; for (var i = minx; i < maxx; i++) { editor.fitRow(i, true, true); } editor.fitRow(maxx, true); ds.trace(feyaSoft.ss.lang.action_change_attribute); }, onBorderButtonFn : function(btn) { var iconCls = btn.iconCls; this.borderMenu.items.each(function(it) { if (iconCls == it.iconCls) { it.handler.call(this, it); return; } }, this); }, onBorderAllFn : function(mBtn) { this.borderBtn.setIconClass(mBtn.iconCls); var ss = this.spreadsheet; var fr = ss.freezeRange, sr = ss.showRange; var sm = ss.sm; var ds = ss.ds; var rows = ds.data.rows; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; if (0 == minx && 0 == maxx && 0 == miny && 0 == maxy) { ds.fireEvent("wholeattributechange", [ ["br", "x-spreadsheet-right-black"], ["bb", "x-spreadsheet-bottom-black"]]); ss.renderRange(fr, sr, null, true); } else if (0 == minx && 0 == maxx) { ds.fireEvent("colattributechange", miny - 1, [["br", "x-spreadsheet-right-black"]]); for (var j = miny; j <= maxy; j++) { ds.fireEvent("colattributechange", j, [ ["br", "x-spreadsheet-right-black"], ["bb", "x-spreadsheet-bottom-black"]]); } ss.renderRange(fr, sr, null, true); } else if (0 == miny && 0 == maxy) { ds.fireEvent("rowattributechange", minx - 1, [["bb", "x-spreadsheet-bottom-black"]]); for (var i = minx; i <= maxx; i++) { ds.fireEvent("rowattributechange", i, [ ["br", "x-spreadsheet-right-black"], ["bb", "x-spreadsheet-bottom-black"]]); } ss.renderRange(fr, sr, null, true); } else { for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= maxy; j++) { var wrap = null; if (rows[i] && rows[i][j]) { wrap = rows[i][j].wrap; } if (i == minx && 1 < i) { var x = i - 1, y = j; ds.fireEvent("attributechange", x, y, [["bb", "x-spreadsheet-bottom-black"]]); } if (j == miny && 1 < j) { var x = i, y = j - 1; ds.fireEvent("attributechange", x, y, [["br", "x-spreadsheet-right-black"]]); } if (wrap) { var br = null, bb = null; if (j == wrap.maxy) { br = "x-spreadsheet-right-black"; } if (i == wrap.maxx) { bb = "x-spreadsheet-bottom-black"; } var pairs = []; if (br) { pairs.push(["br", br]); } if (bb) { pairs.push(["bb", bb]); } if (0 < pairs.length) { ds.fireEvent("attributechange", i, j, pairs); } } else { ds.fireEvent("attributechange", i, j, [ ["br", "x-spreadsheet-right-black"], ["bb", "x-spreadsheet-bottom-black"]]); } } } ss.renderRange(fr, sr, null, true); } ds.trace(feyaSoft.ss.lang.action_border_all); sm.transferFocus(); }, onBorderOutsideFn : function(mBtn) { this.borderBtn.setIconClass(mBtn.iconCls); var ss = this.spreadsheet; var fr = ss.freezeRange, sr = ss.showRange; var sm = ss.sm; var ds = ss.ds; var rows = ds.data.rows; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; if (0 == minx && 0 == maxx && 0 == miny && 0 == maxy) { } else if (0 == minx && 0 == maxx) { } else if (0 == miny && 0 == maxy) { } else { for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= maxy; j++) { var wrap = null; if (rows[i] && rows[i][j]) { wrap = rows[i][j].wrap; } if (i == minx && 1 < i) { var x = i - 1, y = j; ds.fireEvent("attributechange", x, y, [["bb", "x-spreadsheet-bottom-black"]]); } if (j == miny && 1 < j) { var x = i, y = j - 1; ds.fireEvent("attributechange", x, y, [["br", "x-spreadsheet-right-black"]]); } if (wrap) { var br = null, bb = null; if (j == wrap.maxy) { if (j == maxy) { br = "x-spreadsheet-right-black"; } } if (i == wrap.maxx) { if (i == maxx) { bb = "x-spreadsheet-bottom-black"; } } var pairs = []; if (br) { pairs.push(["br", br]); } if (bb) { pairs.push(["bb", bb]); } if (0 < pairs.length) { ds.fireEvent("attributechange", i, j, pairs); } } else { var br = null, bb = null; if (j == maxy) { br = "x-spreadsheet-right-black"; } if (i == maxx) { bb = "x-spreadsheet-bottom-black"; } var pairs = []; if (br) { pairs.push(["br", br]); } if (bb) { pairs.push(["bb", bb]); } if (0 < pairs.length) { ds.fireEvent("attributechange", i, j, pairs); } } } } ss.renderRange(fr, sr, null, true); } ds.trace(feyaSoft.ss.lang.action_border_outside); sm.transferFocus(); }, onBorderInsideFn : function(mBtn) { this.borderBtn.setIconClass(mBtn.iconCls); var ss = this.spreadsheet; var fr = ss.freezeRange, sr = ss.showRange; var sm = ss.sm; var ds = ss.ds; var rows = ds.data.rows; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; if (0 == minx && 0 == maxx && 0 == miny && 0 == maxy) { } else if (0 == minx && 0 == maxx) { } else if (0 == miny && 0 == maxy) { } else { for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= maxy; j++) { var wrap = null; if (rows[i] && rows[i][j]) { wrap = rows[i][j].wrap; } if (wrap) { var br = null, bb = null; if (j == wrap.maxy) { if (j != maxy) { br = "x-spreadsheet-right-black"; } } if (i == wrap.maxx) { if (i != maxx) { bb = "x-spreadsheet-bottom-black"; } } var pairs = []; if (br) { pairs.push(["br", br]); } if (bb) { pairs.push(["bb", bb]); } if (0 < pairs.length) { ds.fireEvent("attributechange", i, j, pairs); } } else { var br = null, bb = null; if (j != maxy) { br = "x-spreadsheet-right-black"; } if (i != maxx) { bb = "x-spreadsheet-bottom-black"; } var pairs = []; if (br) { pairs.push(["br", br]); } if (bb) { pairs.push(["bb", bb]); } if (0 < pairs.length) { ds.fireEvent("attributechange", i, j, pairs); } } } } ss.renderRange(fr, sr, null, true); } ds.trace(feyaSoft.ss.lang.action_border_in); sm.transferFocus(); }, onBorderNoneFn : function(mBtn) { this.borderBtn.setIconClass(mBtn.iconCls); var ss = this.spreadsheet; var fr = ss.freezeRange, sr = ss.showRange; var sm = ss.sm; var ds = ss.ds; var rows = ds.data.rows; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; if (0 == minx && 0 == maxx && 0 == miny && 0 == maxy) { ds.fireEvent("wholeattributechange", [["br", ""], ["bb", ""]]); ss.renderRange(fr, sr, null, true); } else if (0 == minx && 0 == maxx) { ds.fireEvent("colattributechange", miny - 1, [["br", ""]]); for (var j = miny; j <= maxy; j++) { ds.fireEvent("colattributechange", j, [["br", ""], ["bb", ""]]); } ss.renderRange(fr, sr, null, true); } else if (0 == miny && 0 == maxy) { ds.fireEvent("rowattributechange", minx - 1, [["bb", ""]]); for (var i = minx; i <= maxx; i++) { ds.fireEvent("rowattributechange", i, [["br", ""], ["bb", ""]]); } ss.renderRange(fr, sr, null, true); } else { for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= maxy; j++) { var wrap = null; if (rows[i] && rows[i][j]) { wrap = rows[i][j].wrap; } if (i == minx && 1 < i && fr.row.end != i - 1) { var x = i - 1, y = j; ds.fireEvent("attributechange", x, y, [["bb", "x-spreadsheet-bottom-silver"]]); } if (j == miny && 1 < j && fr.col.end != j - 1) { var x = i, y = j - 1; ds.fireEvent("attributechange", x, y, [["br", "x-spreadsheet-right-silver"]]); } if (wrap) { var br = null, bb = null; if (j == wrap.maxy && j != fr.col.end) { br = "x-spreadsheet-right-silver"; } if (i == wrap.maxx && i != fr.row.end) { bb = "x-spreadsheet-bottom-silver"; } var pairs = []; if (br) { pairs.push(["br", br]); } if (bb) { pairs.push(["bb", bb]); } if (0 < pairs.length) { ds.fireEvent("attributechange", i, j, pairs); } } else { ds.fireEvent("attributechange", i, j, [ ["br", "x-spreadsheet-right-silver"], ["bb", "x-spreadsheet-bottom-silver"]]); } } } ss.renderRange(fr, sr, null, true); } ds.trace(feyaSoft.ss.lang.action_border_none); sm.transferFocus(); }, onBorderLeftFn : function(mBtn) { this.borderBtn.setIconClass(mBtn.iconCls); var ss = this.spreadsheet; var fr = ss.freezeRange, sr = ss.showRange; var sm = ss.sm; var ds = ss.ds; var rows = ds.data.rows; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; if (0 == minx && 0 == maxx && 0 == miny && 0 == maxy) { ds.fireEvent("wholeattributechange", [["br", "x-spreadsheet-right-black"]]); ss.renderRange(fr, sr, null, true); } else if (0 == minx && 0 == maxx) { ds.fireEvent("colattributechange", miny - 1, [["br", "x-spreadsheet-right-black"]]); ss.renderRange(fr, sr, null, true); } else if (0 == miny && 0 == maxy) { } else { for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= miny; j++) { var x = i, y = miny - 1; ds.fireEvent("attributechange", x, y, [["br", "x-spreadsheet-right-black"]]); } } ss.renderRange(fr, sr, null, true); } ds.trace(feyaSoft.ss.lang.action_border_left); sm.transferFocus(); }, onBorderTopFn : function(mBtn) { this.borderBtn.setIconClass(mBtn.iconCls); var ss = this.spreadsheet; var fr = ss.freezeRange, sr = ss.showRange; var sm = ss.sm; var ds = ss.ds; var rows = ds.data.rows; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; if (0 == minx && 0 == maxx && 0 == miny && 0 == maxy) { ds.fireEvent("wholeattributechange", [["bb", "x-spreadsheet-bottom-black"]]); ss.renderRange(fr, sr, null, true); } else if (0 == minx && 0 == maxx) { } else if (0 == miny && 0 == maxy) { ds.fireEvent("rowattributechange", minx - 1, [["bb", "x-spreadsheet-bottom-black"]]); ss.renderRange(fr, sr, null, true); } else { for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= maxy; j++) { var x = minx - 1, y = j; ds.fireEvent("attributechange", x, y, [["bb", "x-spreadsheet-bottom-black"]]); } } ss.renderRange(fr, sr, null, true); } ds.trace(feyaSoft.ss.lang.action_border_top); sm.transferFocus(); }, onBorderRightFn : function(mBtn) { this.borderBtn.setIconClass(mBtn.iconCls); var ss = this.spreadsheet; var fr = ss.freezeRange, sr = ss.showRange; var sm = ss.sm; var ds = ss.ds; var rows = ds.data.rows; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; if (0 == minx && 0 == maxx && 0 == miny && 0 == maxy) { ds.fireEvent("wholeattributechange", [["br", "x-spreadsheet-right-black"]]); ss.renderRange(fr, sr, null, true); } else if (0 == minx && 0 == maxx) { ds.fireEvent("colattributechange", maxy, [["br", "x-spreadsheet-right-black"]]); ss.renderRange(fr, sr, null, true); } else if (0 == miny && 0 == maxy) { } else { for (var i = minx; i <= maxx; i++) { ds.fireEvent("attributechange", i, maxy, [["br", "x-spreadsheet-right-black"]]); } ss.renderRange(fr, sr, null, true); } ds.trace(feyaSoft.ss.lang.action_border_right); sm.transferFocus(); }, onBorderBottomFn : function(mBtn) { this.borderBtn.setIconClass(mBtn.iconCls); var ss = this.spreadsheet; var fr = ss.freezeRange, sr = ss.showRange; var sm = ss.sm; var ds = ss.ds; var rows = ds.data.rows; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; if (0 == minx && 0 == maxx && 0 == miny && 0 == maxy) { ds.fireEvent("wholeattributechange", [["bb", "x-spreadsheet-bottom-black"]]); ss.renderRange(fr, sr, null, true); } else if (0 == minx && 0 == maxx) { } else if (0 == miny && 0 == maxy) { ds.fireEvent("rowattributechange", maxx, [["bb", "x-spreadsheet-bottom-black"]]); ss.renderRange(fr, sr, null, true); } else { for (var j = miny; j <= maxy; j++) { ds.fireEvent("attributechange", maxx, j, [["bb", "x-spreadsheet-bottom-black"]]); } ss.renderRange(fr, sr, null, true); } ds.trace(feyaSoft.ss.lang.action_border_bottom); sm.transferFocus(); }, onInsertRowAboveFn : function() { var ss = this.spreadsheet; var ds = ss.ds; var sm = ss.sm; ds.insertRow(sm.focusCell.x, "above"); ss.renderRange(ss.freezeRange, ss.showRange, true); sm.selectedStart.x++; sm.selectedEnd.x++; sm.focusCell.x++; sm.fireEvent("renderborder"); ds.trace(feyaSoft.ss.lang.action_insert_row_above(sm.focusCell.x)); sm.transferFocus(); }, onInsertRowBelowFn : function() { var ss = this.spreadsheet; var ds = ss.ds; var sm = ss.sm; var x = sm.focusCell.x, y = sm.focusCell.y; ds.insertRow(x); ss.renderRange(ss.freezeRange, ss.showRange, true); if (ds.isWraped(x, y)) { sm.selectedEnd.x++; } sm.fireEvent("renderborder"); ds.trace(feyaSoft.ss.lang.action_insert_row_below(sm.focusCell.x)); sm.transferFocus(); }, onInsertColBeforeFn : function() { var ss = this.spreadsheet; var ds = ss.ds; var sm = ss.sm; ds.insertCol(sm.focusCell.y, "before"); ss.renderRange(ss.freezeRange, ss.showRange, true); sm.selectedStart.y++; sm.selectedEnd.y++; sm.focusCell.y++; sm.fireEvent("renderborder"); ds.trace(feyaSoft.ss.lang.action_insert_col_before(ds .getLetter(sm.focusCell.y))); sm.transferFocus(); }, onInsertColAfterFn : function() { var ss = this.spreadsheet; var ds = ss.ds; var sm = ss.sm; var x = sm.focusCell.x, y = sm.focusCell.y; ds.insertCol(y); ss.renderRange(ss.freezeRange, ss.showRange, true); if (ds.isWraped(x, y)) { sm.selectedEnd.y++; } sm.fireEvent("renderborder"); ds.trace(feyaSoft.ss.lang.action_insert_col_after(ds .getLetter(sm.focusCell.y))); sm.transferFocus(); }, onDeleteFn : function() { var ss = this.spreadsheet; var sm = ss.sm; if (0 == sm.selectedStart.x) { this.onDeleteColFn(); } else { this.onDeleteRowFn(); } }, onDeleteRowFn : function() { var ss = this.spreadsheet; var ds = ss.ds; var sm = ss.sm; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var x = rt.minPos.x; var span = rt.maxPos.x - x + 1; ds.deleteRow(x, span); ss.renderRange(ss.freezeRange, ss.showRange, true); sm.fireEvent("renderborder"); ds.trace(feyaSoft.ss.lang.action_delete_row(x)); sm.transferFocus(); }, onDeleteColFn : function() { var ss = this.spreadsheet; var ds = ss.ds; var sm = ss.sm; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var y = rt.minPos.y; var span = rt.maxPos.y - y + 1; ds.deleteCol(y, span); ss.renderRange(ss.freezeRange, ss.showRange, true); sm.fireEvent("renderborder"); ds.trace(feyaSoft.ss.lang.action_delete_col(ds.getLetter(y))); sm.transferFocus(); }, onCombineFn : function(btn) { var ss = this.spreadsheet; var sm = ss.sm; if (false == sm.isSingleSelected()) { if (btn && btn.el.hasClass("x-btn-pressed")) { btn.el.removeClass("x-btn-pressed"); ss.contextmenu.onSplitFn(); } else { btn.el.addClass("x-btn-pressed"); ss.contextmenu.onCombineFn(); } } sm.transferFocus(); }, onWordWrapFn : function(btn) { var arr; if (btn.pressed) { arr = [["word-wrap", "word-wrap:break-word;"]]; } else { arr = [["word-wrap", ""]]; } this.applyAttribute(arr, true); var ss = this.spreadsheet; var sm = ss.sm, ds = ss.ds; var rs = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rs.minPos.x, miny = rs.minPos.y, maxx = rs.maxPos.x, maxy = rs.maxPos.y; for (var i = minx; i < maxx; i++) { ss.editor.fitRow(i, true, true); } ss.editor.fitRow(maxx, true); ds.trace(feyaSoft.ss.lang.action_change_attribute); }, onInsertChartFn : function() { var ss = this.spreadsheet; ss.chartSelector.popup(); }, onGridLineFn : function() { if ("icon_border_hide" == this.gridLineBtn.iconCls) { this.gridLineBtn.setIconClass("icon_border_show"); this.gridLineBtn.setText(feyaSoft.ss.lang.showGridLine); Ext.util.CSS.updateRule(".x-spreadsheet-bottom-silver", "border-bottom", "1px solid transparent"); Ext.util.CSS.updateRule(".x-spreadsheet-right-silver", "border-right", "1px solid transparent"); } else { this.gridLineBtn.setIconClass("icon_border_hide"); this.gridLineBtn.setText(feyaSoft.ss.lang.hideGridLine); Ext.util.CSS.updateRule(".x-spreadsheet-bottom-silver", "border-bottom", "1px solid silver"); Ext.util.CSS.updateRule(".x-spreadsheet-right-silver", "border-right", "1px solid silver"); } var ss = this.spreadsheet; var sm = ss.sm; sm.transferFocus(); }, onBrushFn : function(btn) { var ss = this.spreadsheet; var sm = ss.sm; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; ss.setCutStatus(minx, miny, maxx, maxy); var El = btn.getEl(); if (El.hasClass("x-btn-pressed")) { this.stopBrushFormat(El); } else { El.addClass("x-btn-pressed"); sm.getBrushFormat(); } }, stopBrushFormat : function(El) { El = El || this.brushBtn.getEl(); var ss = this.spreadsheet; var sm = ss.sm; ss.resetCutStatus(); El.removeClass("x-btn-pressed"); sm.resetBrushFormat(); sm.transferFocus(); }, onInsertImageByLinkFn : function(tf, e) { var key = e.getKey(); if (Ext.EventObject.ENTER == key) { var ss = this.spreadsheet; var ds = ss.ds, sm = ss.sm; var v = tf.getValue(); if (Ext.ss.common.Helper.validateURL(v)) { tf.reset(); var chartObj = ss.chartManager.addChart(undefined, { url : v }, "image"); this.insertPictureBtn.menu.hide(); var og = { action : "add-chart", type : "undo", sheetIndex : ds.activeSheet, chartId : chartObj.chartEl.id }; var md = { action : "add-chart", type : "redo", sheetIndex : ds.activeSheet, chartId : chartObj.chartEl.id, chartConfig : ss.chartManager.getChartConfig( ds.activeSheet, chartObj.chartEl.id) }; ds.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }, true); ds.trace(feyaSoft.ss.lang.insertPicture); ds.saveActiveSheet(true); ds.saveExtraInfo(); } else { tf .markInvalid("The URL should be like \"http://www.xxx.com/xxx.xxx\""); } } }, onInsertImageByOpenFn : function() { new feyaSoft.ss.popup.ImagePopup(function(imagePath) { var ss = this.spreadsheet; var ds = ss.ds, sm = ss.sm; var chartObj = ss.chartManager.addChart(undefined, { url : imagePath }, "image"); var og = { action : "add-chart", type : "undo", sheetIndex : ds.activeSheet, chartId : chartObj.chartEl.id }; var md = { action : "add-chart", type : "redo", sheetIndex : ds.activeSheet, chartId : chartObj.chartEl.id, chartConfig : ss.chartManager.getChartConfig( ds.activeSheet, chartObj.chartEl.id) }; ds.add2Modified({ focusCell : Ext.apply({}, sm.focusCell), selectedStart : Ext.apply({}, sm.selectedStart), selectedEnd : Ext.apply({}, sm.selectedEnd), origin : og, modified : md }, true); ds.trace(feyaSoft.ss.lang.insertPicture); ds.saveActiveSheet(true); ds.saveExtraInfo(); }, this); }, onInsertGadgetsFn : function() { var ss = this.spreadsheet; ss.addGadgetsWin.popup(); }, onInsertIncellImageByOpenFn : function() { this.spreadsheet.contextmenu.onInsertIncellImageByOpenFn(); }, onInsertIncellImageByLinkFn : function(ta, e) { this.spreadsheet.contextmenu.onInsertIncellImageByLinkFn(ta, e, this.insertIncellImageBtn.menu); }, onPrintFn : function() { var file = this.getFile(); if (file && file.id) { var ds = this.spreadsheet.ds; var fn = function() { var win = new Ext.ss.popup.PrintSettingWin({ fileId : file.id, callback : function(url) { var newWindow = window.open(url, "_blank"); newWindow.focus(); }, scope : this }); }; var flag = ds.saveModifiedCache(null, function() { fn.call(this); }, this); } else { Ext.Msg.show({ title : feyaSoft.lang.common.notice, msg : feyaSoft.lang.common.saveBeforeAction, buttons : Ext.Msg.OK, icon : Ext.MessageBox.WARNING }); } }, /**导出2007Excel*/ onExportExcel2007Fn : function() { var ds = this.spreadsheet.ds; var title=this.spreadsheet.scontainer.title; title=title.split('<')[0]; window.location.href=basePath+'excel/DownLoadAsExcel.action?type=xlsx&title='+title; }, /**导出Excel*/ onExportExcelFn : function() { var ds = this.spreadsheet.ds; var title=this.spreadsheet.scontainer.title; title=title.split('<')[0]; window.location.href=basePath+'excel/DownLoadAsExcel.action?type=xls&title='+title; /** Ext.Ajax.request({ timeout : 300000, url : basePath+'excel/DownLoadAsExcel.action', params : { type:'xls' }, success : function(response, options) { // var jsonData=Ext.decode(response.responseText); }, failure : function(response, options) { }, scope : this });**/ //alert('todo'); //this.save(null, true, null, null, null, true); /**var ds = this.spreadsheet.ds; var file = ds.getFile() || {}; var isTemp = file.isTemp; var fn = function() { var file = this.getFile(); if (file && file.id) { document.location = feyaSoft.home.CONST.spreadSheetUrl.exportExcel + "?id=" + file.id; } else { Ext.Msg.show({ title : feyaSoft.lang.common.notice, msg : feyaSoft.lang.common.saveBeforeAction, buttons : Ext.Msg.OK, icon : Ext.MessageBox.WARNING }); } }; var changed = ds.saveModifiedCache(null, function() { if (isTemp) { ds.put2ModifiedCache("createUpdate", { x : 0, y : 0, data : ds.getModifiedData(0, 0) }); } fn.call(this); }, this); if (!changed) { fn.call(this); }**/ }, onExportPDFFn : function() { var ds = this.spreadsheet.ds; var title=this.spreadsheet.scontainer.title; title=title.split('<')[0]; window.location.href=basePath+'excel/DownLoadAsPDF.action?title='+title; /**var ds = this.spreadsheet.ds; var file = ds.getFile() || {}; var isTemp = file.isTemp; var fn = function() { var file = this.getFile(); if (file && file.id) { document.location = feyaSoft.home.CONST.spreadSheetUrl.exportPDF + "?id=" + file.id; } else { Ext.Msg.show({ title : feyaSoft.lang.common.notice, msg : feyaSoft.lang.common.saveBeforeAction, buttons : Ext.Msg.OK, icon : Ext.MessageBox.WARNING }); } }; var changed = ds.saveModifiedCache(null, function() { if (isTemp) { ds.put2ModifiedCache("createUpdate", { x : 0, y : 0, data : ds.getModifiedData(0, 0) }); } fn.call(this); }, this); if (!changed) { fn.call(this); }**/ }, onExportHTMLFn : function() { var ds = this.spreadsheet.ds; var file = ds.getFile() || {}; var isTemp = file.isTemp; var fn = function() { var file = this.getFile(); if (file && file.id) { document.location = feyaSoft.home.CONST.spreadSheetUrl.exportPDF + "?printWay=html&id=" + file.id; } else { Ext.Msg.show({ title : feyaSoft.lang.common.notice, msg : feyaSoft.lang.common.saveBeforeAction, buttons : Ext.Msg.OK, icon : Ext.MessageBox.WARNING }); } }; var changed = ds.saveModifiedCache(null, function() { if (isTemp) { ds.put2ModifiedCache("createUpdate", { x : 0, y : 0, data : ds.getModifiedData(0, 0) }); } fn.call(this); }, this); if (!changed) { fn.call(this); } }, onExportCSVFn : function() { var ds = this.spreadsheet.ds; var file = ds.getFile() || {}; var isTemp = file.isTemp; var fn = function() { var file = this.getFile(); if (file && file.id) { document.location = feyaSoft.home.CONST.spreadSheetUrl.exportCSV + "?id=" + file.id; } else { Ext.Msg.show({ title : feyaSoft.lang.common.notice, msg : feyaSoft.lang.common.saveBeforeAction, buttons : Ext.Msg.OK, icon : Ext.MessageBox.WARNING }); } }; var changed = ds.saveModifiedCache(null, function() { if (isTemp) { ds.put2ModifiedCache("createUpdate", { x : 0, y : 0, data : ds.getModifiedData(0, 0) }); } fn.call(this); }, this); if (!changed) { fn.call(this); } }, onImportExcelFn : function() { feyaSoft.home.LoginCheck(function() { new Ext.ss.popup.ImportFileWin({ parentView : this }); }, this); }, onFilterMenuShow : function() { var ds = this.spreadsheet.ds; if (ds.withFilter()) { this.filterItem.setChecked(true); } else { this.filterItem.setChecked(false); } }, updatePress : function(ss, x, y) { var ds = ss.ds; var tb = this; if (tb.isVisible()) { var cell = ds.getCell(x, y); var b = cell.b; var i = cell.i; var u = cell.u; var s = cell.s; var color = tb.getStyleValue(cell.color, "color") || "black"; var fontsize = tb.getStyleValue(cell['font-size'], "font-size") || "10pt"; var fontfamily = tb.getStyleValue(cell['font-family'], "font-family") || "Arial"; var textalign = tb.getStyleValue(cell['text-align'], "text-align") || "left"; var bg = cell.bg; var align = cell.align; var wrap = cell.wrap; var fm = cell.format, dateFm = cell.dateFormat; if ("dollar" == fm || "money" == fm) { var menu = tb.moneyBtn.menu; var item = menu.items.get(0); item.setChecked(true, true); } else if ("rmb" == fm) { var menu = tb.moneyBtn.menu; var item = menu.items.get(1); item.setChecked(true, true); } else if ("pound" == fm) { var menu = tb.moneyBtn.menu; var item = menu.items.get(3); item.setChecked(true, true); } else if ("euro" == fm) { var menu = tb.moneyBtn.menu; var item = menu.items.get(2); item.setChecked(true, true); } else { var menu = tb.moneyBtn.menu; menu.items.each(function(it) { if (it.checked) { it.setChecked(false, true); } }); } this.formatCombo.setValue(fm || "regular"); var dateItems = this.dateFormatMenu.items; dateItems.each(function(it) { if (dateFm == it.fm) { it.setChecked(true, true); return false; } else { it.setChecked(false, true); } }); tb.boldBtn.removeClass("x-btn-pressed"); tb.italicBtn.removeClass("x-btn-pressed"); tb.underlineBtn.removeClass("x-btn-pressed"); tb.strikeBtn.removeClass("x-btn-pressed"); if (b) { tb.boldBtn.addClass("x-btn-pressed"); } if (i) { tb.italicBtn.addClass("x-btn-pressed"); } if (u) { tb.underlineBtn.addClass("x-btn-pressed"); } if (s) { tb.strikeBtn.addClass("x-btn-pressed"); } tb.alignLeftBtn.removeClass("x-btn-pressed"); tb.alignCenterBtn.removeClass("x-btn-pressed"); tb.alignRightBtn.removeClass("x-btn-pressed"); if ("left" == textalign) { tb.alignLeftBtn.addClass("x-btn-pressed"); } else if ("center" == textalign) { tb.alignCenterBtn.addClass("x-btn-pressed"); } else if ("right" == textalign) { tb.alignRightBtn.addClass("x-btn-pressed"); } var El = tb.fontColorBtn.getEl(); if (El) { var bEl = El.child("button"); bEl = bEl.child("div"); if (bEl) { bEl.setStyle("background-color", color); } } tb.fontSizeCombo.setValue(fontsize); tb.fontFamilyCombo.setValue(fontfamily); bg = bg || "transparent"; El = tb.bgColorBtn.getEl(); if (El) { bEl = El.child("button"); bEl = bEl.child("div"); if (bEl) { bEl.setStyle("background-color", bg); } } tb.alignTopBtn.removeClass("x-btn-pressed"); tb.alignMiddleBtn.removeClass("x-btn-pressed"); tb.alignBottomBtn.removeClass("x-btn-pressed"); if (align) { if ("top" == align) { tb.alignTopBtn.addClass("x-btn-pressed"); } if ("middle" == align) { tb.alignMiddleBtn.addClass("x-btn-pressed"); } if ("bottom" == align) { tb.alignBottomBtn.addClass("x-btn-pressed"); } } else { tb.alignTopBtn.addClass("x-btn-pressed"); } if (wrap) { tb.combineBtn.addClass("x-btn-pressed"); } else { tb.combineBtn.removeClass("x-btn-pressed"); } if (cell['word-wrap']) { tb.wordWrapBtn.toggle(true, true); } else { tb.wordWrapBtn.toggle(false, true); } } }, onPublicReadOnlyFn : function() { var lan_common = feyaSoft.lang.common; var fileId = this.getFileId(); if (false == Ext.type(fileId)) { Ext.Msg.show({ title : lan_common.hint, msg : lan_common.save_before_public, buttons : Ext.Msg.YESNO, fn : function(bid, text) { if ("yes" == bid) { this.on("filesaved", function(file) { this.popPublicLinkWin(file.id); }, this, { single : true }); this.save(); } }, scope : this }); } else { this.popPublicLinkWin(fileId); } }, popPublicLinkWin : function(fileId) { var ss = this.spreadsheet; Ext.Ajax.request({ timeout : 300000, url : feyaSoft.home.CONST.documentUrl.loadPublicUrl, params : { id : fileId }, success : function(response, options) { var jsonData = Ext.decode(response.responseText); if (jsonData.success == "true") { ss.publicLinkWin.popup({ id : fileId, link : jsonData.url, isPublic : jsonData.isPublic, sender : "ssPublic" }); } else { if (jsonData.info == "relogin") { new feyaSoft.home.Login; } else { Ext.MessageBox.alert("Failed", jsonData.info); } } ss.sm.transferFocus(); }, failure : function(response, options) { }, scope : this }); }, onPublicReadWriteFn : function() { }, onShareFn : function() { var lan_common = feyaSoft.lang.common; if (false == Ext.type(this.getFileId())) { Ext.Msg.show({ title : "Hint", msg : lan_common.save_before_share, buttons : Ext.Msg.YESNO, fn : function(bid, text) { if ("yes" == bid) { this.on("filesaved", function(file) { this.shareFile(file); }, this, { single : true }); this.onSaveFn(); } }, scope : this }); } else { this.shareFile(this.getFile()); } }, shareFile : function(file) { new feyaSoft.home.common.share.ShareWin({ fileId : file.id, name : file.name, myOwnerCt : this, componentClass : "documentShareFile" }); }, onSplitFn : function(btn) { btn.toggle(); this.spreadsheet.contextmenu.onSplitGridFn(); var ss = this.spreadsheet; ss.sm.transferFocus(); }, onSplitChangedFn : function(ss, fr, sr, ofr, osr) { if (0 == fr.row.len && 0 == fr.col.len) { this.splitBtn.toggle(false); this.freezeBtn.enable(); } else { this.splitBtn.toggle(true); this.splitBtn.enable(); this.freezeBtn.disable(); } }, onFreezeChangedFn : function(ss, fr, sr, ofr, osr) { if (fr.row.start == fr.row.end && fr.col.start == fr.col.end || fr.row.end == 0 && fr.col.end == 0) { this.splitBtn.enable(); } else { this.splitBtn.disable(); } ss.sm.transferFocus(); }, onClearAllFn : function() { this.spreadsheet.contextmenu.onClearAllFn(); }, onClearContentFn : function() { this.spreadsheet.contextmenu.onClearContentFn(); }, onRemoveFormatFn : function() { this.spreadsheet.contextmenu.onRemoveFormatFn(); }, onFreezeFn : function(item) { var lan_ss = feyaSoft.ss.lang; var ss = this.spreadsheet; var sm = ss.sm; if (ss.isFreezed()) { ss.CancelFreezer(); item.setText(lan_ss.freezeGrid); } else { var x = sm.focusCell.x; var y = sm.focusCell.y; if (ss.getCellHEls(x, y)) { ss.MoveFreezer(x, y); ss.ds.trace(lan_ss.freezeGrid); } else { var fr = ss.freezeRange, sr = ss.showRange; x = sr.row.start + 1; y = sr.col.start + 1; if (0 != fr.row.len) { x = fr.row.start + 1; } if (0 != fr.col.len) { y = fr.col.start + 1; } ss.MoveFreezer(x, y); } item.setText(lan_ss.unfreezeGrid); } }, onFreezeRowFn : function() { var lan_ss = feyaSoft.ss.lang; this.fzItem.setText(lan_ss.unfreezeGrid); var ss = this.spreadsheet; var fr = ss.freezeRange, sr = ss.showRange; var x = sr.row.start + 1, y = sr.col.start; if (0 != fr.row.len) { x = fr.row.start + 1; } if (0 != fr.col.len) { y = fr.col.start; } ss.MoveFreezer(x, y); ss.ds.trace(lan_ss.freeze_first_row); }, onFreezeColFn : function() { var lan_ss = feyaSoft.ss.lang; this.fzItem.setText(lan_ss.unfreezeGrid); var ss = this.spreadsheet; var fr = ss.freezeRange, sr = ss.showRange; var x = sr.row.start, y = sr.col.start + 1; if (0 != fr.row.len) { x = fr.row.start; } if (0 != fr.col.len) { y = fr.col.start + 1; } ss.MoveFreezer(x, y); ss.ds.trace(lan_ss.freeze_first_col); }, onFreezeMenuShowFn : function() { var lan_ss = feyaSoft.ss.lang; var ss = this.spreadsheet; if (ss.isFreezed()) { this.fzItem.setText(lan_ss.unfreezeGrid); } else { this.fzItem.setText(lan_ss.freezeGrid); } }, afterRender : function() { Ext.ss.Toolbar.superclass.afterRender.call(this); this.createToolSwitch(); }, createToolSwitch : function() { this.pos = this.tabPosition == "bottom" ? this.footer : this.header; var tt = this.pos.insertFirst({ cls : "x-spreadsheet-swtich x-tool x-tool-toggle" }); tt.addClassOnOver("x-tool-toggle-over"); tt.on("click", this.onSwtichFn, this); this.toolSwitch = tt; }, onSwtichFn : function() { var El = this.getEl(); var collapsed = false; if (El.hasClass("x-panel-collapsed")) { El.removeClass("x-panel-collapsed"); El.setStyle("height", ""); } else { El.setStyle("height", "24px"); El.addClass("x-panel-collapsed"); collapsed = true; } this.fireEvent("toolswitch", collapsed); }, onFilterFn : function(item) { var ss = this.spreadsheet; if (!item.checked) { ss.createFilterForSelection(); } else { ss.cancelFilter(); } }, onFormatSelect : function(cb, rd, index) { var format = rd.data.id; this.setFormatForSelection(format); }, onMoneyFn : function() { this.setFormatForSelection("money"); }, onRMBFn : function() { this.setFormatForSelection("rmb"); }, onDollarFn : function() { this.setFormatForSelection("dollar"); }, onPoundFn : function() { this.setFormatForSelection("pound"); }, onEuroFn : function() { this.setFormatForSelection("euro"); }, onPercentFn : function() { this.setFormatForSelection("percent"); }, onCommaFn : function() { this.setFormatForSelection("comma"); }, onDotMoveRightFn : function() { var ss = this.spreadsheet; var sm = ss.sm, ds = ss.ds; var focusCell = sm.focusCell; var x = focusCell.x, y = focusCell.y; var cell = ds.getCell(x, y), dotLen = 0; if (cell) { var digital = Number(cell.digital); var format = Number(cell.format); if ("" !== cell.digital && false != Ext.type(cell.digital) && Ext.isNumber(digital)) { dotLen = digital; } else if ("" !== cell.format && false != Ext.type(cell.format) && Ext.isNumber(format)) { dotLen = format; } else { var data = Number(cell.data); if (Ext.isNumber(data) || /[0-9\.\,\%]/gi.test(cell.data)) { var str = cell.data.toString(); var parts = str.split("."); if (str.indexOf("e") == -1 && 2 == parts.length) { dotLen = parts[1].length; } } } } if (0 < dotLen) { dotLen--; } this.setDotLenForSelection(dotLen); }, onDotMoveLeftFn : function() { var ss = this.spreadsheet; var sm = ss.sm, ds = ss.ds; var focusCell = sm.focusCell; var x = focusCell.x, y = focusCell.y; var cell = ds.getCell(x, y), dotLen = 0; if (cell) { var digital = Number(cell.digital); var format = Number(cell.format); if ("" !== cell.digital && false != Ext.type(cell.digital) && Ext.isNumber(digital)) { dotLen = digital; } else if ("" !== cell.format && false != Ext.type(cell.format) && Ext.isNumber(format)) { dotLen = format; } else { var data = Number(cell.data); if (Ext.isNumber(data) || /[0-9\.\,\%]/gi.test(cell.data)) { var str = cell.data.toString(); var parts = str.split("."); if (str.indexOf("e") == -1 && 2 == parts.length) { dotLen = parts[1].length; } } } } if (dotLen < ds.dotMaxLen) { dotLen++; } this.setDotLenForSelection(dotLen); }, setDotLenForSelection : function(dotLen) { var isDigital = Ext.isNumber(dotLen); var lan_ss = feyaSoft.ss.lang, str; var ss = this.spreadsheet; var sm = ss.sm, ds = ss.ds; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; dotLen = dotLen.toString(); if (0 == minx && 0 == miny) { if (isDigital) { ds.fireEvent("wholeattributechange", [["digital", dotLen]]); } else { ds.fireEvent("wholeattributechange", [["format", dotLen]]); } } else if (0 == minx) { for (var j = miny; j <= maxy; j++) { if (isDigital) { ds .fireEvent("colattributechange", j, [["digital", dotLen]]); } else { ds.fireEvent("colattributechange", j, [["format", dotLen]]); } } } else if (0 == miny) { var rs = ds.data.rowSetting; for (var i = minx; i <= maxx; i++) { if (isDigital) { ds .fireEvent("rowattributechange", i, [["digital", dotLen]]); } else { ds.fireEvent("rowattributechange", i, [["format", dotLen]]); } } } else { for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= maxy; j++) { if (isDigital) { ds.fireEvent("attributechange", i, j, [["digital", dotLen]]); } else { ds.fireEvent("attributechange", i, j, [["format", dotLen]]); } } } } ss.renderRange(); ds.trace(lan_ss.change_dot_len); ss.sm.transferFocus(); }, setFormatForSelection : function(format) { var lan_ss = feyaSoft.ss.lang, str; var ss = this.spreadsheet; var sm = ss.sm, ds = ss.ds; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; var dateFormat = ""; if ("date" == format) { dateFormat = ds.defaultDateFormat; } if (0 == minx && 0 == miny) { ds.fireEvent("wholeattributechange", [["format", format], ["dateFormat", dateFormat]]); str = lan_ss.wholeSheet; } else if (0 == minx) { for (var j = miny; j <= maxy; j++) { ds.fireEvent("colattributechange", j, [["format", format], ["dateFormat", dateFormat]]); } str = miny != maxy ? lan_ss.column + miny + " : " + lan_ss.column + maxy : lan_ss.column + maxy; } else if (0 == miny) { var rs = ds.data.rowSetting; for (var i = minx; i <= maxx; i++) { ds.fireEvent("rowattributechange", i, [["format", format], ["dateFormat", dateFormat]]); } str = minx != maxx ? lan_ss.row + minx + " : " + lan_ss.row + maxx : lan_ss.row + minx; } else { for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= maxy; j++) { ds.fireEvent("attributechange", i, j, [["format", format], ["dateFormat", dateFormat]]); } } str = ds.getLetter(miny) + minx + " : " + ds.getLetter(maxy) + maxx; } ss.renderRange(); ds.trace(lan_ss.changeFormat + " " + lan_ss['for'] + " " + str); ss.fireEvent("updatefx", sm.focusCell.x, sm.focusCell.y); this.updatePress(ss, sm.focusCell.x, sm.focusCell.y); ss.sm.transferFocus(); }, onShieldFn : function() { var file = this.getFile(); if (!file || !file.id) { Ext.Msg.show({ title : feyaSoft.lang.common.notice, msg : feyaSoft.lang.common.saveBeforeAction, buttons : Ext.Msg.OK, icon : Ext.MessageBox.WARNING }); return; } var fileShield = file.fileShield; var info = (fileShield == "yes" ? feyaSoft.lang.common.remove : feyaSoft.lang.common.add) + " " + feyaSoft.lang.common.additionalAccess + " - " + file.name; Ext.MessageBox.confirm(info, feyaSoft.lang.common.setAccessDesc + "

" + feyaSoft.lang.common.confirmProcess + " [ " + info + " ]", function(btn) { if (btn == "yes") { this.secureWin = new feyaSoft.home.common.SecureAuthWin( { authSuccessCallback : function() { Ext.Ajax.request({ timeout : 300000, url : feyaSoft.home.CONST.documentUrl.addRemove, params : { docId : file.id }, method : "GET", success : function(result, request) { var jsonData = Ext.util.JSON .decode(result.responseText); if (jsonData.success == "true") { file.fileShield = fileShield == "yes" ? "no" : "yes"; Ext.Message .msgStay( feyaSoft.lang.common.ok, feyaSoft.lang.common.saveChanges, 2000); } else { if (jsonData.info == "relogin") { new feyaSoft.home.Login; } else { Ext.MessageBox .alert( feyaSoft.lang.common.error, jsonData.info); } } }, failure : function(result, request) { Ext.MessageBox .alert( feyaSoft.lang.common.failed, feyaSoft.lang.common.errorInternal); }, scope : this }); }, scope : this }); this.secureWin.show(); } }, this); }, onRevisionFn : function() { var file = this.getFile(); var readOnlyView = !FPROXY.isEditable(file); if (!readOnlyView) { if (FPROXY.isLockedForMe(file)) { Ext.MessageBox.alert(feyaSoft.lang.common.failed, feyaSoft.lang.lock.lockedBy + " [ " + file.lockedBy + " ]"); } else { new feyaSoft.home.common.ListRevisionsWin({ revertURL : "spreadsheet/revert", fileId : file.id, exname : file.exname, name : file.name, myOwnerCt : this }); } } else { Ext.MessageBox.alert(feyaSoft.lang.common.failed, feyaSoft.lang.lock.canViewOnly); } }, onLockFn : function(btn) { var lanCom = feyaSoft.lang.common; var lanLock = feyaSoft.lang.lock; var file = this.getFile(); if (!file || !file.id) { Ext.MessageBox.alert(lanCom.failed, lanCom.saveBeforeAction); return; } if ("icon_lock32" == btn.iconCls) { Ext.Msg.show({ title : lanLock.lockCheckTitle, msg : lanLock.lockCheckMsg, buttons : Ext.Msg.OKCANCEL, fn : function(bid) { if ("ok" == bid) { FPROXY.lock({ params : { id : file.id }, successFn : function(response) { file.lockedBy = "me"; file.isLockedBySelf = true; this.fireEvent("lockchanged", true, this); Ext.Message.msgStay("Confirm", lanLock.lockSuccessful, 2000); }, scope : this }); } }, scope : this, icon : Ext.MessageBox.QUESTION }); } else { Ext.Msg.show({ title : lanLock.unlockCheckTitle, msg : lanLock.unlockCheckMsg, buttons : Ext.Msg.OKCANCEL, fn : function(bid) { if ("ok" == bid) { FPROXY.unlock({ params : { id : file.id }, successFn : function(response) { delete file.lockedBy; delete file.isLockedBySelf; this.fireEvent("lockchanged", false, this); Ext.Message.msgStay( feyaSoft.lang.common.confirm, lanLock.unlockSuccessful, 2000); }, scope : this }); } }, scope : this, icon : Ext.MessageBox.QUESTION }); } }, updateToolbarStatus : function(status, toolbar) { var lanCom = feyaSoft.lang.common; var lanLock = feyaSoft.lang.lock; var lockBtn = this.lockBtn; var revisionBtn = this.revisionBtn; this.spreadsheet.scontainer.fireEvent("changetitle"); var file = this.getFile(); if (FPROXY.isLocked(file)) { lockBtn.setIconClass("icon_unlock32"); lockBtn.setText(lanLock.unlockFile); } else { lockBtn.setIconClass("icon_lock32"); lockBtn.setText(lanLock.lockFile); } if (FPROXY.canChangeLockStatus(file)) { lockBtn.enable(); } else { lockBtn.disable(); } if (!FPROXY.isEditable(file) || FPROXY.isLockedForMe(file)) { revisionBtn.disable(); } else { revisionBtn.enable(); } }, backToolbarNormal : function() { var lockBtn = this.lockBtn; var revisionBtn = this.revisionBtn; lockBtn.setIconClass("icon_lock32"); lockBtn.setText(feyaSoft.lang.lock.lockFile); lockBtn.enable(); revisionBtn.enable(); }, reload : function() { this.openFile(this.getFileId()); }, getFile : function() { return this.spreadsheet.file; }, setFile : function(file) { var ss = this.spreadsheet; ss.file = file; ss.ds.setSheets(file.sheets, file.extraInfo, file.activeSheet); }, getFileId : function() { var file = this.getFile(); if (file) { return file.id; } }, setFileId : function(fileId) { var file = this.getFile(); if (file) { file.id = fileId; } else { this.setFile({ id : fileId }); } }, createEmptyFile : function(callback, scope) { Ext.Ajax.request({ timeout : 300000, url : this.createEmptyUrl, params : { createDefault : true }, success : function(response, options) { var jsonData = Ext.decode(response.responseText); if (jsonData.success == "true") { jsonData.isTemp = true; if (callback) { callback.call(scope, jsonData); } } }, scope : this }); }, onHeaderFooter : function() { this.fireEvent("editheadfoot", this); }, initDateFormatMenu : function() { var formats = ["Y-m-d", "Y/m/d", "M/d Y", "m/d/Y", "m-d-Y", "d/m/Y"]; var formatDetails = ["yyyy-MM-dd", "yyyy/MM/dd", "MMM/dd yyyy", "MM/dd/yyyy", "MM-dd-yyyy", "dd/MM/yyyy"]; var items = []; var today = new Date; for (var i = 0, len = formats.length; i < len; i++) { var fm = formats[i]; var fmDetail = formatDetails[i]; items.push({ text : today.format(fm) + " " + fmDetail + "", fm : fm, handler : this.selectDateFormat, scope : this }); } this.dateFormatMenu = new Ext.menu.Menu({ defaults : { group : Ext.id() + "-date", checked : false }, items : items }); }, setDateFormatForSelection : function(fm) { var lan_ss = feyaSoft.ss.lang, str; var ss = this.spreadsheet; var sm = ss.sm, ds = ss.ds; var rt = sm.getMinMaxFromStartEnd(sm.selectedStart, sm.selectedEnd); var minx = rt.minPos.x, maxx = rt.maxPos.x, miny = rt.minPos.y, maxy = rt.maxPos.y; if (0 == minx && 0 == miny) { ds.fireEvent("wholeattributechange", [["dateFormat", fm]]); str = lan_ss.wholeSheet; } else if (0 == minx) { for (var j = miny; j <= maxy; j++) { ds.fireEvent("colattributechange", j, [["dateFormat", fm]]); } str = miny != maxy ? lan_ss.column + miny + " : " + lan_ss.column + maxy : lan_ss.column + maxy; } else if (0 == miny) { var rs = ds.data.rowSetting; for (var i = minx; i <= maxx; i++) { ds.fireEvent("rowattributechange", i, [["dateFormat", fm]]); } str = minx != maxx ? lan_ss.row + minx + " : " + lan_ss.row + maxx : lan_ss.row + minx; } else { for (var i = minx; i <= maxx; i++) { for (var j = miny; j <= maxy; j++) { ds.fireEvent("attributechange", i, j, [["dateFormat", fm]]); } } str = ds.getLetter(miny) + minx + " : " + ds.getLetter(maxy) + maxx; } ss.renderRange(); sm.transferFocus(); }, onNameMgr : function() { if (!this.nameRangeWin) { this.nameRangeWin = new Ext.ss.popup.NameRangeWin({ title : feyaSoft.ss.lang.nameManager, closeAction : "hide", spreadsheet : this.spreadsheet, width : 300, height : 350 }); } this.nameRangeWin.popup(); }, onInsertFormula : function() { if (!this.insertFormulaWin) { this.insertFormulaWin = new Ext.ss.popup.FormulaFunctionWin({ title : feyaSoft.ss.lang.insertFormula, closeAction : "hide", spreadsheet : this.spreadsheet }); } this.insertFormulaWin.popup(); }, selectDateFormat : function(btn) { var fm = btn.fm; this.setDateFormatForSelection(fm); }, onConditionFormat : function() { var ss = this.spreadsheet; var ds = ss.ds; if (!this.conditionFormatWin) { this.conditionFormatWin = new Ext.ss.popup.ConditionFormatWin({ spreadsheet : ss }); } var conditionFormat = ds.data.conditionFormat; this.conditionFormatWin.popup({ cfm : conditionFormat }); }, onRestoreFn : function() { var fileId = this.getFileId(); if (fileId == "fake-file") { Ext.MessageBox.alert(feyaSoft.lang.common.hint, feyaSoft.ss.lang.fileIsNotSaved); return; } Ext.Ajax.request({ url : feyaSoft.home.CONST.spreadSheetUrl.listHistory, params : { fileId : fileId }, success : function(response, options) { var jsonData = Ext.decode(response.responseText); if (jsonData.success == "true" && jsonData.savedAt != null) { this.confirmRestore(jsonData.savedAt); } else { Ext.MessageBox.alert(feyaSoft.lang.common.hint, feyaSoft.ss.lang.fileIsNotSaved); } }, failure : function(result, request) { Ext.MessageBox.alert(feyaSoft.lang.common.failed, feyaSoft.lang.common.errorInternal); }, scope : this }); }, confirmRestore : function(savedAt) { var fileId = this.getFileId(); Ext.Msg.show({ title : feyaSoft.lang.file.confirmRecover, msg : "Revision file saved at " + savedAt + "
" + feyaSoft.lang.file.confirmRecoverDesc, width : 400, buttons : Ext.MessageBox.OKCANCEL, scope : this, animEl : Ext.getBody(), icon : Ext.MessageBox.INFO, fn : function(btn, text) { if (btn == "ok") { Ext.Ajax.request({ url : feyaSoft.home.CONST.spreadSheetUrl.restore, params : { fileId : fileId }, success : function(response, options) { var jsonData = Ext .decode(response.responseText); if (jsonData.success == "true") { if (jsonData.isBackup == "true") { this.reload(); } } else { Ext.MessageBox .alert( feyaSoft.lang.common.failed, feyaSoft.lang.common.errorInternal); } }, failure : function(result, request) { Ext.MessageBox.alert( feyaSoft.lang.common.failed, feyaSoft.lang.common.errorInternal); }, scope : this }); } } }); } }); Ext.ns("Ext.ss"); Ext.ss.SheetContainer = function(config) { var lanCom = feyaSoft.lang.common; config = config || {}; Ext.apply(this, config); this.settings = this.settings || {}; this.ss = new Ext.ss.SpreadSheet({ region : "center", file : this.file, scontainer : this, settings : this.settings }); var hideEditingFlag = false, file = this.getFile(); if (file) { hideEditingFlag = "MYSELF_REPLACE" !== file.sharing ? false : true; } var tbar = new Ext.ss.Toolbar({ region : "north", border : false, activeTab : 0, autoHeight : true, deferredRender : false, hidden : this.settings.readOnlyView, spreadsheet : this.ss }); this.editingUserBtn = new Ext.Button({ hidden : hideEditingFlag, iconCls : "group", handler : this.toggleSidebar, scope : this }); this.editingCommentBtn = new Ext.Button({ hidden : hideEditingFlag, iconCls : "message", handler : this.toggleSidebar, scope : this }); var bbar = new Ext.ss.StatusBar({ text : "Ready", iconCls : "x-status-valid", items : ["-", this.editingUserBtn, "-", this.editingCommentBtn] }); var ds = this.ss.ds; var info = ds.sheets[ds.activeSheet].printHeadFoot || { hidden : true }; var o = this.getHeadFootHtml(info); this.sheetHeader = new Ext.Container({ hidden : info.hidden, cls : "x-spreadsheet-print-head", html : o.headHtml, region : "north", height : 30 }); this.sheetFooter = new Ext.Container({ hidden : info.hidden, cls : "x-spreadsheet-print-foot", html : o.footHtml, region : "south", height : 30 }); this.sheet = Ext.isIE ? new Ext.Container({ region : "center", layout : "fit", items : [{ border : false, layout : "border", items : [this.sheetHeader, this.ss, this.sheetFooter] }] }) : new Ext.Container({ region : "center", layout : "border", items : [this.sheetHeader, this.ss, this.sheetFooter] }); this.editingUserPanel = new feyaSoft.home.common.document.EditingUserList({ iconCls : "group", title : lanCom.currentEditingUser, region : "north", collapsible : true, split : true, height : 160, maxHeight : 200, frame : true, autoScroll : true }); this.commentPanel = new feyaSoft.home.common.document.EditingCommentList({ iconCls : "message", title : lanCom.message, region : "center", collapsible : true }); this.sidebar = new Ext.Panel({ hidden : hideEditingFlag, style : "padding:5px 5px 5px 0px;", border : false, bodyStyle : "background:none;", region : "east", split : true, collapsible : true, collapsed : true, collapseMode : "mini", hideCollapseTool : true, width : 250, layout : "border", items : [this.editingUserPanel, this.commentPanel] }); this.toolbar = tbar; Ext.ss.SheetContainer.superclass.constructor.call(this, { layout : "border", bbar : bbar, items : [tbar, this.sheet, this.sidebar] }); this.addEvents("closewindow", "changetitle"); this.ss.on("poststatus", this.onPostStatusFn, this); this.on("destroy", this.onDestroyFn, this); tbar.on("toolswitch", this.onToolSwitchFn, this); tbar.on("newfile", this.hideEditingUserBtns, this); tbar.on("editheadfoot", this.editHeadFoot, this); tbar.on("showheadfoot", function() { this.showHeadFoot(); }, this); tbar.on("hideheadfoot", function() { this.hideHeadFoot(); }, this); this.editingUserPanel.on("pullingcomment", this.commentPanel.pullingComment, this.commentPanel); this.editingUserPanel.on("refreshfile", this.refreshFile, this); this.editingUserPanel.on("rednumberchange", this.updateUserNo, this); this.commentPanel.on("rednumberchange", this.updateMessageNo, this); tbar.on("showeditinglist", this.showEditingUserBtns, this); tbar.on("hideeditinglist", this.hideEditingUserBtns, this); this.on("afterlayout", this._afterLayout, this, { single : true }); this.sidebar.on("expand", function() { this.editingUserPanel.setHeight(160); this.sidebar.doLayout(); }, this); this.ss.ds.on("switchsheet", this.onSwitchSheet, this); this.on("changetitle", function(title) { title = FPROXY.prepareTitle(title, this.getFile()); this.setTitle(title); }, this); }; Ext.extend(Ext.ss.SheetContainer, Ext.Panel, { hideEditingUserBtns : function() { this.editingUserBtn.hide(); this.editingCommentBtn.hide(); this.hideEditingList(); }, showEditingUserBtns : function() { this.editingUserBtn.show(); this.editingCommentBtn.show(); this.sidebar.show(); this.loadEditingUserComment.apply(this, arguments); }, _afterLayout : function() { if (this.sidebar.isVisible()) { this.loadEditingUserComment(new Date); } }, toggleSidebar : function() { if (this.sidebar.collapsed) { this.sidebar.expand(); } else { this.sidebar.collapse(); } }, refreshFile : function(fileId) { Ext.Msg.show({ title : feyaSoft.lang.common.confirm, msg : feyaSoft.lang.common.refreshConfirm, buttons : Ext.Msg.YESNO, fn : function(bid) { if ("yes" == bid) { this.toolbar.openFile(fileId); } }, scope : this, icon : Ext.MessageBox.QUESTION }); }, showEditingList : function(timestamp) { this.sidebar.show(); this.sidebar.expand(); this.doLayout(); this.loadEditingUserComment(timestamp); }, hideEditingList : function() { this.sidebar.hide(); this.sidebar.collapse(); }, loadEditingUserComment : function(timestamp) { timestamp = timestamp || new Date; var fileId = this.getFileId(); if (fileId) { this.editingUserPanel.showUsers(fileId); this.commentPanel.showTopics(fileId, 0, timestamp); } }, updateMessageNo : function(no, timestamp) { this.editingCommentBtn.setText("" + no + " " + feyaSoft.lang.common.after + " " + timestamp.format("H:i:s")); }, updateUserNo : function(no) { this.editingUserBtn.setText("" + no + ""); }, onToolSwitchFn : function() { this.doLayout(); }, onPostStatusFn : function(o) { this.getBottomToolbar().setStatus(o); }, getFile : function() { return this.ss.file; }, getFileId : function() { var file = this.getFile(); if (file) { return file.id; } }, onDestroyFn : function(p) { var ss = this.ss; ss.removeCSS(); var hk = ss.hotkey; if (hk) { var lookupwin = hk.lookupwin; if (lookupwin) { lookupwin.close(); } } var sm = ss.sm; if (sm) { Ext.EventManager.un(document, "mousedown", sm.onMouseDownFn); Ext.EventManager.un(document, "mousemove", sm.onMouseMoveFn); Ext.EventManager.un(document, "mouseup", sm.onMouseUpFn); } }, getHeadFootHtml : function(info) { var head = info.head || "", headLeft = info.headLeft || "", headRight = info.headRight || ""; var foot = info.foot || "", footLeft = info.footLeft || "", footRight = info.footRight || ""; var headHtml = ""; if (head || headLeft || headRight) { headHtml = "" + "" + "" + "" + "
" + headLeft + "" + head + "" + headRight + "
"; } var footHtml = ""; if (foot || footLeft || footRight) { footHtml = "" + "" + "" + "" + "
" + footLeft + "" + foot + "" + footRight + "
"; } return { headHtml : headHtml, footHtml : footHtml }; }, setHeadFoot : function(info) { var obj = this.getHeadFootHtml(info); this.sheetHeader.getEl().update(obj.headHtml); this.sheetFooter.getEl().update(obj.footHtml); }, updateHeadFoot : function(info) { this.setHeadFoot(info); var ds = this.ss.ds; ds.setPrintHeadFoot(info); ds.saveActiveSheet(true); ds.saveExtraInfo(); }, editHeadFoot : function() { if (!this.headFootWin) { this.headFootWin = new feyaSoft.word.popup.HeadFootWin({ width : 600, autoHeight : true, closeAction : "hide", modal : true, title : feyaSoft.word.lang.edit_head_foot, applyCallback : function(info) { info.hidden = false; this.updateHeadFoot(info); this.sheetHeader.show(); this.sheetFooter.show(); this.sheet.doLayout(); }, scope : this }); } var ds = this.ss.ds; this.headFootWin.popup(ds.sheets[ds.activeSheet].printHeadFoot); }, showHeadFoot : function(suspendUpdate) { var ds = this.ss.ds; var info = ds.sheets[ds.activeSheet].printHeadFoot; if (info) { info.hidden = false; if (!suspendUpdate) { this.updateHeadFoot(info); } this.sheetHeader.show(); this.sheetFooter.show(); this.sheet.doLayout(); } else { Ext.Msg.alert(feyaSoft.lang.common.hint, feyaSoft.ss.lang.noHeadFoot2Show); } }, hideHeadFoot : function(suspendUpdate) { var ds = this.ss.ds; var info = ds.sheets[ds.activeSheet].printHeadFoot; if (info && !suspendUpdate) { info.hidden = true; this.updateHeadFoot(info); } this.sheetHeader.hide(); this.sheetFooter.hide(); this.sheet.doLayout(); }, onSwitchSheet : function(ds) { var info = ds.sheets[ds.activeSheet].printHeadFoot; if (!info || info.hidden) { this.hideHeadFoot(true); } else { this.setHeadFoot(info); this.showHeadFoot(true); } }, changeConfig : function(config) { if (config) { Ext.apply(this, config); this.ss.changeConfig(config); var hideEditingFlag = false, file = this.getFile(); if (file) { hideEditingFlag = "MYSELF_REPLACE" !== file.sharing ? false : true; } } } }); Ext.ns("feyaSoft.api"); feyaSoft.api.SpreadSheet = Ext.extend(Ext.ss.SheetContainer, { constructor : function(config) { Ext.QuickTips.init(); Ext.apply(this, config); this.initSpreadSheet(); feyaSoft.api.SpreadSheet.superclass.constructor.call(this); var sm = this.ss.sm, ds = this.ss.ds; this.lastFocusCell = Ext.apply({ sheetIndex : ds.activeSheet }, sm.focusCell); sm.on("focuschange", this.onFocusChanged, this) }, initSpreadSheet : function() { this.publicView = document.getElementById("publicView") .getAttribute("value"); this.editFileId = document.getElementById("editFileId") .getAttribute("value"); this.url = feyaSoft.home.CONST.spreadSheetUrl.loadJson; if (this.publicView && this.publicView == "yes") { this.url = "ssPublic/loadPublicData" } this.loadFile() }, loadFile : function(editFileId) { if (false !== Ext.type(editFileId) && "" !== editFileId) { this.editFileId = editFileId } var file = { name : "New SpreadSheet", description : '{"json":{"sheets":[{"name":"Sheet1","tabId":"8RVNYY3vXeM_","rows":{}},{"name":"Sheet2","tabId":"EegrAbLaKeY_","rows":{}},{"name":"Sheet3","tabId":"jfLiBKj/ex4_","rows":{}}],"activeSheet":0},"date":"2012-10-12 09:07:20"}', subject : null, isPublic : false, isOwner : true, sharing : "MYSELF_REPLACE", permission : 2, lockedBy : "", isLockedBySelf : false, extraInfo : null, exname : "myXls", updateDate : "2012-10-12 21:07:19" }; file.data = Ext.decode(file.description); if (file.data.json) { Ext.apply(file, file.data.json) } file.isTemp = true; file.isFake = true; delete(file.description); Ext.apply(this, { file : file, title : FPROXY.prepareTitle(null, file) }) }, getCell : function(row, col, sheetIndex) { return this.ss.getCell(row, col, sheetIndex) }, save : function() { this.toolbar.onSaveFn() }, loadData2Sheet : function(json) { if (Ext.isString(json)) { json = Ext.decode(json) } var file = json; if (file.description) { file.data = Ext.decode(file.description); delete(file.description); if (file.data.json) { Ext.apply(file, file.data.json) } } else { if (file.data.json) { Ext.apply(file, file.data.json) } } if (false == Ext.type(file.permission)) { file.permission = 2 } file.isTemp = true; file.isFake = true; this.changeConfig({ file : file }) }, autoSelectCompanyCell : function() { this.ss.autoSelectCompanyCell() }, loadById : function(fileId) { this.toolbar.openFile(fileId) }, getCompanyReferenceCell : function() { return this.ss.getCompanyReferenceCell() }, getCompanyReferenceCellRange : function() { return this.ss.getCompanyReferenceCellRange() }, updateCells : function(json, startPos) { return this.ss.updateCells(json, startPos) }, onFocusChanged : function(focusCell) { var ds = this.ss.ds; var lastFocusCell = this.lastFocusCell; if (lastFocusCell) { if (lastFocusCell.x !== focusCell.x || lastFocusCell.y !== focusCell.y || lastFocusCell.sheetIndex !== ds.activeSheet) { this.fireEvent("focuscellchange", Ext.apply({}, lastFocusCell), this) } } this.lastFocusCell = Ext.apply({ sheetIndex : ds.activeSheet }, focusCell) } }); Ext.ns("Ext.ss"); var sc; var isbrowserClose = true; Ext.onReady(function() { document.body.parentNode.className += " ext-content-box "; var ua = navigator.userAgent.toLowerCase(), check = function(r) { return r.test(ua); }, docMode = document.documentMode; Ext.isIE9 = Ext.isIE && (check(/msie 9/) && docMode != 7 && docMode != 8 || docMode == 9); Ext.isIE10 = Ext.isIE && (check(/msie 10/) && docMode != 7 && docMode != 8 && docMode != 9 || docMode == 10); Ext.BLANK_IMAGE_URL = "images/s.gif"; Ext.QuickTips.init(); var wait = new Ext.LoadMask(document.body, { msg : "Welcome to Enterprise " + feyaSoft.lang.common.spreadsheet + "
" + feyaSoft.lang.common.loadingData }); wait.show(); var fn = function(config) { sc = new Ext.ss.ViewerCon(config); new Ext.Viewport({ border : false, layout : "fit", items : [sc] }); wait.hide(); }; this.publicView = document.getElementById("publicView") .getAttribute("value"); this.editFileId = document.getElementById("editFileId") .getAttribute("value"); this.url = feyaSoft.home.CONST.spreadSheetUrl.loadJson; if (this.publicView && this.publicView == "yes") { this.url = feyaSoft.home.CONST.spreadSheetUrl.loadPublicData; } if (this.editFileId) { var loadFn = function() { Ext.Ajax.request({ timeout : 300000, url : this.url, params : { id : this.editFileId }, success : function(response, options) { var jsonData = Ext.decode(response.responseText); if (jsonData.success == "true") { fn.call(this, { file : jsonData, title : FPROXY.prepareTitle(null, jsonData) }); } else { Ext.MessageBox.alert( feyaSoft.lang.common.error, jsonData.info); wait.hide(); } }, scope : this }); }; var me = this; Ext.Ajax.request({ timeout : 300000, url : feyaSoft.home.CONST.documentUrl.isShield, params : { id : this.editFileId, publicView : this.publicView }, success : function(response, options) { var json = Ext.decode(response.responseText); if ("no" == json.fileShield) { loadFn.call(me); } else { wait.hide(); var secureWin = new feyaSoft.home.common.SecureAuthWin( { modal : true, authSuccessCallback : function() { loadFn.call(me); }, scope : me }); secureWin.show(); } }, failure : function(response, options) { wait.hide(); }, scope : me }); } else if (this.useTmpFile) { Ext.Ajax.request({ timeout : 300000, url : this.url, params : { createDefault : true }, success : function(response, options) { var jsonData = Ext.decode(response.responseText); if (jsonData.success == "true") { jsonData.isTemp = true; fn.call(this, { file : jsonData, title : FPROXY.prepareTitle(null, jsonData) }); } else { Ext.MessageBox.alert(feyaSoft.lang.common.error, jsonData.info); wait.hide(); } }, scope : this }); } else { var fakeJson = { lockedBy : "", exname : "myXls", permission : 2, isPublic : false, updateDate : "2013-01-13 16:04:01", id : "fake-file", sheets : [{ name : "Sheet1", tabId : "tab1", rows : {} }, { name : "Sheet2", tabId : "tab2", rows : {} }, { name : "Sheet3", tabId : "tab3", rows : {} }], activeSheet : 0, sharing : "MYSELF_REPLACE", isLockedBySelf : false, name : "新建电子表格", isOwner : true, extraInfo : null, success : "true" }; fakeJson.isTemp = true; fakeJson.isFake = true; fn.call(this, { file : fakeJson, title : FPROXY.prepareTitle(null, fakeJson) }); } }); Ext.ss.ViewerCon = function(config) { Ext.apply(this, config); var file = {}; if (config && config.file) { file = config.file; } var flag = document.getElementById("flag").getAttribute("value"); if (flag && (flag == "true" || flag == true)) { flag = true; } else { flag = this.readOnlyView || false; } Ext.ss.ViewerCon.superclass.constructor.call(this, { id : file.id, title : this.title || file.name || feyaSoft.lang.common.spreadsheet, settings : { readOnlyView : flag }, iconCls : "excel", tools : [{ id : "gear", qtip : "Version " + Ext.ss.common.Mask.version, handler : function() { //new Ext.ss.popup.about.AboutSS; }, scope : this }, { id : "help", qtip : "Help", handler : function() { var newWindow = window .open( "http://www.usoftchina.com", "_blank"); newWindow.focus(); }, scope : this }], file : file }); this.on("closewindow", this.onCloseWindowFn, this); }; Ext.extend(Ext.ss.ViewerCon, Ext.ss.SheetContainer, { onBeforeCloseFn : function(p) { var ss = this.ss; var file = this.getFile() || {}; if (ss.isChanged() || file.isTemp && file.onceChanged) { Ext.Msg.show({ title : feyaSoft.lang.common.confirm, msg : feyaSoft.lang.common.fileChanged, buttons : Ext.Msg.YESNOCANCEL, fn : function(bid, text) { var toolbar = ss.toolbar; if ("yes" == bid) { toolbar.save(true); } else if ("no" == bid) { isbrowserClose = false; window.close(); } }, scope : this, icon : Ext.MessageBox.QUESTION }); return false; } else { if (file.isTemp) { Ext.Ajax.request({ timeout : 300000, url : feyaSoft.home.CONST.documentUrl.deleteFile, params : { id : file.id } }); } isbrowserClose = false; window.close(); } }, browserClose : function() { var file = this.getFile() || {}; if (isbrowserClose) { if (this.ss.isChanged() || file.isTemp && file.onceChanged) { return feyaSoft.lang.common.save_before_open; } else { if (file && file.isTemp) { if (file.onceChanged) { return feyaSoft.lang.common.save_before_open; } var ds = this.ss.ds; Ext.Ajax.request({ timeout : 300000, url : feyaSoft.home.CONST.documentUrl.deleteFile, params : { id : file.id } }); } } } } }); window.onload = function() { try { if (!window.onbeforeunload) { window.onbeforeunload = function() { if (sc) { return sc.browserClose(); } }; } } catch (e) { } }; Ext.ns("feyaSoft.home.common"); feyaSoft.home.common.AddContactWin = function(config) { var searchInvitePanel = new feyaSoft.home.common.SearchInvitePanel(config || {}); feyaSoft.home.common.AddContactWin.superclass.constructor.call(this, { title : feyaSoft.lang.file.addFriend, width : 600, height : 400, shim : false, constrainHeader : true, modal : true, border : true, buttonAlign : "right", layout : "fit", items : [searchInvitePanel], buttons : [{ text : feyaSoft.lang.common.cancel, handler : this.cancelFn, scope : this }] }); this.show() }; Ext.extend(feyaSoft.home.common.AddContactWin, Ext.Window, { cancelFn : function() { this.close() } }); feyaSoft.home.common.SearchInvitePanel = Ext.extend(Ext.Panel, { border : false, autoScroll : true, initComponent : function() { var addFriendGroup = feyaSoft.lang.contact.addAsFriend; this.addUrl = "contact/inviteContact"; if (this.groupId != null) { addFriendGroup = feyaSoft.lang.group.invite2group; this.addUrl = "locationUserPending/inviteFriend" } this.dataStore = new Ext.data.JsonStore({ url : "userAccess/listForContact", fields : [] }); this.dataStore.baseParams = { excludeMe : "yes", start : 0, limit : 10, searchForFriend : true }; this.inviteBtn = new Ext.Button({ text : '' + feyaSoft.lang.file.invite + "", iconCls : "email", handler : this.inviteFn, minWidth : 80, pressed : true, scope : this }); this.dataView = new feyaSoft.home.common.ContactGroupDataView({ store : this.dataStore, emptyText : '
' + feyaSoft.lang.contact.inviteMsg + "
", applyText : addFriendGroup, applyCallback : this.addFriend, applyScope : this }); this.tbar = [feyaSoft.lang.common.search, "", new Ext.ux.form.SearchField({ autoShow : true, store : this.dataStore, width : 300, emptyText : feyaSoft.lang.common.atleast4char }), "->", this.inviteBtn]; this.bbar = new Ext.PagingToolbar({ pageSize : 10, store : this.dataStore, displayInfo : true, displayMsg : "{0} - {1} of {2}" }); this.items = [this.dataView]; feyaSoft.home.common.SearchInvitePanel.superclass.initComponent .call(this); this.reload() }, addFriend : function(id) { var params = { userId : id }; if (this.groupId != null) { params = { userId : id, groupId : this.groupId } } Ext.Ajax.request({ url : this.addUrl, params : params, success : function(result, request) { var backObj = Ext.util.JSON.decode(result.responseText); if (backObj.success == "true") { Ext.Message.msgStay(feyaSoft.lang.common.confirm, backObj.info, 2000); this.reload() } else { Ext.MessageBox.alert(feyaSoft.lang.common.error, backObj.info) } }, failure : function() { Ext.MessageBox.alert(feyaSoft.lang.common.error, "Fail to connect!") }, scope : this }) }, reload : function() { this.dataStore.load({ params : { start : 0, limit : 10 } }) }, inviteFn : function() { new feyaSoft.home.common.InviteWindow(this.initialConfig) } }); Ext.ns("feyaSoft.home.common"); feyaSoft.home.common.ContactGroupDataView = Ext.extend(Ext.DataView, { cls : "x-publicgroup-list", applyText : "Apply", defaultLogo : feyaSoft.home.CONST.userLogo, overClass : "x-view-over", itemSelector : "div.x-group-preview", singleSelect : true, emptyText : '
' + feyaSoft.lang.common.noResultDisplay + "
", initComponent : function() { var arr = [ '', '
', "", '", "", "
', '', "", '
{[values.firstname?values.firstname+" "+values.lastname:values.name]}
', '
{[values.description?values.description:"(', feyaSoft.lang.contact.noDescriptionForUser, ')"]}
']; if (!this.hideApply) { arr = arr.concat(['"]) } arr = arr.concat(["
", "
", "
", '
']); this.tpl = new Ext.XTemplate(arr.join("")).compile(); feyaSoft.home.common.ContactGroupDataView.superclass.initComponent .call(this); this.on("click", this.onClickFn, this) }, onClickFn : function(dv, index, node, e) { var target = e.getTarget(); if ("apply" == target.name) { if (this.applyCallback) { var rd = dv.getRecord(node); var id = rd.data.id || rd.data.contactUserId; this.applyCallback.call(this.applyScope || this, id, rd, node, dv) } } } }); Ext.ns("feyaSoft.home.common.share"); feyaSoft.home.common.share.SharePanel = function(config) { this.myOwnerCt = null; this.listUsers = new feyaSoft.home.common.share.ListUsers(config); this.addUser = new feyaSoft.home.common.share.AddUser(config); feyaSoft.home.common.share.SharePanel.superclass.constructor.call(this, { title : feyaSoft.lang.file.peopleAccess, border : false, layout : "border", items : [this.listUsers, this.addUser] }) }; Ext.extend(feyaSoft.home.common.share.SharePanel, Ext.Panel, { initLoad : function(config) { this.myOwnerCt = config.myOwnerCt; this.listUsers.initLoad(config); this.addUser.initLoad(config) }, existedUsers : function() { return this.listUsers.existedUsers() }, reloadList : function() { this.listUsers.reload(); this.myOwnerCt.reload() } }); feyaSoft.home.common.share.ListUsers = function(config) { this.fileId = null; this.myOwnerCt = null; this.componentClass = "documentShareFile"; if (config.componentClass) { this.componentClass = config.componentClass } var selectBoxModel = new Ext.grid.CheckboxSelectionModel({ singleSelect : true }); function viewEditPermission(val) { var result = val; if (val == 1) { result = feyaSoft.lang.common.canView } else { if (val == 2) { result = feyaSoft.lang.common.canEdit } else { if (val == 7) { result = feyaSoft.lang.common.canEdit } } } return result } function infoAction(val, p) { return '' } var shareCM = new Ext.grid.ColumnModel([selectBoxModel, { id : "id", header : "Identify", dataIndex : "id", width : 100, hidden : true }, { header : feyaSoft.lang.common.user, width : 190, dataIndex : "shareUser" }, { header : feyaSoft.lang.common.permission, width : 110, dataIndex : "permission", scope : this, renderer : viewEditPermission }, { header : feyaSoft.lang.common.date, width : 140, dataIndex : "updateDate", renderer : Ext.util.Common.formatDateHour }, { header : "Info", width : 40, sortable : false, dataIndex : "note", renderer : infoAction }]); this.shareStore = new Ext.data.JsonStore({ url : this.componentClass + "/list", remoteSort : true, fields : [] }); this.deleteBtn = new Ext.Button({ disabled : true, text : feyaSoft.lang.common.remove, id : "delete-share-file-action", tooltip : "Highlight the item and click this button to remove this shared user", iconCls : "delete", handler : function() { var record = this.getSelectionModel().getSelected(); if (record.data.id == 0) { Ext.MessageBox.alert(feyaSoft.lang.common.permissionDeny, "Not allowed to delete Owner share") } else { this.deleteItem(record) } }, scope : this }); this.changePermit = new Ext.Button({ disabled : true, text : feyaSoft.lang.common.changePermission, tooltip : "Highlight the item and click this button to change this shared user permission", iconCls : "editItem", handler : function() { var record = this.getSelectionModel().getSelected(); if (record.data.id == 0) { Ext.MessageBox.alert(feyaSoft.lang.common.permissionDeny, "Not allowed to change owner permission") } else { this.changeItem(record) } }, scope : this }); feyaSoft.home.common.share.ListUsers.superclass.constructor.call(this, { region : "center", border : true, store : this.shareStore, cm : shareCM, sm : selectBoxModel, width : 600, height : 300, viewConfig : { forceFit : true }, loadMask : { msg : feyaSoft.lang.common.loadingData }, tbar : [this.deleteBtn, this.changePermit], autoScroll : true }); selectBoxModel.on("selectionchange", this.onSelectionChangeFn, this) }; Ext.extend(feyaSoft.home.common.share.ListUsers, Ext.grid.GridPanel, { initLoad : function(config) { this.fileId = config.fileId; this.myOwnerCt = config.myOwnerCt; this.shareStore.baseParams = { fileId : this.fileId }; this.shareStore.load() }, existedUsers : function() { return this.shareStore.data.items }, onSelectionChangeFn : function(sm) { if (0 < sm.getSelections().length) { this.deleteBtn.enable(); if (this.componentClass == "myPhotoShare" || this.componentClass == "myPhotoFolderShare") { this.changePermit.disable() } else { this.changePermit.enable() } } else { this.deleteBtn.disable(); this.changePermit.disable() } }, deleteItem : function(rd) { Ext.Msg.show({ title : feyaSoft.lang.common.confirmDelete, msg : feyaSoft.lang.common.confirmDeleteDesc, icon : Ext.Msg.QUESTION, buttons : Ext.Msg.YESNO, fn : this.onDeleteConfirm, scope : this, record : rd }) }, onDeleteConfirm : function(button_id, text, options) { if (button_id == "yes") { Ext.Ajax.request({ url : this.componentClass + "/delete", params : { id : options.record.data.id }, success : function(result, request) { this.reload(); this.myOwnerCt.reload() }, failure : function(result, request) { Ext.MessageBox.alert("Failed", "Internal Error, please try again") }, scope : this }) } }, changeItem : function(rd) { var changedPermit = feyaSoft.lang.common.canView; if (rd.data.permission == 1) { changedPermit = feyaSoft.lang.common.canEdit } Ext.Msg.show({ title : feyaSoft.lang.common.confirm, msg : feyaSoft.lang.common.confirmChangePermit + changedPermit, icon : Ext.Msg.QUESTION, buttons : Ext.Msg.YESNO, fn : this.onChangeConfirm, scope : this, record : rd }) }, onChangeConfirm : function(button_id, text, options) { if (button_id == "yes") { Ext.Ajax.request({ url : this.componentClass + "/changePermit", params : { id : options.record.data.id }, success : function(result, request) { this.reload(); this.myOwnerCt.reload() }, failure : function(result, request) { Ext.MessageBox.alert("Failed", "Internal Error, please try again") }, scope : this }) } }, reload : function() { this.shareStore.reload() }, disableDelete : function() { Ext.getCmp("delete-share-file-action").setDisabled(true) } }); feyaSoft.home.common.share.AddUser = function(config) { Ext.QuickTips.init(); Ext.form.Field.prototype.msgTarget = "side"; this.fileId = null; this.myOwnerCt = null; this.componentClass = "documentShareFile"; if (config.componentClass) { this.componentClass = config.componentClass } var permissionStore = [["1", feyaSoft.lang.common.canView], ["2", feyaSoft.lang.common.canEdit]]; if (this.componentClass == "myPhotoShare" || this.componentClass == "myPhotoFolderShare") { permissionStore = [["1", feyaSoft.lang.common.canView]] } var permission_data = new Ext.data.SimpleStore({ fields : ["id", "name"], data : permissionStore }); var userStore = new Ext.data.JsonStore({ url : "contact/list", remoteSort : true, fields : [] }); userStore.setDefaultSort("name", "ASC"); this.contactName = new Ext.ux.form.LovCombo({ fieldLabel : feyaSoft.lang.common.user, forceSelection : true, allowBlank : false, typeAhead : true, minChars : 2, triggerAction : "all", store : userStore, displayField : "name", hiddenName : "sharedUserId", valueField : "contactUserId", loadingText : feyaSoft.lang.common.loadingData, pageSize : 15, anchor : "93%", listeners : { select : this.onUserSelectFn, scope : this } }); this.permission = new Ext.form.ComboBox({ fieldLabel : feyaSoft.lang.common.permission, forceSelection : true, allowBlank : false, typeAhead : true, triggerAction : "all", store : permission_data, displayField : "name", hiddenName : "permission", mode : "local", valueField : "id", anchor : "93%", listeners : { select : this.onPermissionSelectFn, scope : this } }); this.allowInvite = new Ext.form.Checkbox({ hideLabel : true, boxLabel : feyaSoft.lang.file.allowViewEdit, name : "allowInvite", disabled : true }); this.note = new Ext.form.HtmlEditor({ hideLabel : true, name : "note", height : 150, anchor : "93%" }); var emailNotify = new Ext.form.Checkbox({ hideLabel : true, boxLabel : feyaSoft.lang.file.sendEmail, name : "emailNotify", checked : true }); this.addMoreBtn = new Ext.Button({ text : feyaSoft.lang.file.addFriend, handler : function() { new feyaSoft.home.common.AddContactWin() }, minWidth : 90, iconCls : "addItem", scope : this }); this.saveBtn = new Ext.Button({ minWidth : 75, text : feyaSoft.lang.common.save, tooltip : "Save the result to the system", iconCls : "save", handler : this.doSaveFn, scope : this }); feyaSoft.home.common.share.AddUser.superclass.constructor.call(this, { region : "east", width : 350, split : true, baseCls : "x-plain", labelWidth : 65, bodyStyle : "padding: 20px 10px 10px 10px", url : this.componentClass + "/create", items : [this.contactName, this.permission, this.allowInvite, this.note, emailNotify], buttons : [this.addMoreBtn, this.saveBtn] }) }; Ext.extend(feyaSoft.home.common.share.AddUser, Ext.form.FormPanel, { initLoad : function(config) { this.fileId = config.fileId; this.myOwnerCt = config.myOwnerCt; this.permission.setValue("1") }, onUserSelectFn : function(obj) { var name = null; var existedUser = false; var existedUsers = this.ownerCt.existedUsers(); for (var i = 0; i < existedUsers.length; i++) { if (obj.value == existedUsers[i].data.shareUserId) { existedUser = true; name = existedUsers[i].data.shareUser } } if (existedUser) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.file.itemShared + ": " + name); this.contactName.setValue(null) } }, onPermissionSelectFn : function(obj) { if (obj && obj.value == 2) { this.allowInvite.setDisabled(false) } else { this.allowInvite.setDisabled(true); this.allowInvite.setValue(false) } }, doSaveFn : function() { if (this.form.isValid()) { this.form.submit({ params : { fileId : this.fileId }, waitMsg : "In processing", failure : function(form, action) { Ext.MessageBox.alert("Error Message", action.result.errorInfo) }, success : function(form, action) { if (action.result.success == "true") { Ext.Message.msgStay( feyaSoft.lang.common.confirm, action.result.info, 2000); this.ownerCt.reloadList(); this.contactName.reset() } else { Ext.MessageBox.alert("Error Message", action.result.info) } }, scope : this }) } else { Ext.MessageBox.alert("Errors", "Please fix the errors noted.") } } }); Ext.ns("feyaSoft.home.common.share"); feyaSoft.home.common.share.GroupSharePanel = function(config) { this.listGroups = new feyaSoft.home.common.share.ListGroups(config); this.addGroup = new feyaSoft.home.common.share.AddGroup(config); feyaSoft.home.common.share.GroupSharePanel.superclass.constructor.call( this, { title : feyaSoft.lang.file.groupAccess, border : false, layout : "border", items : [this.listGroups, this.addGroup] }) }; Ext.extend(feyaSoft.home.common.share.GroupSharePanel, Ext.Panel, { initLoad : function(config) { this.listGroups.initLoad(config); this.addGroup.initLoad(config) }, existedGroups : function() { return this.listGroups.existedGroups() }, reloadListGroup : function() { this.listGroups.reload() } }); feyaSoft.home.common.share.ListGroups = function(config) { this.fileId = null; this.myOwnerCt = null; this.componentClass = "locationFile"; if (config.componentClass == "myPhotoFolderShare") { this.componentClass = "locationPhotoFolder" } else { if (config.componentClass == "myPhotoShare") { this.componentClass = "locationPhoto" } else { if (config.componentClass == "browserBookmarkShare") { this.componentClass = "locationBookmark" } } } var selectBoxModel = new Ext.grid.CheckboxSelectionModel({ singleSelect : true }); function viewEditPermission(val) { var result = val; if (val == 1) { result = feyaSoft.lang.common.canView } else { if (val == 2) { result = feyaSoft.lang.common.canEdit } else { if (val == 7) { result = feyaSoft.lang.common.canEdit } } } return result } var shareCM = new Ext.grid.ColumnModel([selectBoxModel, { id : "id", header : "Identify", dataIndex : "id", width : 100, hidden : true }, { header : feyaSoft.lang.common.name, width : 200, dataIndex : "name" }, { header : feyaSoft.lang.common.permission, width : 100, dataIndex : "permission", scope : this, renderer : viewEditPermission }, { header : feyaSoft.lang.common.date, width : 150, dataIndex : "shareDate", renderer : Ext.util.Common.formatDateHour }]); this.shareStore = new Ext.data.JsonStore({ url : this.componentClass + "/sharedGroups", remoteSort : true, fields : [] }); this.deleteBtn = new Ext.Button({ text : feyaSoft.lang.common.remove, tooltip : "Highlight the item and click this button to remove this shared user", iconCls : "delete", disabled : true, handler : this.deleteItem, scope : this }); this.changePermit = new Ext.Button({ disabled : true, text : feyaSoft.lang.common.changePermission, tooltip : "Highlight the item and click this button to change this shared user permission", iconCls : "editItem", handler : this.changeItem, scope : this }); feyaSoft.home.common.share.ListGroups.superclass.constructor.call(this, { region : "center", store : this.shareStore, cm : shareCM, sm : selectBoxModel, viewConfig : { forceFit : true }, loadMask : { msg : feyaSoft.lang.common.loadingData }, tbar : [this.deleteBtn, this.changePermit], autoScroll : true }); selectBoxModel.on("selectionchange", this.onSelectionChangeFn, this) }; Ext.extend(feyaSoft.home.common.share.ListGroups, Ext.grid.GridPanel, { initLoad : function(config) { this.fileId = config.fileId; this.myOwnerCt = config.myOwnerCt; this.shareStore.baseParams = { fileId : this.fileId }; this.shareStore.load() }, existedGroups : function() { return this.shareStore.data.items }, onSelectionChangeFn : function(sm) { if (0 < sm.getSelections().length) { this.deleteBtn.enable(); if (this.componentClass == "locationPhoto" || this.componentClass == "locationPhotoFolder") { this.changePermit.disable() } else { this.changePermit.enable() } } else { this.deleteBtn.disable(); this.changePermit.disable() } }, deleteItem : function() { var record = this.getSelectionModel().getSelected(); if (record == null || record.data == null || record.data.id == null) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.common.pleaseSelectOne); return } var deleteInfo = feyaSoft.lang.common.confirmDelete + ": " + record.data.name; Ext.MessageBox.confirm(deleteInfo, feyaSoft.lang.common.confirmDeleteDesc, function(btn) { if (btn == "yes") { Ext.Ajax.request({ url : this.componentClass + "/remove", params : { groupId : record.data.id, fileId : this.fileId }, method : "GET", success : function(result, request) { var jsonData = Ext.util.JSON .decode(result.responseText); if (jsonData.success == "true") { this.reload(); this.myOwnerCt.reload() } else { Ext.MessageBox .alert( feyaSoft.lang.common.error, jsonData.info) } }, failure : function(result, request) { }, scope : this }) } }, this) }, changeItem : function() { var record = this.getSelectionModel().getSelected(); if (record == null || record.data == null || record.data.id == null) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.common.pleaseSelectOne); return } var changedPermit = feyaSoft.lang.common.canView; if (record.data.permission == 1) { changedPermit = feyaSoft.lang.common.canEdit } Ext.Msg.show({ title : feyaSoft.lang.common.confirm, msg : feyaSoft.lang.common.confirmChangePermit + changedPermit, icon : Ext.Msg.QUESTION, buttons : Ext.Msg.YESNO, fn : this.onChangeConfirm, scope : this, record : record }) }, onChangeConfirm : function(button_id, text, options) { if (button_id == "yes") { Ext.Ajax.request({ url : this.componentClass + "/changePermit", params : { groupId : options.record.data.id, fileId : this.fileId }, success : function(result, request) { this.reload(); this.myOwnerCt.reload() }, failure : function(result, request) { Ext.MessageBox.alert("Failed", "Internal Error, please try again") }, scope : this }) } }, reload : function() { this.shareStore.reload() }, disableDelete : function() { Ext.getCmp("delete-share-file-action").setDisabled(true) } }); feyaSoft.home.common.share.AddGroup = function(config) { Ext.QuickTips.init(); Ext.form.Field.prototype.msgTarget = "side"; this.fileId = null; this.myOwnerCt = null; this.componentClass = "locationFile"; if (config.componentClass == "myPhotoFolderShare") { this.componentClass = "locationPhotoFolder" } else { if (config.componentClass == "myPhotoShare") { this.componentClass = "locationPhoto" } else { if (config.componentClass == "browserBookmarkShare") { this.componentClass = "locationBookmark" } } } var groupStore = new Ext.data.JsonStore({ url : "locationUser/list", remoteSort : true, fields : [] }); groupStore.setDefaultSort("name", "ASC"); this.group = new Ext.form.ComboBox({ fieldLabel : feyaSoft.lang.group.group, forceSelection : true, allowBlank : false, typeAhead : true, minChars : 2, triggerAction : "all", store : groupStore, displayField : "name", hiddenName : "groupId", valueField : "id", emptyText : feyaSoft.lang.common.pleaseSelectOne, loadingText : feyaSoft.lang.common.loadingData, pageSize : 15, anchor : "93%", listeners : { select : this.onGroupSelectFn, scope : this } }); var permissionStore = [["1", feyaSoft.lang.common.canView], ["2", feyaSoft.lang.common.canEdit]]; if (config.componentClass == "myPhotoShare" || config.componentClass == "myPhotoFolderShare") { permissionStore = [["1", feyaSoft.lang.common.canView]] } var permission_data = new Ext.data.SimpleStore({ fields : ["id", "name"], data : permissionStore }); this.permission = new Ext.form.ComboBox({ fieldLabel : feyaSoft.lang.common.permission, forceSelection : true, allowBlank : false, typeAhead : true, triggerAction : "all", store : permission_data, displayField : "name", hiddenName : "permission", mode : "local", valueField : "id", anchor : "93%" }); this.note = new Ext.form.HtmlEditor({ hideLabel : true, name : "note", height : 150, anchor : "93%" }); this.posting = new Ext.form.Checkbox({ hideLabel : true, boxLabel : feyaSoft.lang.file.groupShareMsg, name : "doPosting", checked : true }); this.saveBtn = new Ext.Button({ minWidth : 75, text : feyaSoft.lang.common.save, tooltip : "Save the result to the system", iconCls : "save", handler : this.doSaveFn, scope : this }); feyaSoft.home.common.share.AddGroup.superclass.constructor.call(this, { region : "east", width : 350, split : true, baseCls : "x-plain", labelWidth : 70, bodyStyle : "padding: 20px 10px 10px 10px", url : this.componentClass + "/createUpdate", items : [this.group, this.permission, this.note, this.posting], buttons : [this.saveBtn] }) }; Ext.extend(feyaSoft.home.common.share.AddGroup, Ext.form.FormPanel, { initLoad : function(config) { this.fileId = config.fileId; this.myOwnerCt = config.myOwnerCt; this.permission.setValue("1") }, onGroupSelectFn : function(obj) { var allowPosting = true; var name = null; var items = obj.store.data.items; for (var i = 0; i < items.length; i++) { if (obj.value == items[i].data.id) { allowPosting = items[i].data.allowPosting; name = items[i].data.name } } if (!allowPosting) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.group.notAllowPosting + ": " + name); this.group.setValue(null) } var existedGroup = false; var existedGroups = this.ownerCt.existedGroups(); for (var i = 0; i < existedGroups.length; i++) { if (obj.value == existedGroups[i].data.id) { existedGroup = true; name = existedGroups[i].data.name } } if (existedGroup) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.group.groupShared + ": " + name); this.group.setValue(null) } }, doSaveFn : function() { if (this.form.isValid()) { this.form.submit({ params : { fileId : this.fileId }, waitMsg : "In processing", failure : function(form, action) { Ext.MessageBox.alert("Error Message", action.result.errorInfo) }, success : function(form, action) { if (action.result.success == "true") { Ext.Message.msgStay( feyaSoft.lang.common.confirm, action.result.info, 2000); this.ownerCt.reloadListGroup(); this.group.reset() } else { Ext.MessageBox.alert( feyaSoft.lang.common.error, action.result.info) } }, scope : this }) } else { Ext.MessageBox.alert(feyaSoft.lang.common.error, "Please fix the errors noted.") } } }); Ext.ns("feyaSoft.home.common.share"); feyaSoft.home.common.share.ContactSharePanel = function(config) { this.myOwnerCt = config.myOwnerCt; this.listContact = new feyaSoft.home.common.share.ListContacts(config); this.addContact = new feyaSoft.home.common.share.AddContact(config); feyaSoft.home.common.share.ContactSharePanel.superclass.constructor.call( this, { title : feyaSoft.lang.file.contactAccess, border : false, layout : "border", items : [this.listContact, this.addContact] }) }; Ext.extend(feyaSoft.home.common.share.ContactSharePanel, Ext.Panel, { initLoad : function(config) { this.listContact.initLoad(config); this.addContact.initLoad(config) }, existedItems : function() { return this.listContact.existedItem() }, reloadList : function() { this.listContact.reload() } }); feyaSoft.home.common.share.ListContacts = function(config) { this.fileId = null; this.myOwnerCt = null; this.componentClass = "contactShareFile"; if (config.componentClass == "myPhotoFolderShare") { this.componentClass = "contactSharePhotoFolder" } else { if (config.componentClass == "myPhotoShare") { this.componentClass = "contactSharePhoto" } else { if (config.componentClass == "browserBookmarkShare") { this.componentClass = "contactShareBookmark" } } } var selectBoxModel = new Ext.grid.CheckboxSelectionModel({ singleSelect : true }); function viewEditPermission(val) { var result = val; if (val == 1) { result = feyaSoft.lang.common.canView } else { if (val == 2) { result = feyaSoft.lang.common.canEdit } else { if (val == 7) { result = feyaSoft.lang.common.canEdit } } } return result } var shareCM = new Ext.grid.ColumnModel([selectBoxModel, { id : "id", header : "Identify", dataIndex : "id", width : 100, hidden : true }, { header : feyaSoft.lang.common.contactCategory, width : 200, dataIndex : "shareCategory" }, { header : feyaSoft.lang.common.permission, width : 90, dataIndex : "permission", scope : this, renderer : viewEditPermission }, { header : feyaSoft.lang.common.date, width : 140, dataIndex : "updateDate", renderer : Ext.util.Common.formatDateHour }]); this.shareStore = new Ext.data.JsonStore({ url : this.componentClass + "/list", remoteSort : true, fields : [] }); this.deleteBtn = new Ext.Button({ disabled : true, text : feyaSoft.lang.common.remove, id : "delete-contact-file-action", tooltip : "Highlight the item and click this button to remove this item", iconCls : "delete", handler : function() { var record = this.getSelectionModel().getSelected(); if (record) { this.deleteItem(record) } }, scope : this }); this.changePermit = new Ext.Button({ disabled : true, text : feyaSoft.lang.common.changePermission, tooltip : "Highlight the item and click this button to change this shared user permission", iconCls : "editItem", handler : function() { var record = this.getSelectionModel().getSelected(); if (record) { this.changeItem(record) } }, scope : this }); feyaSoft.home.common.share.ListContacts.superclass.constructor.call(this, { region : "center", border : true, store : this.shareStore, cm : shareCM, sm : selectBoxModel, width : 600, height : 300, viewConfig : { forceFit : true }, loadMask : { msg : feyaSoft.lang.common.loadingData }, tbar : [this.deleteBtn, this.changePermit], autoScroll : true }); selectBoxModel.on("selectionchange", this.onSelectionChangeFn, this) }; Ext.extend(feyaSoft.home.common.share.ListContacts, Ext.grid.GridPanel, { initLoad : function(config) { this.fileId = config.fileId; this.myOwnerCt = config.myOwnerCt; this.shareStore.baseParams = { fileId : this.fileId }; this.shareStore.load() }, existedItem : function() { return this.shareStore.data.items }, onSelectionChangeFn : function(sm) { if (0 < sm.getSelections().length) { this.deleteBtn.enable(); if (this.componentClass == "contactSharePhotoFolder" || this.componentClass == "contactSharePhoto") { this.changePermit.disable() } else { this.changePermit.enable() } } else { this.deleteBtn.disable(); this.changePermit.disable() } }, deleteItem : function(rd) { Ext.Msg.show({ title : feyaSoft.lang.common.confirmDelete, msg : feyaSoft.lang.common.confirmDeleteDesc, icon : Ext.Msg.QUESTION, buttons : Ext.Msg.YESNO, fn : this.onDeleteConfirm, scope : this, record : rd }) }, onDeleteConfirm : function(button_id, text, options) { if (button_id == "yes") { Ext.Ajax.request({ url : this.componentClass + "/delete", params : { id : options.record.data.id }, success : function(result, request) { this.reload() }, failure : function(result, request) { Ext.MessageBox.alert("Failed", "Internal Error, please try again") }, scope : this }) } }, changeItem : function(rd) { var changedPermit = feyaSoft.lang.common.canView; if (rd.data.permission == 1) { changedPermit = feyaSoft.lang.common.canEdit } Ext.Msg.show({ title : feyaSoft.lang.common.confirm, msg : feyaSoft.lang.common.confirmChangePermit + changedPermit, icon : Ext.Msg.QUESTION, buttons : Ext.Msg.YESNO, fn : this.onChangeConfirm, scope : this, record : rd }) }, onChangeConfirm : function(button_id, text, options) { if (button_id == "yes") { Ext.Ajax.request({ url : this.componentClass + "/changePermit", params : { id : options.record.data.id }, success : function(result, request) { this.reload(); this.myOwnerCt.reload() }, failure : function(result, request) { Ext.MessageBox.alert("Failed", "Internal Error, please try again") }, scope : this }) } }, reload : function() { this.shareStore.reload() }, disableDelete : function() { Ext.getCmp("delete-contact-file-action").setDisabled(true) } }); feyaSoft.home.common.share.AddContact = function(config, myOwnerCt) { Ext.QuickTips.init(); Ext.form.Field.prototype.msgTarget = "side"; this.fileId = null; this.myOwnerCt = null; this.componentClass = "contactShareFile"; if (config.componentClass == "myPhotoFolderShare") { this.componentClass = "contactSharePhotoFolder" } else { if (config.componentClass == "myPhotoShare") { this.componentClass = "contactSharePhoto" } else { if (config.componentClass == "browserBookmarkShare") { this.componentClass = "contactShareBookmark" } } } var permissionStore = [["1", feyaSoft.lang.common.canView], ["2", feyaSoft.lang.common.canEdit]]; if (config.componentClass == "myPhotoShare" || config.componentClass == "myPhotoFolderShare") { permissionStore = [["1", feyaSoft.lang.common.canView]] } var permission_data = new Ext.data.SimpleStore({ fields : ["id", "name"], data : permissionStore }); var categoryStore = new Ext.data.JsonStore({ url : "contactCategory/list", remoteSort : true, fields : [] }); categoryStore.setDefaultSort("name", "ASC"); this.categoryName = new Ext.form.ComboBox({ fieldLabel : feyaSoft.lang.common.category, forceSelection : true, allowBlank : false, typeAhead : true, minChars : 2, triggerAction : "all", store : categoryStore, displayField : "name", hiddenName : "categoryId", valueField : "id", emptyText : feyaSoft.lang.common.pleaseSelectOne, loadingText : feyaSoft.lang.common.loadingData, pageSize : 15, anchor : "93%", listeners : { select : this.onCategorySelectFn, scope : this } }); this.permission = new Ext.form.ComboBox({ fieldLabel : feyaSoft.lang.common.permission, forceSelection : true, allowBlank : false, typeAhead : true, triggerAction : "all", store : permission_data, displayField : "name", hiddenName : "permission", mode : "local", valueField : "id", allowBlank : false, anchor : "93%" }); this.note = new Ext.form.HtmlEditor({ hideLabel : true, name : "note", height : 150, anchor : "93%" }); this.posting = new Ext.form.Checkbox({ hideLabel : true, boxLabel : feyaSoft.lang.file.contactShareMsg, name : "doPosting", checked : true }); this.saveBtn = new Ext.Button({ minWidth : 75, text : feyaSoft.lang.common.save, tooltip : "Save the result to the system", iconCls : "save", handler : this.doSaveFn, scope : this }); feyaSoft.home.common.share.AddContact.superclass.constructor.call(this, { region : "east", width : 350, split : true, baseCls : "x-plain", labelWidth : 65, bodyStyle : "padding: 20px 10px 10px 10px", url : this.componentClass + "/createUpdate", items : [this.categoryName, this.permission, this.note, this.posting], buttons : [this.saveBtn] }) }; Ext.extend(feyaSoft.home.common.share.AddContact, Ext.form.FormPanel, { initLoad : function(config) { this.fileId = config.fileId; this.myOwnerCt = config.myOwnerCt; this.permission.setValue("1") }, onCategorySelectFn : function(obj) { var name = null; var existedItem = false; var existedItems = this.ownerCt.existedItems(); for (var i = 0; i < existedItems.length; i++) { if (obj.value == existedItems[i].data.categoryId) { existedItem = true; name = existedItems[i].data.shareCategory } } if (existedItem) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.file.itemShared + ": " + name); this.categoryName.setValue(null) } }, doSaveFn : function() { if (this.form.isValid()) { this.form.submit({ params : { fileId : this.fileId }, waitMsg : "In processing", failure : function(form, action) { Ext.MessageBox.alert("Error Message", action.result.errorInfo) }, success : function(form, action) { if (action.result.success == "true") { Ext.Message.msgStay( feyaSoft.lang.common.confirm, action.result.info, 2000); this.ownerCt.reloadList(); this.categoryName.reset(); this.note.reset() } else { Ext.MessageBox.alert("Error Message", action.result.info) } }, scope : this }) } else { Ext.MessageBox.alert("Errors", "Please fix the errors noted.") } } }); Ext.ns("feyaSoft.home.common.share"); feyaSoft.home.common.share.OrganizationSharePanel = function(config) { this.listOrganizations = new feyaSoft.home.common.share.ListOrganizations(config); this.addOrganization = new feyaSoft.home.common.share.AddOrganization(config); feyaSoft.home.common.share.OrganizationSharePanel.superclass.constructor .call(this, { title : feyaSoft.lang.file.organizationAccess, border : false, layout : "border", items : [this.listOrganizations, this.addOrganization] }) }; Ext.extend(feyaSoft.home.common.share.OrganizationSharePanel, Ext.Panel, { initLoad : function(config) { this.listOrganizations.initLoad(config); this.addOrganization.initLoad(config) }, existedOrganizations : function() { return this.listOrganizations.existedOrganizations() }, reloadListOrganization : function() { this.listOrganizations.reload() } }); feyaSoft.home.common.share.ListOrganizations = function(config) { this.fileId = null; this.myOwnerCt = null; this.componentClass = "organizationFile"; if (config.componentClass == "myPhotoFolderShare") { this.componentClass = "organizationPhotoFolder" } else { if (config.componentClass == "myPhotoShare") { this.componentClass = "organizationPhoto" } else { if (config.componentClass == "browserBookmarkShare") { this.componentClass = "organizationBookmark" } } } var selectBoxModel = new Ext.grid.CheckboxSelectionModel({ singleSelect : true }); function viewEditPermission(val) { var result = val; if (val == 1) { result = feyaSoft.lang.common.canView } else { if (val == 2) { result = feyaSoft.lang.common.canEdit } else { if (val == 7) { result = feyaSoft.lang.common.canEdit } } } return result } var shareCM = new Ext.grid.ColumnModel([selectBoxModel, { id : "id", header : "Identify", dataIndex : "id", width : 100, hidden : true }, { header : feyaSoft.lang.common.name, width : 200, dataIndex : "name" }, { header : feyaSoft.lang.common.permission, width : 100, dataIndex : "permission", scope : this, renderer : viewEditPermission }, { header : feyaSoft.lang.common.date, width : 150, dataIndex : "shareDate", renderer : Ext.util.Common.formatDateHour }]); this.shareStore = new Ext.data.JsonStore({ url : this.componentClass + "/sharedOrganizations", remoteSort : true, fields : [] }); this.deleteBtn = new Ext.Button({ text : feyaSoft.lang.common.remove, tooltip : "Highlight the item and click this button to remove this shared user", iconCls : "delete", disabled : true, handler : function() { this.deleteItem() }, scope : this }); this.changePermit = new Ext.Button({ disabled : true, text : feyaSoft.lang.common.changePermission, tooltip : "Highlight the item and click this button to change this shared organization permission", iconCls : "editItem", handler : this.changeItem, scope : this }); feyaSoft.home.common.share.ListOrganizations.superclass.constructor.call( this, { region : "center", store : this.shareStore, cm : shareCM, sm : selectBoxModel, viewConfig : { forceFit : true }, loadMask : { msg : feyaSoft.lang.common.loadingData }, tbar : [this.deleteBtn, this.changePermit], autoScroll : true }); selectBoxModel.on("selectionchange", this.onSelectionChangeFn, this) }; Ext.extend(feyaSoft.home.common.share.ListOrganizations, Ext.grid.GridPanel, { initLoad : function(config) { this.fileId = config.fileId; this.myOwnerCt = config.myOwnerCt; this.shareStore.baseParams = { fileId : this.fileId }; this.shareStore.load() }, existedOrganizations : function() { return this.shareStore.data.items }, onSelectionChangeFn : function(sm) { if (0 < sm.getSelections().length) { this.deleteBtn.enable(); if (this.componentClass == "organizationPhotoFolder" || this.componentClass == "organizationPhoto") { this.changePermit.disable() } else { this.changePermit.enable() } } else { this.deleteBtn.disable(); this.changePermit.disable() } }, deleteItem : function(rd) { var record = this.getSelectionModel().getSelected(); if (record == null || record.data == null || record.data.id == null) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.common.pleaseSelectOne); return } var deleteInfo = feyaSoft.lang.common.confirmDelete + ": " + record.data.name; Ext.MessageBox.confirm(deleteInfo, feyaSoft.lang.common.confirmDeleteDesc, function(btn) { if (btn == "yes") { Ext.Ajax.request({ url : this.componentClass + "/remove", params : { organizationId : record.data.id, fileId : this.fileId }, method : "GET", success : function(result, request) { var jsonData = Ext.util.JSON .decode(result.responseText); if (jsonData.success == "true") { this.reload(); this.myOwnerCt.reload() } else { Ext.MessageBox .alert( feyaSoft.lang.common.error, jsonData.info) } }, failure : function(result, request) { }, scope : this }) } }, this) }, changeItem : function() { var record = this.getSelectionModel().getSelected(); if (record == null || record.data == null || record.data.id == null) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.common.pleaseSelectOne); return } var changedPermit = feyaSoft.lang.common.canView; if (record.data.permission == 1) { changedPermit = feyaSoft.lang.common.canEdit } Ext.Msg.show({ title : feyaSoft.lang.common.confirm, msg : feyaSoft.lang.common.confirmChangePermit + changedPermit, icon : Ext.Msg.QUESTION, buttons : Ext.Msg.YESNO, fn : this.onChangeConfirm, scope : this, record : record }) }, onChangeConfirm : function(button_id, text, options) { if (button_id == "yes") { Ext.Ajax.request({ url : this.componentClass + "/changePermit", params : { organizationId : options.record.data.id, fileId : this.fileId }, success : function(result, request) { this.reload(); this.myOwnerCt.reload() }, failure : function(result, request) { Ext.MessageBox.alert("Failed", "Internal Error, please try again") }, scope : this }) } }, reload : function() { this.shareStore.reload() }, disableDelete : function() { Ext.getCmp("delete-share-file-action").setDisabled(true) } }); feyaSoft.home.common.share.AddOrganization = function(config) { Ext.QuickTips.init(); Ext.form.Field.prototype.msgTarget = "side"; this.fileId = null; this.myOwnerCt = null; this.componentClass = "organizationFile"; if (config.componentClass == "myPhotoFolderShare") { this.componentClass = "organizationPhotoFolder" } else { if (config.componentClass == "myPhotoShare") { this.componentClass = "organizationPhoto" } else { if (config.componentClass == "browserBookmarkShare") { this.componentClass = "organizationBookmark" } } } var organizationStore = new Ext.data.JsonStore({ url : "organizationUser/list", remoteSort : true, fields : [] }); organizationStore.setDefaultSort("name", "ASC"); this.organization = new Ext.form.ComboBox({ fieldLabel : feyaSoft.lang.organization.organization, forceSelection : true, allowBlank : false, typeAhead : true, minChars : 2, triggerAction : "all", store : organizationStore, displayField : "name", hiddenName : "itemId", valueField : "id", emptyText : feyaSoft.lang.common.pleaseSelectOne, loadingText : feyaSoft.lang.common.loadingData, pageSize : 15, anchor : "93%", listeners : { select : this.onOrganizationSelectFn, scope : this } }); this.permissionStore = [["1", feyaSoft.lang.common.canView], ["2", feyaSoft.lang.common.canEdit]]; if (this.componentClass == "organizationPhotoFolder" || this.componentClass == "organizationPhoto") { this.permissionStore = [["1", feyaSoft.lang.common.canView]] } this.permission_data = new Ext.data.SimpleStore({ fields : ["id", "name"], data : this.permissionStore }); this.permission = new Ext.form.ComboBox({ fieldLabel : feyaSoft.lang.common.permission, forceSelection : true, allowBlank : false, typeAhead : true, triggerAction : "all", store : this.permission_data, displayField : "name", hiddenName : "permission", mode : "local", valueField : "id", anchor : "93%" }); this.note = new Ext.form.HtmlEditor({ hideLabel : true, name : "note", height : 150, anchor : "93%" }); this.posting = new Ext.form.Checkbox({ hideLabel : true, boxLabel : feyaSoft.lang.file.organizationShareMsg, name : "doPosting", checked : true }); this.saveBtn = new Ext.Button({ minWidth : 75, text : feyaSoft.lang.common.save, tooltip : "Save the result to the system", iconCls : "save", handler : this.doSaveFn, scope : this }); feyaSoft.home.common.share.AddOrganization.superclass.constructor.call( this, { region : "east", width : 350, split : true, baseCls : "x-plain", labelWidth : 70, bodyStyle : "padding: 20px 10px 10px 10px", url : this.componentClass + "/createUpdate", items : [this.organization, this.permission, this.note, this.posting], buttons : [this.saveBtn] }) }; Ext.extend(feyaSoft.home.common.share.AddOrganization, Ext.form.FormPanel, { onOrgAfterRenderFn : function() { this.permission_data.on("load", function() { this.permission.setValue("1") }, this) }, initLoad : function(config) { this.fileId = config.fileId; this.myOwnerCt = config.myOwnerCt; this.permission.setValue("1") }, onOrganizationSelectFn : function(obj) { var allowPosting = true; var name = null; var items = obj.store.data.items; for (var i = 0; i < items.length; i++) { if (obj.value == items[i].data.id) { allowPosting = items[i].data.allowPosting; name = items[i].data.name } } if (!allowPosting) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.group.notAllowPosting + ": " + name); this.organization.setValue(null) } var existedOrganization = false; var existedOrganizations = this.ownerCt.existedOrganizations(); for (var i = 0; i < existedOrganizations.length; i++) { if (obj.value == existedOrganizations[i].data.id) { existedOrganization = true; name = existedOrganizations[i].data.name } } if (existedOrganization) { Ext.MessageBox.alert(feyaSoft.lang.common.error, feyaSoft.lang.group.groupShared + ": " + name); this.organization.setValue(null) } }, doSaveFn : function() { if (this.form.isValid()) { this.form.submit({ params : { fileId : this.fileId }, waitMsg : "In processing", failure : function(form, action) { Ext.MessageBox.alert("Error Message", action.result.errorInfo) }, success : function(form, action) { if (action.result.success == "true") { Ext.Message.msgStay( feyaSoft.lang.common.confirm, action.result.info, 2000); this.ownerCt.reloadListOrganization(); this.organization.reset() } else { Ext.MessageBox.alert( feyaSoft.lang.common.error, action.result.info) } }, scope : this }) } else { Ext.MessageBox.alert(feyaSoft.lang.common.error, "Please fix the errors noted.") } } }); Ext.namespace("Ext.ux.designHelper"); Ext.ux.designHelper.selection = function(win, doc) { this.sel = null; this.range = null; this.sdRange = null; this.init = function() { var sel = win.getSelection ? win.getSelection() : doc.selection; var range; try { if (sel.rangeCount > 0) { range = sel.getRangeAt(0) } else { range = sel.createRange() } } catch (e) { } if (!range) { range = Ext.ux.designHelper.util.createRange(doc) } this.sel = sel; this.range = range; var startNode, startPos, endNode, endPos; if (Ext.isIE) { if (range.item) { var el = range.item(0); startNode = endNode = el; startPos = endPos = 0 } else { var getStartEnd = function(isStart) { var pointRange = range.duplicate(); pointRange.collapse(isStart); var parentNode = pointRange.parentElement(); var nodes = parentNode.childNodes; if (nodes.length == 0) { return { node : parentNode, pos : 0 } } var startNode; var endElement; var startPos = 0; var isEnd = false; var testRange = range.duplicate(); testRange.moveToElementText(parentNode); for (var i = 0, len = nodes.length; i < len; i++) { var node = nodes[i]; var cmp = testRange.compareEndPoints("StartToStart", pointRange); if (cmp > 0) { isEnd = true } else { if (cmp == 0) { if (node.nodeType == 1) { var sdRange = new Ext.ux.designHelper.range(doc); sdRange.selectTextNode(node); return { node : sdRange.startNode, pos : 0 } } else { return { node : node, pos : 0 } } } } if (node.nodeType == 1) { var nodeRange = range.duplicate(); nodeRange.moveToElementText(node); testRange.setEndPoint("StartToEnd", nodeRange); if (isEnd) { startPos += nodeRange.text.length } else { startPos = 0 } } else { if (node.nodeType == 3) { testRange.moveStart("character", node.nodeValue.length); startPos += node.nodeValue.length } } if (!isEnd) { startNode = node } } if (!isEnd && startNode.nodeType == 1) { var startNode = parentNode.lastChild; return { node : startNode, pos : startNode.nodeType == 1 ? 1 : startNode.nodeValue.length } } testRange = range.duplicate(); testRange.moveToElementText(parentNode); testRange.setEndPoint("StartToEnd", pointRange); startPos -= testRange.text.replace(/\r\n|\n|\r/g, "").length; return { node : startNode, pos : startPos } }; var start = getStartEnd(true); var end = getStartEnd(false); startNode = start.node; startPos = start.pos; endNode = end.node; endPos = end.pos } } else { startNode = range.startContainer; startPos = range.startOffset; endNode = range.endContainer; endPos = range.endOffset; if (startNode.nodeType == 1 && typeof startNode.childNodes[startPos] != "undefined") { startNode = startNode.childNodes[startPos]; startPos = 0 } if (endNode.nodeType == 1) { endPos = endPos == 0 ? 1 : endPos; if (typeof endNode.childNodes[endPos - 1] != "undefined") { endNode = endNode.childNodes[endPos - 1]; endPos = (endNode.nodeType == 1) ? 0 : endNode.nodeValue.length } } if (startNode.nodeType == 1 && endNode.nodeType == 3 && endPos == 0 && endNode.previousSibling) { var node = endNode.previousSibling; while (node) { if (node === startNode) { endNode = startNode; break } if (node.childNodes.length != 1) { break } node = node.childNodes[0] } } } var sdRange = new Ext.ux.designHelper.range(doc); sdRange.setTextStart(startNode, startPos); sdRange.setTextEnd(endNode, endPos); this.sdRange = sdRange }; this.init(); this.addRange = function(sdRange) { this.sdRange = sdRange; if (Ext.isIE) { var getEndRange = function(isStart) { var range = Ext.ux.designHelper.util.createRange(doc); var node = isStart ? sdRange.startNode : sdRange.endNode; if (node.nodeType == 1) { range.moveToElementText(node); range.collapse(isStart) } else { if (node.nodeType == 3) { range = Ext.ux.designHelper.util.getNodeStartRange(doc, node); var pos = isStart ? sdRange.startPos : sdRange.endPos; range.moveStart("character", pos) } } return range }; if (!this.range.item) { var node = sdRange.startNode; if (node == sdRange.endNode && Ext.ux.designHelper.util.getNodeType(node) == 1 && Ext.ux.designHelper.util.getNodeTextLength(node) == 0) { var temp = doc.createTextNode(" "); node.appendChild(temp); this.range.moveToElementText(node); this.range.collapse(false); this.range.select(); node.removeChild(temp) } else { this.range.setEndPoint("StartToStart", getEndRange(true)); this.range.setEndPoint("EndToStart", getEndRange(false)); this.range.select() } } } else { var getNodePos = function(node) { var pos = 0; while (node) { node = node.previousSibling; pos++ } return --pos }; var range = new Ext.ux.designHelper.range(doc); range.setTextStart(sdRange.startNode, sdRange.startPos); range.setTextEnd(sdRange.endNode, sdRange.endPos); if (Ext.ux.designHelper.util.getNodeType(range.startNode) == 88) { this.range.setStart(range.startNode.parentNode, getNodePos(range.startNode)) } else { this.range.setStart(range.startNode, range.startPos) } if (Ext.ux.designHelper.util.getNodeType(range.endNode) == 88) { this.range.setEnd(range.endNode.parentNode, getNodePos(range.endNode) + 1) } else { this.range.setEnd(range.endNode, range.endPos) } this.sel.removeAllRanges(); this.sel.addRange(this.range) } }; this.focus = function() { if (Ext.isIE && this.range != null) { this.range.select() } } }; Ext.ux.designHelper.range = function(doc) { this.startNode = null; this.startPos = null; this.endNode = null; this.endPos = null; this.getParentElement = function() { var scanParent = function(node, func) { while (node && (!node.tagName || node.tagName.toLowerCase() != "body")) { node = node.parentNode; if (func(node)) { return } } }; var nodeList = []; scanParent(this.startNode, function(node) { nodeList.push(node) }); var parentNode; scanParent(this.endNode, function(node) { if (Ext.ux.designHelper.util.inArray(node, nodeList)) { parentNode = node; return true } }); return parentNode ? parentNode : doc.body }; this.getNodeList = function() { var self = this; var parentNode = this.getParentElement(); var nodeList = []; var isStarted = false; if (parentNode == self.startNode) { isStarted = true } if (isStarted) { nodeList.push(parentNode) } Ext.ux.designHelper.util.eachNode(parentNode, function(node) { if (node == self.startNode) { isStarted = true } var range = new Ext.ux.designHelper.range(doc); range.selectTextNode(node); if (range.comparePoints("START_TO_END", self) >= 0) { return false } if (isStarted) { nodeList.push(node) } return true }); return nodeList }; this.comparePoints = function(how, range) { var compareNodes = function(nodeA, posA, nodeB, posB) { var cmp; if (Ext.isIE) { var getStartRange = function(node, pos, isStart) { var range = Ext.ux.designHelper.util.createRange(doc); var type = Ext.ux.designHelper.util.getNodeType(node); if (type == 1) { range.moveToElementText(node); range.collapse(isStart) } else { if (type == 3) { range = Ext.ux.designHelper.util.getNodeStartRange( doc, node); range.moveStart("character", pos); range.collapse(true) } } return range }; var rangeA, rangeB; if (how == "START_TO_START" || how == "START_TO_END") { rangeA = getStartRange(nodeA, posA, true) } else { rangeA = getStartRange(nodeA, posA, false) } if (how == "START_TO_START" || how == "END_TO_START") { rangeB = getStartRange(nodeB, posB, true) } else { rangeB = getStartRange(nodeB, posB, false) } return rangeA.compareEndPoints("StartToStart", rangeB) } else { var rangeA = Ext.ux.designHelper.util.createRange(doc); rangeA.selectNode(nodeA); if (how == "START_TO_START" || how == "START_TO_END") { rangeA.collapse(true) } else { rangeA.collapse(false) } var rangeB = Ext.ux.designHelper.util.createRange(doc); rangeB.selectNode(nodeB); if (how == "START_TO_START" || how == "END_TO_START") { rangeB.collapse(true) } else { rangeB.collapse(false) } if (rangeA.compareBoundaryPoints(Range.START_TO_START, rangeB) > 0) { cmp = 1 } else { if (rangeA.compareBoundaryPoints(Range.START_TO_START, rangeB) == 0) { if (posA > posB) { cmp = 1 } else { if (posA == posB) { cmp = 0 } else { cmp = -1 } } } else { cmp = -1 } } } return cmp }; if (how == "START_TO_START") { return compareNodes(this.startNode, this.startPos, range.startNode, range.startPos) } if (how == "START_TO_END") { return compareNodes(this.startNode, this.startPos, range.endNode, range.endPos) } if (how == "END_TO_START") { return compareNodes(this.endNode, this.endPos, range.startNode, range.startPos) } if (how == "END_TO_END") { return compareNodes(this.endNode, this.endPos, range.endNode, range.endPos) } }; this.setTextStart = function(node, pos) { var textNode = node; Ext.ux.designHelper.util.eachNode(node, function(n) { if (Ext.ux.designHelper.util.getNodeType(n) == 3 && n.nodeValue.length > 0 || Ext.ux.designHelper.util.getNodeType(n) == 88) { textNode = n; pos = 0; return false } return true }); this.setStart(textNode, pos) }; this.setStart = function(node, pos) { this.startNode = node; this.startPos = pos; if (this.endNode === null) { this.endNode = node; this.endPos = pos } }; this.setTextEnd = function(node, pos) { var textNode = node; Ext.ux.designHelper.util.eachNode(node, function(n) { if (Ext.ux.designHelper.util.getNodeType(n) == 3 && n.nodeValue.length > 0 || Ext.ux.designHelper.util.getNodeType(n) == 88) { textNode = n; pos = Ext.ux.designHelper.util.getNodeType(n) == 3 ? n.nodeValue.length : 0 } return true }); this.setEnd(textNode, pos) }; this.setEnd = function(node, pos) { this.endNode = node; this.endPos = pos; if (this.startNode === null) { this.startNode = node; this.startPos = pos } }; this.selectNode = function(node) { this.setStart(node, 0); this.setEnd(node, node.nodeType == 1 ? 0 : node.nodeValue.length) }; this.selectTextNode = function(node) { this.setTextStart(node, 0); this.setTextEnd(node, node.nodeType == 1 ? 0 : node.nodeValue.length) }; this.extractContents = function(isDelete) { isDelete = (isDelete === false) ? false : true; var thisRange = this; var startNode = this.startNode; var startPos = this.startPos; var endNode = this.endNode; var endPos = this.endPos; var extractTextNode = function(node, startPos, endPos) { var length = node.nodeValue.length; var cloneNode = node.cloneNode(true); var centerNode = cloneNode.splitText(startPos); centerNode.splitText(endPos - startPos); if (isDelete) { var center = node; if (startPos > 0) { center = node.splitText(startPos) } if (endPos < length) { center.splitText(endPos - startPos) } center.parentNode.removeChild(center) } return centerNode }; var isStarted = false; var isEnd = false; var extractNodes = function(parent, frag) { if (Ext.ux.designHelper.util.getNodeType(parent) != 1) { return true } var node = parent.firstChild; while (node) { if (node == startNode) { isStarted = true } if (node == endNode) { isEnd = true } var nextNode = node.nextSibling; var type = node.nodeType; if (type == 1) { var range = new Ext.ux.designHelper.range(doc); range.selectNode(node); if (isStarted && range.comparePoints("END_TO_END", thisRange) < 0) { var cloneNode = node.cloneNode(true); frag.appendChild(cloneNode); if (isDelete) { node.parentNode.removeChild(node) } } else { var childFlag = node.cloneNode(false); frag.appendChild(childFlag); if (!extractNodes(node, childFlag)) { return false } } } node = nextNode; if (isEnd) { return false } } return true }; var parentNode = this.getParentElement(); var docFrag = parentNode.cloneNode(false); extractNodes(parentNode, docFrag); return docFrag } }; Ext.ux.designHelper.cmd = function(iframeWin, iframeDoc) { this.doc = iframeDoc; this.sdSel = new Ext.ux.designHelper.selection(iframeWin, iframeDoc); this.sdRange = this.sdSel.sdRange; this.mergeAttributes = function(el, attr) { for (var i = 0, len = attr.length; i < len; i++) { Ext.ux.designHelper.util.each(attr[i], function(key, value) { if (key.charAt(0) == ".") { var jsKey = Ext.ux.designHelper.util.getJsKey(key .substr(1)); eval("el.style." + jsKey + " = value;") } else { el.setAttribute(key, value) } }) } return el }; this.wrapTextNode = function(node, startPos, endPos, element, attributes) { var length = node.nodeValue.length; var isFull = (startPos == 0 && endPos == length); var range = new Ext.ux.designHelper.range(this.doc); range.selectTextNode(node.parentNode); if (isFull && node.parentNode.tagName == element.tagName && range.comparePoints("END_TO_END", this.sdRange) <= 0 && range.comparePoints("START_TO_START", this.sdRange) >= 0) { this.mergeAttributes(node.parentNode, attributes); return node } else { var el = element.cloneNode(true); if (isFull) { var cloneNode = node.cloneNode(true); el.appendChild(cloneNode); node.parentNode.replaceChild(el, node); return cloneNode } else { var centerNode = node; if (startPos < endPos) { if (startPos > 0) { centerNode = node.splitText(startPos) } if (endPos < length) { centerNode.splitText(endPos - startPos) } var cloneNode = centerNode.cloneNode(true); el.appendChild(cloneNode); centerNode.parentNode.replaceChild(el, centerNode); return cloneNode } else { if (startPos < length) { centerNode = node.splitText(startPos); centerNode.parentNode.insertBefore(el, centerNode) } else { if (centerNode.nextSibling) { centerNode.parentNode.insertBefore(el, centerNode.nextSibling) } else { centerNode.parentNode.appendChild(el) } } return el } } } }; this.wrap = function(tagName, attributes) { var self = this; this.sdSel.focus(); var element = this.doc.createElement(tagName); this.mergeAttributes(element, attributes); var sdRange = this.sdRange; var startNode = sdRange.startNode; var startPos = sdRange.startPos; var endNode = sdRange.endNode; var endPos = sdRange.endPos; var parentNode = sdRange.getParentElement(); var isStarted = false; Ext.ux.designHelper.util.eachNode(parentNode, function(node) { if (node == startNode) { isStarted = true } if (node.nodeType == 1) { if (node == startNode && node == endNode) { if (Ext.ux.designHelper.util.inArray(node.tagName .toLowerCase(), ["br", "hr", "img", "area", "col", "embed", "input", "param"])) { if (startPos > 0) { node.parentNode.appendChild(element) } else { node.parentNode.insertBefore(element, node) } } else { node.appendChild(element) } sdRange.selectNode(element); return false } else { if (node == startNode) { sdRange.setStart(node, 0) } else { if (node == endNode) { sdRange.setEnd(node, 0); return false } } } } else { if (node.nodeType == 3) { if (isStarted) { if (node == startNode && node == endNode) { var rangeNode = self.wrapTextNode(node, startPos, endPos, element, attributes); sdRange.selectNode(rangeNode); return false } else { if (node == startNode) { var rangeNode = self.wrapTextNode(node, startPos, node.nodeValue.length, element, attributes); sdRange.setStart(rangeNode, 0) } else { if (node == endNode) { var rangeNode = self.wrapTextNode(node, 0, endPos, element, attributes); sdRange .setEnd( rangeNode, rangeNode.nodeType == 1 ? 0 : rangeNode.nodeValue.length); return false } else { self.wrapTextNode(node, 0, node.nodeValue.length, element, attributes) } } } } } } return true }); this.sdSel.addRange(sdRange) }; this.execLink = function(url, txt, stype) { var startNode = this.sdRange.startNode; var endNode = this.sdRange.endNode; var node = this.sdRange.getParentElement(); while (node) { if (node.tagName.toLowerCase() == "a" || node.tagName.toLowerCase() == "body") { break } node = node.parentNode } node = node.parentNode; if (startNode.nodeType == 1 && startNode === endNode) { return } if (Ext.isIE) { var html = '' + txt + ""; this.sdSel.range.pasteHTML(html) } else { var arr = node.getElementsByTagName("a"); for (var i = 0, l = arr.length; i < l; i++) { if (arr[i].href.match(/\/?_tmp_link_url_$/)) { arr[i].href = "#" } } this.doc.execCommand("createlink", false, "_tmp_link_url_"); for (var i = 0, l = arr.length; i < l; i++) { if (arr[i].href.match(/\/?_tmp_link_url_$/)) { arr[i].setAttribute("tmpurl", (stype == "web" ? url : "mailto:" + url)); arr[i].setAttribute("target", "_blank") } } } }; this.execWordLink = function(url, txt, stype) { var startNode = this.sdRange.startNode; var endNode = this.sdRange.endNode; var node = this.sdRange.getParentElement(); while (node) { if (node.tagName.toLowerCase() == "a" || node.tagName.toLowerCase() == "body") { break } node = node.parentNode } node = node.parentNode; if (startNode.nodeType == 1 && startNode === endNode) { return } if (Ext.isIE) { var html = '" + txt + ""; this.sdSel.range.pasteHTML(html) } else { var arr = node.getElementsByTagName("a"); for (var i = 0, l = arr.length; i < l; i++) { if (arr[i].href.match(/\/?_tmp_link_url_$/)) { arr[i].href = "#" } } this.doc.execCommand("createlink", false, "_tmp_link_url_"); for (var i = 0, l = arr.length; i < l; i++) { if (arr[i].href.match(/\/?_tmp_link_url_$/)) { arr[i].href = url } } } }; this.fontShadow = function() { var startNode = this.sdRange.startNode; var endNode = this.sdRange.endNode; var node = this.sdRange.getParentElement(); node = node.parentNode; if (Ext.isIE) { var html = '' + this.sdSel.range.text + ""; this.sdSel.range.pasteHTML(html) } } }; Ext.ux.designHelper.util = { inArray : function(str, arr) { for (var i = 0; i < arr.length; i++) { if (str == arr[i]) { return true } } return false }, getJsKey : function(key) { var arr = key.split("-"); key = ""; for (var i = 0, len = arr.length; i < len; i++) { key += (i > 0) ? arr[i].charAt(0).toUpperCase() + arr[i].substr(1) : arr[i] } return key }, createRange : function(doc) { return doc.createRange ? doc.createRange() : doc.body.createTextRange() }, getNodeType : function(node) { return (node.nodeType == 1 && Ext.ux.designHelper.util.inArray( node.tagName.toLowerCase(), ["br", "hr", "img", "area", "col", "embed", "input", "param"])) ? 88 : node.nodeType }, getNodeTextLength : function(node) { var type = Ext.ux.designHelper.util.getNodeType(node); if (type == 1) { var html = node.innerHTML; return html.replace(/<.*?>/ig, "").length } else { if (type == 3) { return node.nodeValue.length } } }, getNodeStartRange : function(doc, node) { var range = Ext.ux.designHelper.util.createRange(doc); var type = node.nodeType; if (type == 1) { range.moveToElementText(node); return range } else { if (type == 3) { var offset = 0; var sibling = node.previousSibling; while (sibling) { if (sibling.nodeType == 1) { var nodeRange = Ext.ux.designHelper.util .createRange(doc); nodeRange.moveToElementText(sibling); range.setEndPoint("StartToEnd", nodeRange); range.moveStart("character", offset); return range } else { if (sibling.nodeType == 3) { offset += sibling.nodeValue.length } } sibling = sibling.previousSibling } range.moveToElementText(node.parentNode); range.moveStart("character", offset); return range } } }, each : function(obj, func) { for (var key in obj) { if (obj.hasOwnProperty(key)) { func(key, obj[key]) } } }, eachNode : function(node, func) { var walkNodes = function(parent) { if (Ext.ux.designHelper.util.getNodeType(parent) != 1) { return true } var n = parent.firstChild; while (n) { var next = n.nextSibling; if (!func(n)) { return false } if (!walkNodes(n)) { return false } n = next } return true }; walkNodes(node) }, getStyleOfSelection : function(win, doc, style) { var selection = new Ext.ux.designHelper.selection(win, doc); var range = selection.sdRange; if (range) { var pn = range.startNode; if (pn) { if (pn.tagName) { pn = Ext.fly(pn) } else { pn = Ext.fly(range.getParentElement()) } if (pn) { return pn.getStyle(style) } } } }, getStartNodeOfSelection : function(win, doc) { var selection = new Ext.ux.designHelper.selection(win, doc); var range = selection.sdRange; if (range) { var pn = range.startNode; if (pn) { if (pn.tagName) { pn = Ext.fly(pn) } else { pn = Ext.fly(range.getParentElement()) } if (pn) { return pn } } } }, getBackgroundColor : function(El, doc) { doc = doc || document; var bg = El.getStyle("background-color"); while (("transparent" == bg || !bg) && El && (El.dom.parentNode != doc)) { El = Ext.fly(El.dom.parentNode); if (El) { bg = El.getStyle("background-color") } } return bg }, hasClass : function(El, doc, className) { doc = doc || document; while (El && (El.dom.parentNode != doc)) { if (El.hasClass(className)) { return El } El = Ext.fly(El.dom.parentNode) } }, selectRange : function(doc, win) { var selection = new Ext.ux.designHelper.selection(win, doc); var r = selection.sdRange; doc.execCommand("SelectAll", false, null); selection.addRange(r) }, getSelectedText : function(win, doc) { if (win.getSelection) { return doc.getSelection().toString() } else { if (doc.getSelection) { return doc.getSelection() } else { if (doc.selection) { return doc.selection.createRange().text } } } } }; Ext.ns("Ext.ux"); Ext.ux.MessagePusher = Ext.extend(Ext.Window, { iconCls : "cubedrive_icon", title : "News", width : 380, height : 180, closable : true, plain : false, resizable : false, animCollapse : false, manager : { register : Ext.emptyFn, unregister : Ext.emptyFn, bringToFront : Ext.emptyFn, sendToBack : Ext.emptyFn }, initComponent : function() { this.layout = "fit"; var p; if (Ext.isIE) { p = 96 } else { p = 100 } this.tpl = new Ext.XTemplate('
Cubedrive Notification
{title}
{content}
'); this.tpl.compile(); this.viewpanel = new Ext.Panel({ autoScroll : true, bodyStyle : "background:transparent;", border : false }); this.items = [this.viewpanel]; this.tools = [{ id : "down", handler : this.onDownFn, scope : this }, { id : "up", hidden : true, handler : this.onUpFn, scope : this }]; Ext.ux.MessagePusher.superclass.initComponent.call(this); this.on("show", this.onShowFn, this); this.on("render", function() { this.body.on("click", function(e) { var tgEl = Ext.get(e.getTarget()); if (tgEl.hasClass("invitation")) { var vid = e.getTarget() .getAttribute("name"); this.onAcceptInvitation(vid) } else { if (tgEl.hasClass("reject")) { var vid = e.getTarget() .getAttribute("name"); this.onRejectInvitation(vid) } else { if (tgEl.hasClass("groupInvitation")) { var vid = e.getTarget() .getAttribute("name"); this.onGroupInvitation(vid) } else { if (tgEl.hasClass("groupReject")) { var vid = e.getTarget() .getAttribute("name"); this.onGroupReject(vid) } } } } }, this) }) }, changeTool : function(id) { if ("up" == id) { this.tools.down.hide(); this.tools.up.show() } else { this.tools.up.hide(); this.tools.down.show() } }, onUpFn : function(event, tEl, p) { this.changeTool("down"); var ch = this.getSize().height; this.expand(); var eh = this.getSize().height; var pos = this.getPosition(true); this.setPosition(pos[0], pos[1] + ch - eh) }, onDownFn : function(event, tEl, p) { this.changeTool("up"); var eh = this.getSize().height; this.collapse(); var ch = this.getSize().height; var pos = this.getPosition(true); this.setPosition(pos[0], pos[1] + eh - ch) }, popup : function(messages) { this.messages = messages; if (this.isVisible()) { if (this.collapsed) { this.onUpFn() } this.onShowFn() } else { this.show(); if (true != this.mini) { this.expand(); this.changeTool("down") } else { this.collapse(); this.changeTool("up") } var taskBar = Ext.get("ux-taskbar"); if (taskBar) { this.el.alignTo(taskBar, "br-tr", [-1, -1]) } else { this.el.alignTo(Ext.getBody(), "br-br", [-10, -10]) } this.el.slideIn("b", { duration : 0.7 }) } }, onShowFn : function(p) { var len = this.messages.length; if (0 < len) { this.setTitle("Notification(" + len + ")"); var html = this.tpl.apply(this.messages); this.viewpanel.body.update(html); this.viewpanel.body.highlight("#c3daf9", { block : true }) } else { this.hide() } }, onAcceptInvitation : function(id) { Ext.Ajax.request({ url : "contactPending/accept", params : { id : id }, method : "GET", success : function(result, request) { var jsonData = Ext.util.JSON .decode(result.responseText); if (jsonData.success == "true") { Ext.Message.msgStay(feyaSoft.lang.common.confirm, jsonData.info, 2000) } else { Ext.MessageBox.alert(feyaSoft.lang.common.error, jsonData.info) } }, failure : function(result, request) { Ext.MessageBox.alert(feyaSoft.lang.common.error, "Internal Error") }, scope : this }) }, onRejectInvitation : function(id) { Ext.Ajax.request({ url : "contactPending/reject", params : { id : id }, method : "GET", success : function(result, request) { var jsonData = Ext.util.JSON .decode(result.responseText); if (jsonData.success == "true") { Ext.Message.msgStay(feyaSoft.lang.common.confirm, jsonData.info, 2000) } else { Ext.MessageBox.alert(feyaSoft.lang.common.error, jsonData.info) } }, failure : function(result, request) { Ext.MessageBox.alert(feyaSoft.lang.common.error, "Internal Error") }, scope : this }) }, onGroupInvitation : function(id) { Ext.Ajax.request({ url : "locationUserPending/accept", params : { id : id }, method : "GET", success : function(result, request) { var jsonData = Ext.util.JSON .decode(result.responseText); if (jsonData.success == "true") { Ext.Message.msgStay(feyaSoft.lang.common.confirm, jsonData.info, 2000) } else { Ext.MessageBox.alert(feyaSoft.lang.common.error, jsonData.info) } }, failure : function(result, request) { Ext.MessageBox.alert(feyaSoft.lang.common.error, "Internal Error") }, scope : this }) }, onGroupReject : function(id) { Ext.Ajax.request({ url : "locationUserPending/reject", params : { id : id }, method : "GET", success : function(result, request) { var jsonData = Ext.util.JSON .decode(result.responseText); if (jsonData.success == "true") { Ext.Message.msgStay(feyaSoft.lang.common.confirm, jsonData.info, 2000) } else { Ext.MessageBox.alert(feyaSoft.lang.common.error, jsonData.info) } }, failure : function(result, request) { Ext.MessageBox.alert(feyaSoft.lang.common.error, "Internal Error") }, scope : this }) } }); Ext.ux.SlidingPager = Ext.extend(Object, { init : function(pbar) { Ext.each(pbar.items.getRange(2, 6), function(c) { c.hide() }); var slider = new Ext.Slider({ width : 114, minValue : 1, maxValue : 1, plugins : new Ext.ux.SliderTip({ getText : function(s) { return String .format( "Page {0} of {1}", s.value, s.maxValue) } }), listeners : { changecomplete : function(s, v) { pbar.changePage(v) } } }); pbar.insert(5, slider); pbar.on({ change : function(pb, data) { slider.maxValue = data.pages; slider.setValue(data.activePage) }, beforedestroy : function() { slider.destroy() } }) } });