source: pro-violet-viettel/refs/LectureEditor/menus.as @ 698

Last change on this file since 698 was 698, checked in by dungnv, 10 years ago
File size: 38.1 KB
Line 
1////////////////////////////////////////////////////////////////////////////////
2// File:   MENU.AS
3// Desc:   File chứa các hàm và dữ liệu phục vụ việc khởi tạo, xử lý các chức
4//         năng của Menu, Toolbar, các nút bấm trên giao diện chính, các hộp
5//         nhập liệu (dialog) và hộp thoại (alert),...
6//
7// Author: Đinh Hải Minh, VicoSoft
8// Date:   01/12/2003
9////////////////////////////////////////////////////////////////////////////////
10
11import mx.controls.Alert;
12
13function CreateMenuBar() {
14        /*
15        //
16        // CREATE THE MENUBAR OF APPLICATION
17        //
18
19        // Delete all menu items
20        while( mnuBar.getMenuAt(0) ) mnuBar.removeMenuAt(0);
21
22        var menuObj = new XML(
23                "<node label=\"" + lang.mnuFile + "\">"+
24                "<node label=\"" + lang.mnuNew + " (F2)\"/>"+
25                "<node label=\"" + lang.mnuOpen + "... (F3)\"/>"+
26                "<node label=\"" + lang.mnuSave + "\"/>"+
27                "<node label=\"" + lang.mnuSaveAs + "...\"/>"+
28                "<node type=\"separator\"/>"+
29                "<node label=\"" + lang.mnuLibrary + "... (Ctrl+L)\"/>"+
30                "<node label=\"" + lang.mnuPack + "... (F4)\"/>"+
31                "<node type=\"separator\"/>"+
32                "<node label=\"" + lang.mnuExit + "\"/>"+
33                "</node>");
34        mnuBar.addMenu(menuObj);
35
36        var menuObj = new XML(
37                "<node label=\"" + lang.mnuEdit + "\">"+
38                "<node label=\"" + lang.mnuUndo + " (Ctrl+Z)\"/>"+
39                "<node label=\"" + lang.mnuRedo + " (Ctrl+Y)\"/>"+
40                "<node type=\"separator\"/>"+
41                "<node label=\"" + lang.mnuCut + " (Ctrl+X)\"/>"+
42                "<node label=\"" + lang.mnuCopy + " (Ctrl+C)\"/>"+
43                "<node label=\"" + lang.mnuPaste + " (Ctrl+V)\"/>"+
44                "<node type=\"separator\"/>"+
45                "<node label=\"" + lang.mnuMoveUp + " (Alt+↑)\"/>"+
46                "<node label=\"" + lang.mnuMoveDn + " (Alt+↓)\"/>"+
47                "</node>");
48        mnuBar.addMenu(menuObj);
49
50        menuObj = new XML(
51                "<node label=\"" + lang.mnuContent + "\">"+
52                "<node label=\"" + lang.mnuAdd + " (F5)\"/>"+
53                "<node label=\"" + lang.mnuChange + " (F6)\"/>"+
54                "<node label=\"" + lang.mnuSync + " (F7)\"/>"+
55                "<node label=\"" + lang.mnuDelete + "\"/>"+
56                "<node type=\"separator\"/>"+
57                "<node label=\"" + lang.mnuCover + "\"/>"+
58                "<node label=\"" + lang.mnuLayout + " (F8)\"/>"+
59                "<node label=\"" + lang.mnuBackGround + "\"/>"+
60                "<node type=\"separator\"/>"+
61                "<node label=\"" + lang.mnuFullScr + " (F9)\"/>"+
62                "</node>");
63        mnuBar.addMenu(menuObj);
64
65        menuObj = new XML(
66                "<node label=\"" + lang.mnuOption + "\">"+
67                (webbase? "":
68                "<node label=\"" + lang.mnuUpdateModules + "\"/>"+
69                "<node label=\"" + lang.mnuUpdateLayouts + "\"/>"+
70                "<node label=\"" + lang.mnuUpdateLibs + "\"/>"+
71                "<node type=\"separator\"/>"+
72                "<node label=\"" + lang.mnuSupport + "\">"+
73                "<node label=\"" + lang.mnuUniKey + "\"/>"+
74                "<node label=\"" + lang.mnuTeamViewer + "\"/>"+
75                "</node>"+
76                "<node type=\"separator\"/>")+
77                "<node label=\"" + lang.mnuOrigin + "\"/>"+
78                "<node label=\"" + lang.mnuConfig + "\"/>"+
79                "</node>");
80        mnuBar.addMenu(menuObj);
81
82        menuObj = new XML(
83                "<node label=\"" + lang.mnuHelp + "\">"+
84                "<node label=\"" + lang.mnuHelpContent + " (F1)\"/>"+
85                (webbase? "":
86                "<node label=\"" + lang.mnuUpgrade + "\"/>")+
87                "<node type=\"separator\"/>"+
88                "<node label=\"" + lang.mnuAbout + "...\"/>"+
89                "</node>");
90        mnuBar.addMenu(menuObj);
91
92        if (online) {
93        menuObj = new XML(
94                "<node label=\"" + lang.mnuAccount + "\">"+
95                "<node label=\"" + lang.mnuInfo + "\"/>"+
96                "<node label=\"" + lang.mnuPayment + "\"/>"+
97                "<node label=\"" + lang.mnuLicense + "\"/>"+
98                "<node label=\"" + lang.mnuLogout + "\"/>"+
99                "</node>");
100        mnuBar.addMenu(menuObj);
101        }
102
103        //
104        // GET SUBMENUS OF MENUBAR AND HANDLE THEM
105        //
106        mnuFile = mnuBar.getMenuAt(0);
107        mnuEdit = mnuBar.getMenuAt(1);
108        mnuSlide = mnuBar.getMenuAt(2);
109        mnuOption = mnuBar.getMenuAt(3);
110        mnuHelp = mnuBar.getMenuAt(4);
111        //if (online) mnuAccount = mnuBar.getMenuAt(5);
112        mnuFile.addEventListener("change", onSelectFile);
113        mnuEdit.addEventListener("change", onSelectEdit);
114        mnuSlide.addEventListener("change", onSelectSlide);
115        mnuOption.addEventListener("change", onSelectWindow);
116        mnuHelp.addEventListener("change", onSelectHelp);
117        //if (online) mnuAccount.addEventListener("change", onSelectAccount);
118       
119        // hide the Menu Bar
120        //mnuBar.visible = false;
121        */
122
123        //
124        // TOOLTIP TEXT OF INTERFACE BUTTONS
125        //
126        btnNew.tooltipText     = lang.mnuNew;
127        btnOpen.tooltipText    = lang.mnuOpen + "...";
128        btnSave.tooltipText    = lang.mnuSave;
129        btnSaveAs.tooltipText  = lang.mnuSaveAs + "...";
130        btnUndo.tooltipText    = lang.mnuUndo;
131        btnRedo.tooltipText    = lang.mnuRedo;
132        btnSync.tooltipText    = lang.mnuSync + "...";
133        btnLibrary.tooltipText = lang.mnuLibrary + "...";
134        btnPack.tooltipText    = lang.mnuPack + "...";
135        btnCover.tooltipText   = lang.mnuCover + "...";
136        btnBackground.tooltipText  = lang.mnuBackGround + "...";
137        btnLayout.tooltipText  = lang.mnuLayout;
138        btnPreview.tooltipText = lang.mnuFullScr;
139        btnHelp.tooltipText    = lang.mnuHelpContent;
140        btnSetting.tooltipText = lang.mnuConfig + "...";
141
142        btnMoveUp.onRollOver   = function() {StartTooltip(lang.mnuMoveUp)};
143        btnMoveDown.onRollOver = function() {StartTooltip(lang.mnuMoveDn)};
144        btnCutItem.onRollOver  = function() {StartTooltip(lang.mnuCut)};
145        btnCopyItem.onRollOver = function() {StartTooltip(lang.mnuCopy)};
146        btnPasteItem.onRollOver = function() {StartTooltip(lang.mnuPaste)};
147        btnAdd.onRollOver      = function() {StartTooltip(lang.mnuAdd)};
148        btnDetail.onRollOver   = function() {StartTooltip(lang.mnuChange)};
149        btnDelete.onRollOver   = function() {StartTooltip(lang.mnuDelete)};
150
151        btnMoveUp.onRollOut    = btnMoveUp.onPress   = StopTooltip;
152        btnMoveDown.onRollOut  = btnMoveDown.onPress = StopTooltip;
153        btnCutItem.onRollOut   = btnCutItem.onPress = StopTooltip;
154        btnCopyItem.onRollOut  = btnCopyItem.onPress = StopTooltip;
155        btnPasteItem.onRollOut = btnPasteItem.onPress = StopTooltip;
156        btnAdd.onRollOut       = btnAdd.onPress      = StopTooltip;
157        btnDelete.onRollOut    = btnDelete.onPress   = StopTooltip;
158        btnDetail.onRollOut    = btnDetail.onPress   = StopTooltip;
159}
160
161////////////////////////////////////////////////////////////////////////////////
162// HANDLE FUNCTIONS FOR ALL SUBMENUS
163//
164function onSelectFile(itemObj) {
165        if( itemObj.menuItem == mnuFile.getItemAt(0) ) btnNew.onRelease();
166        if( itemObj.menuItem == mnuFile.getItemAt(1) ) btnOpen.onRelease();
167        if( itemObj.menuItem == mnuFile.getItemAt(2) ) btnSave.onRelease();
168        if( itemObj.menuItem == mnuFile.getItemAt(3) ) SaveAndExec(undefined, true);
169        if( itemObj.menuItem == mnuFile.getItemAt(5) ) btnLibrary.onRelease();
170        if( itemObj.menuItem == mnuFile.getItemAt(6) ) btnPack.onRelease();
171        if( itemObj.menuItem == mnuFile.getItemAt(8) ) ExitProgram();
172}
173
174btnSaveAs.onRelease = function() {
175        SaveAndExec(undefined, true);
176}
177
178function onSelectEdit(itemObj) {
179        if( itemObj.menuItem == mnuEdit.getItemAt(0) ) ProcessUndo();
180        if( itemObj.menuItem == mnuEdit.getItemAt(1) ) ProcessRedo();
181        if( itemObj.menuItem == mnuEdit.getItemAt(3) ) btnCutOnRelease();
182        if( itemObj.menuItem == mnuEdit.getItemAt(4) ) btnCopyOnRelease();
183        if( itemObj.menuItem == mnuEdit.getItemAt(5) ) btnPasteOnRelease();
184        if( itemObj.menuItem == mnuEdit.getItemAt(7) ) btnMoveUp.onRelease();
185        if( itemObj.menuItem == mnuEdit.getItemAt(8) ) btnMoveDown.onRelease();
186}
187
188btnUndo.onRelease = function() {
189        ProcessUndo();
190}
191
192btnRedo.onRelease = function() {
193        ProcessRedo();
194}
195
196function onSelectSlide(itemObj) {
197        if(itemObj.menuItem == mnuSlide.getItemAt(0)) btnAdd.onRelease();
198        if(itemObj.menuItem == mnuSlide.getItemAt(1)) btnDetail.onRelease();
199        if(itemObj.menuItem == mnuSlide.getItemAt(2)) SyncVideoAudio();
200        if(itemObj.menuItem == mnuSlide.getItemAt(3)) btnDelete.onRelease();
201        if(itemObj.menuItem == mnuSlide.getItemAt(5)) SelectCoverPage();
202        if(itemObj.menuItem == mnuSlide.getItemAt(6)) btnLayout.onRelease();
203        if(itemObj.menuItem == mnuSlide.getItemAt(7)) SelectBackGround();
204        if(itemObj.menuItem == mnuSlide.getItemAt(9)) btnPreview.onRelease();
205}
206
207btnSync.onRelease = function() {
208        SyncVideoAudio();
209}
210
211btnCover.onRelease = function() {
212        SelectCoverPage();
213}
214
215btnBackground.onRelease = function() {
216        SelectBackGround();
217}
218
219function onSelectWindow(itemObj) {
220        if (webbase) {
221                if(itemObj.menuItem == mnuOption.getItemAt(0)) ResetWindowSize();
222                if(itemObj.menuItem == mnuOption.getItemAt(1)) ShowConfigDlg();
223                return;
224        }
225        if(itemObj.menuItem == mnuOption.getItemAt(0)) UpdatePlugin();
226        if(itemObj.menuItem == mnuOption.getItemAt(1)) UpdateLayout();
227        if(itemObj.menuItem == mnuOption.getItemAt(2)) UpdateCommonLib();
228        if(itemObj.menuItem == mnuOption.getItemAt(4).childNodes[0]) RunApplication((isWow64? "UniKey64": "UniKey") + "\\UniKeyNT.exe");
229        if(itemObj.menuItem == mnuOption.getItemAt(4).childNodes[1]) RunApplication("TeamViewer\\TeamViewerQS_vi.exe");
230        if(itemObj.menuItem == mnuOption.getItemAt(6)) ResetWindowSize();
231        if(itemObj.menuItem == mnuOption.getItemAt(7)) ShowConfigDlg();
232}
233
234btnSetting.onRelease = function() {
235        ShowConfigDlg();
236}
237
238function onSelectHelp(itemObj) {
239        if(itemObj.menuItem == mnuHelp.getItemAt(0)) btnHelp.onRelease();
240        if (webbase) {
241                if(itemObj.menuItem == mnuHelp.getItemAt(2)) AboutProgram();
242                return;
243        }
244        if(itemObj.menuItem == mnuHelp.getItemAt(1)) AutoUpgrade();
245        if(itemObj.menuItem == mnuHelp.getItemAt(3)) AboutProgram();
246}
247
248function onSelectAccount(itemObj) {
249        if(itemObj.menuItem == mnuAccount.getItemAt(0)) EditAccountInfo();
250        if(itemObj.menuItem == mnuAccount.getItemAt(1)) ManageCastAccount();
251        if(itemObj.menuItem == mnuAccount.getItemAt(2)) ShowVioletLicense();
252        if(itemObj.menuItem == mnuAccount.getItemAt(3)) LogoutViolet();
253}
254
255////////////////////////////////////////////////////////////////////////////////
256// COMMON FUNCTIONS
257//
258function StartTooltip(tooltipText) {
259        if( !movTimer && tooltipText ) {
260                createEmptyMovieClip("movTimer", 1);
261                movTimer.counter = 0;
262
263                movTimer.onEnterFrame = function() {
264                        this.counter++;
265                        if( this.counter == 10) {
266                                if(!txtTooltip) createTextField("txtTooltip", 2, _xmouse+16, _ymouse+16, 0, 0);
267                                txtTooltip.text = tooltipText;
268                                txtTooltip.autoSize = true;
269                                txtTooltip.border = true;
270                                txtTooltip.background = true;
271                                txtTooltip.backgroundColor = 0xFFFFCC;
272                               
273                                var newFormat = new TextFormat();
274                                newFormat.font = "Arial";
275                                newFormat.size = 12;
276                                txtTooltip.setTextFormat(newFormat);
277                                delete newFormat;
278                               
279                                if( txtTooltip._x + txtTooltip._width > 800 ) txtTooltip._x = 800 - txtTooltip._width;
280                        }
281                        if( this.counter == 130) StopTooltip();
282                }
283        }
284}
285
286function StopTooltip() {
287        if( txtTooltip ) txtTooltip.removeTextField();
288        if( movTimer ) movTimer.removeMovieClip();
289}
290
291function ShowGrayScreen(show) {
292        if( show==undefined ) show = true;
293        btnSemitrans.count += (show? 1: -1);
294        show = (btnSemitrans.count > 0);
295        btnSemitrans._visible = show;
296        fscommand("Enable Drop", !show);
297}
298
299function ShowDialog(frameLabel, winTitle) {
300        if (!wndDialog.content.loaded) return;
301        if (!wndDialog._visible) ShowGrayScreen();
302        wndDialog.content.gotoAndStop(frameLabel);
303        wndDialog.title = winTitle;
304        wndDialog.setSize(wndDialog.content._width+6, wndDialog.content._height+34);
305        wndDialog._x = 400 - wndDialog._width/2;
306        wndDialog._y = 290 - wndDialog._height/2;
307        wndDialog._visible = true;
308}
309
310function ShowMessage(message, title, showMessageCallBack, showMessageObj)
311{
312        messageShowing = true;
313        ShowGrayScreen();
314        Alert.buttonWidth = 60;
315        Alert.okLabel = lang.btnOK;
316        Alert.show(
317                message, title, Alert.OK, _root,
318                function(evt) {
319                        messageShowing = false;
320                        ShowGrayScreen(false);
321                        if (showMessageCallBack!=undefined)
322                                showMessageCallBack.call(showMessageObj);
323                },
324                null, Alert.OK );
325}
326
327function ShowQuestion(message, caption, cancel, yesFunction, noFunction) {
328        messageShowing = true;
329        ShowGrayScreen();
330        Alert.buttonWidth = 60;
331        Alert.yesLabel = lang.btnYes;
332        Alert.noLabel = lang.btnNo;
333        Alert.cancelLabel = cancel;
334       
335        var msgButtons = Alert.YES | Alert.NO;
336        if( cancel!="" ) msgButtons |= Alert.CANCEL;
337       
338        Alert.show(
339                message, caption, msgButtons, _root,
340                function(evt) {
341                        messageShowing = false;
342                        ShowGrayScreen(false);
343                        if( evt.detail==Alert.YES) yesFunction();
344                        if( evt.detail==Alert.NO ) noFunction();
345                },
346                "Question Movie", Alert.YES
347        );
348}
349
350function LoadPopupMovie(title, filename, onClickOK, onClickCancel, parentObj, languagePath) {
351        if (languagePath != undefined) {
352                plang = lang.createEmptyMovieClip("popup", lang.getNextHighestDepth());
353                loadVariables(appPath + languagePath + slash + language + ".txt", lang.popup);
354                lang.popup.onData = function() {
355                        LoadPopupMovie(title, filename, onClickOK, onClickCancel, parentObj);
356                };
357                return;
358        }
359        var frame = "";
360        if (filename.indexOf("|") != -1) {
361                var a = filename.split("|");
362                filename = a[0];
363                frame = a[1];
364        }
365        var initObj = {title: title, contentPath: _root.appPath + filename, closeButton: true};
366        var mcPopup = mx.managers.PopUpManager.createPopUp(_root, mx.containers.Window, true, initObj);
367        var oldPressEnter = _root.onPressEnter;
368        var oldPressEsc = _root.onPressEsc;
369        var oldPressDelete = _root.oldPressDelete;
370        _root.onPressEnter = undefined;
371        _root.onPressEsc = undefined;
372        _root.oldPressDelete= undefined;
373        parentObj.SetBehindDialog(true);
374        mcPopup._visible = false;
375
376        mcPopup.onCloseDialog = function() {
377                mcPopup.deletePopUp();
378                lang.popup.removeMovieClip();
379                _root.onPressEnter = oldPressEnter;
380                _root.onPressEsc = oldPressEsc;
381                _root.oldPressDelete = oldPressDelete;
382                parentObj.SetBehindDialog(false);
383                onClickCancel();
384        };
385        mcPopup.onFinishInput = function(retVal) {
386                mcPopup.onCloseDialog();
387                onClickOK(retVal);
388        };
389        mcPopup.setDlgSize = function() {
390                var movie = mcPopup.content;
391                var size = movie.getMovieSize? movie.getMovieSize(): {width: movie._width, height: movie._height};
392                mcPopup.setSize(size.width + 6, size.height + 34);
393                mcPopup._x = 400 - mcPopup.width/2;
394                mcPopup._y = 290 - mcPopup.height/2;
395                mcPopup._visible = true;
396        }
397        mcPopup.addEventListener("complete", function() {if (frame!="") mcPopup.content.gotoAndStop(frame); mcPopup.setDlgSize()});
398        mcPopup.addEventListener("click", function() {if (onClickCancel!==false) mcPopup.onCloseDialog()});
399
400        return mcPopup;
401}
402
403function ClearAllData() {
404        movScene.ClearBackGround();
405        while (movScene.bkgnd_node.childNodes.length > 0) movScene.bkgnd_node.lastChild.removeNode();
406        while (treItem.length > 0) treItem.removeItemAt(0);
407        currentFile = "";
408        dataChanged = "false";
409        undoData.splice(0);
410        undoPos = 0;
411        GetRelatedFiles();
412}
413
414function ExecWithConfirmSave(execFunction)
415{
416        if( dataChanged == "true" ) {
417                ShowQuestion(
418                        lang.msgConfirmSave, lang.msgTitle, lang.btnContinue,
419                        function() { SaveAndExec(execFunction) },
420                        execFunction
421                );
422        } else {
423                execFunction();
424        }
425}
426
427function ChangeTempPath(tmpPathName) {
428        var pos = tempPath.length;
429        var tmp = GetFullFileName(tmpPathName);
430        if( tmp.substr(0, pos) == tempPath )
431                return defaultFilePath + tmp.substr(pos);
432        return tmpPathName;
433}
434
435function EncodeXml(s)
436{
437        s = Replace(s, '&', "&amp;");
438        s = Replace(s, '"', "&quot;");
439        s = Replace(s, '<', "&lt;");
440        s = Replace(s, '>', "&gt;");
441        return escape(s);
442}
443
444function SaveAndExec(execFunction, isSaveAs)
445{
446        if( currentFile == "" || isSaveAs ) {
447                if (online) {
448                        ShowGrayScreen();
449                        var pop = LoadPopupMovie(lang.mnuSaveAs, "Popup" + slash + "Space.swf",
450                        function(param) {SaveToFile(execFunction, param)},
451                        function() {ShowGrayScreen(false)});
452                        pop.defExt = "xvl";
453                        pop.filter = ["xvl"];
454                        return;
455                }
456                fscommand("Save As", "");
457                ShowGrayScreen();
458                command = "";
459                onEnterFrame = function() {
460                        if( command == "" ) return;
461                        ShowGrayScreen(false);
462                        if( command == "Save As OK" ) {
463                                GetDataChangePath(GetFullFileName, dataXML.firstChild);
464                                currentFile = savedFileName;
465                                GetDataChangePath(GetRelativeFileName, dataXML.firstChild);
466                                SaveToFile(execFunction, true);
467                                fscommand("Set Title", currentFile);
468                        }
469                        else {
470                                onEnterFrame = WaitForAppCommand;
471                                command = "";
472                        }
473                }
474                return;
475        }
476        SaveToFile(execFunction);
477}
478
479function SaveToFile(execFunction, param) {
480        var isFirstSave = (param != undefined);
481        if(  isFirstSave ) {
482                var pos1 = currentFile.lastIndexOf(slash) + 1;
483                var pos2 = currentFile.lastIndexOf(".");
484                defaultFilePath = currentFile.substring(pos1, pos2) + " files" + slash;
485                GetDataChangePath(ChangeTempPath, dataXML.firstChild);
486                filesForRetrieve = fileList;
487                GetRelatedFiles();
488        }
489
490        ascData = new XML(dataXML.toString());
491        if (movScene.bkgnd_node.childNodes.length > 0)
492                if( !ascData.firstChild.firstChild ) ascData.firstChild.appendChild(movScene.bkgnd_node.cloneNode(true));
493                else ascData.firstChild.insertBefore(movScene.bkgnd_node.cloneNode(true), ascData.firstChild.firstChild);
494
495        if( online ) {
496                var xml:XML = new XML();
497                xml.ignoreWhite = true;
498                xml.onLoad = function(success) {
499                        if (!checkSuccess(success, "errServerConnect", "Không thể kết nối tới server.")) return;
500                        var attr = this.firstChild.attributes;
501                        if (!checkSuccess(attr.err=="", attr.errCode, attr.err)) return;
502                        currentFile = attr.id;
503                        fscommand("Set Title", attr.name);
504                        dataChanged = "false";
505                        execFunction();
506                }
507                var request = spaceUrl + "save";
508                if (isFirstSave) request += "?userid="+param.userid + "&dir="+param.dir + "&name="+param.name;
509                else request += "?fileid="+currentFile;
510                ascData.sendAndLoad(request, xml);
511                return;
512        }
513
514        UnicodeAscii(EncodeXml, ascData.firstChild);
515        ascData = defXmlDecl + GetAlignedXml(ascData, 0);
516
517        fscommand("Save", "");
518        command = "";
519        onEnterFrame = function() {
520                if( command == "" ) return;
521                onEnterFrame = WaitForAppCommand;
522                if( command == "Save OK" ) execFunction();
523                if( command == "Save Error" ) ShowMessage(lang.msgSaveError, lang.msgTitle1);
524                if( isFirstSave ) fscommand("Retrieve", "");
525                else fscommand("Cleanup", "");
526                delete ascData;
527                command = "";
528        }
529}
530
531////////////////////////////////////////////////////////////////////////////////
532// MENU FILE FUNCTIONS
533//
534btnNew.onRelease = function() {
535        ExecWithConfirmSave(CreateNewData);
536}
537
538function InitializeDataXML() {
539        var lectureNode = commonXML.createElement("LECTURE_INFO");
540        if( appUserName ) {
541                lectureNode.attributes.Info = unescape(appUserName) + " - " + unescape(appAddress);
542                lectureNode.attributes.Check = lectureNode.attributes.Info.length + 13;
543        }
544        lectureNode.attributes.CommonDir = commonDir;
545        lectureNode.attributes.Layout = "Layout1.swf";
546        lectureNode.attributes.Title = "";
547        lectureNode.attributes.Version = version;
548        dataXML.appendChild(lectureNode);
549}
550
551function CreateNewData() {
552        ClearAllData();
553        InitializeDataXML();
554        movScene.onLoadXMLData();
555        fscommand("Set Title", "");
556}
557
558btnOpen.onRelease = function() {
559        ExecWithConfirmSave(
560        function() {
561                if (online) {
562                        ShowGrayScreen();
563                        var pop = LoadPopupMovie(lang.mnuOpen, "Popup" + slash + "Space.swf",
564                        function(param) {
565                                ClearAllData();
566                               
567                                currentFile = param.id;
568                                fscommand("Set Title", param.name);
569                                LoadXMLData(spaceUrl + "file?id="+param.id+"&userid="+param.userid);
570                        },
571                        function() {ShowGrayScreen(false)});
572                        pop.defExt = "xvl";
573                        pop.filter = ["xvl"];
574                        return;
575                }
576                command = "";
577                openedFileName = "";
578                fscommand("Open", "");
579                ShowGrayScreen();
580               
581                onEnterFrame = function() {
582                        if( command == "" ) return;
583                        ShowGrayScreen(false);
584                        if( command == "Open OK" ) OpenNewFile();
585                        onEnterFrame = WaitForAppCommand;
586                        command = "";
587                }
588        });
589}
590
591// open from Violet Space (using HMTL/javascript to display folders & files)
592// when user clicked a file in Violet Space, a new window (which contains the lecture editor client) will be opened; ID of the selected lecture will be passed via flashvar
593function OpenFileById() {
594        clearInterval(_root.openFileInterval);
595       
596        if (fileId == undefined) return;
597        if (fileId == "") return;
598       
599        //ShowGrayScreen();
600        ClearAllData();
601        currentFile = fileId;
602        LoadXMLData(spaceUrl + "file?id="+fileId+"&userid="+userId);
603}
604
605function OpenNewFile() {
606        ClearAllData();
607        currentFile = openedFileName;
608        fscommand("Set Title", currentFile);
609        LoadXMLData(currentFile);
610}
611
612btnSave.onRelease = function() {
613        SaveAndExec();
614}
615
616btnLibrary.onRelease = function() {
617        ShowGrayScreen();
618        var pop = LoadPopupMovie(lang.mnuLibrary, "Popup" + slash + "Library.swf",
619        function(filename) {
620                ClearAllData();
621                openedFileName = filename;
622                LoadXMLData(filename);
623        },
624        function() {ShowGrayScreen(false)});
625        pop.libPaths = _root.lecturePaths;
626        pop.remember = true;
627        pop.okTitle = lang.mnuOpen;
628}
629
630btnPack.onRelease = function() {
631        GetRelatedFiles(true);
632
633        var slashPos = currentFile.lastIndexOf(slash);
634        if( !online && currentFile.substr(slashPos + 1) == "Scenario.xvl" ) {
635                ShowQuestion(lang.msgHasPacked, lang.msgTitle4, lang.btnCancel,
636                function() {
637                        oldpackType = packageType;
638                        packageType = 0;
639                        packagePath = currentFile.substring(0, slashPos)
640                        CreatePackage("Overwrite");
641                        dataChanged = "false";
642                },
643                function() {
644                        ShowDialog("Pack", lang.mnuPack);
645                });
646                return;
647        }
648
649        ShowDialog("Pack", lang.mnuPack);
650}
651
652function CreatePackage(status, paid) {
653        if (online && (isNaN(userLevel) || userLevel < 1) && !paid) {
654                ShowGrayScreen();
655                LoadPopupMovie("lang.dlgLicenseTitle", "Popup" + slash + "UserManager.swf|Package",
656                function() {CreatePackage(status, true)},
657                function() {ShowGrayScreen(false)},
658                null, "Language" + slash + "User");
659                return;
660        }
661        if( webbase ) {
662                treItem.enabled = false;
663                xml = new XML();
664                xml.onLoad = function() {
665                        treItem.enabled = true;
666                        var param = "userid=" + userId;
667                        param += "&name=" + escape(packagePath);
668                        param += "&id=" + this.firstChild.attributes.id;
669                        getUrl(rootPath + "Service/packdownload.php?" + param);
670                }
671                var lv:LoadVars = new LoadVars();
672                lv.userid = userId;
673                lv.name = packagePath;
674                lv.type = packageType;
675                lv.dataNum = dataFileNum;
676                lv.commonNum = commonFileNum;
677                lv.fileList = fileListStr.split("|").join(",");
678                if (packageType == 1) lv.packagePlayer = packagePlayer;
679                if (packageType == 3) {
680                        lv.scormVersion = scormVersion;
681                        lv.scormTitle = packXML.firstChild.attributes.Title;
682                        lv.scormOrgData = GetAlignedXml(CreateOrganization(packXML), 3);
683                }
684                lv.dataXml = defXmlDecl + GetAlignedXml(packXML, 0);
685                lv.sendAndLoad(rootPath + "Service/package.php", xml);
686                return;
687        }
688
689        if( status==undefined ) status = "";
690        SwitchCurrentVideo(movScene.currMovie, "close");
691        treItem.enabled = false;
692       
693        ascData = new XML(packXML.toString());
694        UnicodeAscii(EncodeXml, ascData.firstChild);
695        if( packageType == 3 ) {
696                scormTitle = ascData.firstChild.attributes.Title;
697                scormOrgData = GetAlignedXml(CreateOrganization(ascData), 3);
698        }
699        ascData = defXmlDecl + GetAlignedXml(ascData, 0);
700
701        fscommand("Pack", status);
702        command = "";
703               
704        onEnterFrame = function() {
705                if( command == "" ) return;
706                if( command == "Create Error" ) {
707                        ShowMessage(lang.msgDirError, lang.msgTitle1);
708                }
709                if( command == "Copy Error" || command == "Save Error" ) {
710                        ShowMessage(lang.msgPackError + copiedFile + "\r\r ", lang.msgTitle1);
711                }
712                if( command == "Dir Existed" ) {
713                        ShowQuestion(
714                                lang.msgPackOver, lang.msgTitle, lang.btnCancel,
715                                function() { CreatePackage("Overwrite", paid) },
716                                function() { CreatePackage("Merge", paid) }
717                        );
718                }
719                SwitchCurrentVideo(movScene.currMovie, "replay");
720                treItem.enabled = true;
721
722                if( packageType == 0 ) packageType = oldpackType;
723                onEnterFrame = WaitForAppCommand;
724                delete ascData;
725                command = "";
726        }
727}
728
729function ExitProgram()
730{
731        if (online) {
732                var lv:LoadVars = new LoadVars();
733                lv.send(userUrl + "logout");
734        }
735        ExecWithConfirmSave(
736        function() {
737                SaveConfig();
738                fscommand("Quit", "");
739        });
740}
741
742////////////////////////////////////////////////////////////////////////////////
743// MENU EDIT FUNCTIONS
744//
745function UpdateUndoData() {
746        undoData.splice(undoPos);
747        if(undoData.length >= maxUndo) undoData.shift();
748        var node = dataXML.firstChild.cloneNode(true);
749        node.attributes.selectedIndex = treItem.selectedIndex;
750        undoData.push(node);
751        undoPos = undoData.length;
752        dataChanged = "true";
753}
754
755function RestoreFromUndoData() {
756        while (treItem.length > 0) treItem.removeItemAt(0);
757        var layout = dataXML.firstChild.attributes.Layout;
758        var title = dataXML.firstChild.attributes.Title;
759        dataXML.firstChild.removeNode();
760        dataXML.appendChild(undoData[undoPos].cloneNode(true));
761        UpdateScreen(true);
762        treItem.selectedIndex = dataXML.firstChild.attributes.selectedIndex;
763        delete dataXML.firstChild.attributes.selectedIndex;
764
765        if( layout != dataXML.firstChild.attributes.Layout ||
766                title != dataXML.firstChild.attributes.Title )
767        {
768                movScene.currentItem = treItem.selectedNode.attributes.item;
769                movScene.currentSection = treItem.selectedNode.attributes.section;
770                movScene.UpdateTemplate();
771        } else {
772                onChangeHandle();
773        }
774}
775
776function ProcessUndo() {
777        if( undoPos == 0 ) return;
778        if( undoPos == undoData.length ) {UpdateUndoData(); undoPos--;}
779        undoPos--;
780        RestoreFromUndoData();
781}
782
783function ProcessRedo() {
784        if( undoPos == undoData.length ) return;
785        undoPos++;
786        RestoreFromUndoData();
787        if( undoPos == undoData.length - 1 ) undoData.pop();
788}
789
790btnCutItem.onRelease = btnCutOnRelease = function() {
791        CopyToClipboard(DeleteItem);
792}
793
794btnCopyItem.onRelease = btnCopyOnRelease = function() {
795        CopyToClipboard();
796}
797
798function GetElementChangePath(change, node) {
799        if( node.attributes.hyperlink.charAt(0) == "1" ) {
800                node.attributes.hyperlink = "1|" + change(node.attributes.hyperlink.substr(2));
801        }
802        if( node.nodeName == "IMAGE" || node.nodeName == "MEDIA" ) {
803                node.attributes.url = change(node.attributes.url);
804        }
805        if( node.nodeName == "PLUGIN" ) {
806                ChangeXMLFileInfo(node.firstChild, change, pluXML.childNodes[1].childNodes[1].attributes[node.firstChild.nodeName]);
807                var subNodes = node.firstChild.childNodes;
808                for( var i=0; i<subNodes.length; i++ )
809                        if( subNodes[i].attributes.hyperlink.charAt(0) == "1" )
810                                subNodes[i].attributes.hyperlink = "1|" + change(subNodes[i].attributes.hyperlink.substr(2));
811                var langAttr = node.childNodes[1].firstChild.attributes;
812                for (var a in langAttr) if (a.substr(0, 5)=="file_") langAttr[a] = change(langAttr[a]);
813        }
814}
815
816function GetNodeChangePath(change, itemData) {
817        for( var k=0; k<itemData.childNodes.length; k++ ) {
818                var node = itemData.childNodes[k];
819                GetElementChangePath(change, node);
820        }
821}
822
823function GetDataChangePath(change, itemData) {
824        if( itemData.nodeName == "LECTURE_INFO" ) ChangeLayoutFileParam(itemData, change);
825        if( itemData.nodeName == "LECTURE_INFO" || itemData.nodeName == "SECTION_INFO" || itemData.nodeName == "BACKGROUND_INFO" )
826                for( var i = 0; i < itemData.childNodes.length; i++ )
827                GetDataChangePath(change, itemData.childNodes[i]);
828        else
829                GetNodeChangePath(change, itemData);
830}
831
832function CopyToClipboard(execFunction) {
833        if( treItem.length == 0 ) return;
834
835        var section = treItem.selectedNode.attributes.section-1;
836        var item = treItem.selectedNode.attributes.item-1;
837        var itemData = (item>=0) ?
838                dataXML.firstChild.childNodes[section].childNodes[item] :
839                dataXML.firstChild.childNodes[section];
840
841        var copiedData = itemData.cloneNode(true);
842        GetDataChangePath(GetFullFileName, copiedData);
843
844        command = "";
845        ascData = new XML(copiedData.toString());
846        UnicodeAscii(escape, ascData);
847        fscommand("Set Clipboard", dataID + ascData.toString());
848        onEnterFrame = function() {
849                if( command == "" ) return;
850                if( command == "Set OK" ) execFunction();
851                onEnterFrame = WaitForAppCommand;
852                delete ascData;
853                command = "";
854        }
855}
856
857btnPasteItem.onRelease = btnPasteOnRelease = function() {
858        command = "";
859        clipboardData = "";
860        fscommand("Get Clipboard");
861
862        onEnterFrame = function() {
863                if( command == "" ) return;
864                if( command == "Get Text" ) {
865                        if( clipboardData.substr(0, dataID.length) == dataID ) {
866                                var xmlClipboard = new XML(clipboardData.substr(dataID.length));
867                                var itemData = xmlClipboard.firstChild;
868                                UnicodeAscii(unescape, itemData);
869                                GetDataChangePath(GetRelativeFileName, itemData);
870
871                                var section = treItem.selectedItem.attributes.section;
872                                if( itemData.nodeName == "SECTION_INFO" ) AddSectionData(itemData);
873                                else if( section != undefined) AddItemData(section - 1, itemData);
874                        }
875                }
876                onEnterFrame = WaitForAppCommand;
877                command = "";
878        }
879}
880       
881////////////////////////////////////////////////////////////////////////////////
882// MENU CONTENT FUNCTIONS
883//
884btnAdd.onRelease = function() {
885        isChanging = false;
886        inputingCover = false;
887        ShowDialog("Item", lang.dlgItem);
888}
889       
890btnDetail.onRelease = function() {
891        if( treItem.length == 0 ) return;
892        treCurrentNode = treItem.selectedNode;
893        var section = treItem.selectedNode.attributes.section-1;
894
895        var item = treItem.selectedNode.attributes.item-1;
896        if(item>=0) changingNode = dataXML.firstChild.childNodes[section].childNodes[item];
897        else changingNode = dataXML.firstChild.childNodes[section];
898        wndDialog.content.node = changingNode.cloneNode(true);
899        isChanging = true;
900        inputingCover = dataXML.firstChild.childNodes[section].attributes.coverpage=="true";
901
902        if(item<0 && inputingCover ) return;
903
904        if(item>=0) ShowDialog("Item", lang.dlgItem);
905        else ShowDialog("Section", lang.dlgSection);
906}
907
908btnDelete.onRelease = function() {
909        if( treItem.length == 0 ) return;
910        ShowQuestion(lang.msgConfirmDel, lang.msgTitle3, "", DeleteItem);
911}
912
913function SyncVideoAudio() {
914        var section = treItem.selectedNode.attributes.section - 1;
915        var item = treItem.selectedNode.attributes.item - 1;
916        if (item >= 0) {
917                if (movScene.sectionSync) {ShowMessage(lang.msgSyncSection, lang.msgTitle1); return;}
918                movScene.selectItem(movScene.currentItem, true);
919                if (!movScene.firstMediaObj) {ShowMessage(lang.msgSyncNoVideo, lang.msgTitle1); return;}
920                if (movScene.currentIndex == undefined) {ShowMessage(lang.msgSyncNoAction, lang.msgTitle1); return;}
921                wndDialog.content.node = dataXML.firstChild.childNodes[section].childNodes[item];
922        } else {
923                if (movScene.currentItemNum < 2) {ShowMessage(lang.msgSyncNoAction, lang.msgTitle1); return;}
924                movScene.UpdateBackGround();
925                movScene.sectionSync = true;
926                movScene.firstMediaObj = movScene.movPageBkGnd.firstMediaObj;
927                if (!movScene.firstMediaObj) {ShowMessage(lang.msgSyncNoVideo, lang.msgTitle1); return;}
928                movScene.selectItem(1);
929                wndDialog.content.node = dataXML.firstChild.childNodes[section];
930        }
931        movScene.firstMediaObj.autoPlay = true;
932        delete movScene.onEnterFrame;
933        ShowDialog("Sync", lang.mnuSync);
934        wndDialog._x = 15;
935}
936
937function SelectCoverPage() {
938        isChanging = false;
939        inputingCover = true;
940        ShowDialog("Item", lang.dlgItem);
941}
942
943function SelectBackGround() {
944        retFrame = "";
945        ShowDialog("BkGnd", lang.mnuBackGround);
946}
947
948function AddCoverPage(node) {
949        if( !isChanging ) {
950                if( dataXML.firstChild.firstChild.attributes.coverpage=="true" ) {
951                        UpdateUndoData();
952                        dataXML.firstChild.firstChild.firstChild.removeNode();
953                        dataXML.firstChild.firstChild.appendChild(node);
954                        var i = 0;
955                        while( treItem.getItemAt(i).attributes.section != 1 ) i++;
956                        treItem.selectedIndex = i+1;
957                        onChangeHandle();
958                        GetRelatedFiles();
959                } else {
960                        movScene.ClearBackGround();
961                        var sectionInfo = dataXML.createElement("SECTION_INFO");
962                        sectionInfo.attributes.label = lang.coverPage;
963                        sectionInfo.attributes.coverpage = "true";
964                        sectionInfo.attributes.invisible = "true";
965                        sectionInfo.appendChild(node);
966                        AddSectionData(sectionInfo, 0);
967                }
968        } else {
969                UpdateUndoData();
970                changingNode.parentNode.insertBefore(node, changingNode);
971                changingNode.removeNode();
972                onChangeHandle();
973                GetRelatedFiles();
974        }
975}
976
977btnLayout.onRelease = function() {
978        ShowDialog("Layout", lang.mnuLayout);
979}
980
981btnPreview.onRelease = function() {
982        if( btnSceneBkGnd._visible ) { ClosePreview(); return; }
983        fscommand("Set Style", "Popup");
984        btnSceneBkGnd._visible = true;
985        movPlayer.swapDepths(movScenePrev);
986        movPlayer._yscale = 100;
987        movPlayer._xscale = 100;
988        movPlayer._x = 0;
989        movPlayer._y = -10;
990}
991
992function ClosePreview() {
993        if( !btnSceneBkGnd._visible ) return;
994        fscommand("Set Style", "Normal");
995        btnSceneBkGnd._visible = false;
996        movPlayer.swapDepths(movScenePrev);
997        movPlayer._x = 275;
998        movPlayer._y = 100;
999        movPlayer._xscale = 500/8;
1000        movPlayer._yscale = 375/6;
1001}
1002
1003////////////////////////////////////////////////////////////////////////////////
1004// MENU MODIFY FUNCTIONS
1005//
1006function EditFile(fileName) {
1007        command = "";
1008        fscommand("Edit File", fileName);
1009        onEnterFrame = function() {
1010                if( command == "" ) return;
1011                if( command == "Launch Error" ) ShowMessage(lang.msgEditError, lang.msgTitle1);
1012                onEnterFrame = WaitForAppCommand;
1013                command = "";
1014        }
1015}
1016
1017////////////////////////////////////////////////////////////////////////////////
1018// MENU WINDOWS FUNCTIONS
1019//
1020function ResetWindowSize() {
1021        windowState = 1;
1022        windowTop = 0;
1023        windowLeft = 0;
1024        windowRight = 0;
1025        windowBottom = 0;
1026        fscommand("Set State", "");
1027}
1028
1029function SetFlashViewMode(mode) {
1030        fscommand("View Mode", mode);
1031        flashViewMode = mode;
1032}
1033
1034function ShowConfigDlg() {
1035        ShowDialog("Config", lang.mnuConfig);
1036}
1037
1038function UpdatePlugin() {
1039        ShowDialog("Plugin", lang.mnuUpdateModules);
1040}
1041
1042function UpdateLayout() {
1043        ShowDialog("LayUpdate", lang.mnuUpdateLayouts);
1044}
1045
1046function UpdateCommonLib() {
1047        ShowDialog("LibUpdate", lang.mnuUpdateLibs);
1048}
1049
1050function SaveConfigXML(action, data) {
1051        ascData = new XML(data.toString());
1052        UnicodeAscii(EncodeXml, ascData.firstChild);
1053        ascData = defXmlDecl + GetAlignedXml(ascData, 0);
1054        fscommand(action, "ascData");
1055}
1056
1057function RunApplication(filename) {
1058        SendRequest("Run App", filename, function(response, data) {
1059                if (response != "Run OK") ShowMessage(lang.msgCanNotRun + " " + filename, lang.msgTitle1);
1060        });
1061}
1062////////////////////////////////////////////////////////////////////////////////
1063// MENU HELP FUNCTIONS
1064//
1065btnHelp.onRelease = function() {
1066        getURL("http://hoctructuyen.violet.vn/present/list/cat_id/7795643", "_blank");
1067}
1068
1069function AutoUpgrade() {
1070        ShowDialog("Upgrade", lang.mnuUpgrade);
1071}
1072
1073function AboutProgram() {
1074        ShowDialog("About", lang.mnuAbout);
1075}
1076
1077////////////////////////////////////////////////////////////////////////////////
1078// MENU ACCOUNT FUNCTIONS
1079//
1080function EditAccountInfo() {
1081        ShowGrayScreen();
1082        LoadPopupMovie(lang.dlgLoginTitle, "Popup" + slash + "UserManager.swf|Update",
1083        null, function() {ShowGrayScreen(false)}, null, "Language" + slash + "User");
1084}
1085
1086function ManageCastAccount() {
1087        ShowGrayScreen();
1088        LoadPopupMovie(lang.dlgLoginTitle, "Popup" + slash + "UserManager.swf|Payment",
1089        null, function() {ShowGrayScreen(false)}, null, "Language" + slash + "User");
1090}
1091
1092function ShowVioletLicense() {
1093        ShowGrayScreen();
1094        LoadPopupMovie(lang.dlgLoginTitle, "Popup" + slash + "UserManager.swf|License",
1095        null, function() {ShowGrayScreen(false)}, null, "Language" + slash + "User");
1096}
1097
1098function LoginViolet() {
1099        ShowGrayScreen();
1100        LoadPopupMovie(lang.dlgLoginTitle, "Popup" + slash + "UserManager.swf|Login",
1101        function(lv) {
1102                ShowGrayScreen(false);
1103                userId = lv.id;
1104                userLevel = lv.level;
1105                userPhone = lv.phone;
1106                userMoney = lv.money;
1107                appUserName = lv.fullname;
1108                appAddress = lv.school + ", " + lv.province;
1109                dataXML.firstChild.attributes.Info = unescape(appUserName) + " - " + unescape(appAddress);
1110                dataXML.firstChild.attributes.Check = dataXML.firstChild.attributes.Info.length + 13;
1111                movScene.movTemplate.userInfo = movDefLayout.userInfo = dataXML.firstChild.attributes.Info;
1112                licenseInfo = {type: lv.licType, customer: lv.licCustomer, create: lv.licCreate, expire: lv.licExpire}
1113        }, false, null, "Language" + slash + "User");
1114}
1115
1116// load user info
1117function LoadUserInfo() {
1118        // gray screen
1119        ShowGrayScreen();
1120       
1121        // load user info
1122        var xml_userinfo:XML = new XML();
1123        xml_userinfo.ignoreWhite = true;
1124       
1125        xml_userinfo.onLoad = function(success) {
1126                // hide gray screen
1127                ShowGrayScreen(false);
1128               
1129                // user data
1130                var attr:Object = this.firstChild.firstChild.attributes;
1131                userId = attr.userId;
1132                userLevel = attr.userLevel;
1133                userPhone = attr.userPhone;
1134                userMoney = attr.userMoney;
1135                appUserName = attr.appUserName;
1136                appAddress = attr.appAddress;
1137                dataXML.firstChild.attributes.Info = unescape(appUserName) + " - " + unescape(appAddress);
1138                dataXML.firstChild.attributes.Check = dataXML.firstChild.attributes.Info.length + 13;
1139                movScene.movTemplate.userInfo = movDefLayout.userInfo = dataXML.firstChild.attributes.Info;
1140                licenseInfo = { type: attr.licType, customer: attr.licCustomer, create: attr.licCreate, expire: attr.licExpire }
1141               
1142                //
1143                if (fileId != undefined) {
1144                        _root.openFileInterval = setInterval(OpenFileById, 1000);
1145                }
1146        }
1147       
1148        var str:String = (host == undefined) ? userInfoUrl : (host + userInfoUrl);
1149        xml_userinfo.load(str);
1150}
1151
1152// Nếu user info được lấy theo cách truyền từ flashvars:
1153function UpdateFromFlashVars() {
1154        dataXML.firstChild.attributes.Info = unescape(appUserName) + " - " + unescape(appAddress);
1155        dataXML.firstChild.attributes.Check = dataXML.firstChild.attributes.Info.length + 13;
1156        movScene.movTemplate.userInfo = movDefLayout.userInfo = dataXML.firstChild.attributes.Info;
1157        licenseInfo = {type: licType, customer: licCustomer, create: licCreate, expire: licExpire}
1158}
1159
1160
1161function LogoutViolet() {
1162        ExecWithConfirmSave(function() {
1163                CreateNewData();
1164                var lv:LoadVars = new LoadVars();
1165                lv.send(userUrl + "logout");
1166                userId = 0;
1167                LoginViolet();
1168        });
1169}
1170
1171////////////////////////////////////////////////////////////////////////////////
1172// RIGHT CLICK MENU ITEMS
1173//
1174function InitTreeContextMenu() {
1175        var cmTree = new ContextMenu();
1176        var cmiAbout = new ContextMenuItem("About ViOLET...", function() {getURL("http://www.bachkim.vn", "_blank")});
1177        var cmiCut = new ContextMenuItem("Cut (Ctrl+X)", btnCutOnRelease);
1178        var cmiCopy = new ContextMenuItem("Copy (Ctrl+C)", btnCopyOnRelease);
1179        var cmiPaste = new ContextMenuItem("Paste (Ctrl+V)", btnPasteOnRelease);
1180        var cmiAdd = new ContextMenuItem("Add (F5)", btnAdd.onRelease);
1181        var cmiChange = new ContextMenuItem("Change (F6)", btnDetail.onRelease);
1182        var cmiDelete = new ContextMenuItem("Delete (Del)", btnDelete.onRelease);
1183        cmiCut.separatorBefore = true;
1184        cmiAdd.separatorBefore = true;
1185        cmTree.hideBuiltInItems();
1186        cmTree.customItems.push(cmiAbout, cmiCut, cmiCopy, cmiPaste, cmiAdd, cmiChange, cmiDelete);
1187        treItem.menu = cmTree;
1188}
Note: See TracBrowser for help on using the repository browser.