//////////////////////////////////////////////////////////////////////////////// // File: SCENE.AS // Mô tả: File chứa các biến, các hàm phục vụ việc xử lý các thao tác trên // 3 đối tượng của giao diện chính (gồm TreeView, Preview, FileList) // và cập nhật dữ liệu dùng chung (biến dataXML) // // Tác giả: Đinh Hải Minh, VicoSoft // Ngày: 02/12/2003 //////////////////////////////////////////////////////////////////////////////// //****************************************************************************** // Khởi tạo các biến toàn cục và thuộc tính ban đầu của các đối tượng // Nạp file Player để hiển thị PREVIEW của bài giảng //****************************************************************************** version = "1.81"; if (language == undefined) language = "Vietnamese"; if (vietType == undefined) vietType = false; if (tokenPassword == undefined) tokenPassword = "violet"; if (applicationId == undefined) applicationId = "Violet"; slash = "\\"; btnSemitrans.count = 0; btnSemitrans._visible = false; btnSceneBkGnd._visible = false; btnSemitrans.useHandCursor = false; btnSceneBkGnd.useHandCursor = false; scpFileList.content.movFileItem._visible = false; treItem.addEventListener("change", onTreeViewChange); if (_url.substr(0, 7)=="http://") { rootPath = _url.substr(0, -25); slash = "/"; webbase = true; } else if (_url.substr(0, 8)=="file:///") { rootPath = _url.substr(8, -33).split("|").join(":"); slash = "/"; } else if (_url.substr(0, 7)=="file://") rootPath = _url.substr(7, -32).split("|").join(":"); dataDir = 'Data'; commonDir = 'Common'; commonLibDir = 'Addins'; maxUndo = 10; dataID = "[VIOLET Data]"; dataChanged = "false"; commonXML = new XML(); currentFile = ""; defXmlDecl = "" packagePlayer = "Player.exe"; playerMovie = rootPath + "Frame" + slash + "Player.swf"; appPath = rootPath + "Lecture" + slash; commonPath = appPath + "Layout" + slash; pluginUrl = "http://edustore.vn/violet/"; userUrl = "http://api.violet.vn/user/"; spaceUrl = "http://api.violet.vn/space/"; userInfoUrl = "/ajax/user/login/xml"; // the server domain/IP will be passed via flashvars //online = true; fileId = 2877; userInfoUrl = "userinfo.xml"; // TEST userId = 0; curPos = new Array(); repPos = new Array(); undoData = new Array(); undoPos = 0; if( !command ) command = ""; onEnterFrame = WaitForAppCommand; wndDialog.contentPath = appPath + "Dialogs.swf"; wndDialog.addEventListener("click", function(){this.content.gotoAndStop(1)}); createEmptyMovieClip("lang", 0); InitTreeContextMenu(); #include "scorm.as" #include "versions.as" #include "utils.as" //****************************************************************************** // Hàm khởi động ứng dụng Flash, được gọi sau khi các biến của Flash đã được // khởi tạo trong hàm OnInitDialog của chương trình C++. Hàm này sẽ được // thực hiện khi chương trình C++ gửi message "Init OK" hoặc "Init&Open File" // Tác dụng: // - Nạp cấu hình (cửa sổ và các tùy chọn của Violet) // - Nạp dữ liệu ngôn ngữ giao tiếp // - Nạp module Player, để hiển thị bài giảng đang soạn // - Nạp bộ gõ tiếng Việt (nếu cần) //****************************************************************************** function InitFlashApp(execFunc) { LoadPluginInfo(); LoadConfig(); LoadLanguage(); if( !vietType ) { onLoadTypingObj = function() { typingObj.deactive(); delete typingObj; } } var loader = new MovieClipLoader(); loader.loadClip(playerMovie, movPlayer); loader.addListener({onLoadInit: function() { movScene = movPlayer.scene; LoadCommonLibs(commonLibList, appPath + commonLibDir); if( fullscreen == true ) btnPreview.onRelease(); if (execFunc) execFunc(); else { movScene.dataXML = dataXML; movScene.onLoadXMLData(); } }}); if( autoDemoTime ) setInterval(function() { if( movScene.NextScreen() == -1 ) { SaveConfig(); fscommand("Quit", ""); } }, Number(autoDemoTime)*1000); } //****************************************************************************** // Hàm xử lý các lệnh (chứa trong biến command) nhận về từ chương trình C++ // Tác dụng: // - Xử lý lệnh khi người dùng nhấn nút CLOSE trên cửa sổ chương trình C++ // - Xử lý phím Enter và Esc, chủ yếu thực hiện khi đang hiện các Dialog // - Xử lý các phím tắt của chương trình tương ứng với các mục menu //****************************************************************************** function WaitForAppCommand() { if( messageShowing ) command = ""; if( command == "" ) return; if( command == "Init OK" ) { dataXML = new XML(defXmlDecl); InitializeDataXML(); InitFlashApp(); if (online) InitFlashKeys(); } if( command == "Press Delete" ) onPressDelete(); if( command == "Press Enter" ) onPressEnter(); if( command == "Press Esc" ) onPressEsc(); if( command == "Press Undo" ) onPressUndo(); if( command == "Press Redo" ) onPressRedo(); if( command == "Press Cut" ) onPressCtrlX(); if( command == "Press Copy" ) onPressCtrlC(); if( command == "Press Paste" ) onPressCtrlV(); if( command == "Press SelAll" ) onPressCtrlA(); if( command == "Drop Element" ) onDropElement(); if( command == "Press Help" ) btnHelp.onRelease(); if( !btnSemitrans._visible ) { if( command == "Init&Open File" ) InitFlashApp(OpenNewFile); if( command == "Open File" ) ExecWithConfirmSave(OpenNewFile); if( command == "Press New" ) btnNew.onRelease(); if( command == "Press Open" ) btnOpen.onRelease(); if( command == "Press Lib" ) btnLibrary.onRelease(); if( command == "Press Save" ) btnSave.onRelease(); if( command == "Press Pack" ) btnPack.onRelease(); if( command == "Quit App" ) ExitProgram(); if( command == "Press Undo" ) ProcessUndo(); if( command == "Press Redo" ) ProcessRedo(); if( command == "Press Cut" ) btnCutOnRelease(); if( command == "Press Copy" ) btnCopyOnRelease(); if( command == "Press Paste" ) btnPasteOnRelease(); if( command == "Press MoveUp" ) btnMoveUp.onRelease(); if( command == "Press MoveDn" ) btnMoveDown.onRelease(); if( command == "Press Add" ) btnAdd.onRelease(); if( command == "Press Update" ) btnDetail.onRelease(); if( command == "Press Delete" ) btnDelete.onRelease(); if( command == "Press Sync" ) SyncVideoAudio(); if( command == "Press Layout" ) btnLayout.onRelease(); if( command == "Press Preview" ) btnPreview.onRelease(); } command = ""; } function InitFlashKeys() { var keyListener = new Object(); keyListener.onKeyDown = function() { if (messageShowing) return; var keyCode = Key.getCode(); switch (keyCode) { case Key.DELETEKEY: onPressDelete(); break; case Key.ENTER: onPressEnter(); break; case Key.ESCAPE: onPressEsc(); break; case 90 /*Z*/: if (Key.isDown(Key.CONTROL)) onPressUndo(); break; case 89 /*Y*/: if (Key.isDown(Key.CONTROL)) onPressRedo(); break; case 88 /*X*/: if (Key.isDown(Key.CONTROL)) onPressCtrlX(); break; case 67 /*C*/: if (Key.isDown(Key.CONTROL)) onPressCtrlC(); break; case 86 /*V*/: if (Key.isDown(Key.CONTROL)) onPressCtrlV(); break; case 65 /*A*/: if (Key.isDown(Key.CONTROL)) onPressCtrlA(); break; case 112 /*F1*/: btnHelp.onRelease(); break; } if( !btnSemitrans._visible ) switch (keyCode) { case 90 /*Z*/: if (Key.isDown(Key.CONTROL)) ProcessUndo(); break; case 89 /*Y*/: if (Key.isDown(Key.CONTROL)) ProcessRedo(); break; case 88 /*X*/: if (Key.isDown(Key.CONTROL)) btnCutOnRelease(); break; case 67 /*C*/: if (Key.isDown(Key.CONTROL)) btnCopyOnRelease(); break; case 86 /*V*/: if (Key.isDown(Key.CONTROL)) btnPasteOnRelease(); break; case 76 /*L*/: if (Key.isDown(Key.CONTROL)) btnLibrary.onRelease(); break; case 83 /*S*/: if (Key.isDown(Key.CONTROL)) btnSave.onRelease(); break; case 113 /*F2*/: btnNew.onRelease(); break; case 114 /*F3*/: btnOpen.onRelease(); break; case 115 /*F4*/: btnPack.onRelease(); break; case 116 /*F5*/: btnAdd.onRelease(); break; case 117 /*F6*/: btnDetail.onRelease(); break; case 118 /*F7*/: SyncVideoAudio(); break; case 119 /*F8*/: btnLayout.onRelease(); break; case 120 /*F9*/: btnPreview.onRelease(); break; case Key.DELETEKEY: btnDelete.onRelease(); break; } } Key.addListener(keyListener); } //****************************************************************************** // Hàm nạp thông tin về các plugin và các layout, dùng cho hàm chuyển đổi // version, cho cửa sổ soạn thảo slide và cho bảng lựa chọn Layout // Tác dụng: // - Đọc các thông tin XML trong file Plugin.xml và Layouts.xml //****************************************************************************** function LoadPluginInfo() { pluginXML = new XML(); pluginXML.ignoreWhite = true; pluginXML.load(appPath + "Plugins.xml"); pluginXML.onLoad = function() { pluXML = pluginXML.firstChild; LoadOldPlgLang(pluXML.firstChild.childNodes); } layoutXML = new XML(); layoutXML.ignoreWhite = true; layoutXML.load(appPath + "Layout" + slash + "Layouts.xml"); var libXML = new XML(); libXML.ignoreWhite = true; libXML.load(appPath + "Libraries.xml"); libXML.onLoad = function() { libraryPaths = libXML.firstChild.childNodes[0]; symbolPaths = libXML.firstChild.childNodes[1]; lecturePaths = libXML.firstChild.childNodes[2]; libraryPaths.attributes.libPath = libPath1[0]; lecturePaths.attributes.libPath = libPath2[0]; libraryPaths.attributes.libCurrentSelected = libPath1[1]; lecturePaths.attributes.libCurrentSelected = libPath2[1]; libraryPaths.attributes.libCurrentPage = libPath1[2]; lecturePaths.attributes.libCurrentPage = libPath2[2]; } delete pluginXmlData; delete layoutXmlData; } //****************************************************************************** // Hàm nạp dữ liệu ngôn ngữ, dùng khi khởi động và khi thay đổi ngôn ngữ // Tác dụng: Đọc các file ngôn ngữ trong Langugue và Langugue\Plugins //****************************************************************************** function LoadLanguage() { lang.onData = function() { CreateMenuBar(); AutoCheckVersion(); //if (online && userId==0) LoginViolet(); if (online && userId == 0) { LoadUserInfo(); } else { UpdateFromFlashVars(); } } loadVariables(appPath + "Language" + slash + language + ".txt", lang); RemoveAllChild(lang); var plang = lang.createEmptyMovieClip("plgLang", 0); var llang = lang.createEmptyMovieClip("layLang", 1); loadVariables(appPath + "Language" + slash + "Plugins" + slash + language + ".txt", plang); loadVariables(appPath + "Layout" + slash + "Language" + slash + language + ".txt", llang); LoadLibLanguage(commonLibList, commonLibDir); } function LoadOldPlgLang(plulist) { for( var i = 0; i < plulist.length; i++ ) { var name = plulist[i].attributes.name; if (name=="vpTest" || name=="vpDrag" || name=="vpCross") { var lang = lang.createEmptyMovieClip(name, lang.getNextHighestDepth()); loadVariables(appPath + plulist[i].attributes.language + slash + language + ".txt", lang); } } } function LoadLibLanguage(libStr, libDir) { var libs = libStr.split(","); for (var i = 0; i < libs.length; i++) { if (libs[i].substr(-4).toLowerCase() != ".swf") continue; var name = libs[i].substr(0, -4); var file = libDir + slash + name + "_lang" + slash + language + ".txt"; if (lang[name]) lang[name].removeMovieClip(); var lib = lang.createEmptyMovieClip(name, lang.getNextHighestDepth()); loadVariables(file, lib); } } function GetPluginTitle(node) { var isXml = (typeof(node) != "string"); var name = isXml? node.attributes.name: node; var title = lang.plgLang[name]; if (!title && isXml) title = node.attributes.title; return title? title: name; } function RunAfterLoadPlgLang(plgNode, UpdateList) { for (var i = 0; i < plgNode.childNodes.length; i++) { if (!_root.lang.plgLang[plgNode.attributes.name]) break; } if (i < plgNode.childNodes.length) { loadVariables(pluginUrl + "language/" + language + ".txt", lang.plgLang); lang.plgLang.onData = UpdateList; needUpdatePluginLang = true; } else UpdateList(); } function UpdatePluginLang() { if (!needUpdatePluginLang) return; fscommand("Download Plugin", pluginUrl + "language/Language.zip"); needUpdatePluginLang = false; } //****************************************************************************** // Hàm tự động kiểm tra phiên bản phần mềm và xử lý khi phiên bản đã cũ // Tác dụng: Đọc file thông tin violet.inf trên server, so sánh phiên bản và // + nếu update_level = 0 thì không làm gì // + nếu update_level = 1 thì thông báo và chạy tiếp // + nếu update_level = 2 thì thông báo và ngừng chương trình //****************************************************************************** function AutoCheckVersion() { var verlv = new LoadVars(); verlv.load("http://www.bachkim.vn/resource/violet.inf"); verlv.onLoad = function(success) { if (!success) return; var lastest = Number(verlv.violet_version); var prever = Number(verlv.violet_preversion); var level = Number(verlv.update_level); if (level > 0 && prever < version && version < lastest) { ShowMessage(lang.msgNeedUpdate, lang.msgTitle, function() { if (level == 2) fscommand("Quit", ""); }); } } } //****************************************************************************** // Hàm nạp dữ liệu từ file ngoài (*.XVL), được gọi trong chức năng MỞ FILE // Tác dụng: Tạo biến dataXML và gọi lệnh để đọc dữ liệu từ file vào biến này //****************************************************************************** function LoadXMLData(fileName) { dataXML = new XML(); dataXML.onLoad = onLoadData; dataXML.ignoreWhite = true; dataXML.load(fileName); movScene.dataXML = dataXML; } //****************************************************************************** // Hàm thông báo lỗi nếu có lỗi khi mở file, được gọi trong hàm onLoadData() //****************************************************************************** function ErrorMessage(message) { ShowMessage(message, lang.msgTitle1); CreateNewData(); } //****************************************************************************** // Hàm cập nhật toàn bộ màn hình Violet mỗi khi dữ liệu dataXML thay đổi một // cách bất kỳ. Hàm được gọi khi load một XML mới hoặc khi undo, redo. // Tác dụng: Cập nhất nội dung Tree mới và cập nhật phần danh sách file. //****************************************************************************** function UpdateScreen() { var index = 0; var a = new XML(); for( var i=0; i0 && treItem.length>0 ) { while( i 0 ) { dataXML.firstChild.childNodes[section-1].childNodes[item-1].removeNode(); if( !delOnly ) { curPos.push(section); curPos.push(item); repPos.push(-1); repPos.push(-1); } treItem.getItemAt(i).removeTreeNode(); treItem.removeItemAt(i); while( i 0 ) { if( oldSel của html đó. // Nếu không có attr thì sẽ thay đổi nội dung của textNode. //****************************************************************************** function ChangeXMLFileInfo(node, change, infostr) { if (infostr == undefined) return; var infos = infostr.split(";"); for (var i = 0; i < infos.length; i++) { var html = infos[i].substr(-6) == "(html)"; if (html) infos[i] = infos[i].substr(0, infos[i].length - 6); var info = infos[i].split("."); if (info[0] != node.nodeName || (info[1] != undefined && node.attributes[info[1]] == undefined)) continue; if (info[1] != undefined) node.attributes[info[1]] = ChangeFileInfo(html, change, node.attributes[info[1]]); else node.firstChild.nodeValue = ChangeFileInfo(html, change, node.firstChild.nodeValue); } for (var i = 0; i < node.childNodes.length; i++) { ChangeXMLFileInfo(node.childNodes[i], change, infostr); } } function ChangeFileInfo(html, change, data) { return html? GetHtmlChangePath(change, data): change(data); } //****************************************************************************** // Hàm cho biết có sử dụng một mục nào đó có dùng bộ gõ tiếng Việt hay không, // để khi đóng gói thì copy file Vnkey.swf theo // Tác dụng: Đọc thông tin trong infostr dạng "name.attr.value", nếu node có // tên là name, thuộc tính attr bằng value thì là có dùng bộ gõ tiếng Việt //****************************************************************************** function GetXMLUsingKB(node, infostr) { if (infostr == undefined) return false; if (infostr == "") return true; var infos = infostr.split(";"); for (var i = 0; i < infos.length; i++) { var info = infos[i].split("."); if (info[0] == node.nodeName && node.attributes[info[1]] == info[2]) return true; } for (var i = 0; i < node.childNodes.length; i++) { if (GetXMLUsingKB(node.childNodes[i], infostr)) return true; } return false; } //****************************************************************************** // Hàm thay đổi các đường dẫn nếu có trong các tham số của Layout // Tác dụng: Lấy danh sách tham số Layout, duyệt các tham số, nếu kiểu là // dạng file name thì thay đổi //****************************************************************************** function ChangeLayoutFileParam(node, change) { var layout = node.attributes.Layout; var paramStr = ""; var layoutInfo = layoutXML.firstChild.childNodes; for (var i = 0; i < layoutInfo.length; i++) if (layout == layoutInfo[i].attributes.file) paramStr = layoutInfo[i].attributes.param; var a = paramStr.split("|"); for (var i = 0; i < a.length; i++) { var b = a[i].split(","); if (b[1] == "ImageFile" && dataXML.firstChild.attributes[b[0]]) node.attributes[b[0]] = change(dataXML.firstChild.attributes[b[0]]); } } //****************************************************************************** // Hàm xử lý add thêm common library vào danh sách // Tác dụng: Duyệt trường commonLib của XML, nếu không thấy có libName thì // add thêm vào //****************************************************************************** function AddCommonLib(xml, libName) { if (!libName) return; var libs = xml.firstChild.attributes.commonLib? xml.firstChild.attributes.commonLib.split(","): new Array(); for (var i = 0; i < libs.length; i++) if (libs[i] == libName) return; libs.push(libName); AddToList(appPath + commonLibDir + slash + libName, "COMMON_FILE"); xml.firstChild.attributes.commonLib = libs.join(","); } //****************************************************************************** // Hàm xử lý bớt đi common library từ trong danh sách // Tác dụng: Duyệt trường commonLib của XML, nếu thấy có libName thì bỏ đi //****************************************************************************** function RemoveCommonLib(xml, libName) { if (!xml.firstChild.attributes.commonLib) return; var libs = xml.firstChild.attributes.commonLib.split(","); for (var i = 0; i < libs.length; i++) if (libs[i] == libName) break; if (i == libs.length) return; libs.splice(i, 1); if (libs.length > 0) xml.firstChild.attributes.commonLib = libs.join(","); else delete xml.firstChild.attributes.commonLib; } //****************************************************************************** // Hàm ghi các thông tin cấu hình vào Cookies // Tác dụng: Dùng đối tượng ShareObject của Flash để ghi vào file sau đây // C:\Documents and Settings\Administrator\Application Data\Macromedia\ // Flash Player\localhost\...\Violet.sol //****************************************************************************** function SaveConfig() { var configSO = SharedObject.getLocal("Violet"); configSO.data.windowState = windowState; configSO.data.windowTop = windowTop; configSO.data.windowLeft = windowLeft; configSO.data.windowRight = windowRight; configSO.data.windowBottom = windowBottom; configSO.data.flashViewMode = flashViewMode; configSO.data.language = language; configSO.data.vietType = vietType; configSO.data.cfgUseSnap = cfgUseSnap; configSO.data.cfgShowGrid = cfgShowGrid; configSO.data.cfgGridWidth = cfgGridWidth; configSO.data.cfgVideoFormat = cfgVideoFormat; configSO.data.libPath1 = libraryPaths.attributes.libPath + "|" + libraryPaths.attributes.libCurrentSelected + "|" + libraryPaths.attributes.libCurrentPage; configSO.data.libPath2 = lecturePaths.attributes.libPath + "|" + lecturePaths.attributes.libCurrentSelected + "|" + lecturePaths.attributes.libCurrentPage; configSO.data.fullscreen = btnSceneBkGnd._visible; if(usingNum != 200) configSO.data.remainNum = usingNum; configSO.flush(); delete configSO; } //****************************************************************************** // Hàm đọc các thông tin cấu hình trong Cookies ra các biến tương ứng // Tác dụng: Dùng đối tượng ShareObject của Flash để đọc từ file cấu hình mà // hàm SaveConfig ghi ra, sau đó thiết lập chương trình theo các thông tin này //****************************************************************************** function LoadConfig() { windowState = 3; windowTop = 0; windowLeft = 0; windowRight = 0; windowBottom = 0; flashViewMode = "original size"; cfgUseSnap = true; cfgShowGrid = true; cfgGridWidth = 10; cfgVideoFormat = "flv"; var configSO = SharedObject.getLocal("Violet"); for( var a in configSO.data ) { if( a == "windowState" ) windowState = configSO.data[a]; if( a == "windowTop" ) windowTop = configSO.data[a]; if( a == "windowLeft" ) windowLeft = configSO.data[a]; if( a == "windowRight" ) windowRight = configSO.data[a]; if( a == "windowBottom" ) windowBottom = configSO.data[a]; if( a == "flashViewMode" ) SetFlashViewMode(configSO.data[a]); if( a == "language" ) language = configSO.data[a]; if( a == "vietType" ) vietType = configSO.data[a]; if( a == "cfgUseSnap" ) cfgUseSnap = configSO.data[a]; if( a == "cfgShowGrid" ) cfgShowGrid = configSO.data[a]; if( a == "cfgGridWidth" ) cfgGridWidth = configSO.data[a]; if( a == "cfgVideoFormat" ) cfgVideoFormat = configSO.data[a]; if( a == "libPath1" ) libPath1 = configSO.data[a].split("|"); if( a == "libPath2" ) libPath2 = configSO.data[a].split("|"); if( a == "fullscreen" ) fullscreen = configSO.data[a]; if( a == "remainNum" ) remainNum = configSO.data[a]; } delete configSO; if( remainNum != undefined && usingNum != 200 && Number(remainNum) <= Number(usingNum) ) fscommand("bug", ""); if( flashViewMode == "original size" ) mnuWindow.getItemAt(2).attributes.selected = true; if( flashViewMode == "full size" ) mnuWindow.getItemAt(3).attributes.selected = true; if (!webbase) fscommand("Set State", ""); }