├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── .stylelintrc ├── ERROR_CODE.txt ├── Gruntfile.js ├── LICENSE ├── README.md ├── build ├── cmaps │ ├── 78-EUC-H.bcmap │ ├── 78-EUC-V.bcmap │ ├── 78-H.bcmap │ ├── 78-RKSJ-H.bcmap │ ├── 78-RKSJ-V.bcmap │ ├── 78-V.bcmap │ ├── 78ms-RKSJ-H.bcmap │ ├── 78ms-RKSJ-V.bcmap │ ├── 83pv-RKSJ-H.bcmap │ ├── 90ms-RKSJ-H.bcmap │ ├── 90ms-RKSJ-V.bcmap │ ├── 90msp-RKSJ-H.bcmap │ ├── 90msp-RKSJ-V.bcmap │ ├── 90pv-RKSJ-H.bcmap │ ├── 90pv-RKSJ-V.bcmap │ ├── Add-H.bcmap │ ├── Add-RKSJ-H.bcmap │ ├── Add-RKSJ-V.bcmap │ ├── Add-V.bcmap │ ├── Adobe-CNS1-0.bcmap │ ├── Adobe-CNS1-1.bcmap │ ├── Adobe-CNS1-2.bcmap │ ├── Adobe-CNS1-3.bcmap │ ├── Adobe-CNS1-4.bcmap │ ├── Adobe-CNS1-5.bcmap │ ├── Adobe-CNS1-6.bcmap │ ├── Adobe-CNS1-UCS2.bcmap │ ├── Adobe-GB1-0.bcmap │ ├── Adobe-GB1-1.bcmap │ ├── Adobe-GB1-2.bcmap │ ├── Adobe-GB1-3.bcmap │ ├── Adobe-GB1-4.bcmap │ ├── Adobe-GB1-5.bcmap │ ├── Adobe-GB1-UCS2.bcmap │ ├── Adobe-Japan1-0.bcmap │ ├── Adobe-Japan1-1.bcmap │ ├── Adobe-Japan1-2.bcmap │ ├── Adobe-Japan1-3.bcmap │ ├── Adobe-Japan1-4.bcmap │ ├── Adobe-Japan1-5.bcmap │ ├── Adobe-Japan1-6.bcmap │ ├── Adobe-Japan1-UCS2.bcmap │ ├── Adobe-Korea1-0.bcmap │ ├── Adobe-Korea1-1.bcmap │ ├── Adobe-Korea1-2.bcmap │ ├── Adobe-Korea1-UCS2.bcmap │ ├── B5-H.bcmap │ ├── B5-V.bcmap │ ├── B5pc-H.bcmap │ ├── B5pc-V.bcmap │ ├── CNS-EUC-H.bcmap │ ├── CNS-EUC-V.bcmap │ ├── CNS1-H.bcmap │ ├── CNS1-V.bcmap │ ├── CNS2-H.bcmap │ ├── CNS2-V.bcmap │ ├── ETHK-B5-H.bcmap │ ├── ETHK-B5-V.bcmap │ ├── ETen-B5-H.bcmap │ ├── ETen-B5-V.bcmap │ ├── ETenms-B5-H.bcmap │ ├── ETenms-B5-V.bcmap │ ├── EUC-H.bcmap │ ├── EUC-V.bcmap │ ├── Ext-H.bcmap │ ├── Ext-RKSJ-H.bcmap │ ├── Ext-RKSJ-V.bcmap │ ├── Ext-V.bcmap │ ├── GB-EUC-H.bcmap │ ├── GB-EUC-V.bcmap │ ├── GB-H.bcmap │ ├── GB-V.bcmap │ ├── GBK-EUC-H.bcmap │ ├── GBK-EUC-V.bcmap │ ├── GBK2K-H.bcmap │ ├── GBK2K-V.bcmap │ ├── GBKp-EUC-H.bcmap │ ├── GBKp-EUC-V.bcmap │ ├── GBT-EUC-H.bcmap │ ├── GBT-EUC-V.bcmap │ ├── GBT-H.bcmap │ ├── GBT-V.bcmap │ ├── GBTpc-EUC-H.bcmap │ ├── GBTpc-EUC-V.bcmap │ ├── GBpc-EUC-H.bcmap │ ├── GBpc-EUC-V.bcmap │ ├── H.bcmap │ ├── HKdla-B5-H.bcmap │ ├── HKdla-B5-V.bcmap │ ├── HKdlb-B5-H.bcmap │ ├── HKdlb-B5-V.bcmap │ ├── HKgccs-B5-H.bcmap │ ├── HKgccs-B5-V.bcmap │ ├── HKm314-B5-H.bcmap │ ├── HKm314-B5-V.bcmap │ ├── HKm471-B5-H.bcmap │ ├── HKm471-B5-V.bcmap │ ├── HKscs-B5-H.bcmap │ ├── HKscs-B5-V.bcmap │ ├── Hankaku.bcmap │ ├── Hiragana.bcmap │ ├── KSC-EUC-H.bcmap │ ├── KSC-EUC-V.bcmap │ ├── KSC-H.bcmap │ ├── KSC-Johab-H.bcmap │ ├── KSC-Johab-V.bcmap │ ├── KSC-V.bcmap │ ├── KSCms-UHC-H.bcmap │ ├── KSCms-UHC-HW-H.bcmap │ ├── KSCms-UHC-HW-V.bcmap │ ├── KSCms-UHC-V.bcmap │ ├── KSCpc-EUC-H.bcmap │ ├── KSCpc-EUC-V.bcmap │ ├── Katakana.bcmap │ ├── LICENSE │ ├── NWP-H.bcmap │ ├── NWP-V.bcmap │ ├── RKSJ-H.bcmap │ ├── RKSJ-V.bcmap │ ├── Roman.bcmap │ ├── UniCNS-UCS2-H.bcmap │ ├── UniCNS-UCS2-V.bcmap │ ├── UniCNS-UTF16-H.bcmap │ ├── UniCNS-UTF16-V.bcmap │ ├── UniCNS-UTF32-H.bcmap │ ├── UniCNS-UTF32-V.bcmap │ ├── UniCNS-UTF8-H.bcmap │ ├── UniCNS-UTF8-V.bcmap │ ├── UniGB-UCS2-H.bcmap │ ├── UniGB-UCS2-V.bcmap │ ├── UniGB-UTF16-H.bcmap │ ├── UniGB-UTF16-V.bcmap │ ├── UniGB-UTF32-H.bcmap │ ├── UniGB-UTF32-V.bcmap │ ├── UniGB-UTF8-H.bcmap │ ├── UniGB-UTF8-V.bcmap │ ├── UniJIS-UCS2-H.bcmap │ ├── UniJIS-UCS2-HW-H.bcmap │ ├── UniJIS-UCS2-HW-V.bcmap │ ├── UniJIS-UCS2-V.bcmap │ ├── UniJIS-UTF16-H.bcmap │ ├── UniJIS-UTF16-V.bcmap │ ├── UniJIS-UTF32-H.bcmap │ ├── UniJIS-UTF32-V.bcmap │ ├── UniJIS-UTF8-H.bcmap │ ├── UniJIS-UTF8-V.bcmap │ ├── UniJIS2004-UTF16-H.bcmap │ ├── UniJIS2004-UTF16-V.bcmap │ ├── UniJIS2004-UTF32-H.bcmap │ ├── UniJIS2004-UTF32-V.bcmap │ ├── UniJIS2004-UTF8-H.bcmap │ ├── UniJIS2004-UTF8-V.bcmap │ ├── UniJISPro-UCS2-HW-V.bcmap │ ├── UniJISPro-UCS2-V.bcmap │ ├── UniJISPro-UTF8-V.bcmap │ ├── UniJISX0213-UTF32-H.bcmap │ ├── UniJISX0213-UTF32-V.bcmap │ ├── UniJISX02132004-UTF32-H.bcmap │ ├── UniJISX02132004-UTF32-V.bcmap │ ├── UniKS-UCS2-H.bcmap │ ├── UniKS-UCS2-V.bcmap │ ├── UniKS-UTF16-H.bcmap │ ├── UniKS-UTF16-V.bcmap │ ├── UniKS-UTF32-H.bcmap │ ├── UniKS-UTF32-V.bcmap │ ├── UniKS-UTF8-H.bcmap │ ├── UniKS-UTF8-V.bcmap │ ├── V.bcmap │ └── WP-Symbol.bcmap ├── css │ ├── external.min.css │ └── modules.min.css ├── ogv │ ├── ogv-decoder-audio-opus-wasm.js │ ├── ogv-decoder-audio-opus-wasm.wasm │ ├── ogv-decoder-audio-opus.js │ ├── ogv-decoder-video-vp8-wasm.js │ ├── ogv-decoder-video-vp8-wasm.wasm │ ├── ogv-decoder-video-vp8.js │ ├── ogv-decoder-video-vp9-wasm.js │ ├── ogv-decoder-video-vp9-wasm.wasm │ ├── ogv-demuxer-webm-wasm.js │ ├── ogv-demuxer-webm-wasm.wasm │ ├── ogv-demuxer-webm.js │ ├── ogv-es2017.js │ ├── ogv-support.js │ ├── ogv-version.js │ ├── ogv-worker-audio.js │ ├── ogv-worker-video.js │ └── ogv.js └── src │ ├── audio-g711-and-resampler.min.js │ ├── audio-map │ ├── external-min │ ├── external.min.js │ ├── fabric.3.6.2.min.js │ ├── firebase-7.3.0.min.js │ ├── pdf-map │ ├── pdf.min.js │ ├── pdf.worker-map │ ├── pdf.worker.min.js │ ├── shadow-dom.js │ ├── video-libwebp-0.1.3.min.js │ ├── wb-map │ └── wb.min.js ├── css ├── bootstrap │ ├── css │ │ ├── bootstrap-theme.css │ │ ├── bootstrap-theme.css.map │ │ ├── bootstrap-theme.min.css │ │ ├── bootstrap-theme.min.css.map │ │ ├── bootstrap.css │ │ ├── bootstrap.css.map │ │ └── bootstrap.min.css │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ └── js │ │ ├── bootstrap.js │ │ ├── bootstrap.min.js │ │ └── npm.js ├── font │ ├── firepad.eot │ ├── firepad.svg │ ├── firepad.ttf │ └── firepad.woff └── modules │ ├── askQuestion.css │ ├── black_jquery-ui.css │ ├── chat-container.css │ ├── color.css │ ├── custom.css │ ├── dashboard.css │ ├── dbPpt.css │ ├── dbVideo.css │ ├── document-share.css │ ├── editor.css │ ├── icon.css │ ├── jquery.ui.chatbox.css │ ├── main-container-layout.css │ ├── media.css │ ├── multivideo.css │ ├── network.css │ ├── pbar.css │ ├── peervideo.css │ ├── poll.css │ ├── popup.css │ ├── progress.css │ ├── quiz.css │ ├── right-sidebar.css │ ├── screenshare.css │ ├── sharepresentation.css │ ├── styles.css │ ├── test.css │ ├── vceditor.css │ ├── video.css │ ├── whiteboard.css │ └── youtube.css ├── example ├── auth.php ├── en.php ├── index1.php ├── js.debug.php ├── js.php └── pwaLandingPage.html ├── export.php ├── external ├── css │ ├── codemirror.css │ ├── fine-uploader-gallery.css │ ├── fine-uploader-gallery.min.css │ ├── overrideimage.css │ ├── pix │ │ ├── edit.gif │ │ ├── flagged.png │ │ ├── icon.png │ │ ├── icon.svg │ │ ├── icon2.png │ │ ├── icon2.svg │ │ ├── loading.gif │ │ ├── navflagged.png │ │ └── unflagged.png │ ├── poll-c3.css │ ├── slickQuiz.css │ ├── slickQuiz.min.css │ └── video-js.css ├── src │ ├── axios.js │ ├── bootstrap-3.3.7.js │ ├── chroma.js │ ├── codemirror-continuelist.js │ ├── codemirror-markdown.js │ ├── codemirror-xml.js │ ├── codemirror.js │ ├── fabric-3.6.2.js │ ├── firebase-app.js │ ├── firebase-auth.js │ ├── firebase-firestore.js │ ├── handlebars-v4.0.8.js │ ├── jquery-1.12.4.js │ ├── jquery-ui.js │ ├── markdown.js │ ├── mo_slickQuiz.js │ ├── pdf.js │ ├── poll-c3.js │ ├── poll-d3.js │ ├── s3.fine-uploader.js │ ├── vhcheck.js │ ├── video.js │ ├── videojs-contrib-hls.js │ ├── wave-mic.js │ ├── wave.js │ └── youtube.js └── worker │ ├── pdf.worker.js │ └── video-libwebp-0.1.3.min.js ├── fine-upload.php ├── images ├── .xdp_maskable_icon.png.HIN7H0 ├── Congrea144x144.png ├── Congrea192x192.png ├── Congrea512x512.png ├── Congrea72x72.png ├── Congrea96x96.png ├── chrome.png ├── congrea.png ├── ipad_splash.png ├── ipadpro1_splash.png ├── ipadpro2_splash.png ├── ipadpro3_splash.png ├── iphone5_splash.png ├── iphone6_splash.png ├── iphoneplus_splash.png ├── iphonex_splash.png ├── iphonexr_splash.png ├── iphonexsmax_splash.png ├── launch-750x1294.png ├── launch-750x1294x.png ├── loading.gif ├── our-logo.png └── webinar.png ├── import.php ├── lang ├── lang-en.js ├── lang-es.js └── lang-pt_br.js ├── package-lock.json ├── package.json ├── resources ├── audio │ ├── audio-music.mp3 │ └── audio_music.ogg ├── cacert.pem ├── fonts │ ├── icomoon.eot │ ├── icomoon.svg │ ├── icomoon.ttf │ └── icomoon.woff ├── images │ ├── arrow.png │ ├── congrea_logo.svg │ ├── progressbar.gif │ ├── quality-support.png │ └── user.png └── sample.pdf ├── service-workerBackupForURL.js ├── src ├── api.js ├── app-settings.js ├── audio-codec-g711.js ├── audio-resampler.js ├── back-detect.js ├── bookmark.js ├── bootstrap.js ├── chat-boxManager.js ├── chat-container-event.js ├── chat-footer.js ├── chat-lib.js ├── chat.js ├── color-selector.js ├── config.js ├── congrea-uploader.js ├── dashboard.js ├── doNotesMain.js ├── document-share.js ├── editor-annotation-list.js ├── editor-attribute-constants.js ├── editor-line-formatting.js ├── editor-parse-html.js ├── editor-rich-toolbar.js ├── editor-serialize-html.js ├── editor-span.js ├── editor-text-op.js ├── editor-utils.js ├── editor.js ├── footer-control-user.js ├── gesture.js ├── idb.js ├── index.js ├── indexeddb-storage.js ├── installPrompt.js ├── io-adapter.js ├── io-event-api.js ├── io-missing-packets.js ├── io-ping-pong.js ├── io-storage.js ├── io.js ├── jquery.ui.chatbox.js ├── jquery.ui.chatlist.js ├── jquery.ui.chatroom.js ├── keyboard.js ├── lang.js ├── live-stream.js ├── lzstring.js ├── media-audio.js ├── media-video.js ├── media.js ├── mic-testing.js ├── modal.js ├── modernizr.js ├── multi-video.js ├── network.js ├── note.js ├── order-list.js ├── ot-adapter.js ├── ot-client.js ├── ot-codemirror-adapter.js ├── ot-cursor.js ├── ot-editor-client.js ├── ot-server.js ├── ot-text-operation.js ├── ot-undo-manager.js ├── ot-wrapped-operation.js ├── page-navigation.js ├── page.js ├── pdf-render.js ├── poll.js ├── popup.js ├── pptshare.js ├── precheck.js ├── progressbar.js ├── question-answer.js ├── quiz.js ├── raise-hand.js ├── receive-function.js ├── receive-messages-response.js ├── record-play.js ├── rightbar.js ├── roles.js ├── screenshare-dirtycorner.js ├── screenshare-getscreen.js ├── screenshare.js ├── server-data.js ├── settings.js ├── storage-array-base64-converter.js ├── system.js ├── templates_view.js ├── upload-video.js ├── user-interactivity-engine.js ├── user-interactivity-events.js ├── user-interactivity-renderer.js ├── user-interactivity.js ├── user-join-operation.js ├── utility.js ├── vceditor.js ├── video-ajax.js ├── video-base64.min.js ├── video-host.js ├── video-script.js ├── video.min.js ├── view.js ├── virtualclass.js ├── webrtc-adapter.js ├── whiteboard-active.js ├── whiteboard-circle.js ├── whiteboard-common-shape.js ├── whiteboard-common.js ├── whiteboard-cursor.js ├── whiteboard-freedrawing.js ├── whiteboard-line.js ├── whiteboard-message.js ├── whiteboard-protocol.js ├── whiteboard-rectangle.js ├── whiteboard-replay.js ├── whiteboard-text.js ├── whiteboard-triangle.js ├── whiteboard-utility.js ├── whiteboard-wrapper.js ├── whiteboard.js ├── worker │ ├── screendecode.js │ ├── screenworker.js │ ├── storage-array-base64-converter.js │ ├── webptopng.js │ ├── worker-audio-rec.js │ ├── worker-audio-send.js │ ├── worker-io.js │ ├── worklet-audio-rec.js │ └── worklet-audio-send.js ├── xhr.js ├── xhrn.js └── zoom.js ├── templates ├── appSettingDetail.hbs ├── appTools.hbs ├── appToolsMeeting.hbs ├── askQuestion │ ├── answer.hbs │ ├── askQuestionMain.hbs │ ├── bookmark.hbs │ ├── comment.hbs │ ├── context.hbs │ ├── ellipsisText.hbs │ ├── input.hbs │ ├── note-content-area.hbs │ ├── note.hbs │ └── question.hbs ├── audioWidget.hbs ├── chat │ ├── chatMain.hbs │ ├── chatbox.hbs │ ├── chatuser.hbs │ └── stickycont.hbs ├── context-mark.hbs ├── dashboard.hbs ├── dashboardCont.hbs ├── dashboardNav.hbs ├── documentSharing │ ├── dashboard.hbs │ ├── docsMain.hbs │ ├── docsNav.hbs │ ├── notesMain.hbs │ ├── notesNav.hbs │ └── screen.hbs ├── editor │ ├── edenableall.hbs │ ├── editorrich.hbs │ └── messagebox.hbs ├── footerBar.hbs ├── joinclass.hbs ├── leftBar.hbs ├── main.hbs ├── mobileLandscapeWarn.hbs ├── multiVideo.hbs ├── multiVideoMain.hbs ├── navigation │ ├── docIndex.hbs │ ├── navMain.hbs │ └── wbIndex.hbs ├── poll │ ├── edit-modal.hbs │ ├── modal.hbs │ ├── optioninput.hbs │ ├── pollStd.hbs │ ├── pollmain.hbs │ ├── pollresultlist.hbs │ ├── preview-modal.hbs │ ├── previewPopup.hbs │ ├── qn.hbs │ ├── qnOptions.hbs │ ├── result-modal.hbs │ ├── setting-modal.hbs │ └── stdResult.hbs ├── popupCont.hbs ├── ppt │ ├── dashboard.hbs │ ├── linkPpt.hbs │ ├── mszdisplay.hbs │ ├── ppt.hbs │ └── pptiframe.hbs ├── precheck.hbs ├── recordingButton.hbs ├── recordingControl.hbs ├── rightBar.hbs ├── rightBarHeader.hbs ├── ssmainDiv.hbs ├── teacherVideo.hbs ├── videoupload │ ├── linkvideo.hbs │ ├── popup.hbs │ └── videoupload.hbs ├── whiteboard │ ├── main.hbs │ └── toolbar.hbs ├── youtube │ ├── yts.hbs │ └── ytscontrol.hbs └── zoomControl.hbs └── webapi.php /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | end_of_line = lf 10 | max_line_length = 300 11 | 12 | 13 | [*.md] 14 | insert_final_newline = false 15 | trim_trailing_whitespace = false 16 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | es6: true, 5 | worker: true, 6 | }, 7 | extends: 'airbnb-base', 8 | globals: { 9 | Atomics: 'readonly', 10 | SharedArrayBuffer: 'readonly', 11 | virtualclass: 'writable', 12 | api: 'writable', 13 | lang: 'writable', 14 | colorSelector: 'writable', 15 | dashBoard: 'writable', 16 | system: 'writable', 17 | gesture: 'writable', 18 | ioAdapter: 'writable', 19 | io: 'writable', 20 | ioMissingPackets: 'writable', 21 | ioPingPong: 'writable', 22 | ioStorage: 'writable', 23 | LZString: 'writable', 24 | micTesting: 'writable', 25 | MultiVideo: 'writable', 26 | precheck: 'writable', 27 | progressBar: 'writable', 28 | response: 'writable', 29 | roles: 'writable', 30 | dirtyCorner: 'writable', 31 | serverData: 'writable', 32 | settings: 'writable', 33 | vutil: 'writable', 34 | videoHost: 'writable', 35 | wbCommon: 'writable', 36 | keyBoard: 'writable', 37 | optimize: 'writable', 38 | packetQueue: 'writable', 39 | xhr: 'writable', 40 | xhrn: 'writable', 41 | workerIO: 'writable', 42 | virtualclass : 'writable', 43 | virtualclassSetting: 'writable', 44 | wbUser: 'writable', 45 | axios: 'readonly', 46 | sdworker: 'writable', 47 | sworker: 'writable', 48 | chatContainerEvent: 'writable', 49 | OrderedList: 'writable', 50 | receiveFunctions: 'writable', 51 | firebase: 'writable', 52 | AskQuestion: 'writable', 53 | WhiteboardReplay: 'writable', 54 | WhiteboardUtility: 'writable', 55 | WhiteboardReplay: 'writable', 56 | WhiteboardWrapper: 'writable', 57 | WhiteboardProtocol: 'writable', 58 | WhiteboardCircle: 'writable', 59 | WhiteboardCommonShape: 'writable', 60 | WhiteboardLine: 'writable', 61 | WhiteboardFreeDrawing: 'writable', 62 | WhiteboardTriangle: 'writable', 63 | WhiteboardRectangle: 'writable', 64 | WhiteboardActiveAll: 'writable', 65 | WhiteboardText: 'writable', 66 | OrderedList: 'writable', 67 | receiveFunctions: 'writable', 68 | firebase: 'writable', 69 | AskQuestion: 'writable', 70 | $: 'writable', 71 | WhiteboardCursor: 'writable', 72 | WhiteboardMessage: 'writable', 73 | fabric: 'writable', 74 | LiveStream: 'writable', 75 | MediaWrapper: 'writable', 76 | }, 77 | parserOptions: { 78 | ecmaVersion: 2017, 79 | ecmaFeatures: { 80 | impliedStrict: true 81 | } 82 | }, 83 | rules: { 84 | 'max-len': [1, { "code": 120 }], 85 | 'linebreak-style': ["error", "unix"], 86 | }, 87 | }; 88 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .vscode/ 3 | /nbproject/private/ 4 | nbproject/* 5 | node_modules/* 6 | uploads/* 7 | .sass-cache/ 8 | css/theme/black.css.map 9 | css/theme/gray.css.map 10 | example/play.php 11 | dest_temp/* 12 | .DS_Store 13 | example/.DS_Store 14 | .htaccess 15 | .DS_Store 16 | example/.DS_Store 17 | -------------------------------------------------------------------------------- /.stylelintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "stylelint-config-standard", 3 | "rules": { 4 | "font-family-no-missing-generic-family-keyword": null 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ERROR_CODE.txt: -------------------------------------------------------------------------------- 1 | VCE2 = Permission denied 2 | VCE3 = File not found 3 | VCE4 = No data for recording 4 | VCE5 = Unable to record data 5 | VCE6 = Course module id missing 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Virtual Class 2 | Virtual Class 3 | 4 | ## Introduction 5 | It is a tool to facilitate real time interaction between users. Build of education, it is designed primarily for virtual classrooms. 6 | 7 | Presenter would be able to share their audio/video, screen, documents & other media with all users in real time. All of this is browser based and we aim to have an native compatibility with all major browsers on both desktops and tablets. 8 | 9 | ## License : GPLv3 10 | 11 | ## Browser Compatibility 12 | Latest version of Google Chrome 13 | 14 | ## 3rd party integrations 15 | 1) Moodle [https://github.com/vidyamantra/moodle-mod_congrea] 16 | 17 | ## TODO - Roadmap 18 | - [x] Audio/Video 19 | - [x] Documents - pdf, doc, ppt etc 20 | - [x] Live Presence - all users see each other 21 | - [x] Works with firewalls and behind proxies (works on standard 443 SSL port) 22 | - [x] End to end encryption 23 | - [x] Allow Recording and Playback (browser based) 24 | - [x] Allow Direct YouTube playback 25 | - [x] Support Native Basic Editor 26 | - [x] Polls 27 | - [x] Quiz 28 | - [x] Hand Raise 29 | - [x] Responsive and zoom-in, zoom-out controls 30 | - [x] Performance to handle thousands of concurrent users 31 | - [x] Layout template engine 32 | - [x] Compatibility with all major browsers and iPad 33 | - [X] Server side recording 34 | - [ ] Advanced Configurable Reports 35 | -------------------------------------------------------------------------------- /build/cmaps/78-EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/78-EUC-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/78-EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/78-EUC-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/78-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/78-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/78-RKSJ-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/78-RKSJ-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/78-RKSJ-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/78-RKSJ-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/78-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/78-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/78ms-RKSJ-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/78ms-RKSJ-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/78ms-RKSJ-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/78ms-RKSJ-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/83pv-RKSJ-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/83pv-RKSJ-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/90ms-RKSJ-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/90ms-RKSJ-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/90ms-RKSJ-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/90ms-RKSJ-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/90msp-RKSJ-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/90msp-RKSJ-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/90msp-RKSJ-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/90msp-RKSJ-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/90pv-RKSJ-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/90pv-RKSJ-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/90pv-RKSJ-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/90pv-RKSJ-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/Add-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Add-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/Add-RKSJ-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Add-RKSJ-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/Add-RKSJ-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Add-RKSJ-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/Add-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Add-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-CNS1-0.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-CNS1-0.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-CNS1-1.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-CNS1-1.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-CNS1-2.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-CNS1-2.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-CNS1-3.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-CNS1-3.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-CNS1-4.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-CNS1-4.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-CNS1-5.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-CNS1-5.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-CNS1-6.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-CNS1-6.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-CNS1-UCS2.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-CNS1-UCS2.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-GB1-0.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-GB1-0.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-GB1-1.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-GB1-1.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-GB1-2.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-GB1-2.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-GB1-3.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-GB1-3.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-GB1-4.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-GB1-4.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-GB1-5.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-GB1-5.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-GB1-UCS2.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-GB1-UCS2.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-Japan1-0.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-Japan1-0.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-Japan1-1.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-Japan1-1.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-Japan1-2.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-Japan1-2.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-Japan1-3.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-Japan1-3.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-Japan1-4.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-Japan1-4.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-Japan1-5.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-Japan1-5.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-Japan1-6.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-Japan1-6.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-Japan1-UCS2.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-Japan1-UCS2.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-Korea1-0.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-Korea1-0.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-Korea1-1.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-Korea1-1.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-Korea1-2.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-Korea1-2.bcmap -------------------------------------------------------------------------------- /build/cmaps/Adobe-Korea1-UCS2.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Adobe-Korea1-UCS2.bcmap -------------------------------------------------------------------------------- /build/cmaps/B5-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/B5-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/B5-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/B5-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/B5pc-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/B5pc-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/B5pc-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/B5pc-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/CNS-EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/CNS-EUC-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/CNS-EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/CNS-EUC-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/CNS1-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/CNS1-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/CNS1-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/CNS1-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/CNS2-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/CNS2-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/CNS2-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/CNS2-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/ETHK-B5-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/ETHK-B5-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/ETHK-B5-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/ETHK-B5-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/ETen-B5-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/ETen-B5-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/ETen-B5-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/ETen-B5-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/ETenms-B5-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/ETenms-B5-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/ETenms-B5-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/ETenms-B5-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/EUC-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/EUC-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/Ext-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Ext-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/Ext-RKSJ-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Ext-RKSJ-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/Ext-RKSJ-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Ext-RKSJ-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/Ext-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Ext-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/GB-EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/GB-EUC-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/GB-EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/GB-EUC-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/GB-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/GB-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/GB-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/GB-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/GBK-EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/GBK-EUC-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/GBK-EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/GBK-EUC-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/GBK2K-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/GBK2K-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/GBK2K-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/GBK2K-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/GBKp-EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/GBKp-EUC-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/GBKp-EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/GBKp-EUC-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/GBT-EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/GBT-EUC-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/GBT-EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/GBT-EUC-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/GBT-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/GBT-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/GBT-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/GBT-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/GBTpc-EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/GBTpc-EUC-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/GBTpc-EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/GBTpc-EUC-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/GBpc-EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/GBpc-EUC-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/GBpc-EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/GBpc-EUC-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/H.bcmap -------------------------------------------------------------------------------- /build/cmaps/HKdla-B5-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/HKdla-B5-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/HKdla-B5-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/HKdla-B5-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/HKdlb-B5-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/HKdlb-B5-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/HKdlb-B5-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/HKdlb-B5-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/HKgccs-B5-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/HKgccs-B5-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/HKgccs-B5-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/HKgccs-B5-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/HKm314-B5-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/HKm314-B5-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/HKm314-B5-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/HKm314-B5-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/HKm471-B5-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/HKm471-B5-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/HKm471-B5-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/HKm471-B5-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/HKscs-B5-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/HKscs-B5-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/HKscs-B5-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/HKscs-B5-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/Hankaku.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Hankaku.bcmap -------------------------------------------------------------------------------- /build/cmaps/Hiragana.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Hiragana.bcmap -------------------------------------------------------------------------------- /build/cmaps/KSC-EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/KSC-EUC-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/KSC-EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/KSC-EUC-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/KSC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/KSC-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/KSC-Johab-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/KSC-Johab-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/KSC-Johab-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/KSC-Johab-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/KSC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/KSC-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/KSCms-UHC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/KSCms-UHC-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/KSCms-UHC-HW-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/KSCms-UHC-HW-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/KSCms-UHC-HW-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/KSCms-UHC-HW-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/KSCms-UHC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/KSCms-UHC-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/KSCpc-EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/KSCpc-EUC-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/KSCpc-EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/KSCpc-EUC-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/Katakana.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Katakana.bcmap -------------------------------------------------------------------------------- /build/cmaps/LICENSE: -------------------------------------------------------------------------------- 1 | %%Copyright: ----------------------------------------------------------- 2 | %%Copyright: Copyright 1990-2009 Adobe Systems Incorporated. 3 | %%Copyright: All rights reserved. 4 | %%Copyright: 5 | %%Copyright: Redistribution and use in source and binary forms, with or 6 | %%Copyright: without modification, are permitted provided that the 7 | %%Copyright: following conditions are met: 8 | %%Copyright: 9 | %%Copyright: Redistributions of source code must retain the above 10 | %%Copyright: copyright notice, this list of conditions and the following 11 | %%Copyright: disclaimer. 12 | %%Copyright: 13 | %%Copyright: Redistributions in binary form must reproduce the above 14 | %%Copyright: copyright notice, this list of conditions and the following 15 | %%Copyright: disclaimer in the documentation and/or other materials 16 | %%Copyright: provided with the distribution. 17 | %%Copyright: 18 | %%Copyright: Neither the name of Adobe Systems Incorporated nor the names 19 | %%Copyright: of its contributors may be used to endorse or promote 20 | %%Copyright: products derived from this software without specific prior 21 | %%Copyright: written permission. 22 | %%Copyright: 23 | %%Copyright: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 24 | %%Copyright: CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 25 | %%Copyright: INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 26 | %%Copyright: MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 27 | %%Copyright: DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 28 | %%Copyright: CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 29 | %%Copyright: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 30 | %%Copyright: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 31 | %%Copyright: LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32 | %%Copyright: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33 | %%Copyright: CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 34 | %%Copyright: OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 35 | %%Copyright: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 36 | %%Copyright: ----------------------------------------------------------- 37 | -------------------------------------------------------------------------------- /build/cmaps/NWP-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/NWP-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/NWP-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/NWP-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/RKSJ-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/RKSJ-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/RKSJ-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/RKSJ-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/Roman.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/Roman.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniCNS-UCS2-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniCNS-UCS2-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniCNS-UCS2-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniCNS-UCS2-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniCNS-UTF16-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniCNS-UTF16-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniCNS-UTF16-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniCNS-UTF16-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniCNS-UTF32-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniCNS-UTF32-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniCNS-UTF32-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniCNS-UTF32-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniCNS-UTF8-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniCNS-UTF8-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniCNS-UTF8-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniCNS-UTF8-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniGB-UCS2-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniGB-UCS2-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniGB-UCS2-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniGB-UCS2-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniGB-UTF16-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniGB-UTF16-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniGB-UTF16-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniGB-UTF16-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniGB-UTF32-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniGB-UTF32-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniGB-UTF32-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniGB-UTF32-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniGB-UTF8-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniGB-UTF8-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniGB-UTF8-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniGB-UTF8-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJIS-UCS2-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJIS-UCS2-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJIS-UCS2-HW-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJIS-UCS2-HW-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJIS-UCS2-HW-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJIS-UCS2-HW-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJIS-UCS2-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJIS-UCS2-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJIS-UTF16-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJIS-UTF16-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJIS-UTF16-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJIS-UTF16-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJIS-UTF32-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJIS-UTF32-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJIS-UTF32-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJIS-UTF32-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJIS-UTF8-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJIS-UTF8-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJIS-UTF8-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJIS-UTF8-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJIS2004-UTF16-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJIS2004-UTF16-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJIS2004-UTF16-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJIS2004-UTF16-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJIS2004-UTF32-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJIS2004-UTF32-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJIS2004-UTF32-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJIS2004-UTF32-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJIS2004-UTF8-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJIS2004-UTF8-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJIS2004-UTF8-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJIS2004-UTF8-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJISPro-UCS2-HW-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJISPro-UCS2-HW-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJISPro-UCS2-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJISPro-UCS2-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJISPro-UTF8-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJISPro-UTF8-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJISX0213-UTF32-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJISX0213-UTF32-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJISX0213-UTF32-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJISX0213-UTF32-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJISX02132004-UTF32-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJISX02132004-UTF32-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniJISX02132004-UTF32-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniJISX02132004-UTF32-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniKS-UCS2-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniKS-UCS2-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniKS-UCS2-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniKS-UCS2-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniKS-UTF16-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniKS-UTF16-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniKS-UTF16-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniKS-UTF16-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniKS-UTF32-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniKS-UTF32-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniKS-UTF32-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniKS-UTF32-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniKS-UTF8-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniKS-UTF8-H.bcmap -------------------------------------------------------------------------------- /build/cmaps/UniKS-UTF8-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/UniKS-UTF8-V.bcmap -------------------------------------------------------------------------------- /build/cmaps/V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/V.bcmap -------------------------------------------------------------------------------- /build/cmaps/WP-Symbol.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/cmaps/WP-Symbol.bcmap -------------------------------------------------------------------------------- /build/ogv/ogv-decoder-audio-opus-wasm.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/ogv/ogv-decoder-audio-opus-wasm.wasm -------------------------------------------------------------------------------- /build/ogv/ogv-decoder-video-vp8-wasm.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/ogv/ogv-decoder-video-vp8-wasm.wasm -------------------------------------------------------------------------------- /build/ogv/ogv-decoder-video-vp9-wasm.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/ogv/ogv-decoder-video-vp9-wasm.wasm -------------------------------------------------------------------------------- /build/ogv/ogv-demuxer-webm-wasm.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/build/ogv/ogv-demuxer-webm-wasm.wasm -------------------------------------------------------------------------------- /css/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/css/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /css/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/css/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /css/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/css/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /css/bootstrap/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/css/bootstrap/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /css/bootstrap/js/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /css/font/firepad.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/css/font/firepad.eot -------------------------------------------------------------------------------- /css/font/firepad.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/css/font/firepad.ttf -------------------------------------------------------------------------------- /css/font/firepad.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/css/font/firepad.woff -------------------------------------------------------------------------------- /css/modules/color.css: -------------------------------------------------------------------------------- 1 | #virtualclassCont.congrea .bootstrap .nav > li > a:hover, 2 | #virtualclassCont.congrea .bootstrap .nav > li > a:focus, 3 | #virtualclassCont.congrea .bootstrap .nav > li > a:hover:active { 4 | background: #2d3741 none; 5 | } 6 | -------------------------------------------------------------------------------- /css/modules/custom.css: -------------------------------------------------------------------------------- 1 | 2 | #virtualclassCont.congrea #virtualclassPreCheck #browserNext { 3 | width: 100%; 4 | } 5 | 6 | #virtualclassCont.congrea #virtualclassPreCheck.bootstrap .btn { 7 | border-color: #c2c2c2; 8 | float: right; 9 | padding: 0.25rem 0.75rem; 10 | font-size: 0.875rem; 11 | } 12 | 13 | #virtualclassCont.congrea #virtualclassPreCheck.bootstrap #joinSession .btn.joinButton { 14 | pointer-events:none; 15 | } 16 | 17 | #virtualclassCont.congrea #virtualclassPreCheck.bootstrap #joinSession .btn.joinButton.enable { 18 | pointer-events:visible; 19 | } 20 | 21 | #virtualclassCont.congrea #virtualclassPreCheck .testName { 22 | font-size: 1.25rem; 23 | text-align: center; 24 | margin-bottom: 1rem; 25 | text-transform: capitalize; 26 | } 27 | 28 | #virtualclassCont.congrea #virtualclassPreCheck .result div { 29 | background: rgba(0, 128, 0, 0.01) none; 30 | border: 1px dotted rgba(0, 128, 0, 0.4); 31 | border-radius: 3px; 32 | padding: 0.75rem; 33 | text-align: center; 34 | margin-top: 1.25rem; 35 | margin-bottom: 0.9375rem; 36 | } 37 | 38 | #virtualclassCont.congrea #virtualclassPreCheck .result div#micTest { 39 | line-height: 1.3rem; 40 | } 41 | 42 | #virtualclassCont.congrea #virtualclassPreCheck .result div.errorMsg { 43 | text-align: left; 44 | padding-left: 15px; 45 | line-height: 160%; 46 | } 47 | 48 | #virtualclassCont.congrea #virtualclassPreCheck .result .error div { 49 | background: rgba(255, 148, 148, 0.012) none; 50 | border: 1px dotted rgba(255, 148, 148, 0.5); 51 | } 52 | 53 | #virtualclassCont.congrea #virtualclassPreCheck .result div.screenImages { 54 | margin-top: 3px; 55 | } 56 | 57 | #virtualclassCont.congrea #virtualclassPreCheck.bootstrap .btn-default:hover { 58 | background-color: #eee; 59 | border-color: #aaa; 60 | } 61 | 62 | #virtualclassCont.congrea .bootstrap .progress { 63 | background-color: #f5f5f5; 64 | border-radius: 3px; 65 | -webkit-box-shadow: 0 0 2px rgba(0, 0, 0, 0.12) inset; 66 | box-shadow: 0 0 2px rgba(0, 0, 0, 0.12) inset; 67 | color: #666; 68 | font-size: 12px; 69 | height: 26px; 70 | margin-bottom: 20px; 71 | margin-top: 10px; 72 | overflow: hidden; 73 | padding: 5px 6px; 74 | } 75 | 76 | #virtualclassCont.congrea #virtualclassPreCheck.bootstrap .next.btn { 77 | float: right; 78 | cursor: pointer; 79 | } 80 | 81 | #virtualclassCont.congrea #virtualclassPreCheck.bootstrap .prev.btn { 82 | margin-right: 10px; 83 | float: left; 84 | cursor: pointer; 85 | } 86 | -------------------------------------------------------------------------------- /css/modules/peervideo.css: -------------------------------------------------------------------------------- 1 | #virtualclassCont.congrea #peerVideoContainer { 2 | width: 320px; 3 | height: 300px; 4 | border: 1px solid #ddd; 5 | margin-top: 50px; 6 | } 7 | -------------------------------------------------------------------------------- /css/modules/progress.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: 'Alegreya Sans', sans-serif; 3 | margin: 0; 4 | padding: 0; 5 | } 6 | 7 | #virtualclassCont.congrea .pbcontainer { 8 | width: 80%; 9 | 10 | /* margin: 100px auto; */ 11 | margin: 0 auto; 12 | } 13 | 14 | #virtualclassCont.congrea .progressbar { 15 | margin: 10px 0; 16 | padding: 0; 17 | counter-reset: step; 18 | } 19 | 20 | #virtualclassCont.congrea .progressbar li { 21 | list-style-type: none; 22 | width: 20%; 23 | float: left; 24 | font-size: 12px; 25 | position: relative; 26 | text-align: center; 27 | text-transform: uppercase; 28 | color: #7d7d7d; 29 | margin-bottom: 1rem; 30 | } 31 | 32 | #virtualclassCont.congrea .progressbar li { 33 | color: #c3c3c3; 34 | } 35 | 36 | #virtualclassCont.congrea .progressbar li::before { 37 | width: 43px; 38 | height: 30px; 39 | 40 | /* 41 | content: counter(step); 42 | counter-increment: step; 43 | */ 44 | line-height: 30px; 45 | display: block; 46 | text-align: center; 47 | margin: 0 auto 1.25rem auto; 48 | border-radius: 50%; 49 | background-color: white; 50 | } 51 | 52 | #virtualclassCont.congrea .progressbar li::after { 53 | width: 100%; 54 | height: 2px; 55 | content: ''; 56 | position: absolute; 57 | background-color: #7d7d7d; 58 | top: 15px; 59 | 60 | /* left: -50%; */ 61 | left: 0; 62 | z-index: -1; 63 | } 64 | 65 | #virtualclassCont.congrea .progressbar li:first-child::after { 66 | content: none; 67 | } 68 | 69 | #virtualclassCont.congrea .progressbar li.active { 70 | color: rgba(0, 128, 0, 1); 71 | } 72 | 73 | #virtualclassCont.congrea .progressbar li.active::before { 74 | /* 75 | border-color: #55b776; 76 | content: "\2714"; 77 | */ 78 | } 79 | 80 | #virtualclassCont.congrea .progressbar li.active + li::after { 81 | background-color: #55b776; 82 | } 83 | 84 | #virtualclassCont.congrea .progressbar li.active.current::before { 85 | color: #ffbb4d; 86 | } 87 | -------------------------------------------------------------------------------- /css/modules/test.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/css/modules/test.css -------------------------------------------------------------------------------- /example/auth.php: -------------------------------------------------------------------------------- 1 | $authusername, 'authpass' => $authpassword, 'role' => $r, 'room' => $room, 'recording' => true); 34 | 35 | $post_data = json_encode($post_data); 36 | 37 | 38 | $rid = my_curl_request("https://api.congrea.net/backend/auth", $post_data, $licensekey, $secret); 39 | 40 | 41 | 42 | 43 | if (!$rid = json_decode($rid)) { 44 | echo "{\"error\": \"403: Please make sure key & secret are correct. Please try again after 5 minutes. \"}";exit; 45 | } elseif (isset($rid->message)) { 46 | echo "{\"error\": \"$rid->message\"}";exit; 47 | } elseif (!isset($rid->result)) { 48 | echo "{\"error\": \"invalid\"}";exit; 49 | } 50 | 51 | $rid = "wss://$rid->result"; 52 | 53 | ?> 54 | 55 | 86 | -------------------------------------------------------------------------------- /example/en.php: -------------------------------------------------------------------------------- 1 | "Downloading in process, click Play to begin "'; 8 | $string['overallprogress'] = 'Overall Progress'; 9 | $string['replay_message'] = 'Thanks for watching.'; 10 | $string['uploadedsession'] = 'Your session has ended, you may now close the window.
Or 11 | close this popup to start a new session.'; 12 | $string['sessionendmsg'] = 'Session has been closed. You may now close your browser.'; 13 | $string['play'] = 'Play'; 14 | $string['replay'] = 'Re-play'; 15 | $string['tpAudioTest'] = 'Test Audio'; 16 | $string['audioEnable'] = 'Unmute'; 17 | $string['audioDisable'] = 'Mute'; 18 | $string['pressAlwaysToSpeak'] = 'Press always to speak.'; 19 | $string['pushtotalk'] = 'Push To Talk'; 20 | $string['waitmsgconnect'] = 'Please wait a whlie. Application is trying to connect.'; 21 | 22 | $string['testingbrowser'] = 'Testing Browser Compatibility'; 23 | $string['testinginternetspeed'] = 'Testing Internet Speed'; 24 | $string['testingspeaker'] = 'Testing Speaker'; 25 | $string['testingmichrophone'] = 'Testing Microphone'; 26 | $string['testingwebcam'] = 'Testing Webcam Connection'; 27 | $string['proposedspeed'] = 'Proposed Speed'; 28 | $string['audiolatency'] = 'Audio Latency'; 29 | $string['videoquality'] = 'Video Quality'; 30 | ?> 31 | -------------------------------------------------------------------------------- /example/js.php: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /export.php: -------------------------------------------------------------------------------- 1 | 17 | -------------------------------------------------------------------------------- /external/css/overrideimage.css: -------------------------------------------------------------------------------- 1 | #virtualclassCont.congrea .qq-gallery .qq-upload-spinner { 2 | background: url("pix/loading.gif"); 3 | } 4 | 5 | 6 | #virtualclassCont.congrea .qq-gallery .qq-gallery .qq-edit-filename-icon { 7 | background: url("pix/edit.gif"); 8 | } 9 | 10 | 11 | #virtualclassCont.congrea .qq-gallery .qq-edit-filename-icon { 12 | background: url("pix/edit.gif"); 13 | } -------------------------------------------------------------------------------- /external/css/pix/edit.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/external/css/pix/edit.gif -------------------------------------------------------------------------------- /external/css/pix/flagged.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/external/css/pix/flagged.png -------------------------------------------------------------------------------- /external/css/pix/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/external/css/pix/icon.png -------------------------------------------------------------------------------- /external/css/pix/icon2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/external/css/pix/icon2.png -------------------------------------------------------------------------------- /external/css/pix/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/external/css/pix/loading.gif -------------------------------------------------------------------------------- /external/css/pix/navflagged.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/external/css/pix/navflagged.png -------------------------------------------------------------------------------- /external/css/pix/unflagged.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/external/css/pix/unflagged.png -------------------------------------------------------------------------------- /external/src/codemirror-continuelist.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: http://codemirror.net/LICENSE 3 | 4 | (function(mod) { 5 | // We disabled this because there is already we are adding codemirror.js by script tag 6 | // so we can not add it through here by require and define 7 | // For more information about error, http://requirejs.org/docs/errors.html 8 | //if (typeof exports == "object" && typeof module == "object") // CommonJS 9 | // mod(require("../../lib/codemirror")); 10 | //else if (typeof define == "function" && define.amd) // AMD 11 | // define(["../../lib/codemirror"], mod); 12 | //else // Plain browser env 13 | 14 | mod(CodeMirror); 15 | })(function(CodeMirror) { 16 | "use strict"; 17 | 18 | var listRE = /^(\s*)(>[> ]*|[*+-]\s|(\d+)([.)]))(\s*)/, 19 | emptyListRE = /^(\s*)(>[> ]*|[*+-]|(\d+)[.)])(\s*)$/, 20 | unorderedListRE = /[*+-]\s/; 21 | 22 | CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) { 23 | if (cm.getOption("disableInput")) return CodeMirror.Pass; 24 | var ranges = cm.listSelections(), replacements = []; 25 | for (var i = 0; i < ranges.length; i++) { 26 | var pos = ranges[i].head; 27 | var eolState = cm.getStateAfter(pos.line); 28 | var inList = eolState.list !== false; 29 | var inQuote = eolState.quote !== 0; 30 | 31 | var line = cm.getLine(pos.line), match = listRE.exec(line); 32 | if (!ranges[i].empty() || (!inList && !inQuote) || !match) { 33 | cm.execCommand("newlineAndIndent"); 34 | return; 35 | } 36 | if (emptyListRE.test(line)) { 37 | cm.replaceRange("", { 38 | line: pos.line, ch: 0 39 | }, { 40 | line: pos.line, ch: pos.ch + 1 41 | }); 42 | replacements[i] = "\n"; 43 | } else { 44 | var indent = match[1], after = match[5]; 45 | var bullet = unorderedListRE.test(match[2]) || match[2].indexOf(">") >= 0 46 | ? match[2] 47 | : (parseInt(match[3], 10) + 1) + match[4]; 48 | 49 | replacements[i] = "\n" + indent + bullet + after; 50 | } 51 | } 52 | 53 | cm.replaceSelections(replacements); 54 | }; 55 | }); 56 | -------------------------------------------------------------------------------- /external/src/vhcheck.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : 3 | typeof define === 'function' && define.amd ? define(factory) : 4 | (global.vhCheck = factory()); 5 | }(this, (function () { 'use strict'; 6 | 7 | function testVh() { 8 | // test with fixed 9 | var fixedTest = document.createElement('div'); 10 | fixedTest.style.cssText = 'position: fixed; top: 0; bottom: 0;'; 11 | document.documentElement.insertBefore( 12 | fixedTest, 13 | document.documentElement.firstChild 14 | ); 15 | // test with vh 16 | var vhTest = document.createElement('div'); 17 | vhTest.style.cssText = 'position: fixed; top: 0; height: 100vh'; 18 | document.documentElement.insertBefore( 19 | vhTest, 20 | document.documentElement.firstChild 21 | ); 22 | // in iOS vh will be bigger 23 | var topBottom = fixedTest.offsetHeight; 24 | var vh = vhTest.offsetHeight; 25 | var offset = vh - topBottom; 26 | // clean 27 | document.documentElement.removeChild(fixedTest); 28 | document.documentElement.removeChild(vhTest); 29 | return offset; 30 | } 31 | 32 | function updateCssVar(cssVarName, offset) { 33 | document.documentElement.style.setProperty('--' + cssVarName, offset + 'px'); 34 | } 35 | 36 | function vhCheck(cssVarName) { 37 | // configurable CSS var 38 | cssVarName = typeof cssVarName === 'string' ? cssVarName : 'vh-offset'; 39 | var offset = testVh(); 40 | // usefulness check 41 | if (!offset) return false; 42 | updateCssVar(cssVarName, offset); 43 | // Listen for orientation changes 44 | window.addEventListener( 45 | 'orientationchange', 46 | function() { 47 | var newOffset = testVh(); 48 | updateCssVar(cssVarName, newOffset); 49 | }, 50 | false 51 | ); 52 | return true; 53 | } 54 | 55 | return vhCheck; 56 | 57 | }))); -------------------------------------------------------------------------------- /images/.xdp_maskable_icon.png.HIN7H0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/.xdp_maskable_icon.png.HIN7H0 -------------------------------------------------------------------------------- /images/Congrea144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/Congrea144x144.png -------------------------------------------------------------------------------- /images/Congrea192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/Congrea192x192.png -------------------------------------------------------------------------------- /images/Congrea512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/Congrea512x512.png -------------------------------------------------------------------------------- /images/Congrea72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/Congrea72x72.png -------------------------------------------------------------------------------- /images/Congrea96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/Congrea96x96.png -------------------------------------------------------------------------------- /images/chrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/chrome.png -------------------------------------------------------------------------------- /images/congrea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/congrea.png -------------------------------------------------------------------------------- /images/ipad_splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/ipad_splash.png -------------------------------------------------------------------------------- /images/ipadpro1_splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/ipadpro1_splash.png -------------------------------------------------------------------------------- /images/ipadpro2_splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/ipadpro2_splash.png -------------------------------------------------------------------------------- /images/ipadpro3_splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/ipadpro3_splash.png -------------------------------------------------------------------------------- /images/iphone5_splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/iphone5_splash.png -------------------------------------------------------------------------------- /images/iphone6_splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/iphone6_splash.png -------------------------------------------------------------------------------- /images/iphoneplus_splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/iphoneplus_splash.png -------------------------------------------------------------------------------- /images/iphonex_splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/iphonex_splash.png -------------------------------------------------------------------------------- /images/iphonexr_splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/iphonexr_splash.png -------------------------------------------------------------------------------- /images/iphonexsmax_splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/iphonexsmax_splash.png -------------------------------------------------------------------------------- /images/launch-750x1294.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/launch-750x1294.png -------------------------------------------------------------------------------- /images/launch-750x1294x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/launch-750x1294x.png -------------------------------------------------------------------------------- /images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/loading.gif -------------------------------------------------------------------------------- /images/our-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/our-logo.png -------------------------------------------------------------------------------- /images/webinar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/images/webinar.png -------------------------------------------------------------------------------- /import.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "virtualclass", 3 | "title": "minify_resource", 4 | "version": "1.0.0", 5 | "devDependencies": { 6 | "eslint": "^5.16.0", 7 | "eslint-config-airbnb-base": "^13.1.0", 8 | "eslint-plugin-import": "^2.17.3", 9 | "grunt": "^1.1.0", 10 | "grunt-contrib-cssmin": "^3.0.0", 11 | "grunt-contrib-handlebars": "^1.0.0", 12 | "grunt-contrib-jshint": "^2.1.0", 13 | "grunt-contrib-nodeunit": "^2.0.0", 14 | "grunt-contrib-sass": "^1.0.0", 15 | "grunt-contrib-uglify": "^4.0.1", 16 | "grunt-contrib-watch": "^1.1.0", 17 | "grunt-htmlcompressor": "~0.1.10", 18 | "stylelint": "^10.1.0", 19 | "stylelint-config-standard": "^18.3.0" 20 | }, 21 | "description": "", 22 | "main": "index.js", 23 | "directories": { 24 | "example": "example" 25 | }, 26 | "dependencies": {}, 27 | "scripts": { 28 | "test": "echo \"Error: no test specified\" && exit 1" 29 | }, 30 | "repository": { 31 | "type": "git", 32 | "url": "https://github.com/congrea/virtualclass.git" 33 | }, 34 | "author": "", 35 | "license": "ISC", 36 | "bugs": { 37 | "url": "https://github.com/congrea/virtualclass/issues" 38 | }, 39 | "homepage": "https://github.com/congrea/virtualclass" 40 | } 41 | -------------------------------------------------------------------------------- /resources/audio/audio-music.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/resources/audio/audio-music.mp3 -------------------------------------------------------------------------------- /resources/audio/audio_music.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/resources/audio/audio_music.ogg -------------------------------------------------------------------------------- /resources/fonts/icomoon.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/resources/fonts/icomoon.eot -------------------------------------------------------------------------------- /resources/fonts/icomoon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/resources/fonts/icomoon.ttf -------------------------------------------------------------------------------- /resources/fonts/icomoon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/resources/fonts/icomoon.woff -------------------------------------------------------------------------------- /resources/images/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/resources/images/arrow.png -------------------------------------------------------------------------------- /resources/images/progressbar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/resources/images/progressbar.gif -------------------------------------------------------------------------------- /resources/images/quality-support.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/resources/images/quality-support.png -------------------------------------------------------------------------------- /resources/images/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/resources/images/user.png -------------------------------------------------------------------------------- /resources/sample.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/congrea/virtualclass/b21b58d231ee5cfd5302da37be7c538033caaf1f/resources/sample.pdf -------------------------------------------------------------------------------- /service-workerBackupForURL.js: -------------------------------------------------------------------------------- 1 | const FILES_TO_CACHE = [ 2 | './css/modules/test.css', 3 | ]; 4 | 5 | const CACHE_NAME = 'pages-cache-v1'; 6 | 7 | self.addEventListener('install', (event) => { 8 | console.log('Inside the install handler:', event); 9 | // event.waitUntil( 10 | // caches.open(CACHE_NAME) 11 | // .then(cache => { 12 | // console.log('[ServiceWorker] Pre-caching offline page'); 13 | // return cache.addAll(FILES_TO_CACHE); 14 | // }) 15 | // ); 16 | }); 17 | 18 | self.addEventListener('activate', (event) => { 19 | console.log('Inside the activate handler:', event); 20 | }); 21 | 22 | self.addEventListener('fetch', (event) => { 23 | console.log('Inside the fetch handler:',event); 24 | // event.respondWith(event.request); 25 | // event.respondWith( 26 | // caches.match(event.request) 27 | // .then(response => { 28 | // if (response) { 29 | // console.log('Found ', event.request.url, ' in cache'); 30 | // return response; 31 | // } 32 | // console.log('Network request for ', event.request.url); 33 | // return fetch(event.request) 34 | 35 | // .then(response => { 36 | // // TODO 5 - Respond with custom 404 page 37 | // return caches.open(CACHE_NAME).then(cache => { 38 | // cache.put(event.request.url, response.clone()); 39 | // return response; 40 | // }); 41 | // }); 42 | 43 | // }).catch(error => { 44 | 45 | // // TODO 6 - Respond with custom offline page 46 | 47 | // }) 48 | // ); 49 | }); 50 | 51 | 52 | -------------------------------------------------------------------------------- /src/api.js: -------------------------------------------------------------------------------- 1 | const api = { 2 | access: 'https://api.congrea.net/data/access', 3 | askQnsAccess: 'https://api.congrea.net/data/askqns-access', 4 | upload: 'https://api.congrea.net/t/upload', 5 | uploadSuccess: 'https://api.congrea.net/t/uploadSuccess', 6 | uploadMedia: 'https://uploadmedia.congrea.net', 7 | UpdateDocumentStatus: 'https://api.congrea.net/t/UpdateDocumentStatus', 8 | GetDocumentURLs: 'https://api.congrea.net/t/GetDocumentURLs', 9 | UpdateRoomMetaData: 'https://api.congrea.net/t/UpdateRoomMetaData', 10 | GetRoomMetaData: 'https://api.congrea.net/t/GetRoomMetaData', 11 | addURL: 'https://api.congrea.net/t/addURL', 12 | GetDocumentStatus: 'https://api.congrea.net/t/GetDocumentStatus', 13 | recordingFiles: 'https://api.congrea.net/data/recording-files', 14 | 15 | }; 16 | -------------------------------------------------------------------------------- /src/app-settings.js: -------------------------------------------------------------------------------- 1 | (function (window, document) { 2 | /** 3 | * This is the main object which has properties and methods 4 | * Through this properties and methods all the front stuff is happening 5 | * eg:- creating, storing and replaying the objects 6 | */ 7 | 8 | const appSetting = function () { 9 | return { 10 | init() { 11 | const toggle = document.getElementById('appSettingCtrl'); 12 | if (toggle) { 13 | toggle.addEventListener('click', () => { 14 | // window.removeEventListener('mouseup', virtualclass.vutil.attachAskQuestionOptionHandler()); 15 | const appSettingDetail = document.getElementById('appSettingDetail'); 16 | if (appSettingDetail.classList.contains('active')) { 17 | appSettingDetail.classList.remove('active'); 18 | } else { 19 | appSettingDetail.classList.add('active'); 20 | } 21 | }); 22 | } 23 | }, 24 | }; 25 | }; 26 | window.appSetting = appSetting(); 27 | }(window, document)); 28 | -------------------------------------------------------------------------------- /src/back-detect.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This module is used to detect the back press button of browser, 3 | * inspired from http://www.vvaves.net/jquery-backDetect/ 4 | */ 5 | const backDection = { 6 | backDetectValues: { 7 | frameLoaded: 0, 8 | frameTry: 0, 9 | frameTime: 0, 10 | frameDetect: null, 11 | frameSrc: null, 12 | frameCallBack: null, 13 | frameThis: null, 14 | frameNavigator: window.navigator.userAgent, 15 | frameDelay: 0, 16 | frameDataSrc: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC', 17 | }, 18 | 19 | backDetect(selector, callback, delay) { 20 | this.backDetectValues.frameThis = document.querySelector(selector); 21 | this.window = window; 22 | this.backDetectValues.frameCallBack = callback; 23 | if (delay !== null) { 24 | this.backDetectValues.frameDelay = delay; 25 | } 26 | let frameSrc = 'about:blank?loading'; 27 | if (this.backDetectValues.frameNavigator.indexOf('MSIE ') > -1 28 | || this.backDetectValues.frameNavigator.indexOf('Trident') > -1) { 29 | frameSrc = `${this.backDetectValues.frameDataSrc}?loading`; 30 | } 31 | setTimeout(() => { 32 | const iframeHtml = ``; 33 | this.backDetectValues.frameThis.insertAdjacentHTML('beforeEnd', iframeHtml); 34 | }, this.backDetectValues.frameDelay); 35 | }, 36 | 37 | frameInit() { 38 | this.backDetectValues.frameDetect = document.getElementById('backDetectFrame'); 39 | if (this.backDetectValues.frameLoaded === 2) { 40 | this.backDetectValues.frameCallBack.call(this); 41 | this.window.history.go(-1); 42 | } 43 | this.backDetectValues.frameLoaded += 1; 44 | if (this.backDetectValues.frameLoaded === 1) { 45 | this.backDetectValues.frameTime = setTimeout(() => { 46 | backDection.setupFrames(); 47 | }, 500); 48 | } 49 | }, 50 | 51 | setupFrames() { 52 | clearTimeout(this.backDetectValues.frameTime); 53 | this.backDetectValues.frameSrc = this.backDetectValues.frameDetect.src; 54 | if (this.backDetectValues.frameLoaded === 1 && this.backDetectValues.frameSrc.indexOf('historyLoaded') === -1) { 55 | if (this.backDetectValues.frameNavigator.indexOf('MSIE ') > -1 56 | || this.backDetectValues.frameNavigator.indexOf('Trident') > -1) { 57 | this.backDetectValues.frameDetect.src = `${this.backDetectValues.frameDataSrc}'?historyLoaded`; 58 | } else { 59 | this.backDetectValues.frameDetect.src = 'about:blank?historyLoaded'; 60 | } 61 | } 62 | }, 63 | }; 64 | -------------------------------------------------------------------------------- /src/bookmark.js: -------------------------------------------------------------------------------- 1 | class Bookmark { // Part of bookmark 2 | afterChangeContext(context) { 3 | const activeBookMark = document.querySelector('#bookmark .container .bookmarks.active'); 4 | if (activeBookMark) { 5 | activeBookMark.classList.remove('active'); 6 | } 7 | 8 | const newBookmarkElem = document.querySelector(`#bookmark .bookmarks[data-context~=${context}]`); 9 | if (newBookmarkElem) { 10 | newBookmarkElem.classList.add('active'); 11 | } else { 12 | const bookMarkContainer = document.querySelector('#bookmark .container'); 13 | if (bookMarkContainer && !newBookmarkElem) { 14 | const bookmarkHtml = virtualclass.getTemplate('bookmark', 'askQuestion'); 15 | bookMarkContainer.insertAdjacentHTML('beforeEnd', bookmarkHtml({ 16 | context: virtualclass.userInteractivity.currentContext, 17 | })); 18 | } 19 | } 20 | 21 | if (virtualclass.userInteractivity.queue.bookmark[context] 22 | && virtualclass.userInteractivity.queue.bookmark[context].length > 0) { 23 | virtualclass.userInteractivity.engine.perform(context, 'bookmark'); 24 | } 25 | } 26 | 27 | async bookMarkHandler(event) { 28 | // await virtualclass.userInteractivity.triggerInitFirebaseOperation('bookmark'); 29 | const ev = event; 30 | virtualclass.userInteractivity.handler(ev); 31 | const parentNodeElem = ev.target.parentNode; 32 | if (+(parentNodeElem.dataset.value) === 1) { 33 | parentNodeElem.dataset.value = 0; 34 | ev.target.dataset.title = virtualclass.lang.getString('addContext'); 35 | } else { 36 | parentNodeElem.dataset.value = 1; 37 | ev.target.dataset.title = virtualclass.lang.getString('removeContext'); 38 | } 39 | } 40 | 41 | attachHandler() { 42 | document.getElementById('bookmark').addEventListener('click', this.bookMarkHandler); 43 | } 44 | 45 | updateOnPageRefresh(data) { 46 | const bookmark = document.querySelector(`#bookmark .bookmarks[data-context~=${data.context}]`); 47 | if (bookmark) { 48 | const toolTip = bookmark.querySelector('.congtooltip'); 49 | bookmark.dataset.value = data.content; 50 | if (data.content === 1) { 51 | toolTip.dataset.title = virtualclass.lang.getString('removeContext'); 52 | } else { 53 | toolTip.dataset.title = virtualclass.lang.getString('addContext'); 54 | } 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/doNotesMain.js: -------------------------------------------------------------------------------- 1 | !(function () { const n = Handlebars.template; (Handlebars.templates = Handlebars.templates || {})['docNotesMain.hbs'] = n({ compiler: [7, '>= 4.0.0'], main(n, e, a, l, t) { let s; return `
\n ${n.escapeExpression((s = (s = a.name || (e != null ? e.name : e)) != null ? s : a.helperMissing, typeof s === 'function' ? s.call(e != null ? e : n.nullContext || {}, { name: 'name', hash: {}, data: t }) : s))}\n
`; }, useData: !0 }); }()); 2 | -------------------------------------------------------------------------------- /src/editor-attribute-constants.js: -------------------------------------------------------------------------------- 1 | // This file is part of Vidyamantra - http:www.vidyamantra.com/ 2 | /** 3 | * By this file we are creating the Editor 4 | * It depends on parameters what kind of editor(Rich Text or Code editor would be created) 5 | * 6 | * @Copyright 2015 Vidyamantra Edusystems. Pvt.Ltd. 7 | * @author Suman Bogati 8 | * 9 | * 10 | */ 11 | (function (window) { 12 | const AttributeConstants = { 13 | BOLD: 'b', 14 | ITALIC: 'i', 15 | UNDERLINE: 'u', 16 | STRIKE: 's', 17 | FONT: 'f', 18 | FONT_SIZE: 'fs', 19 | COLOR: 'c', 20 | BACKGROUND_COLOR: 'bc', 21 | ENTITY_SENTINEL: 'ent', 22 | 23 | // Line Attributes 24 | LINE_SENTINEL: 'l', 25 | LINE_INDENT: 'li', 26 | LINE_ALIGN: 'la', 27 | LIST_TYPE: 'lt', 28 | }; 29 | window.AttributeConstants = AttributeConstants; 30 | }(window)); 31 | -------------------------------------------------------------------------------- /src/editor-line-formatting.js: -------------------------------------------------------------------------------- 1 | // This file is part of Vidyamantra - http:www.vidyamantra.com/ 2 | /** 3 | * By this file we are creating the Editor 4 | * It depends on parameters what kind of editor(Rich Text or Code editor would be created) 5 | * 6 | * @Copyright 2015 Vidyamantra Edusystems. Pvt.Ltd. 7 | * @author Suman Bogati 8 | * 9 | * 10 | */ 11 | (function (window) { 12 | /** 13 | * Immutable object to represent line formatting. Formatting can be modified by chaining method calls. 14 | * 15 | * @constructor 16 | * @type {Function} 17 | */ 18 | const LineFormatting = (function () { 19 | const ATTR = window.AttributeConstants; 20 | 21 | function LineFormatting(attributes) { 22 | // Allow calling without new. 23 | if (!(this instanceof LineFormatting)) { 24 | return new LineFormatting(attributes); 25 | } 26 | 27 | this.attributes = attributes || {}; 28 | this.attributes[ATTR.LINE_SENTINEL] = true; 29 | } 30 | 31 | LineFormatting.LIST_TYPE = { 32 | NONE: false, 33 | ORDERED: 'o', 34 | UNORDERED: 'u', 35 | TODO: 't', 36 | TODOCHECKED: 'tc', 37 | }; 38 | 39 | LineFormatting.prototype.cloneWithNewAttribute_ = function (attribute, value) { 40 | const attributes = {}; 41 | 42 | // Copy existing. 43 | for (const attr in this.attributes) { 44 | attributes[attr] = this.attributes[attr]; 45 | } 46 | 47 | // Add new one. 48 | if (value === false) { 49 | delete attributes[attribute]; 50 | } else { 51 | attributes[attribute] = value; 52 | } 53 | 54 | return new LineFormatting(attributes); 55 | }; 56 | 57 | LineFormatting.prototype.indent = function (indent) { 58 | return this.cloneWithNewAttribute_(ATTR.LINE_INDENT, indent); 59 | }; 60 | 61 | LineFormatting.prototype.align = function (align) { 62 | return this.cloneWithNewAttribute_(ATTR.LINE_ALIGN, align); 63 | }; 64 | 65 | LineFormatting.prototype.listItem = function (val) { 66 | vceditor.utils.assert(val === false || val === 'u' || val === 'o' || val === 't' || val === 'tc'); 67 | return this.cloneWithNewAttribute_(ATTR.LIST_TYPE, val); 68 | }; 69 | 70 | LineFormatting.prototype.getIndent = function () { 71 | return this.attributes[ATTR.LINE_INDENT] || 0; 72 | }; 73 | 74 | LineFormatting.prototype.getAlign = function () { 75 | return this.attributes[ATTR.LINE_ALIGN] || 0; 76 | }; 77 | 78 | LineFormatting.prototype.getListItem = function () { 79 | return this.attributes[ATTR.LIST_TYPE] || false; 80 | }; 81 | return LineFormatting; 82 | }()); 83 | 84 | window.LineFormatting = LineFormatting; 85 | }(window)); 86 | -------------------------------------------------------------------------------- /src/editor-span.js: -------------------------------------------------------------------------------- 1 | // This file is part of Vidyamantra - http:www.vidyamantra.com/ 2 | /** 3 | * By this file we are creating the Editor 4 | * It depends on parameters what kind of editor(Rich Text or Code editor would be created) 5 | * 6 | * @Copyright 2015 Vidyamantra Edusystems. Pvt.Ltd. 7 | * @author Suman Bogati 8 | * 9 | * 10 | */ 11 | (function (window) { 12 | const Span = (function () { 13 | function Span(pos, length) { 14 | this.pos = pos; 15 | this.length = length; 16 | } 17 | 18 | Span.prototype.end = function () { 19 | return this.pos + this.length; 20 | }; 21 | 22 | return Span; 23 | }()); 24 | window.Span = Span; 25 | }(window)); 26 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | /** * 2 | * @Copyright 2014 Vidya Mantra EduSystems Pvt. Ltd. 3 | * @author Suman Bogati 4 | ** */ 5 | $.uiBackCompat = false; 6 | (function (window) { 7 | window.onload = async function () { 8 | const bootStraper = new window.Bootstrap(); 9 | await bootStraper.setBasicData(window); 10 | await bootStraper.validDateSession(); 11 | await bootStraper.loadData(); 12 | await bootStraper.appInit(); 13 | await bootStraper.setUpMedia(); 14 | await bootStraper.readyToGo(); 15 | await bootStraper.cache(); 16 | 17 | virtualclass.serverData.syncComplete = false; 18 | await virtualclass.serverData.syncAllData().then(() => { 19 | if (virtualclass.currApp === 'DocumentShare' && virtualclass.dts) { 20 | virtualclass.dts.updateScreen(); 21 | } else if (virtualclass.currApp === 'Video' && typeof virtualclass.videoUl.UI.rawVideoList() === 'object') { 22 | virtualclass.videoUl.UI.rawVideoList(); 23 | } else if (virtualclass.currApp === 'SharePresentation' && virtualclass.serverData.rawData.ppt.length > 0) { 24 | virtualclass.sharePt.awsPresentationList(virtualclass.serverData.rawData.ppt); 25 | } 26 | 27 | virtualclass.vutil.requestOrder(() => {}); 28 | }); 29 | 30 | bootStraper.notifyAboutCPU(); 31 | if (virtualclass.isPlayMode) { 32 | virtualclass.settings.triggerSettings(); 33 | } 34 | }; 35 | }(window)); 36 | -------------------------------------------------------------------------------- /src/installPrompt.js: -------------------------------------------------------------------------------- 1 | if(window.location.search !== null && window.location.search !== "") { 2 | // when plugin has a support of pwa 3 | document.querySelector("html").classList.add("pwaSupported"); 4 | } 5 | window.addEventListener('beforeinstallprompt', (event) => { 6 | console.log('👍', 'beforeinstallprompt', event); 7 | // Prevent the mini-infobar from appearing on mobile 8 | event.preventDefault(); 9 | // Stash the event so it can be triggered later. 10 | window.deferredPrompt = event; 11 | }); 12 | 13 | // Track how the PWA was launched 14 | window.addEventListener('load', () => { 15 | if (navigator.fullscreen) { 16 | console.log('Launched: pwa app from ios'); 17 | document.querySelector("html").classList.add("pwaRunning"); 18 | } else if (matchMedia('(display-mode: fullscreen)').matches) { 19 | console.log('Launched: pwa app from android'); 20 | document.querySelector("html").classList.add("pwaRunning"); 21 | } else { 22 | console.log('Launched: Browser Tab'); 23 | } 24 | 25 | // Track the android app running 26 | if(document.referrer.includes('net.vidyamantra.congrea')) { 27 | document.querySelector("html").classList.add("twaRunning"); 28 | console.log('Launched: Android app'); 29 | } 30 | }); -------------------------------------------------------------------------------- /src/io-ping-pong.js: -------------------------------------------------------------------------------- 1 | const ioPingPong = { 2 | ping(e) { 3 | // When a new member is added, greet him with both broadcast and individual msg 4 | if (e.type === 'member_added') { 5 | if (roles.hasAdmin()) { 6 | const session = virtualclass.config.sessionName(); 7 | const msg = { ping: 'ping', cf: 'pong', session }; 8 | ioAdapter.sendWithDelayAndDrop(msg, null, 'mustSend', 'pingAll', 3000); 9 | // console.log('PING BROADCAST'); 10 | } 11 | } 12 | }, 13 | async pong(e) { 14 | if (e.toUser) { 15 | // console.log(`PONG TO ${e.toUser.userid} from ${e.fromUser.userid}`); 16 | const msg = { ping: 'pong', cf: 'pongAck' }; 17 | ioAdapter.mustSendUser(msg, e.fromUser.userid); 18 | // console.log(`PONG ACK TO ${e.fromUser.userid}`); 19 | } else { 20 | // console.log(`PONG BROADCAST from ${e.fromUser.userid}`); 21 | await virtualclass.config.verifySession(e); 22 | } 23 | }, 24 | pongAck(e) { 25 | // console.log(`PONG ACK FROM ${e.fromUser.userid}`); 26 | }, 27 | }; 28 | -------------------------------------------------------------------------------- /src/io-storage.js: -------------------------------------------------------------------------------- 1 | const ioStorage = { 2 | storeCacheAllDataSend(data, key) { 3 | const msg = { 4 | user: { userid: wbUser.id }, 5 | m: data.arg.msg, 6 | }; 7 | msg.user.lname = virtualclass.gObj.allUserObj[virtualclass.gObj.uid].lname; 8 | msg.user.name = virtualclass.gObj.allUserObj[virtualclass.gObj.uid].name; 9 | msg.user.role = virtualclass.gObj.allUserObj[virtualclass.gObj.uid].role; 10 | msg.type = 'broadcastToAll'; 11 | virtualclass.storage.storeCacheAll(JSON.stringify(msg), key); 12 | }, 13 | 14 | storeCacheAllData(data, key) { 15 | const msg = ioStorage.addUserObj(data); 16 | virtualclass.storage.storeCacheAll(JSON.stringify(msg), key); 17 | }, 18 | 19 | storeCacheOutData(data, key) { 20 | // if (data.m.cf !== 'eddata') { 21 | const msg = ioStorage.addUserObj(data); 22 | virtualclass.storage.storeCacheOut(JSON.stringify(msg), key); 23 | // } 24 | }, 25 | 26 | addUserObj(msg) { 27 | if (!Object.prototype.hasOwnProperty.call(msg, 'type') && Object.prototype.hasOwnProperty.call(msg, 'user')) { 28 | msg.type = 'broadcastToAll'; 29 | if (typeof virtualclass.gObj.allUserObj[msg.user.userid] === 'undefined') { 30 | virtualclass.gObj.allUserObj[msg.user.userid] = {}; 31 | virtualclass.gObj.allUserObj[msg.user.userid].userid = msg.user.userid; 32 | virtualclass.gObj.allUserObj[msg.user.userid].lname = ' '; 33 | virtualclass.gObj.allUserObj[msg.user.userid].name = 'student'; 34 | virtualclass.gObj.allUserObj[msg.user.userid].role = 's'; 35 | } 36 | 37 | if (virtualclass.gObj.allUserObj[msg.user.userid].userid === msg.user.userid) { 38 | msg.user.lname = virtualclass.gObj.allUserObj[msg.user.userid].lname; 39 | msg.user.name = virtualclass.gObj.allUserObj[msg.user.userid].name; 40 | msg.user.role = virtualclass.gObj.allUserObj[msg.user.userid].role; 41 | } 42 | } 43 | return msg; 44 | }, 45 | 46 | storeCacheInData(data, key) { 47 | // if (data.m.cf !== 'eddata') { 48 | virtualclass.storage.storeCacheIn(JSON.stringify(data), key); 49 | // } 50 | }, 51 | }; 52 | -------------------------------------------------------------------------------- /src/keyboard.js: -------------------------------------------------------------------------------- 1 | class VirtualclassKeyboard { 2 | init(wId) { 3 | // const canvas = document.querySelector(`#canvasWrapper${wId} .upper-canvas`); 4 | // if(canvas) canvas.addEventListener('keydown', this.handlerKeyDown); 5 | const canvasWrapper = document.querySelector(`#canvasWrapper${wId}`); 6 | canvasWrapper.tabIndex = 1000; 7 | canvasWrapper.addEventListener('keydown', this.constructor.handlerKeyDown, false); 8 | } 9 | 10 | static handlerKeyDown(evt) { 11 | // This is used for removed the selected object. 12 | // var currTime = new Date().getTime(); 13 | // 8 is used for delete on mac 14 | if (evt.keyCode === 8 || evt.keyCode === 46) { 15 | WhiteboardUtility.deleteActiveObject(evt, virtualclass.gObj.currWb); 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /src/lang.js: -------------------------------------------------------------------------------- 1 | // This file is part of Vidyamantra - http:www.vidyamantra.com/ 2 | /** @Copyright 2014 Vidya Mantra EduSystems Pvt. Ltd. 3 | * @author Suman Bogati 4 | */ 5 | 6 | (function (window) { 7 | /** 8 | * @words expect array 9 | * 10 | */ 11 | 12 | const setLangType = function (LangType) { 13 | let currentLangType; 14 | // Check language type is present in congreaLanguages or not. 15 | if (Object.prototype.hasOwnProperty.call(window.congreaLanguages, LangType)) { 16 | currentLangType = LangType; 17 | } else if (LangType.length >= 4) { 18 | // check language by first two characters of langtype 19 | LangType = LangType.substring(0, 2); 20 | if (Object.prototype.hasOwnProperty.call(window.congreaLanguages, LangType)) { 21 | currentLangType = LangType; 22 | } else { 23 | currentLangType = 'en'; 24 | } 25 | } else { 26 | // used default language 27 | currentLangType = 'en'; 28 | } 29 | return currentLangType; 30 | }; 31 | 32 | const getLang = function (Langtype) { 33 | if (typeof Langtype === 'undefined' || !Langtype || Langtype == '0') { 34 | // language is not passed from the moodle 35 | const userBrowserLang = window.navigator.language; 36 | Langtype = userBrowserLang.toLowerCase(); 37 | Langtype = Langtype.replace(/-/g, '_'); // Replacing hyphen with underscore 38 | } 39 | const congreaLang = setLangType(Langtype); 40 | window.message = window.congreaLanguages[congreaLang]; 41 | }; 42 | 43 | getLang(wbUser.language); // Takes argument from the moodle (moodle's language) 44 | 45 | const getString = function (string, words) { 46 | let langString = window.virtualclass.lang.message[string]; 47 | if (typeof words !== 'undefined' && words.length > 0) { 48 | for (let i = 0; i < words.length; i++) { 49 | const spatt = new RegExp(`{virtualclass${i + 1}}`); 50 | langString = langString.replace(spatt, words[i]); 51 | } 52 | } 53 | return langString; 54 | }; 55 | window.getString = getString; 56 | }(window)); 57 | 58 | -------------------------------------------------------------------------------- /src/modal.js: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | (function (window) { 7 | const modal = () => ({ 8 | show(elem) { 9 | const element = document.querySelector(elem); 10 | if (element != null) { 11 | element.classList.add('in'); 12 | } 13 | }, 14 | 15 | hide(elem) { 16 | const celem = document.querySelector(elem); 17 | if (celem != null) { 18 | celem.classList.add('fade'); 19 | } 20 | }, 21 | 22 | removeModal() { 23 | const modalElem = document.querySelector('#editPollModal'); 24 | if (modalElem) { 25 | modalElem.parentNode.removeChild(modalElem); 26 | } 27 | }, 28 | closeModalHandler(id) { 29 | const that = this; 30 | const close = document.querySelector(`#${id} .close`); 31 | if (close) { 32 | close.addEventListener('click', () => { 33 | that.removeModal(); 34 | }); 35 | } 36 | }, 37 | hideModal() { 38 | const db = document.querySelector('#congdashboard'); 39 | if (db) { 40 | db.className = 'modal fade'; 41 | } 42 | }, 43 | 44 | showModal() { 45 | const db = document.querySelector('#congdashboard'); 46 | if (db) { 47 | db.className = 'modal in'; 48 | } 49 | }, 50 | 51 | attachpopupHandler(pollType, index, preview) { 52 | const cont = document.querySelector(`#qnText${pollType}${index}`); 53 | cont.insertAdjacentHTML('beforeend', preview); 54 | const content = document.querySelector(`#qnText${pollType}${index} .popover-content`); 55 | content.classList.add('hide'); 56 | 57 | const elem = document.querySelector(`#qnText${pollType}${index} .popover-content`); 58 | cont.addEventListener('mouseover', () => { 59 | elem.classList.add('show'); 60 | elem.classList.remove('hide'); 61 | }); 62 | cont.addEventListener('mouseleave', () => { 63 | elem.classList.remove('show'); 64 | elem.classList.add('hide'); 65 | }); 66 | }, 67 | 68 | }); 69 | window.modal = modal(); 70 | }(window)); 71 | -------------------------------------------------------------------------------- /src/order-list.js: -------------------------------------------------------------------------------- 1 | class OrderedList { 2 | constructor() { 3 | this.ol = {}; 4 | this.ol.order = []; 5 | this.ol.list = {}; 6 | } 7 | 8 | insert(id, data, position) { 9 | if (position != null || position === 0) { 10 | this.ol.order.splice(position, 0, id); 11 | } else { 12 | this.ol.order.push(id); 13 | } 14 | if (data) { 15 | this.ol.list[id] = data; 16 | } 17 | } 18 | 19 | remove(position) { 20 | this.ol.order.splice(position, 1); 21 | } 22 | 23 | removeByID(id) { 24 | const position = this.ol.order.indexOf(id); 25 | this.ol.order.splice(position, 1); 26 | } 27 | 28 | getNext(position) { 29 | position += 1; 30 | const obj = { id: this.ol.order[position], data: this.ol.list[this.ol.order[position]] }; 31 | return obj; 32 | } 33 | 34 | getPrevious(position) { 35 | position -= 1; 36 | const obj = { id: this.ol.order[position], data: this.ol.list[this.ol.order[position]] }; 37 | return obj; 38 | } 39 | 40 | getNextByID(id) { 41 | const position = this.ol.order.indexOf(id) + 1; 42 | const obj = { id: this.ol.order[position], data: this.ol.list[this.ol.order[position]] }; 43 | return obj; 44 | } 45 | 46 | getPreviousByID(id) { 47 | const position = this.ol.order.indexOf(id) - 1; 48 | const obj = { id: this.ol.order[position], data: this.ol.list[this.ol.order[position]] }; 49 | return obj; 50 | } 51 | 52 | getOrder() { 53 | return this.ol.list.join(','); 54 | } 55 | 56 | loadOrder(order) { 57 | this.ol.list = order.split(','); 58 | } 59 | 60 | setID(id, data) { 61 | this.ol.list[id] = data; 62 | } 63 | 64 | loadList(list) { 65 | this.ol.list = list; 66 | } 67 | 68 | reset() { 69 | this.ol = {}; 70 | this.ol.order.length = 0; 71 | this.ol.list = {}; 72 | } 73 | 74 | overrideOrder(order) { 75 | this.ol.order = order; 76 | } 77 | 78 | getCurrentPosition(id) { 79 | return this.ol.order.indexOf(id); 80 | } 81 | 82 | getCurrent(id) { 83 | return this.ol.list[id]; 84 | } 85 | 86 | emptyList () { 87 | console.log('====> Empty the list'); 88 | this.ol.order.length = 0; 89 | delete this.ol.list; 90 | this.ol.list = {}; 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /src/ot-cursor.js: -------------------------------------------------------------------------------- 1 | // This file is part of Vidyamantra - http:www.vidyamantra.com/ 2 | /** 3 | * By this file we are creating the Editor 4 | * It depends on parameters what kind of editor(Rich Text or Code editor would be created) 5 | * 6 | * @Copyright 2015 Vidyamantra Edusystems. Pvt.Ltd. 7 | * @author Suman Bogati 8 | * 9 | * 10 | */ 11 | (function (window) { 12 | const Cursor = (function () { 13 | // A cursor has a `position` and a `selectionEnd`. Both are zero-based indexes 14 | // into the document. When nothing is selected, `selectionEnd` is equal to 15 | // `position`. When there is a selection, `position` is always the side of the 16 | // selection that would move if you pressed an arrow key. 17 | function Cursor(position, selectionEnd) { 18 | this.position = position; 19 | this.selectionEnd = selectionEnd; 20 | } 21 | 22 | Cursor.fromJSON = function (obj) { 23 | return new Cursor(obj.position, obj.selectionEnd); 24 | }; 25 | 26 | Cursor.prototype.equals = function (other) { 27 | return this.position === other.position 28 | && this.selectionEnd === other.selectionEnd; 29 | }; 30 | 31 | // Return the more current cursor information. 32 | Cursor.prototype.compose = function (other) { 33 | return other; 34 | }; 35 | 36 | // Update the cursor with respect to an operation. 37 | Cursor.prototype.transform = function (other) { 38 | function transformIndex(index) { 39 | let newIndex = index; 40 | const { ops } = other; 41 | for (let i = 0, l = other.ops.length; i < l; i++) { 42 | if (ops[i].isRetain()) { 43 | index -= ops[i].chars; 44 | } else if (ops[i].isInsert()) { 45 | newIndex += ops[i].text.length; 46 | } else { 47 | newIndex -= Math.min(index, ops[i].chars); 48 | index -= ops[i].chars; 49 | } 50 | if (index < 0) { 51 | break; 52 | } 53 | } 54 | return newIndex; 55 | } 56 | 57 | const newPosition = transformIndex(this.position); 58 | if (this.position === this.selectionEnd) { 59 | return new Cursor(newPosition, newPosition); 60 | } 61 | return new Cursor(newPosition, transformIndex(this.selectionEnd)); 62 | }; 63 | 64 | return Cursor; 65 | }()); 66 | window.Cursor = Cursor; 67 | }(window)); 68 | -------------------------------------------------------------------------------- /src/ot-server.js: -------------------------------------------------------------------------------- 1 | const Server = (function (global) { 2 | // Constructor. Takes the current document as a string and optionally the array 3 | // of all operations. 4 | function Server(document, operations) { 5 | this.document = document; 6 | this.operations = operations || []; 7 | } 8 | 9 | // Call this method whenever you receive an operation from a client. 10 | Server.prototype.receiveOperation = function (revision, operation) { 11 | // console.log(`Operations ${this.operations.length} Revision ${revision}`); 12 | if (revision < 0 || this.operations.length < revision) { 13 | // if(revision > 1 ){ 14 | // virtualclass.editorRich.requestData('from_s'); 15 | // } 16 | // throw Ernewror("operation revision not in history"); 17 | // console.log(`operation revision ${revision} not in history`); 18 | return false; 19 | } 20 | 21 | // Find all operations that the client didn't know of when it sent the 22 | // operation ... 23 | const concurrentOperations = this.operations.slice(revision); 24 | // console.log('conc operation ' + concurrentOperations.length); 25 | // ... and transform the operation against all these operations ... 26 | const { transform } = operation.constructor; 27 | for (let i = 0; i < concurrentOperations.length; i++) { 28 | // console.log('transforming'); 29 | operation = transform(operation, concurrentOperations[i])[0]; 30 | } 31 | 32 | // ... and apply that on the document. 33 | this.document = operation.apply(this.document); 34 | // Store operation in history. 35 | this.operations.push(operation); 36 | 37 | // It's the caller's responsibility to send the operation to all connected 38 | // clients and an acknowledgement to the creator. 39 | return operation; 40 | }; 41 | 42 | return Server; 43 | }(this)); 44 | 45 | if (typeof module === 'object') { 46 | module.exports = ot.Server; 47 | } 48 | -------------------------------------------------------------------------------- /src/ot-wrapped-operation.js: -------------------------------------------------------------------------------- 1 | // This file is part of Vidyamantra - http:www.vidyamantra.com/ 2 | /** 3 | * By this file we are creating the Editor 4 | * It depends on parameters what kind of editor(Rich Text or Code editor would be created) 5 | * 6 | * @Copyright 2015 Vidyamantra Edusystems. Pvt.Ltd. 7 | * @author Suman Bogati 8 | * 9 | * 10 | */ 11 | (function (window) { 12 | const WrappedOperation = (function (global) { 13 | // A WrappedOperation contains an operation and corresponing metadata. 14 | function WrappedOperation(operation, meta) { 15 | this.wrapped = operation; 16 | this.meta = meta; 17 | } 18 | 19 | WrappedOperation.prototype.apply = function () { 20 | return this.wrapped.apply.apply(this.wrapped, arguments); 21 | }; 22 | 23 | WrappedOperation.prototype.invert = function () { 24 | const { meta } = this; 25 | return new WrappedOperation( 26 | this.wrapped.invert.apply(this.wrapped, arguments), 27 | meta && typeof meta === 'object' && typeof meta.invert === 'function' 28 | ? meta.invert.apply(meta, arguments) : meta, 29 | ); 30 | }; 31 | 32 | // Copy all properties from source to target. 33 | function copy(source, target) { 34 | for (const key in source) { 35 | if (Object.prototype.hasOwnProperty.call(source, key)) { 36 | target[key] = source[key]; 37 | } 38 | } 39 | } 40 | 41 | function composeMeta(a, b) { 42 | if (a && typeof a === 'object') { 43 | if (typeof a.compose === 'function') { 44 | return a.compose(b); 45 | } 46 | const meta = {}; 47 | copy(a, meta); 48 | copy(b, meta); 49 | return meta; 50 | } 51 | return b; 52 | } 53 | 54 | WrappedOperation.prototype.compose = function (other) { 55 | return new WrappedOperation( 56 | this.wrapped.compose(other.wrapped), 57 | composeMeta(this.meta, other.meta), 58 | ); 59 | }; 60 | 61 | function transformMeta(meta, operation) { 62 | if (meta && typeof meta === 'object') { 63 | if (typeof meta.transform === 'function') { 64 | return meta.transform(operation); 65 | } 66 | } 67 | return meta; 68 | } 69 | 70 | WrappedOperation.transform = function (a, b) { 71 | const { transform } = a.wrapped.constructor; 72 | const pair = transform(a.wrapped, b.wrapped); 73 | return [ 74 | new WrappedOperation(pair[0], transformMeta(a.meta, b.wrapped)), 75 | new WrappedOperation(pair[1], transformMeta(b.meta, a.wrapped)), 76 | ]; 77 | }; 78 | 79 | return WrappedOperation; 80 | }()); 81 | window.WrappedOperation = WrappedOperation; 82 | }(window)); 83 | -------------------------------------------------------------------------------- /src/progressbar.js: -------------------------------------------------------------------------------- 1 | // This file is part of Vidyamantra - http:www.vidyamantra.com/ 2 | /** @Copyright 2015 Vidya Mantra EduSystems Pvt. Ltd. 3 | * @author Suman Bogati 4 | */ 5 | 6 | 7 | let prvTimeout; 8 | const progressBar = { 9 | prvVal: '', 10 | currVal: '', 11 | 12 | /** * 13 | After each progress of XHR, there would check difference 14 | between current and previous value. Will provide the download link 15 | if found the differences, Otherwise initialize function progressInit() 16 | for trigger it after five minute. 17 | 18 | */ 19 | 20 | progressInit() { 21 | const that = this; 22 | if (typeof prvTimeout !== 'undefined') { 23 | clearTimeout(prvTimeout); 24 | } 25 | prvTimeout = setTimeout( 26 | () => { 27 | if (that.prvVal === that.currVal 28 | && Object.prototype.hasOwnProperty.call(virtualclass.gObj, 'downloadProgress')) { 29 | virtualclass.recorder.initMakeAvailDownloadFile(); 30 | } else { 31 | that.prvVal = that.currVal; 32 | that.progressInit(); 33 | } 34 | }, 50000, 35 | ); 36 | }, 37 | 38 | renderProgressBar(totalVal, portion, pbar, pval) { 39 | // console.log('===== totalVal ==== ' + totalVal + '; portion' + portion); 40 | 41 | if (portion > totalVal) { 42 | portion = totalVal; 43 | document.getElementById('askplayMessage').innerHTML = virtualclass.lang.getString('playsessionmsg'); 44 | } 45 | 46 | const totalProgress = (totalVal === 0 && portion === 0) ? 0 : Math.round((portion * 100) / totalVal); 47 | 48 | const pbarElem = document.getElementById(pbar); 49 | if (pbarElem != null) { 50 | pbarElem.style.width = `${totalProgress}%`; 51 | } 52 | 53 | if (pval >= 100) { 54 | const closeButton = document.getElementById('recordingClose'); 55 | recordingClose.style.display = 'block'; 56 | closeButton.addEventListener('click', () => { 57 | virtualclass.popup.closeElem(); 58 | }); 59 | } 60 | }, 61 | 62 | }; 63 | -------------------------------------------------------------------------------- /src/roles.js: -------------------------------------------------------------------------------- 1 | const roles = { 2 | 3 | /** 4 | * Teacher is super Admin in our app, original Teacher 5 | * We should avoid using IS functions and rather use HAS functions, wherever possible 6 | * @returns {boolean} 7 | */ 8 | isTeacher() { 9 | return (virtualclass.gObj.uRole === 't'); 10 | }, 11 | /** 12 | * Student is student, lease privileged user 13 | * We should avoid using IS functions and rather use HAS functions, wherever possible 14 | * @returns {boolean} 15 | */ 16 | isStudent() { 17 | return (virtualclass.gObj.uRole === 's'); 18 | }, 19 | /** 20 | * Presenter is upgraded Student role 21 | * We should avoid using IS functions and rather use HAS functions, wherever possible 22 | * @returns {boolean} 23 | */ 24 | isPresenter() { 25 | return (virtualclass.gObj.uRole === 'p'); 26 | }, 27 | /** 28 | * Educator is downgraded Teacher role 29 | * We should avoid using IS functions and rather use HAS functions, wherever possible 30 | * @returns {boolean} 31 | */ 32 | isEducator() { 33 | return (virtualclass.gObj.uRole === 'e'); 34 | }, 35 | /** 36 | * Teacher and Presenter should have controls 37 | * We should avoid using IS functions and rather use HAS functions, wherever possible 38 | * @returns {boolean} 39 | */ 40 | hasControls() { 41 | return (virtualclass.gObj.uRole === 't' || virtualclass.gObj.uRole === 'p'); 42 | }, 43 | /** 44 | * Teacher and Educator should have OT. 45 | * There should be only one person having OT Permission. 46 | * @returns {boolean} 47 | */ 48 | hasAdmin() { 49 | return (virtualclass.gObj.uRole === 't' || virtualclass.gObj.uRole === 'e'); 50 | }, 51 | /** 52 | * Student and Educator has View Only Access 53 | * @returns {boolean} 54 | */ 55 | hasView() { 56 | return (virtualclass.gObj.uRole === 's' || virtualclass.gObj.uRole === 'e'); 57 | }, 58 | }; 59 | -------------------------------------------------------------------------------- /src/screenshare-dirtycorner.js: -------------------------------------------------------------------------------- 1 | /** To change this license header, choose License Headers in Project Properties. 2 | * To change this template file, choose Tools | Templates 3 | * and open the template in the editor. 4 | */ 5 | (function (window) { 6 | const dirtyCorner = { 7 | decodeRGB(encodeDataArr, ctx, canvas) { 8 | const imageData = ctx.createImageData(canvas.width, canvas.height); // TODO - Create empty Array 9 | let red; let green; let 10 | blue; 11 | for (let i = 0; i < encodeDataArr.length * 4; i++) { 12 | imageData.data[(i * 4) + 0] = (encodeDataArr[i] >> 5) * 36.5; // red 13 | imageData.data[(i * 4) + 1] = ((encodeDataArr[i] & 28) >> 2) * 36.5; 14 | imageData.data[(i * 4) + 2] = (encodeDataArr[i] & 3) * 85; 15 | imageData.data[(i * 4) + 3] = 255; 16 | } 17 | return imageData; 18 | }, 19 | 20 | decodeRGBSlice(encodeDataArr, ctx, d) { 21 | const imageData = ctx.createImageData(d.w, d.h); // TODO - Create empty Array 22 | let red; let green; let 23 | blue; 24 | for (let i = 0; i < encodeDataArr.length * 4; i++) { 25 | imageData.data[(i * 4) + 0] = (encodeDataArr[i] >> 5) * 36.5; // red 26 | imageData.data[(i * 4) + 1] = ((encodeDataArr[i] & 28) >> 2) * 36.5; 27 | imageData.data[(i * 4) + 2] = (encodeDataArr[i] & 3) * 85; 28 | imageData.data[(i * 4) + 3] = 255; 29 | } 30 | return imageData; 31 | }, 32 | 33 | encodeRGB(imgData) { 34 | const length = imgData.length / 4; 35 | const encodeDataArr = new Uint8ClampedArray(length); 36 | let red; let green; let blue; let 37 | encodedData; 38 | 39 | for (let i = 0; i < length; i++) { 40 | red = imgData[(i * 4) + 0]; 41 | green = imgData[(i * 4) + 1]; 42 | blue = imgData[(i * 4) + 2]; 43 | encodedData = (Math.round((red / 36.5)) << 5) + (Math.round((green / 36.5)) << 2) + Math.round((blue / 85)); 44 | encodeDataArr[i] = encodedData; 45 | } 46 | return encodeDataArr; 47 | }, 48 | 49 | str2ImageData(str, d) { 50 | const imageData = context2.createImageData(d.w, d.h); 51 | const buf = new ArrayBuffer(str.length); // 2 bytes for each char 52 | imageData.data = new Uint8Array(buf); 53 | for (let i = 0, strLe = str.length; i < strLen; i++) { 54 | imageData.data[i] = str.charCodeAt(i); 55 | } 56 | return imageData; 57 | }, 58 | 59 | doClearCanvas() { 60 | context2.clearRect(0, 0, canvas2.width, canvas2.height); 61 | }, 62 | }; 63 | window.dirtyCorner = dirtyCorner; 64 | }(window)); 65 | -------------------------------------------------------------------------------- /src/screenshare-getscreen.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Executed when the virtual class is loaded 3 | * Provides an interaction with desktop selector 4 | * messege is posted to desktop selector and and desktop selector 5 | * performes the task and posts a message back on receiving the message. 6 | * initializes user's screen and recorders 7 | * Todo, following file should be deleted in future, 8 | * as there is no need of extension to share the screen 9 | */ 10 | window.addEventListener('message', (event) => { 11 | if (event.origin !== window.location.origin) { 12 | return; 13 | } 14 | if (event.data.type === 'gotScreen') { 15 | // delete window.shouldChromExtInstall; 16 | let constraints; 17 | if (event.data.sourceId === '') { // user canceled 18 | virtualclass.vutil.beforeSend({ sd: true, cf: 'colorIndicator' }); 19 | const error = new Error('NavigatorUserMediaError'); 20 | error.name = 'PERMISSION_DENIED'; 21 | if (Object.prototype.hasOwnProperty.call(virtualclass, 'ss')) { 22 | virtualclass.ss.onError(error); 23 | } 24 | 25 | if (virtualclass.currApp === 'SharePresentation' || virtualclass.currApp === 'DocumentShare') { 26 | const dashboardnav = document.querySelector('#dashboardnav button'); 27 | if (dashboardnav != null) { 28 | dashboardnav.click(); 29 | } 30 | } 31 | 32 | if (roles.hasControls()) { // #943 33 | virtualclass.vutil.initDefaultApp(); 34 | } 35 | } else { 36 | constraints = constraints || { 37 | audio: false, 38 | video: { 39 | mandatory: { 40 | chromeMediaSource: 'desktop', 41 | chromeMediaSourceId: event.data.sourceId, 42 | maxWidth: 1440, 43 | maxHeight: 9999, 44 | }, 45 | 46 | optional: [ 47 | { maxFrameRate: 3 }, 48 | { googLeakyBucket: true }, 49 | { googTemporalLayeredScreencast: true }, 50 | ], 51 | }, 52 | }; 53 | 54 | virtualclass.adpt = new virtualclass.adapter(); 55 | const navigator2 = virtualclass.adpt.init(navigator); 56 | navigator2.getUserMedia(constraints, (stream) => { 57 | virtualclass.ss.initInternal(); 58 | virtualclass.ss.initializeRecorder.call(virtualclass.ss, stream); 59 | }, (e) => { 60 | virtualclass.ss.onError.call(virtualclass.ss, e); 61 | }); 62 | // the stream we can get here with initalizeRecorder() 63 | } 64 | const elem = document.querySelector('#virtualclassScreenShareLocalSmall'); 65 | if (elem) { 66 | elem.style.display = 'block'; 67 | } 68 | } else if (event.data.type === 'getScreenPending') { 69 | window.clearTimeout(event.data.id); 70 | } else if (event.data.type === 'yes') { 71 | virtualclass.gObj.ext = true; 72 | } 73 | }); 74 | -------------------------------------------------------------------------------- /src/user-interactivity-engine.js: -------------------------------------------------------------------------------- 1 | class UserInteractivityEngine { // main part 2 | performWithQueue(data) { 3 | this.makeQueue(data); 4 | const type = (data.component === 'note' || data.component === 'bookmark') ? data.component : 'question'; 5 | this.perform(data.context, type); 6 | } 7 | 8 | makeQueue(data) { 9 | const type = (data.component === 'note' || data.component === 'bookmark') ? data.component : 'question'; 10 | if (!virtualclass.userInteractivity.queue[type][data.context]) { 11 | virtualclass.userInteractivity.queue[type][data.context] = []; 12 | } 13 | virtualclass.userInteractivity.queue[type][data.context].push(data); 14 | } 15 | 16 | perform(context, type) { 17 | while (virtualclass.userInteractivity.queue[type][context] && virtualclass.userInteractivity.queue[type][context].length > 0) { 18 | const data = virtualclass.userInteractivity.queue[type][context].shift(); 19 | if (data.component === 'question' && data.upvote && data.upvote > 1) { 20 | virtualclass.userInteractivity.upvote.call(virtualclass.userInteractivity, data); 21 | } else if (data.component === 'answer' && data.upvote && data.upvote > 1) { 22 | virtualclass.userInteractivity.upvote.call(virtualclass.userInteractivity, data); 23 | } else { 24 | // context = whiteboard 1/screen share, component = question/answer, action = create/edit 25 | virtualclass.userInteractivity[data.action].call(virtualclass.userInteractivity, data); 26 | console.log('=====> perform ', data); 27 | } 28 | } 29 | } 30 | 31 | performWithPassData(data) { 32 | virtualclass.userInteractivity[data.action].call(virtualclass.userInteractivity, data); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/video-ajax.js: -------------------------------------------------------------------------------- 1 | let vType; 2 | function createRequestObject() { 3 | let ro; 4 | const browser = navigator.appName; 5 | if (browser == 'Microsoft Internet Explorer') { 6 | ro = new ActiveXObject('Microsoft.XMLHTTP'); 7 | } else { 8 | ro = new XMLHttpRequest(); 9 | } 10 | return ro; 11 | } 12 | 13 | const http = createRequestObject(); 14 | 15 | function convertResponseBodyToText(IEByteArray) { 16 | const ByteMapping = {}; 17 | for (let i = 0; i < 256; i++) { 18 | for (let j = 0; j < 256; j++) { 19 | ByteMapping[String.fromCharCode(i + j * 256)] = String.fromCharCode(i) + String.fromCharCode(j); 20 | } 21 | } 22 | const rawBytes = IEBinaryToArray_ByteStr(IEByteArray); 23 | const lastChr = IEBinaryToArray_ByteStr_Last(IEByteArray); 24 | return rawBytes.replace(/[\s\S]/g, 25 | match => ByteMapping[match]) + lastChr; 26 | } 27 | 28 | const IEBinaryToArray_ByteStr_Script = '\r\n' 29 | + "\r\n'; 43 | document.write(IEBinaryToArray_ByteStr_Script); 44 | 45 | 46 | function loadfile(imgData, canvas, context) { 47 | if (typeof vType === 'undefined') vType = 'dec'; 48 | // document.getElementById('testbild').innerHTML='server query....'; 49 | if (vType === 'dec') { 50 | const imgTag = new Image(); 51 | imgTag.src = imgData; 52 | http.open('get', imgTag.src); 53 | 54 | if (http.overrideMimeType) http.overrideMimeType('text/plain; charset=x-user-defined'); 55 | else http.setRequestHeader('Accept-Charset', 'x-user-defined'); 56 | 57 | http.onreadystatechange = function () { 58 | if (http.readyState == 4) { 59 | if (typeof http.responseBody === 'undefined') { 60 | var response = http.responseText.split('').map(e => String.fromCharCode(e.charCodeAt(0) & 0xff)).join(''); 61 | } else { 62 | var response = convertResponseBodyToText(http.responseBody); 63 | } 64 | if (vType === 'dec') { 65 | if (virtualclass.gObj.meetingMode) { 66 | WebPDecDemo(canvas.id); 67 | } 68 | } 69 | // WebPDecDemo(canvas.id); 70 | virtualclass.vutil.WebPDecodeAndDraw(response, canvas, context); 71 | } // else alert('Cannot load file. Please, try again'); 72 | }; 73 | http.send(null); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /src/video-base64.min.js: -------------------------------------------------------------------------------- 1 | eval(function (p, a, c, k, e, r) { e = function (c) { return (c < a ? '' : e(parseInt(c / a))) + ((c %= a) > 35 ? String.fromCharCode(c + 29) : c.toString(36)); }; if (!''.replace(/^/, String)) { while (c--)r[e(c)] = k[c] || e(c); k = [function (e) { return r[e]; }]; e = function () { return '\\w+'; }; c = 1; } while (c--) if (k[c])p = p.replace(new RegExp(`\\b${e(c)}\\b`, 'g'), k[c]); return p; }('(v(){o d="H+/";o e=I J(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,K,-1,-1,-1,L,M,N,O,P,Q,R,S,T,U,w,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,V,W,X,Y,Z,1a,-1,-1,-1,-1,-1,-1,1b,1c,1d,1e,1f,1g,1h,1i,1j,1k,1l,1m,1n,1o,1p,1q,1r,1s,1t,1u,1v,1w,1x,1y,1z,1A,-1,-1,-1,-1,-1);v A(a){o b,i,g;o c,h,f;g=a.B;i=0;b="";p(i>2);b+=d.k((c&x)<<4);b+="==";q}h=a.n(i++);j(i==g){b+=d.k(c>>2);b+=d.k(((c&x)<<4)|((h&C)>>4));b+=d.k((h&D)<<2);b+="=";q}f=a.n(i++);b+=d.k(c>>2);b+=d.k(((c&x)<<4)|((h&C)>>4));b+=d.k(((h&D)<<2)|((f&1B)>>6));b+=d.k(f&1C)}s b}v E(a){o b,h,f,l;o i,g,m;g=a.B;i=0;m="";p(i>4));t{f=a.n(i++)&r;j(f==w)s m;f=e[f]}p(i>2));t{l=a.n(i++)&r;j(l==w)s m;l=e[l]}p(i 5 | */ 6 | class WhiteboardCircle extends WhiteboardCommonShape { 7 | constructor(name) { 8 | super(name); 9 | this.name = name; 10 | } 11 | 12 | mouseDown(pointer, whiteboard, event) { 13 | this.innerMouseDown(pointer, whiteboard, event); 14 | if (!event.e.isTrusted) return; 15 | this.sendMouseDownData(pointer); 16 | } 17 | 18 | innerMouseDown(pointer, whiteboard) { 19 | this.mousedown = true; 20 | this.startLeft = pointer.x; 21 | this.startTop = pointer.y; 22 | this.coreObj.left = this.startLeft; 23 | this.coreObj.top = this.startTop; 24 | this.coreObj.rx = pointer.x - this.startLet; 25 | this.coreObj.ry = pointer.y - this.startTop; 26 | this.coreObj.angle = 0; 27 | this.coreObj.stroke = this.default.stroke; 28 | this.coreObj.strokeWidth = this.default.strokeWidth; 29 | this.coreObj.rotatingPointOffset = this.default.rotatingPointOffset * virtualclass.zoom.canvasScale; 30 | this.coreObj.cornerSize = this.default.cornerSize * virtualclass.zoom.canvasScale; 31 | this.coreObj.strokeWidth = this.default.strokeWidth; 32 | 33 | if (whiteboard.toolColor) { 34 | this.coreObj.stroke = whiteboard.toolColor; 35 | } 36 | if (whiteboard.strokeSize) { 37 | this.coreObj.strokeWidth = +(whiteboard.strokeSize); 38 | } 39 | this[this.name] = new fabric.Ellipse(this.coreObj); // add object 40 | whiteboard.canvas.add(this[this.name]); 41 | } 42 | 43 | mouseMove(pointer, whiteboard) { 44 | this.sendMouseMoveData(pointer); 45 | this.innerMouseMove(pointer, whiteboard); 46 | } 47 | 48 | innerMouseMove(pointer, whiteboard) { 49 | let rx = Math.abs(this.startLeft - pointer.x) / 2; 50 | let ry = Math.abs(this.startTop - pointer.y) / 2; 51 | if (rx > this.circle.strokeWidth) { 52 | rx -= this.circle.strokeWidth / 2; 53 | } 54 | if (ry > this.circle.strokeWidth) { 55 | ry -= this.circle.strokeWidth / 2; 56 | } 57 | this.circle.set({ rx, ry }); 58 | if (this.startLeft > pointer.x) { 59 | this.circle.set({ originX: 'right' }); 60 | } else { 61 | this.circle.set({ originX: 'left' }); 62 | } 63 | if (this.startTop > pointer.y) { 64 | this.circle.set({ originY: 'bottom' }); 65 | } else { 66 | this.circle.set({ originY: 'top' }); 67 | } 68 | whiteboard.canvas.renderAll(); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/whiteboard-freedrawing.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This class is responsible to create free drawing image. 3 | * As mouse move data received, fbaric's pencil instance draws the move image here. 4 | * Sending the mouse move cordinates from here. 5 | * @Copyright 2020 Vidya Mantra EduSystems Pvt. Ltd. 6 | * @author Suman Bogati 7 | */ 8 | 9 | class WhiteboardFreeDrawing extends WhiteboardCommonShape { 10 | constructor(name) { 11 | super(name); 12 | this.name = name; 13 | this.chunks = []; 14 | } 15 | 16 | innerMouseMove(pointer, whiteboard, event) { 17 | if (!event) event = { e: { isPrimary: true }}; 18 | whiteboard.myPencil.onMouseMove(pointer, event); 19 | } 20 | 21 | mouseMove(pointer, whiteboard, event) { 22 | this.innerMouseMove(pointer, whiteboard, event); 23 | if (!event.e.isTrusted) return; 24 | this.collectingData(pointer); 25 | virtualclass.wbWrapper.msg.optimizeToSend(this.chunks, 3000, 'sf'); 26 | } 27 | 28 | collectingData(pointer) { 29 | const newData = { 30 | x: pointer.x, 31 | y: pointer.y, 32 | }; 33 | 34 | if ((!this.freeDrawPrevious) || (((Math.abs(newData.x - this.freeDrawPrevious.x) > 1) 35 | || (Math.abs(newData.y - this.freeDrawPrevious.y) > 1)))) { 36 | this.freeDrawPrevious = newData; 37 | this.chunks.push(`${newData.x}_${newData.y}`); 38 | // console.log('====> actual x, y sendin =============FREE DRAWING==== before scale ', newData.x, newData.y); 39 | } 40 | virtualclass.wbWrapper.gObj.previousData = newData; 41 | } 42 | } -------------------------------------------------------------------------------- /src/whiteboard-line.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This class draws the line on whtieboard 3 | * @Copyright 2020 Vidya Mantra EduSystems Pvt. Ltd. 4 | * @author Suman Bogati 5 | */ 6 | 7 | class WhiteboardLine extends WhiteboardCommonShape { 8 | constructor(name) { 9 | super(name); 10 | this.name = name; 11 | } 12 | 13 | mouseMove(pointer, whiteboard) { 14 | this.sendMouseMoveData(pointer); 15 | this.innerMouseMove(pointer, whiteboard); 16 | } 17 | 18 | innerMouseMove(pointer, whiteboard) { 19 | if (!this.mousedown) return; 20 | this.line.set({ 21 | x2: pointer.x, 22 | y2: pointer.y, 23 | }); 24 | whiteboard.canvas.renderAll(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/whiteboard-message.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This class is responsible for communcating whiteboard data or packets 3 | * @Copyright 2020 Vidya Mantra EduSystems Pvt. Ltd. 4 | * @author Suman Bogati 5 | */ 6 | class WhiteboardMessage { 7 | static send(data) { 8 | if (roles.hasControls()) { 9 | // console.log('sending the data here guys ', JSON.stringify(data)); 10 | ioAdapter.mustSend(data); 11 | if (data.wb[0].substring(0, 2) === 'sf') { 12 | WhiteboardUtility.storeAtMemory(data.wb, virtualclass.gObj.currWb, data.v); 13 | } else { 14 | WhiteboardUtility.storeAtMemory(data.wb, virtualclass.gObj.currWb); 15 | } 16 | } 17 | } 18 | 19 | onMessage(e) { 20 | const whiteboardShape = e.message.wb[0].substring(0, 2); 21 | if (whiteboardShape === 'sf') { // free drawing packet 22 | const fromUserRole = e.fromUser.role; 23 | const result = WhiteboardProtocol.generateFreeDrawingData(e.message.v, e.message.s, true); 24 | let event; 25 | for (let i = 0; i < result.length; i += 1) { 26 | event = { message: { wb: result[i] }, fromUser: { role: fromUserRole } }; 27 | this.onMessage(event); 28 | } 29 | } else { 30 | if (!Array.isArray(e.message.wb)) e.message.wb = [e.message.wb]; 31 | const dataToPlay = e.message.wb; 32 | virtualclass.vutil.storeWhiteboardAtInlineMemory(e.message.wb); 33 | if (!virtualclass.zoom.canvasScale) return; 34 | if (virtualclass.gObj.currWb && typeof virtualclass.wb[virtualclass.gObj.currWb] === 'object' 35 | && e.fromUser.role === 't') { 36 | virtualclass.wbWrapper.replay.triggerReplay(dataToPlay, virtualclass.gObj.currWb); 37 | } 38 | } 39 | } 40 | 41 | optimizeToSend(data, time, type) { 42 | virtualclass.wbWrapper.gObj.previousData = data; 43 | virtualclass.wbWrapper.gObj.presentSendDataTime = new Date().getTime(); 44 | const timeDifference = (virtualclass.wbWrapper.gObj.presentSendDataTime - virtualclass.wbWrapper.gObj.lastSentDataTime); 45 | if (timeDifference >= time) { 46 | if (type) { 47 | const newData = virtualclass.wbWrapper.protocol.encode(type, data); 48 | this.constructor.send(newData); 49 | } 50 | virtualclass.wbWrapper.gObj.lastSentDataTime = new Date().getTime(); 51 | if (type === 'sf') { 52 | // Empty the free drarwing after bulk data sent 53 | virtualclass.wb[virtualclass.gObj.currWb].freeDrawingObj.chunks.length = 0; 54 | } 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/whiteboard-rectangle.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This class draws the rectangle 3 | * @Copyright 2020 Vidya Mantra EduSystems Pvt. Ltd. 4 | * @author Suman Bogati 5 | */ 6 | class WhiteboardRectangle extends WhiteboardCommonShape { 7 | constructor(name) { 8 | super(name); 9 | this.name = name; 10 | } 11 | 12 | mouseMove(pointer, whiteboard) { 13 | this.sendMouseMoveData(pointer); 14 | this.innerMouseMove(pointer, whiteboard); 15 | } 16 | 17 | innerMouseMove(pointer, whiteboard) { 18 | if (!this.mousedown) return; 19 | const newLeft = pointer.x; 20 | const newTop = pointer.y; 21 | const width = newLeft - this.startLeft; 22 | const height = newTop - this.startTop; 23 | 24 | if (width > 0) { // Draw from left to right 25 | this.rectangle.set('width', width); 26 | } else { 27 | this.rectangle.set('left', newLeft); // Draw from right to left 28 | this.rectangle.set('width', width * -1); 29 | } 30 | 31 | if (height > 0) { 32 | this.rectangle.set('height', height); // Draw from top to bottom 33 | } else { 34 | this.rectangle.set('top', newTop); // Draw from bottom to top 35 | this.rectangle.set('height', height * -1); 36 | } 37 | whiteboard.canvas.renderAll(); 38 | } 39 | } -------------------------------------------------------------------------------- /src/whiteboard-triangle.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This class draws the triangle on whiteboard 3 | * @Copyright 2020 Vidya Mantra EduSystems Pvt. Ltd. 4 | * @author Suman Bogati 5 | */ 6 | 7 | class WhiteboardTriangle extends WhiteboardCommonShape { 8 | constructor(name) { 9 | super(name); 10 | this.name = name; 11 | } 12 | 13 | mouseMove(pointer, whiteboard) { 14 | this.sendMouseMoveData(pointer); 15 | this.innerMouseMove(pointer, whiteboard); 16 | } 17 | 18 | innerMouseMove(pointer, whiteboard) { 19 | if (!this.mousedown) return; 20 | const newLeft = pointer.x; 21 | const newTop = pointer.y; 22 | const width = newLeft - this.startLeft; 23 | const height = newTop - this.startTop; 24 | 25 | // Setting the width of triangle 26 | if (width > 0) { 27 | this.triangle.set('width', width); // Left to Right 28 | } else { 29 | this.triangle.set('width', width * -1); // Right to Left 30 | } 31 | 32 | // Setting the height of triangle 33 | if (height > 0) { 34 | this.triangle.set('angle', 0); 35 | this.triangle.set('height', height); // Top to bottom 36 | if (width > 0) { 37 | this.triangle.set('left', newLeft - width); 38 | } else { 39 | this.triangle.set('left', newLeft); 40 | } 41 | } else { 42 | this.triangle.set('angle', 180); 43 | this.triangle.set('height', height * -1); 44 | this.triangle.set('top', newTop + height * -1); // Bottom to top 45 | if (width > 0) { 46 | this.triangle.set('left', newLeft); 47 | } else { 48 | this.triangle.set('left', newLeft + width * -1); 49 | } 50 | } 51 | whiteboard.canvas.renderAll(); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/worker/worklet-audio-send.js: -------------------------------------------------------------------------------- 1 | /** * 2 | * @copyright 2018 Suman Bogati {@link http://vidyamantra.com} 3 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 4 | * This file gets audio continuously from getUserMedia, and 5 | * send it to send audio worker (worker-audio-send.js) 6 | */ 7 | const workletAudioSendBlob = URL.createObjectURL(new Blob(['(', function () { 8 | // console.log('== init audio worklet 1'); 9 | class workletAudioSend extends AudioWorkletProcessor { 10 | constructor() { 11 | super(); 12 | this.audios = new Float32Array(4096); 13 | this.position = 0; 14 | const that = this; 15 | this.port.onmessage = function (e) { 16 | if (Object.prototype.hasOwnProperty.call(e.data, 'cmd') && e.data.cmd == 'workerAudioSend') { 17 | that.workerAudioSend = e.ports[0]; 18 | that.workerAudioSend.onmessage = that.fromworkerAudioSend; 19 | } 20 | }; 21 | } 22 | 23 | fromworkerAudioSend() { 24 | // console.log('This is from audio sender'); 25 | } 26 | 27 | /** 28 | * Once the GetUsermedia stream is connected to the Audio Context, 29 | * the following method is triggered continuously 30 | */ 31 | process(inputs, outputs) { 32 | const input = inputs[0][0]; 33 | this.audios.set(input, this.position); 34 | this.position += input.length; 35 | if (this.position >= 4096) { 36 | if (Object.prototype.hasOwnProperty.call(this, 'workerAudioSend')) { 37 | this.workerAudioSend.postMessage({ cmd: 'rawAudio', msg: this.audios }); 38 | } 39 | this.audios = new Float32Array(4096); 40 | this.position = 0; 41 | } 42 | return true; 43 | } 44 | } 45 | registerProcessor('worklet-audio-send', workletAudioSend); 46 | }.toString(), ')()'], { type: 'application/javascript' })); 47 | -------------------------------------------------------------------------------- /src/xhr.js: -------------------------------------------------------------------------------- 1 | // This file is part of google 2 | /** 3 | * @author(Current) Suman Bogati 4 | */ 5 | (function (window) { 6 | const xhr = { 7 | init() { 8 | this.vxhr = axios.create({ 9 | timeout: 10000, 10 | withCredentials: true, 11 | headers: { 12 | 'Content-Type': 'application/json', 13 | post: { 14 | 'Content-Type': 'application/json', 15 | }, 16 | get: { 17 | 'Content-Type': 'application/json', 18 | }, 19 | }, 20 | onUploadProgress: ((progressEvent) => { 21 | virtualclass.xhr.onProgress(progressEvent); 22 | }), 23 | }); 24 | }, 25 | 26 | // this is not inbuilt onprogress 27 | onProgress(evt) { 28 | virtualclass.pbar.currVal = evt.loaded; 29 | if ((virtualclass.pbar.prvVal === '' || typeof virtualclass.pbar.prvVal === 'undefined') 30 | && !virtualclass.isPlayMode) { 31 | virtualclass.pbar.progressInit(); 32 | } 33 | virtualclass.pbar.renderProgressBar(evt.total, evt.loaded, 'indProgressBar', 'indProgressValue'); 34 | }, 35 | }; 36 | window.xhr = xhr; 37 | }(window)); 38 | -------------------------------------------------------------------------------- /src/xhrn.js: -------------------------------------------------------------------------------- 1 | // This file is part of google 2 | /** 3 | * @author(Current) Suman Bogati 4 | */ 5 | (function (window) { 6 | const xhrn = { 7 | init() { 8 | this.vxhrn = axios.create({ 9 | timeout: 10000, 10 | headers: { 11 | 'Content-Type': 'application/json', 12 | 'x-api-key': wbUser.lkey, 13 | 'x-congrea-authuser': wbUser.auth_user, 14 | 'x-congrea-authpass': wbUser.auth_pass, 15 | 'x-congrea-room': wbUser.room, 16 | post: { 17 | 'Content-Type': 'application/json', 18 | }, 19 | get: { 20 | 'Content-Type': 'application/json', 21 | }, 22 | }, 23 | }); 24 | }, 25 | 26 | getAccess() { 27 | this.vxhrn.get(virtualclass.api.access, { withCredentials: true }) 28 | .then(() => { 29 | virtualclass.gObj.readyToCommunicate = true; 30 | }) 31 | .catch((error) => { 32 | console.error('Request failed with error ', error); 33 | setTimeout(() => { 34 | virtualclass.xhrn.getAccess(); 35 | }, 1000); 36 | }); 37 | }, 38 | 39 | async getAskQnAccess() { 40 | const result = await this.vxhrn.get(virtualclass.api.askQnsAccess); 41 | return (result.data) ? result : false; 42 | }, 43 | }; 44 | window.xhrn = xhrn; 45 | }(window)); 46 | -------------------------------------------------------------------------------- /templates/appTools.hbs: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 | 6 |
7 | 8 |
9 | 10 |
11 | 12 |
13 | 14 |
15 | 16 |
17 | 18 |
19 | 20 |
21 | 22 |
23 | 24 |
25 | 26 |
27 | 28 |
29 | 30 |
31 | 32 |
33 | 34 |
35 | 36 |
37 | 38 |
39 | 40 |
41 | 42 |
43 | 44 |
45 |
-------------------------------------------------------------------------------- /templates/appToolsMeeting.hbs: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 | 6 |
7 | 8 |
9 | 10 |
11 | 12 |
13 | 14 |
15 | 16 |
17 | 18 |
19 | 20 |
21 | 22 |
23 | 24 |
25 | 26 |
27 | 28 |
29 | 30 |
31 | 32 |
33 | 34 |
35 | 36 |
37 | 38 |
39 | 40 |
41 | 42 |
43 | 44 |
45 | 46 |
47 | 48 |
49 |
-------------------------------------------------------------------------------- /templates/askQuestion/answer.hbs: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 | {{userName}} 7 | {{getString 'answerLable'}} 8 | 9 |
10 |
11 | 12 |
13 |

{{content}} 14 | {{morecontent}} 15 | {{getString 'more'}} 16 |

17 |
18 | 19 | 45 | 46 |
47 |
48 |
49 | -------------------------------------------------------------------------------- /templates/askQuestion/askQuestionMain.hbs: -------------------------------------------------------------------------------- 1 |
2 |
3 |
Loading
4 |
5 | -------------------------------------------------------------------------------- /templates/askQuestion/bookmark.hbs: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | -------------------------------------------------------------------------------- /templates/askQuestion/comment.hbs: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 | {{userName}} 6 | {{getString 'commentLable'}} 7 |
8 |
9 |

{{content}} 10 | {{morecontent}} 11 | {{getString 'more'}} 12 |

13 |
14 | 31 | 32 |
33 | 34 |
35 |
36 | -------------------------------------------------------------------------------- /templates/askQuestion/context.hbs: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | -------------------------------------------------------------------------------- /templates/askQuestion/ellipsisText.hbs: -------------------------------------------------------------------------------- 1 | {{morecontent}} 2 | {{getString 'more'}} 3 | -------------------------------------------------------------------------------- /templates/askQuestion/input.hbs: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 | 6 |
7 |
8 | -------------------------------------------------------------------------------- /templates/askQuestion/note-content-area.hbs: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | -------------------------------------------------------------------------------- /templates/askQuestion/note.hbs: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |
6 |
7 |
{{getString 'ClearAll'}}
8 | 13 |
14 |
15 |
Loading
16 |
17 | -------------------------------------------------------------------------------- /templates/askQuestion/question.hbs: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 | {{userName}} 7 | {{getString 'questionLable'}} 8 | 9 |
10 |
11 | 12 |
13 |

{{content}} 14 | {{morecontent}} 15 | {{getString 'more'}} 16 |

17 |
18 | 19 | 42 | 43 |
44 | 45 |
46 |
47 | -------------------------------------------------------------------------------- /templates/audioWidget.hbs: -------------------------------------------------------------------------------- 1 |
2 | 31 |
-------------------------------------------------------------------------------- /templates/chat/chatMain.hbs: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | -------------------------------------------------------------------------------- /templates/chat/chatbox.hbs: -------------------------------------------------------------------------------- 1 |
  • {{getString 'adminusr'}} 4 |
    5 |
    {{getString 'adminusr'}} 10 |
    11 |
    12 |
    13 | 14 |
    15 |
    17 |
    18 |
    19 |
  • -------------------------------------------------------------------------------- /templates/chat/stickycont.hbs: -------------------------------------------------------------------------------- 1 | 54 | -------------------------------------------------------------------------------- /templates/context-mark.hbs: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |
    5 |
    6 | -------------------------------------------------------------------------------- /templates/dashboard.hbs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /templates/dashboardCont.hbs: -------------------------------------------------------------------------------- 1 |
    -------------------------------------------------------------------------------- /templates/dashboardNav.hbs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /templates/documentSharing/dashboard.hbs: -------------------------------------------------------------------------------- 1 | {{!-- cn == currNote, cd == currDoc--}} 2 |
    3 |
    4 |
    5 |
    6 | 7 |
    8 |
    9 | 10 |
    11 |
    12 | {{#if hasControls}} 13 | 14 |
    15 | {{/if}} 16 |
    17 |
    -------------------------------------------------------------------------------- /templates/documentSharing/docsMain.hbs: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 | 5 |
    6 | {{#if control}} 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | {{else}} 16 |

    {{getString 'mybsharedoc'}}

    17 | {{/if}} 18 |
    19 | 20 |
    21 |
    22 | -------------------------------------------------------------------------------- /templates/documentSharing/docsNav.hbs: -------------------------------------------------------------------------------- 1 | {{!-- docs navigation --}} 2 | -------------------------------------------------------------------------------- /templates/documentSharing/notesMain.hbs: -------------------------------------------------------------------------------- 1 | {{#each notes}} 2 |
    3 | 6 |
    7 | {{/each}} 8 | -------------------------------------------------------------------------------- /templates/documentSharing/notesNav.hbs: -------------------------------------------------------------------------------- 1 | {{!-- note navigation --}} 2 | 21 | -------------------------------------------------------------------------------- /templates/documentSharing/screen.hbs: -------------------------------------------------------------------------------- 1 | {{!-- cn == currNote, cd == currDoc--}} 2 |
    3 | {{debug}} 4 |
    5 |
    6 | {{> docNotesMain }} 7 |
    8 | {{#if hasControls}} 9 | 10 | 11 | {{/if}} 12 | 13 |
    14 | 15 | 16 | 17 |
    18 |
    19 | 20 | -------------------------------------------------------------------------------- /templates/editor/edenableall.hbs: -------------------------------------------------------------------------------- 1 |
    2 | 3 |
    -------------------------------------------------------------------------------- /templates/editor/editorrich.hbs: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    -------------------------------------------------------------------------------- /templates/editor/messagebox.hbs: -------------------------------------------------------------------------------- 1 |
    2 |

    {{getString 'pleasewaitWhSynNewCont'}}

    3 |
    -------------------------------------------------------------------------------- /templates/joinclass.hbs: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | 4 | 16 |
    17 |
    -------------------------------------------------------------------------------- /templates/leftBar.hbs: -------------------------------------------------------------------------------- 1 | 2 |
    3 | 4 | {{#if hasControls}} 5 | {{#if meetingMode}} 6 | {{> appToolsMeeting }} 7 | {{else}} 8 | {{> appTools }} 9 | {{/if}} 10 | 11 | {{/if}} 12 |
    13 | 22 |
    23 | 26 |
    27 |
    28 | 29 |
    30 | {{> dashboardCont}} 31 |
    32 | -------------------------------------------------------------------------------- /templates/main.hbs: -------------------------------------------------------------------------------- 1 | {{> precheck}} 2 | {{> joinclass}} 3 | {{> mobileLandscapeWarn}} 4 |
    5 | 6 | {{> leftBar}} 7 | {{> rightBar }} 8 | {{> footerBar}} 9 | {{> popupCont}} 10 |
    11 | -------------------------------------------------------------------------------- /templates/mobileLandscapeWarn.hbs: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | 4 |

    Please turn your device orientation to use the app

    5 |
    6 |
    7 |

    Get your app. It won't take up space on your phone

    8 | 11 |
    12 |
    -------------------------------------------------------------------------------- /templates/multiVideo.hbs: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 | 5 |
    6 |
    7 | 8 | -------------------------------------------------------------------------------- /templates/multiVideoMain.hbs: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /templates/navigation/docIndex.hbs: -------------------------------------------------------------------------------- 1 | {{page}} -------------------------------------------------------------------------------- /templates/navigation/navMain.hbs: -------------------------------------------------------------------------------- 1 | {{#if control}} 2 | 3 | 4 | {{getString 'page'}} 5 |
    6 |
    7 | {{currIndex}} 8 | of {{totalPages}} 9 |
    10 |
    11 |
    12 |
    13 | 14 | {{else}} 15 | {{getString 'page'}} 16 |
    17 | 1 18 | of 1 19 |
    20 | {{/if}} 21 | -------------------------------------------------------------------------------- /templates/navigation/wbIndex.hbs: -------------------------------------------------------------------------------- 1 | {{order}} 2 | 3 | -------------------------------------------------------------------------------- /templates/poll/edit-modal.hbs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /templates/poll/modal.hbs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /templates/poll/optioninput.hbs: -------------------------------------------------------------------------------- 1 |
    2 | 4 | {{#if close.closeBtn}} 5 | × 6 | {{/if}} 7 |
    8 | -------------------------------------------------------------------------------- /templates/poll/pollStd.hbs: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 | 5 |
    6 | 7 |
    8 |
    9 |
    10 | 11 |
    12 | {{#each poll.options}} 13 |
    14 | 15 | {{this}} 16 |
    17 | {{/each}} 18 |
    19 |
    20 |
    21 | 22 |
    23 |
    -------------------------------------------------------------------------------- /templates/poll/pollresultlist.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
    {{getString 'NAME'}}{{getString 'optselectd'}}
    -------------------------------------------------------------------------------- /templates/poll/preview-modal.hbs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /templates/poll/previewPopup.hbs: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 | 5 |
    {{data.questiontext}}
    6 |
    7 |
    8 | 9 | {{#each data.options}} 10 |
    11 | 12 | 13 |
    14 | {{/each}} 15 |
    16 |
    17 |
    18 |
    19 | -------------------------------------------------------------------------------- /templates/poll/qn.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 12 | 19 | 26 | 27 |
    6 |
    7 | 8 | 9 | 10 |
    11 |
    13 |
    14 | 15 | 16 | 17 |
    18 |
    20 |
    21 | 22 | 23 | 24 |
    25 |
    28 | 29 | 30 | {{pollQn.questiontext}} 32 | {{pollQn.creator}} 33 | -------------------------------------------------------------------------------- /templates/poll/qnOptions.hbs: -------------------------------------------------------------------------------- 1 | {{#each poll.options}} 2 |
    3 | 4 | {{this}} 5 |
    6 | {{/each}} 7 | -------------------------------------------------------------------------------- /templates/poll/result-modal.hbs: -------------------------------------------------------------------------------- 1 | 59 | -------------------------------------------------------------------------------- /templates/poll/setting-modal.hbs: -------------------------------------------------------------------------------- 1 | 56 | -------------------------------------------------------------------------------- /templates/poll/stdResult.hbs: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 | 5 |
    6 |
    7 | 9 |
    10 |
    11 | 12 | 13 |
    14 |
    15 | 16 |
    17 |
    18 | 19 |
    20 | 25 | 30 |
    31 | 32 |
    33 |
    34 |
    35 |
    36 |
    37 | -------------------------------------------------------------------------------- /templates/ppt/dashboard.hbs: -------------------------------------------------------------------------------- 1 | 2 |
    3 |
    4 |
    5 | 6 | 7 | 8 |
    9 | 10 |
    11 |
    12 |
    13 | 14 | 15 |
    16 |
    17 |
    18 |
    19 | 20 | 21 | -------------------------------------------------------------------------------- /templates/ppt/linkPpt.hbs: -------------------------------------------------------------------------------- 1 |
    3 |
    4 | 5 |
    6 |
    7 |
    9 | {{#if dataset.status}} 10 |
    11 | {{else}} 12 |
    13 | {{/if}} 14 |
    15 | 16 |
    17 |
    18 |
    -------------------------------------------------------------------------------- /templates/ppt/mszdisplay.hbs: -------------------------------------------------------------------------------- 1 |

    {{getString 'preWllBshortly'}}

    -------------------------------------------------------------------------------- /templates/ppt/ppt.hbs: -------------------------------------------------------------------------------- 1 |
    2 | {{#if control}} 3 | 4 | 5 | 6 | 7 | {{/if}} 8 |
    -------------------------------------------------------------------------------- /templates/ppt/pptiframe.hbs: -------------------------------------------------------------------------------- 1 |
    2 | 4 |
    5 | -------------------------------------------------------------------------------- /templates/recordingButton.hbs: -------------------------------------------------------------------------------- 1 | {{#if ten}} 2 |
    3 |
    4 | 5 | {{getString 'recordingText'}} 6 |
    7 |
    8 | 9 | {{else if eleven}} 10 |
    11 |
    12 | 13 | {{getString 'recordingText'}} 14 |
    15 |
    16 | 17 | {{else if twenty}} 18 |
    19 |
    20 | 21 | {{getString 'recordingText'}} 22 |
    23 |
    24 | 25 | {{else if twentyone}} 26 |
    27 |
    28 | 29 | {{getString 'recordingText'}} 30 |
    31 |
    32 | {{/if}} 33 | -------------------------------------------------------------------------------- /templates/recordingControl.hbs: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |
    5 |
    6 |
    7 |
    8 |
    9 |
    10 |
    11 |
    12 | 13 |
    0
    14 |
    15 |
    16 |
    00:00:00 / 00:00:00
    17 |
    18 |
    19 | 20 |
    21 | -------------------------------------------------------------------------------- /templates/rightBar.hbs: -------------------------------------------------------------------------------- 1 |
    2 | {{> ('getVideoType') }} 3 | {{> rightBarHeader}} 4 | {{!-- {{> ('getVideoType') }} --}} 5 | {{!-- Chat widget --}} 6 | 7 |
    8 | {{> appSettingDetail}} 9 |
    10 |
    11 |
    12 |
    13 | 18 |
    19 |
    20 |
    21 |
    22 |
    23 | -------------------------------------------------------------------------------- /templates/rightBarHeader.hbs: -------------------------------------------------------------------------------- 1 |
    2 |
    {{getString "userListHeader"}}
    3 |
    {{getString "commonChatHeader"}}
    4 | {{#if std}} 5 |
    {{getString "teacherVideoHeader"}}
    6 | {{/if}} 7 |
    8 |
    9 |
    10 | {{getString 'askQuestionHeader'}} 11 |
    12 |
    13 | 14 | 15 | {{#if isPlayMode}} 16 | 19 | {{/if}} 20 |
    21 |
    22 |
    23 |
    {{getString "virtualclassnoteHeader"}}
    24 |
    25 | 26 | 27 | 28 |
    29 | 30 | 31 |
    32 | -------------------------------------------------------------------------------- /templates/ssmainDiv.hbs: -------------------------------------------------------------------------------- 1 |
    2 | {{#if control}} 3 | 4 | {{#if recImg}} 5 |
    6 | 7 |
    8 | {{else}} 9 |
    10 | 11 |
    12 | 13 |
    14 | 15 | 16 |

    {{getString 'screensharemsg'}}

    17 |
    18 | {{/if}} 19 | 20 | {{else}} 21 |
    22 | 23 |
    24 | {{#if scrctrl}} 25 |
    26 | 29 |
    30 | {{/if}} 31 | {{/if}} 32 | 33 | {{#if control}} 34 | {{#unless recImg}} 35 |
    36 | 37 |
    38 | {{/unless}} 39 | {{/if}} 40 |
    41 | -------------------------------------------------------------------------------- /templates/teacherVideo.hbs: -------------------------------------------------------------------------------- 1 |
    2 | {{#if hasControl}} 3 | 4 | 5 | 6 | {{else}} 7 |
    8 | 9 |
    10 | {{/if}} 11 |
    Teacher video is interrupted
    12 |
    13 | 14 | -------------------------------------------------------------------------------- /templates/videoupload/linkvideo.hbs: -------------------------------------------------------------------------------- 1 |
    3 |
    4 |
    5 |
    6 | 7 |
    8 |
    9 | 10 |
    11 |
    {{getString 'clicktoplay'}}
    13 | 14 | {{#if dataset.status}} 15 | 16 | {{else}} 17 | 18 | {{/if}} 19 | 22 |
    23 |
    24 | 25 | -------------------------------------------------------------------------------- /templates/videoupload/popup.hbs: -------------------------------------------------------------------------------- 1 |
    2 | 4 |
    5 | 6 |
    7 |
    8 | 9 |
    10 |
    11 |
    12 | 15 |
    16 |
    17 | 18 | 19 |
    20 | 21 |
    22 |
    -------------------------------------------------------------------------------- /templates/videoupload/videoupload.hbs: -------------------------------------------------------------------------------- 1 |
    2 | {{#if control}} 3 |
    4 | 5 |

    {{getString 'livestream'}}

    6 |
    7 | {{else}} 8 |

    {{getString 'Vwllbshrshortly'}}

    9 | {{/if}} 10 |
    11 |
    12 | {{#if control}} 13 | 14 | {{else}} 15 | 16 | {{/if}} 17 |
    18 |
    -------------------------------------------------------------------------------- /templates/whiteboard/main.hbs: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | {{#if hasControl }} 4 | {{> whiteboardToolbar }} 5 | {{/if}} 6 | 7 |
    8 | 9 | {{getString 'canvasmissing'}} 10 | 11 |
    12 | 13 |
    14 |
    15 | -------------------------------------------------------------------------------- /templates/youtube/yts.hbs: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | {{#if hascontrol}} 4 | {{> ytscontrol}} 5 | {{/if}} 6 | {{#if createMsg}} 7 |

    {{getString 'youtubewllbshrshortly'}}

    8 | {{/if}} 9 |
    -------------------------------------------------------------------------------- /templates/youtube/ytscontrol.hbs: -------------------------------------------------------------------------------- 1 |
    2 | 3 | 4 |
    -------------------------------------------------------------------------------- /templates/zoomControl.hbs: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |
    5 | {{!--
    --}} 6 |
    7 | -------------------------------------------------------------------------------- /webapi.php: -------------------------------------------------------------------------------- 1 | 4 | --------------------------------------------------------------------------------