├── .gitignore ├── LICENSE ├── README.md ├── applet ├── loginScripts.js ├── loginStyles.css ├── logos │ ├── launcher-icon1024.webp │ ├── launcher-icon128.png │ ├── launcher-icon128.webp │ ├── launcher-icon144.png │ ├── launcher-icon144.webp │ ├── launcher-icon168.png │ ├── launcher-icon168.webp │ ├── launcher-icon192.webp │ ├── launcher-icon256_ios.webp │ ├── launcher-icon48.png │ ├── launcher-icon512.png │ ├── launcher-icon512.webp │ ├── launcher-icon512_maskable.webp │ ├── launcher-icon72.png │ ├── launcher-icon96.png │ ├── overlay96.png │ └── overlay96.webp └── manifest.json ├── clappr ├── LICENSE.txt └── clappr.min.js ├── livestream.htm ├── login.htm ├── sounds ├── airhorn.mp3 ├── alarm-frenzy.mp3 ├── alarm.mp3 ├── alarming.mp3 ├── alien-message.mp3 ├── alien-tune.mp3 ├── are-you-kidding.mp3 ├── attention-required.mp3 ├── blocker.mp3 ├── decay.mp3 ├── demonstrative.mp3 ├── determined.mp3 ├── doorbell.mp3 ├── enough-with-the-talking.mp3 ├── gentle-alarm.mp3 ├── gesture.mp3 ├── good-morning.mp3 ├── goodbye.mp3 ├── hail.mp3 ├── hell-yeah.mp3 ├── high-pitch.mp3 ├── i-demand-attention.mp3 ├── i-saw-you.mp3 ├── job-done.mp3 ├── just-like-magic.mp3 ├── long-chime-sound.mp3 ├── may-i-have-your-attention.mp3 ├── munchausen.mp3 ├── news-bringer.mp3 ├── no-way.mp3 ├── not-kiddin.mp3 ├── oh-really.mp3 ├── on-serious-matters.mp3 ├── paranoid.mp3 ├── pizzicato.mp3 ├── police.mp3 ├── pop.mp3 ├── professionals.mp3 ├── quiet-knock.mp3 ├── robot-walking.mp3 ├── served.mp3 ├── sorted.mp3 ├── springy.mp3 ├── surprise-on-a-spring.mp3 ├── system-fault.mp3 ├── the-squeaky-wheel-gets-the-grease.mp3 ├── this-is-it.mp3 ├── warning.mp3 ├── what.mp3 ├── wiggle.mp3 ├── will-you.mp3 └── you-wouldnt-believe.mp3 ├── timeout.htm ├── ui3.htm ├── ui3 ├── LoadingImage.png ├── ajax-loader-big.gif ├── css-vars-ponyfill.min.js ├── flag24.png ├── help │ ├── css │ │ ├── bootstrap.min.css │ │ └── help.css │ ├── help.html │ ├── img │ │ ├── CameraContextMenu.png │ │ ├── ClipContextMenu.png │ │ ├── ConvertExport.png │ │ ├── ConvertExportIcon.png │ │ ├── ExportList.png │ │ ├── ExportRange.png │ │ ├── ExportStatus.png │ │ ├── MainMenuIcon.png │ │ ├── MqttSample.png │ │ ├── ProfileEditor.png │ │ ├── RecordingFilters.png │ │ ├── ServerSideStreamingProfile.png │ │ └── StatsForNerds.png │ └── js │ │ ├── bootstrap.min.js │ │ ├── help.js │ │ ├── jquery-1.12.4.min.js │ │ └── jquery.stickytabs.js ├── horror.png ├── icons-src │ ├── Flag.xcf │ ├── RedDot5px.png │ ├── Ripple.svg │ ├── Rolling.svg │ ├── Trigger.xcf │ ├── Trigger2.xcf │ ├── Trigger24.png │ ├── Trigger_8color.png │ ├── alert.svg │ ├── alert1.png │ ├── alert1.svg │ ├── alert1_20px.png │ ├── auto_maximize.svg │ ├── chrome.svg │ ├── clipicons.png │ ├── closeBtn.svg │ ├── contrast.svg │ ├── design-icons.svg │ ├── edge.svg │ ├── ellipsis.svg │ ├── firefox.svg │ ├── flag24.png │ ├── flag24_1.png │ ├── flag24_2.png │ ├── flag24_3.png │ ├── gamepad_public_domain.svg │ ├── horror.png │ ├── launcher-icon192_ios_lossless.webp │ ├── launcher-icon256_ios_sharpened_lossless.webp │ ├── logo_icon_ios.png │ ├── logo_icon_ios_visualcenter.png │ ├── logosrc.png │ ├── logosrc_ai.png │ ├── material.io │ │ ├── LICENSE.txt │ │ ├── apps_black_24dp.svg │ │ ├── baseline-access_time-24px.svg │ │ ├── baseline-branding_watermark-24px.svg │ │ ├── baseline-edit-24px.svg │ │ ├── baseline-movie_filter-24px.svg │ │ ├── bolt_black_24dp.svg │ │ ├── close_fullscreen-24px.svg │ │ ├── crop-black-24dp.svg │ │ ├── directions_car_black_24dp.svg │ │ ├── download_black_24dp.svg │ │ ├── folder-24px.svg │ │ ├── folder_special-24px.svg │ │ ├── hide_image_black_24dp.svg │ │ ├── home_black_24dp.svg │ │ ├── ic_brightness_low_black_24px.svg │ │ ├── ic_check_box_black_24px.svg │ │ ├── ic_check_box_outline_blank_black_24px.svg │ │ ├── ic_cloud_upload_black_24px.svg │ │ ├── ic_content_copy_black_24px.svg │ │ ├── ic_delete_black_48px.svg │ │ ├── ic_directions_run_black_24px.svg │ │ ├── ic_filter_frames_black_24px.svg │ │ ├── ic_fullscreen_black_48px.svg │ │ ├── ic_fullscreen_exit_black_48px.svg │ │ ├── ic_help_black_24px.svg │ │ ├── ic_lightbulb_outline_black_24px.svg │ │ ├── ic_lock_black_24px.svg │ │ ├── ic_movie_black_48px.svg │ │ ├── ic_perm_device_information_black_24px.svg │ │ ├── ic_photo_size_select_large_black_24px.svg │ │ ├── ic_refresh_black_48px.svg │ │ ├── ic_replay_black_24px.svg │ │ ├── ic_tab_black_48px.svg │ │ ├── ic_view_quilt_black_24px.svg │ │ ├── ic_volume_down_black_24px.svg │ │ ├── ic_volume_mute_black_24px.svg │ │ ├── ic_volume_off_black_24px.svg │ │ ├── ic_volume_up_black_24px.svg │ │ ├── ic_warning_black_24px.svg │ │ ├── indeterminate_check_box-24px.svg │ │ ├── launch-24px.svg │ │ ├── man_black_24dp.svg │ │ ├── open_in_full-24px.svg │ │ ├── pending_black_24dp.svg │ │ ├── picture_in_picture_alt_black_24dp.svg │ │ ├── search_black_24dp.svg │ │ ├── sports_esports_24dp.svg │ │ ├── star_rate-24px.svg │ │ ├── storage-24px.svg │ │ ├── update.svg │ │ ├── videocam_black_24dp.svg │ │ ├── view_sidebar.svg │ │ ├── zoom_in_black_24dp.svg │ │ └── zoom_out_black_24dp.svg │ ├── person24.png │ ├── pets.svg │ ├── sentry_human.svg │ ├── sentry_human_src.svg │ ├── sentry_logo.svg │ ├── sentry_logo_src.svg │ ├── shield.svg │ ├── sidebar_hidden.svg │ ├── sidebar_hidden2.svg │ ├── trigger@2x.png │ ├── ui3gamepad.svg │ ├── ui3gamepad_optimized.svg │ ├── vehicle24.png │ ├── wildlife.svg │ └── wildlife24.png ├── icons.svg ├── libs-src │ ├── AVI.js │ ├── Css Z-index Planner.txt │ ├── Dialog.css │ ├── Dialog.js │ ├── HistoryButtonOverride.js │ ├── NoSleep.js │ ├── NoSleep.min.js │ ├── Queue.src.js │ ├── WebGLCanvas.js │ ├── about-libs-src.txt │ ├── base64Array.js │ ├── basic-event-timer.js │ ├── client-zip@2.3.1.js │ ├── clipboard.js │ ├── datepicker.css │ ├── hammer.min.js │ ├── jmuxer.js │ ├── jquery-1.12.4.js │ ├── jquery-1.12.4.min.js │ ├── jquery.cookie.js │ ├── jquery.customscroll.js │ ├── jquery.longpress.js │ ├── jquery.ui2modal.js │ ├── jsonview │ │ ├── MIT_LICENSE.txt │ │ ├── change_notice.txt │ │ ├── jsonview.js │ │ ├── jsonview.min.css │ │ └── jsonview.min.js │ ├── lightbox.js │ ├── lightbox.min.js │ ├── loginScriptsSrc.js │ ├── md5.js │ ├── nosleep.js.7z │ ├── openh264_decoder.js │ ├── paho-mqtt-min.js │ ├── paho-mqtt.js │ ├── point-in-polygon.js │ ├── promise.polyfill.min.js │ ├── seeded-random.js │ ├── simple-scrollbar.css │ ├── simple-scrollbar.min.js │ ├── slider-checkbox.css │ ├── toastr.min.css │ ├── toastr.min.js │ ├── url-search-params.polyfill.js │ ├── vue.js │ ├── vue.min.js │ ├── wdContextMenu │ │ ├── change_notice.txt │ │ ├── contextmenu.css │ │ ├── jquery.contextmenu.js │ │ ├── lgpl.html │ │ ├── m_arrow.gif │ │ ├── m_item.gif │ │ ├── m_splitLine.gif │ │ ├── menu_bg.gif │ │ └── readme │ └── zebra_datepicker │ │ ├── change_notice.txt │ │ ├── default.css │ │ ├── license.txt │ │ ├── zebra_datepicker.js │ │ └── zebra_datepicker.src.js ├── libs-ui3.css ├── libs-ui3.js ├── licenses.txt ├── noimage.png ├── openh264_decoder.js ├── pnacl │ ├── pnacl_player.nmf │ └── pnacl_player.pexe ├── reset.htm ├── storageinfo-libs.js ├── storageinfo.htm ├── svgtest.htm ├── trigger24.png ├── ui3.css └── ui3.js └── ui3serviceworker.js /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | /ui3.sln 10 | ui3-local-overrides.js 11 | ui3-local-overrides.css 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Build results 17 | [Dd]ebug/ 18 | [Dd]ebugPublic/ 19 | [Rr]elease/ 20 | [Rr]eleases/ 21 | x64/ 22 | x86/ 23 | bld/ 24 | [Bb]in/ 25 | [Oo]bj/ 26 | [Ll]og/ 27 | 28 | # Visual Studio 2015 cache/options directory 29 | .vs/ 30 | # Uncomment if you have tasks that create the project's static files in wwwroot 31 | #wwwroot/ 32 | 33 | # MSTest test Results 34 | [Tt]est[Rr]esult*/ 35 | [Bb]uild[Ll]og.* 36 | 37 | # NUNIT 38 | *.VisualState.xml 39 | TestResult.xml 40 | 41 | # Build Results of an ATL Project 42 | [Dd]ebugPS/ 43 | [Rr]eleasePS/ 44 | dlldata.c 45 | 46 | # DNX 47 | project.lock.json 48 | artifacts/ 49 | 50 | *_i.c 51 | *_p.c 52 | *_i.h 53 | *.ilk 54 | *.meta 55 | *.obj 56 | *.pch 57 | *.pdb 58 | *.pgc 59 | *.pgd 60 | *.rsp 61 | *.sbr 62 | *.tlb 63 | *.tli 64 | *.tlh 65 | *.tmp 66 | *.tmp_proj 67 | *.log 68 | *.vspscc 69 | *.vssscc 70 | .builds 71 | *.pidb 72 | *.svclog 73 | *.scc 74 | 75 | # Chutzpah Test files 76 | _Chutzpah* 77 | 78 | # Visual C++ cache files 79 | ipch/ 80 | *.aps 81 | *.ncb 82 | *.opendb 83 | *.opensdf 84 | *.sdf 85 | *.cachefile 86 | *.VC.db 87 | *.VC.VC.opendb 88 | 89 | # Visual Studio profiler 90 | *.psess 91 | *.vsp 92 | *.vspx 93 | *.sap 94 | 95 | # TFS 2012 Local Workspace 96 | $tf/ 97 | 98 | # Guidance Automation Toolkit 99 | *.gpState 100 | 101 | # ReSharper is a .NET coding add-in 102 | _ReSharper*/ 103 | *.[Rr]e[Ss]harper 104 | *.DotSettings.user 105 | 106 | # JustCode is a .NET coding add-in 107 | .JustCode 108 | 109 | # TeamCity is a build add-in 110 | _TeamCity* 111 | 112 | # DotCover is a Code Coverage Tool 113 | *.dotCover 114 | 115 | # NCrunch 116 | _NCrunch_* 117 | .*crunch*.local.xml 118 | nCrunchTemp_* 119 | 120 | # MightyMoose 121 | *.mm.* 122 | AutoTest.Net/ 123 | 124 | # Web workbench (sass) 125 | .sass-cache/ 126 | 127 | # Installshield output folder 128 | [Ee]xpress/ 129 | 130 | # DocProject is a documentation generator add-in 131 | DocProject/buildhelp/ 132 | DocProject/Help/*.HxT 133 | DocProject/Help/*.HxC 134 | DocProject/Help/*.hhc 135 | DocProject/Help/*.hhk 136 | DocProject/Help/*.hhp 137 | DocProject/Help/Html2 138 | DocProject/Help/html 139 | 140 | # Click-Once directory 141 | publish/ 142 | 143 | # Publish Web Output 144 | *.[Pp]ublish.xml 145 | *.azurePubxml 146 | # TODO: Comment the next line if you want to checkin your web deploy settings 147 | # but database connection strings (with potential passwords) will be unencrypted 148 | *.pubxml 149 | *.publishproj 150 | 151 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 152 | # checkin your Azure Web App publish settings, but sensitive information contained 153 | # in these scripts will be unencrypted 154 | PublishScripts/ 155 | 156 | # NuGet Packages 157 | *.nupkg 158 | # The packages folder can be ignored because of Package Restore 159 | **/packages/* 160 | # except build/, which is used as an MSBuild target. 161 | !**/packages/build/ 162 | # Uncomment if necessary however generally it will be regenerated when needed 163 | #!**/packages/repositories.config 164 | # NuGet v3's project.json files produces more ignoreable files 165 | *.nuget.props 166 | *.nuget.targets 167 | 168 | # Microsoft Azure Build Output 169 | csx/ 170 | *.build.csdef 171 | 172 | # Microsoft Azure Emulator 173 | ecf/ 174 | rcf/ 175 | 176 | # Windows Store app package directories and files 177 | AppPackages/ 178 | BundleArtifacts/ 179 | Package.StoreAssociation.xml 180 | _pkginfo.txt 181 | 182 | # Visual Studio cache files 183 | # files ending in .cache can be ignored 184 | *.[Cc]ache 185 | # but keep track of directories ending in .cache 186 | !*.[Cc]ache/ 187 | 188 | # Others 189 | ClientBin/ 190 | ~$* 191 | *~ 192 | *.dbmdl 193 | *.dbproj.schemaview 194 | *.pfx 195 | *.publishsettings 196 | node_modules/ 197 | orleans.codegen.cs 198 | 199 | # Since there are multiple workflows, uncomment next line to ignore bower_components 200 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 201 | #bower_components/ 202 | 203 | # RIA/Silverlight projects 204 | Generated_Code/ 205 | 206 | # Backup & report files from converting an old project file 207 | # to a newer Visual Studio version. Backup files are not needed, 208 | # because we have git ;-) 209 | _UpgradeReport_Files/ 210 | Backup*/ 211 | UpgradeLog*.XML 212 | UpgradeLog*.htm 213 | 214 | # SQL Server files 215 | *.mdf 216 | *.ldf 217 | 218 | # Business Intelligence projects 219 | *.rdl.data 220 | *.bim.layout 221 | *.bim_*.settings 222 | 223 | # Microsoft Fakes 224 | FakesAssemblies/ 225 | 226 | # GhostDoc plugin setting file 227 | *.GhostDoc.xml 228 | 229 | # Node.js Tools for Visual Studio 230 | .ntvs_analysis.dat 231 | 232 | # Visual Studio 6 build log 233 | *.plg 234 | 235 | # Visual Studio 6 workspace options file 236 | *.opt 237 | 238 | # Visual Studio LightSwitch build output 239 | **/*.HTMLClient/GeneratedArtifacts 240 | **/*.DesktopClient/GeneratedArtifacts 241 | **/*.DesktopClient/ModelManifest.xml 242 | **/*.Server/GeneratedArtifacts 243 | **/*.Server/ModelManifest.xml 244 | _Pvt_Extensions 245 | 246 | # Paket dependency manager 247 | .paket/paket.exe 248 | paket-files/ 249 | 250 | # FAKE - F# Make 251 | .fake/ 252 | 253 | # JetBrains Rider 254 | .idea/ 255 | *.sln.iml 256 | 257 | # Manual Additions 258 | Thumbs.db 259 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # UI3 2 | UI3 is a powerful, modern HTML5 web interface for Blue Iris. Since April 20, 2018, UI3 is Blue Iris's default web interface for non-IE browsers and is included with Blue Iris versions 4.7.3 and newer. 3 | 4 | ![Screenshot of UI3-268](https://github.com/bp2008/ui3/assets/5639911/a3a7fabb-9e08-4df0-a809-13fccda09c1b) 5 | 6 | ## Discuss on ipcamtalk 7 | 8 | UI3 has a dedicated thread on the **ipcamtalk** forum, here: 9 | 10 | https://ipcamtalk.com/threads/blue-iris-ui3.23528/ 11 | 12 | ## Manual installation 13 | 14 | Be aware that most UI3 releases are developed against the **latest Blue Iris version** at the time of UI3 release. Compatibility with older Blue Iris versions is not maintained, so any time you update UI3 without being on the latest version of Blue Iris, you risk encountering broken features and other bugs. 15 | 16 | If you wish to manually install a UI3 update, you can get it from the releases tab: https://github.com/bp2008/ui3/releases 17 | 18 | To install, just extract everything to Blue Iris's `www` directory and overwrite all files. The default path to this folder is `C:\Program Files\Blue Iris 5\www`. 19 | 20 | ### Blue Iris 4.x Users 21 | 22 | The last Blue Iris 4 release (4.8.6.3) shipped with [UI3-70](https://github.com/bp2008/ui3/releases/tag/70), but you can update to [UI3-77](https://github.com/bp2008/ui3/releases/tag/77) for a few improvements. Things will begin breaking if you update beyond UI3-77 on a Blue Iris 4.x installation. 23 | -------------------------------------------------------------------------------- /applet/logos/launcher-icon1024.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon1024.webp -------------------------------------------------------------------------------- /applet/logos/launcher-icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon128.png -------------------------------------------------------------------------------- /applet/logos/launcher-icon128.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon128.webp -------------------------------------------------------------------------------- /applet/logos/launcher-icon144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon144.png -------------------------------------------------------------------------------- /applet/logos/launcher-icon144.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon144.webp -------------------------------------------------------------------------------- /applet/logos/launcher-icon168.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon168.png -------------------------------------------------------------------------------- /applet/logos/launcher-icon168.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon168.webp -------------------------------------------------------------------------------- /applet/logos/launcher-icon192.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon192.webp -------------------------------------------------------------------------------- /applet/logos/launcher-icon256_ios.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon256_ios.webp -------------------------------------------------------------------------------- /applet/logos/launcher-icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon48.png -------------------------------------------------------------------------------- /applet/logos/launcher-icon512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon512.png -------------------------------------------------------------------------------- /applet/logos/launcher-icon512.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon512.webp -------------------------------------------------------------------------------- /applet/logos/launcher-icon512_maskable.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon512_maskable.webp -------------------------------------------------------------------------------- /applet/logos/launcher-icon72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon72.png -------------------------------------------------------------------------------- /applet/logos/launcher-icon96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/launcher-icon96.png -------------------------------------------------------------------------------- /applet/logos/overlay96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/overlay96.png -------------------------------------------------------------------------------- /applet/logos/overlay96.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/applet/logos/overlay96.webp -------------------------------------------------------------------------------- /applet/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "%%UI3_PWA_NAME%%", 3 | "name": "%%UI3_PWA_NAME%%", 4 | "icons": [ 5 | { 6 | "src": "logos/launcher-icon1024.webp", 7 | "sizes": "1024x1024", 8 | "type": "image/webp" 9 | }, 10 | { 11 | "src": "logos/launcher-icon128.webp", 12 | "sizes": "128x128", 13 | "type": "image/webp" 14 | }, 15 | { 16 | "src": "logos/launcher-icon144.webp", 17 | "sizes": "144x144", 18 | "type": "image/webp" 19 | }, 20 | { 21 | "src": "logos/launcher-icon168.webp", 22 | "sizes": "168x168", 23 | "type": "image/webp" 24 | }, 25 | { 26 | "src": "logos/launcher-icon192.webp", 27 | "sizes": "192x192", 28 | "type": "image/webp" 29 | }, 30 | { 31 | "src": "logos/launcher-icon512.webp", 32 | "sizes": "512x512", 33 | "type": "image/webp" 34 | }, 35 | { 36 | "src": "logos/launcher-icon512_maskable.webp", 37 | "sizes": "512x512", 38 | "type": "image/webp", 39 | "purpose": "maskable" 40 | }, 41 | { 42 | "src": "logos/launcher-icon512.png", 43 | "sizes": "512x512", 44 | "type": "image/png" 45 | }, 46 | { 47 | "src": "logos/launcher-icon48.png", 48 | "sizes": "48x48", 49 | "type": "image/png" 50 | }, 51 | { 52 | "src": "logos/launcher-icon72.png", 53 | "sizes": "72x72", 54 | "type": "image/png" 55 | }, 56 | { 57 | "src": "logos/launcher-icon96.png", 58 | "sizes": "96x96", 59 | "type": "image/png" 60 | }, 61 | { 62 | "src": "logos/launcher-icon128.png", 63 | "sizes": "128x128", 64 | "type": "image/png" 65 | }, 66 | { 67 | "src": "logos/launcher-icon144.png", 68 | "sizes": "144x144", 69 | "type": "image/png" 70 | }, 71 | { 72 | "src": "logos/launcher-icon168.png", 73 | "sizes": "168x168", 74 | "type": "image/png" 75 | }, 76 | { 77 | "src": "logos/launcher-icon256_ios.webp", 78 | "sizes": "256x256", 79 | "type": "image/webp" 80 | } 81 | ], 82 | "background_color": "#000000", 83 | "theme_color": "#3E5F8A", 84 | "display": "standalone", 85 | "start_url": "../ui3.htm", 86 | "id": "/ui3.htm", 87 | "scope": "%%VIRTDIR%%" 88 | } -------------------------------------------------------------------------------- /clappr/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014, Globo.com Player authors. All rights reserved. 2 | 3 | Redistribution and use in source and binary forms, with or without 4 | modification, are permitted provided that the following conditions are met: 5 | 6 | * Redistributions of source code must retain the above copyright 7 | notice, this list of conditions and the following disclaimer. 8 | * Redistributions in binary form must reproduce the above copyright 9 | notice, this list of conditions and the following disclaimer in the 10 | documentation and/or other materials provided with the distribution. 11 | * Neither the name of the Globo.com nor the names of its contributors 12 | may be used to endorse or promote products derived from this software without 13 | specific prior written permission. 14 | 15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 19 | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | -------------------------------------------------------------------------------- /sounds/airhorn.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/airhorn.mp3 -------------------------------------------------------------------------------- /sounds/alarm-frenzy.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/alarm-frenzy.mp3 -------------------------------------------------------------------------------- /sounds/alarm.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/alarm.mp3 -------------------------------------------------------------------------------- /sounds/alarming.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/alarming.mp3 -------------------------------------------------------------------------------- /sounds/alien-message.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/alien-message.mp3 -------------------------------------------------------------------------------- /sounds/alien-tune.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/alien-tune.mp3 -------------------------------------------------------------------------------- /sounds/are-you-kidding.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/are-you-kidding.mp3 -------------------------------------------------------------------------------- /sounds/attention-required.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/attention-required.mp3 -------------------------------------------------------------------------------- /sounds/blocker.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/blocker.mp3 -------------------------------------------------------------------------------- /sounds/decay.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/decay.mp3 -------------------------------------------------------------------------------- /sounds/demonstrative.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/demonstrative.mp3 -------------------------------------------------------------------------------- /sounds/determined.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/determined.mp3 -------------------------------------------------------------------------------- /sounds/doorbell.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/doorbell.mp3 -------------------------------------------------------------------------------- /sounds/enough-with-the-talking.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/enough-with-the-talking.mp3 -------------------------------------------------------------------------------- /sounds/gentle-alarm.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/gentle-alarm.mp3 -------------------------------------------------------------------------------- /sounds/gesture.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/gesture.mp3 -------------------------------------------------------------------------------- /sounds/good-morning.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/good-morning.mp3 -------------------------------------------------------------------------------- /sounds/goodbye.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/goodbye.mp3 -------------------------------------------------------------------------------- /sounds/hail.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/hail.mp3 -------------------------------------------------------------------------------- /sounds/hell-yeah.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/hell-yeah.mp3 -------------------------------------------------------------------------------- /sounds/high-pitch.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/high-pitch.mp3 -------------------------------------------------------------------------------- /sounds/i-demand-attention.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/i-demand-attention.mp3 -------------------------------------------------------------------------------- /sounds/i-saw-you.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/i-saw-you.mp3 -------------------------------------------------------------------------------- /sounds/job-done.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/job-done.mp3 -------------------------------------------------------------------------------- /sounds/just-like-magic.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/just-like-magic.mp3 -------------------------------------------------------------------------------- /sounds/long-chime-sound.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/long-chime-sound.mp3 -------------------------------------------------------------------------------- /sounds/may-i-have-your-attention.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/may-i-have-your-attention.mp3 -------------------------------------------------------------------------------- /sounds/munchausen.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/munchausen.mp3 -------------------------------------------------------------------------------- /sounds/news-bringer.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/news-bringer.mp3 -------------------------------------------------------------------------------- /sounds/no-way.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/no-way.mp3 -------------------------------------------------------------------------------- /sounds/not-kiddin.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/not-kiddin.mp3 -------------------------------------------------------------------------------- /sounds/oh-really.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/oh-really.mp3 -------------------------------------------------------------------------------- /sounds/on-serious-matters.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/on-serious-matters.mp3 -------------------------------------------------------------------------------- /sounds/paranoid.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/paranoid.mp3 -------------------------------------------------------------------------------- /sounds/pizzicato.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/pizzicato.mp3 -------------------------------------------------------------------------------- /sounds/police.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/police.mp3 -------------------------------------------------------------------------------- /sounds/pop.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/pop.mp3 -------------------------------------------------------------------------------- /sounds/professionals.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/professionals.mp3 -------------------------------------------------------------------------------- /sounds/quiet-knock.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/quiet-knock.mp3 -------------------------------------------------------------------------------- /sounds/robot-walking.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/robot-walking.mp3 -------------------------------------------------------------------------------- /sounds/served.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/served.mp3 -------------------------------------------------------------------------------- /sounds/sorted.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/sorted.mp3 -------------------------------------------------------------------------------- /sounds/springy.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/springy.mp3 -------------------------------------------------------------------------------- /sounds/surprise-on-a-spring.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/surprise-on-a-spring.mp3 -------------------------------------------------------------------------------- /sounds/system-fault.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/system-fault.mp3 -------------------------------------------------------------------------------- /sounds/the-squeaky-wheel-gets-the-grease.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/the-squeaky-wheel-gets-the-grease.mp3 -------------------------------------------------------------------------------- /sounds/this-is-it.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/this-is-it.mp3 -------------------------------------------------------------------------------- /sounds/warning.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/warning.mp3 -------------------------------------------------------------------------------- /sounds/what.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/what.mp3 -------------------------------------------------------------------------------- /sounds/wiggle.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/wiggle.mp3 -------------------------------------------------------------------------------- /sounds/will-you.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/will-you.mp3 -------------------------------------------------------------------------------- /sounds/you-wouldnt-believe.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/sounds/you-wouldnt-believe.mp3 -------------------------------------------------------------------------------- /timeout.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Timeout - %%SYSNAME%% UI3 9 | 54 | 55 | 56 |
57 |

Blue Iris

58 |
59 |

%%SYSNAME%% - Web Interface Timeout

60 |

You have been idle too long, and were redirected here to save resources.

61 |

The idle timeout can be adjusted in "UI Settings" under UI3's Main Menu.

62 |
63 | 67 | 71 |

72 | 73 | 74 | 75 | Click here to reconnect 76 | 77 |

78 |
79 | 200 | 201 | -------------------------------------------------------------------------------- /ui3/LoadingImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/LoadingImage.png -------------------------------------------------------------------------------- /ui3/ajax-loader-big.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/ajax-loader-big.gif -------------------------------------------------------------------------------- /ui3/flag24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/flag24.png -------------------------------------------------------------------------------- /ui3/help/css/help.css: -------------------------------------------------------------------------------- 1 | .navbar 2 | { 3 | margin-bottom: 0px; 4 | } 5 | .baseContainer 6 | { 7 | padding: 8px; 8 | } 9 | p.padded-info 10 | { 11 | padding: 15px; 12 | } 13 | .tab-pane 14 | { 15 | margin-bottom: 144px; 16 | } -------------------------------------------------------------------------------- /ui3/help/img/CameraContextMenu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/CameraContextMenu.png -------------------------------------------------------------------------------- /ui3/help/img/ClipContextMenu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/ClipContextMenu.png -------------------------------------------------------------------------------- /ui3/help/img/ConvertExport.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/ConvertExport.png -------------------------------------------------------------------------------- /ui3/help/img/ConvertExportIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/ConvertExportIcon.png -------------------------------------------------------------------------------- /ui3/help/img/ExportList.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/ExportList.png -------------------------------------------------------------------------------- /ui3/help/img/ExportRange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/ExportRange.png -------------------------------------------------------------------------------- /ui3/help/img/ExportStatus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/ExportStatus.png -------------------------------------------------------------------------------- /ui3/help/img/MainMenuIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/MainMenuIcon.png -------------------------------------------------------------------------------- /ui3/help/img/MqttSample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/MqttSample.png -------------------------------------------------------------------------------- /ui3/help/img/ProfileEditor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/ProfileEditor.png -------------------------------------------------------------------------------- /ui3/help/img/RecordingFilters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/RecordingFilters.png -------------------------------------------------------------------------------- /ui3/help/img/ServerSideStreamingProfile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/ServerSideStreamingProfile.png -------------------------------------------------------------------------------- /ui3/help/img/StatsForNerds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/help/img/StatsForNerds.png -------------------------------------------------------------------------------- /ui3/help/js/help.js: -------------------------------------------------------------------------------- 1 | (function ($) 2 | { 3 | if (navigator.cookieEnabled) 4 | NavRemoveUrlParams("session"); 5 | $('.nav-pills').stickyTabs(); 6 | //$(function () 7 | //{ 8 | // $("#navEle").resize(navResized); 9 | // navResized(); 10 | //}); 11 | //function navResized() 12 | //{ 13 | // $('body').css("padding-top", ($("#navEle").height()) + "px"); 14 | //} 15 | })(jQuery); 16 | /** 17 | * Changes the current URL by removing the specified query string parameter(s) from it. 18 | * @returns {String} Returns null if successful, otherwise returns the new URL if changing the history state failed. 19 | */ 20 | function NavRemoveUrlParams() 21 | { 22 | var url = RemoveUrlParams.apply(this, arguments); 23 | try { history.replaceState(history.state, "", url); return null; } catch (ex) { return url; } 24 | } 25 | function RemoveUrlParams() 26 | { 27 | var s = location.search; 28 | for (var i = 0; i < arguments.length; i++) 29 | { 30 | var param = arguments[i]; 31 | var rx = new RegExp('(&|\\?)' + param + '=[^&?#%]+', 'gi'); 32 | s = s.replace(rx, ""); 33 | while (s.indexOf("&") === 0) 34 | { 35 | if (s.length > 1) 36 | s = s.substr(1); 37 | else 38 | s = ""; 39 | } 40 | if (s.length > 0 && s.indexOf("?") === -1) 41 | s = "?" + s; 42 | } 43 | return location.origin + location.pathname + s + location.hash; 44 | } 45 | 46 | 47 | $(function () 48 | { 49 | var imgs = document.getElementsByTagName("img"); 50 | for (var i = 0; i < imgs.length; i++) 51 | { 52 | var src = imgs[i].getAttribute("mysrc"); 53 | if (src) 54 | imgs[i].src = src + (navigator.cookieEnabled ? "" : "?session=" + local_bi_session); 55 | } 56 | try 57 | { 58 | var profileData = JSON.parse(localStorage.ui3_streamingProfileArray); 59 | for (var i = 0; i < profileData.length; i++) 60 | { 61 | var row = $(''); 62 | var cell_name = $('').text(profileData[i].name); 63 | var cell_nameEnc = $('').append($('').text(encodeURIComponent(profileData[i].name))); 64 | row.append(cell_name); 65 | row.append(cell_nameEnc); 66 | $("#streamingProfileTbody").append(row); 67 | } 68 | $("#streamingProfileListParagraph").show(); 69 | } 70 | catch (ex) 71 | { 72 | console.log("Unable to load streaming profiles. Local storage is probably not enabled."); 73 | console.error(ex); 74 | } 75 | 76 | try 77 | { 78 | // Set the current time minus one minute in the Timeline example link on the URL Parameters page 79 | $("#timelineLink").attr("href", $("#timelineLink").attr("href") + (Date.now() - 60000)); 80 | $("#timelineLink").text($("#timelineLink").text() + (Date.now() - 60000)); 81 | } 82 | catch (ex) 83 | { 84 | console.log("Unable to set timelineLink."); 85 | console.error(ex); 86 | } 87 | 88 | function GetFirstHeading(ele) 89 | { 90 | for (var i = 1; i <= 9; i++) 91 | { 92 | var h = ele.find("h" + i).first(); 93 | if (h.length) 94 | return h; 95 | } 96 | return null; 97 | } 98 | 99 | try 100 | { 101 | // Copy all navbar links to a list on the Home page. 102 | var tabPanels = $('div.tab-pane'); 103 | var homeLinks = []; 104 | var allTabPanes = []; 105 | for (var i = 0; i < tabPanels.length; i++) 106 | { 107 | var tabPanel = tabPanels.eq(i); 108 | allTabPanes.push(tabPanel); 109 | var firstHeading = GetFirstHeading(tabPanel); 110 | if (firstHeading) 111 | { 112 | var id = tabPanel.attr('id'); 113 | if (id && id !== '' && id !== 'home' && id !== 'template') 114 | { 115 | var dst = $(''); 116 | dst.attr('href', "#" + id); 117 | var text = firstHeading.text().trim(); 118 | dst.text(text); 119 | 120 | homeLinks.push({ key: text, a: dst }); 121 | } 122 | } 123 | } 124 | 125 | homeLinks.sort(function (a, b) 126 | { 127 | return a.key.localeCompare(b.key); 128 | }); 129 | 130 | var homeIndex = $("#homeIndex"); 131 | for (var i = 0; i < homeLinks.length; i++) 132 | homeIndex.append(homeLinks[i].a); 133 | 134 | if (!$("#home").is(":hidden")) 135 | $('div.tab-pane').addClass("active"); 136 | } 137 | catch (ex) 138 | { 139 | console.log("Unable to create list of section links in Home page."); 140 | console.error(ex); 141 | } 142 | }); 143 | $("#nav-home").on("shown.bs.tab", function () 144 | { 145 | $('div.tab-pane').addClass("active"); 146 | }); -------------------------------------------------------------------------------- /ui3/help/js/jquery.stickytabs.js: -------------------------------------------------------------------------------- 1 | /** 2 | * jQuery Plugin: Sticky Tabs 3 | * 4 | * @author Aidan Lister 5 | * @version 1.2.0 6 | */ 7 | (function ( $ ) { 8 | $.fn.stickyTabs = function( options ) { 9 | var context = this 10 | 11 | var settings = $.extend({ 12 | getHashCallback: function(hash, btn) { return hash }, 13 | selectorAttribute: "href", 14 | backToTop: false, 15 | initialTab: $('li.active > a', context) 16 | }, options ); 17 | 18 | // Show the tab corresponding with the hash in the URL, or the first tab. 19 | var showTabFromHash = function() { 20 | var hash = settings.selectorAttribute == "href" ? window.location.hash : window.location.hash.substring(1); 21 | var selector = hash ? 'a[' + settings.selectorAttribute +'="' + hash + '"]' : settings.initialTab; 22 | $(selector, context).tab('show'); 23 | setTimeout(backToTop, 1); 24 | } 25 | 26 | // We use pushState if it's available so the page won't jump, otherwise a shim. 27 | var changeHash = function(hash) { 28 | if (history && history.pushState) { 29 | history.pushState(null, null, window.location.pathname + window.location.search + '#' + hash); 30 | } else { 31 | scrollV = document.body.scrollTop; 32 | scrollH = document.body.scrollLeft; 33 | window.location.hash = hash; 34 | document.body.scrollTop = scrollV; 35 | document.body.scrollLeft = scrollH; 36 | } 37 | } 38 | 39 | var backToTop = function() { 40 | if (settings.backToTop === true) { 41 | window.scrollTo(0, 0); 42 | } 43 | } 44 | 45 | // Set the correct tab when the page loads 46 | showTabFromHash(); 47 | 48 | // Set the correct tab when a user uses their back/forward button 49 | $(window).on('hashchange', showTabFromHash); 50 | 51 | // Change the URL when tabs are clicked 52 | $('a', context).on('click', function(e) { 53 | var hash = this.href.split('#')[1]; 54 | var adjustedhash = settings.getHashCallback(hash, this); 55 | changeHash(adjustedhash); 56 | setTimeout(backToTop, 1); 57 | }); 58 | 59 | return this; 60 | }; 61 | }( jQuery )); -------------------------------------------------------------------------------- /ui3/horror.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/horror.png -------------------------------------------------------------------------------- /ui3/icons-src/Flag.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/Flag.xcf -------------------------------------------------------------------------------- /ui3/icons-src/RedDot5px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/RedDot5px.png -------------------------------------------------------------------------------- /ui3/icons-src/Ripple.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui3/icons-src/Rolling.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /ui3/icons-src/Trigger.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/Trigger.xcf -------------------------------------------------------------------------------- /ui3/icons-src/Trigger2.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/Trigger2.xcf -------------------------------------------------------------------------------- /ui3/icons-src/Trigger24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/Trigger24.png -------------------------------------------------------------------------------- /ui3/icons-src/Trigger_8color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/Trigger_8color.png -------------------------------------------------------------------------------- /ui3/icons-src/alert.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /ui3/icons-src/alert1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/alert1.png -------------------------------------------------------------------------------- /ui3/icons-src/alert1.svg: -------------------------------------------------------------------------------- 1 | 2 | 15 | 17 | 18 | 20 | image/svg+xml 21 | 23 | 24 | 25 | 26 | 28 | 48 | 53 | 54 | -------------------------------------------------------------------------------- /ui3/icons-src/alert1_20px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/alert1_20px.png -------------------------------------------------------------------------------- /ui3/icons-src/auto_maximize.svg: -------------------------------------------------------------------------------- 1 | 2 | 15 | 17 | 18 | 20 | image/svg+xml 21 | 23 | 24 | 25 | 26 | 27 | 29 | 49 | 54 | 59 | 60 | -------------------------------------------------------------------------------- /ui3/icons-src/chrome.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/clipicons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/clipicons.png -------------------------------------------------------------------------------- /ui3/icons-src/closeBtn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/contrast.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/edge.svg: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /ui3/icons-src/ellipsis.svg: -------------------------------------------------------------------------------- 1 | 2 | 16 | 18 | 19 | 21 | image/svg+xml 22 | 24 | 25 | 26 | 27 | 29 | 49 | 54 | 59 | 60 | -------------------------------------------------------------------------------- /ui3/icons-src/firefox.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/flag24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/flag24.png -------------------------------------------------------------------------------- /ui3/icons-src/flag24_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/flag24_1.png -------------------------------------------------------------------------------- /ui3/icons-src/flag24_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/flag24_2.png -------------------------------------------------------------------------------- /ui3/icons-src/flag24_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/flag24_3.png -------------------------------------------------------------------------------- /ui3/icons-src/gamepad_public_domain.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | image/svg+xml 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 | -------------------------------------------------------------------------------- /ui3/icons-src/horror.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/horror.png -------------------------------------------------------------------------------- /ui3/icons-src/launcher-icon192_ios_lossless.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/launcher-icon192_ios_lossless.webp -------------------------------------------------------------------------------- /ui3/icons-src/launcher-icon256_ios_sharpened_lossless.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/launcher-icon256_ios_sharpened_lossless.webp -------------------------------------------------------------------------------- /ui3/icons-src/logo_icon_ios.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/logo_icon_ios.png -------------------------------------------------------------------------------- /ui3/icons-src/logo_icon_ios_visualcenter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/logo_icon_ios_visualcenter.png -------------------------------------------------------------------------------- /ui3/icons-src/logosrc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/logosrc.png -------------------------------------------------------------------------------- /ui3/icons-src/logosrc_ai.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/logosrc_ai.png -------------------------------------------------------------------------------- /ui3/icons-src/material.io/apps_black_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/baseline-access_time-24px.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/baseline-branding_watermark-24px.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/baseline-edit-24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/baseline-movie_filter-24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/bolt_black_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/close_fullscreen-24px.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/crop-black-24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/directions_car_black_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/download_black_24dp.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/folder-24px.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/folder_special-24px.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/hide_image_black_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/home_black_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_brightness_low_black_24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_check_box_black_24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_check_box_outline_blank_black_24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_cloud_upload_black_24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_content_copy_black_24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_delete_black_48px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_directions_run_black_24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_filter_frames_black_24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_fullscreen_black_48px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_fullscreen_exit_black_48px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_help_black_24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_lightbulb_outline_black_24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_lock_black_24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_movie_black_48px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_perm_device_information_black_24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_photo_size_select_large_black_24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_refresh_black_48px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_replay_black_24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_tab_black_48px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_view_quilt_black_24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_volume_down_black_24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_volume_mute_black_24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_volume_off_black_24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_volume_up_black_24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/ic_warning_black_24px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/indeterminate_check_box-24px.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/launch-24px.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/man_black_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/open_in_full-24px.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/pending_black_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/picture_in_picture_alt_black_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/search_black_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/sports_esports_24dp.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/star_rate-24px.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/storage-24px.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/update.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/videocam_black_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/view_sidebar.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/zoom_in_black_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/material.io/zoom_out_black_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui3/icons-src/person24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/person24.png -------------------------------------------------------------------------------- /ui3/icons-src/pets.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /ui3/icons-src/sentry_human.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /ui3/icons-src/sentry_human_src.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | Sentry Human traced by bp2008 21 | 23 | 42 | 45 | 46 | 48 | 49 | 51 | image/svg+xml 52 | 54 | Sentry Human traced by bp2008 55 | 56 | 57 | 58 | 62 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /ui3/icons-src/sentry_logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /ui3/icons-src/sentry_logo_src.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | Sentry Logo traced by bp2008 21 | 23 | 42 | 45 | 46 | 48 | 49 | 51 | image/svg+xml 52 | 54 | Sentry Logo traced by bp2008 55 | 56 | 57 | 58 | 64 | 70 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /ui3/icons-src/shield.svg: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 20 | 22 | image/svg+xml 23 | 25 | 26 | Based on 'security' icon from material.io 27 | 28 | 29 | 30 | 32 | 52 | 55 | 56 | 63 | 70 | 71 | -------------------------------------------------------------------------------- /ui3/icons-src/sidebar_hidden.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/sidebar_hidden2.svg: -------------------------------------------------------------------------------- 1 | 2 | 12 | 14 | 33 | 49 | 50 | 54 | 59 | 64 | 69 | 74 | 79 | 84 | 89 | 94 | 99 | 104 | 105 | -------------------------------------------------------------------------------- /ui3/icons-src/trigger@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/trigger@2x.png -------------------------------------------------------------------------------- /ui3/icons-src/ui3gamepad_optimized.svg: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /ui3/icons-src/vehicle24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/vehicle24.png -------------------------------------------------------------------------------- /ui3/icons-src/wildlife.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ui3/icons-src/wildlife24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/icons-src/wildlife24.png -------------------------------------------------------------------------------- /ui3/libs-src/Css Z-index Planner.txt: -------------------------------------------------------------------------------- 1 | .clipIconWrapper 1 2 | #exportOffsetStart 1 3 | #exportOffsetEnd 2 4 | .clipDesc 10 5 | #statusArea 50 6 | #layouttop 100 7 | #datePickerDialog 100 8 | #bigThumb 9999 9 | #loadingmsgwrapper 99999 (defined in html style attribute) 10 | .inputRequiredToPlay 500000 11 | #toast-container 999999 (defined in toastr css) 12 | .dropdown_list 9999999 13 | .playbackSettings 9999999 14 | .profileListItem.ghost 999999999 -------------------------------------------------------------------------------- /ui3/libs-src/Dialog.css: -------------------------------------------------------------------------------- 1 | .dialog_close_icon svg 2 | { 3 | stroke: currentColor; 4 | pointer-events: none; 5 | } 6 | 7 | .dialog_refresh_icon svg 8 | { 9 | fill: currentColor; 10 | pointer-events: none; 11 | } 12 | 13 | .dialog_overlay 14 | { 15 | position: absolute; 16 | width: 100%; 17 | height: 100%; 18 | top: 0px; 19 | left: 0px; 20 | background-color: #000000; 21 | } 22 | 23 | .dialog_wrapper 24 | { 25 | position: absolute; 26 | border: 1px solid #1870B5; 27 | background-color: #FFFFFF; 28 | color: #000000; 29 | font-size: 10pt; 30 | overflow-x: hidden; 31 | overflow-y: hidden; 32 | min-width: 160px; 33 | min-height: 24px; 34 | max-width: 90vw; 35 | box-shadow: 0px 0px 35px 1px rgba(0,0,0,0.4); 36 | } 37 | 38 | .dialog_wrapper.darkTheme 39 | { 40 | background-color: #393939; 41 | color: #cdcdcd; 42 | } 43 | 44 | .dialog_titlebar 45 | { 46 | position: relative; 47 | height: 24px; 48 | overflow: hidden; 49 | padding-right: 40px; 50 | border-bottom: 1px solid #B5D5FF; 51 | user-select: none; 52 | cursor: default; 53 | font-size: 0px; 54 | } 55 | 56 | .dialog_wrapper.darkTheme .dialog_titlebar 57 | { 58 | border-bottom: 1px solid #15273f; 59 | background-color: #272727; 60 | } 61 | 62 | .dialog_title 63 | { 64 | padding: 0px 4px; 65 | top: 0px; 66 | left: 0px; 67 | height: 24px; 68 | line-height: 24px; 69 | font-size: 16px; 70 | user-select: none; 71 | } 72 | 73 | .dialog_close, 74 | .dialog_refresh 75 | { 76 | position: absolute; 77 | top: 0px; 78 | right: 0px; 79 | width: 40px; 80 | height: 24px; 81 | background-color: #FFFFFF; 82 | } 83 | 84 | .dialog_close:hover 85 | { 86 | background-color: #E81123; 87 | color: #FFFFFF; 88 | } 89 | 90 | .dialog_close:active 91 | { 92 | background-color: #F1707A; 93 | color: #FFFFFF; 94 | } 95 | 96 | .dialog_wrapper.darkTheme .dialog_close, 97 | .dialog_wrapper.darkTheme .dialog_refresh 98 | { 99 | background-color: #272727; 100 | color: #cdcdcd; 101 | } 102 | 103 | .dialog_wrapper.darkTheme .dialog_close:hover 104 | { 105 | background-color: #9b0612; 106 | } 107 | 108 | .dialog_wrapper.darkTheme .dialog_close:active 109 | { 110 | background-color: #7d040e; 111 | } 112 | 113 | .dialog_refresh 114 | { 115 | right: 40px; 116 | } 117 | 118 | .dialog_refresh:hover, 119 | .dialog_wrapper.darkTheme .dialog_refresh:hover 120 | { 121 | background-color: #158e1d; 122 | color: #FFFFFF; 123 | } 124 | 125 | .dialog_refresh:active, 126 | .dialog_wrapper.darkTheme .dialog_refresh:active 127 | { 128 | background-color: #146619; 129 | color: #FFFFFF; 130 | } 131 | 132 | .dialog_close_icon, .dialog_refresh_icon 133 | { 134 | width: 12px; 135 | height: 12px; 136 | margin: 6px auto; 137 | } 138 | 139 | .dialog_content 140 | { 141 | position: relative; 142 | padding: 2px 4px; 143 | overflow: auto; 144 | max-width: 90vw; 145 | max-height: 85vh; 146 | max-height: calc(100vh - 27px); 147 | box-sizing: border-box; 148 | } 149 | 150 | .dialog_content a, .dialog_content a:visited 151 | { 152 | color: #88DDFF; 153 | } 154 | 155 | .dialog_wrapper.loading::after 156 | { 157 | content: ""; 158 | position: absolute; 159 | top: 24px; 160 | left: 0px; 161 | width: 100%; 162 | height: 100%; 163 | background-color: rgba(0,0,0,0.3); 164 | } 165 | -------------------------------------------------------------------------------- /ui3/libs-src/HistoryButtonOverride.js: -------------------------------------------------------------------------------- 1 | /* 2 | HistoryButtonOverride.js 3 | by bp2008 4 | The HistoryButtonOverride code is released to the public domain. 5 | IMPORTANT: Safari on mac will not raise the window.load event if you create an instance of this object before window.load is raised. 6 | */ 7 | function HistoryButtonOverride(BackButtonPressed, ForwardButtonPressed) 8 | { 9 | var activated = false; 10 | var Reset = function () 11 | { 12 | if (history.state === null) 13 | return; 14 | if (history.state.customHistoryStage === 1) 15 | history.forward(); 16 | else if (history.state.customHistoryStage === 3) 17 | history.back(); 18 | }; 19 | function hboPopState() 20 | { 21 | // Called when history navigation occurs. 22 | if (history.state === null || !activated) 23 | return; 24 | if (history.state.customHistoryStage === 1) 25 | { 26 | if (typeof BackButtonPressed === "function" && BackButtonPressed()) 27 | { 28 | Reset(); 29 | return; 30 | } 31 | if (history.state.initialHistoryLength > 1) 32 | history.back(); // There is back-history to go to. 33 | else 34 | history.forward(); // No back-history to go to, so undo the back operation. 35 | } 36 | else if (history.state.customHistoryStage === 3) 37 | { 38 | if (typeof ForwardButtonPressed === "function" && ForwardButtonPressed()) 39 | { 40 | Reset(); 41 | return; 42 | } 43 | if (history.length > history.state.initialHistoryLength + 2) 44 | history.forward(); // There is forward-history to go to. 45 | else 46 | history.back(); // No forward-history to go to, so undo the forward operation. 47 | } 48 | } 49 | $(window).on("popstate", hboPopState); 50 | if (history.state === null) 51 | { 52 | // This is the first page load. Inject new history states to help identify back/forward button presses. 53 | var initialHistoryLength = history.length; 54 | history.replaceState({ customHistoryStage: 1, initialHistoryLength: initialHistoryLength }, "", location.href); 55 | history.pushState({ customHistoryStage: 2, initialHistoryLength: initialHistoryLength }, "", location.href); 56 | if (typeof ForwardButtonPressed === "function") 57 | { 58 | history.pushState({ customHistoryStage: 3, initialHistoryLength: initialHistoryLength }, "", location.href); 59 | history.back(); 60 | } 61 | } 62 | else if (history.state.customHistoryStage === 1) 63 | history.forward(); 64 | else if (history.state.customHistoryStage === 3) 65 | history.back(); 66 | 67 | this.Destroy = function () 68 | { 69 | activated = false; 70 | $(window).off("popstate", hboPopState); 71 | history.back(); 72 | } 73 | 74 | activated = true; 75 | } -------------------------------------------------------------------------------- /ui3/libs-src/Queue.src.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Queue.js 4 | 5 | A function to represent a queue 6 | 7 | Created by Stephen Morley - http://code.stephenmorley.org/ - and released under 8 | the terms of the CC0 1.0 Universal legal code: 9 | 10 | http://creativecommons.org/publicdomain/zero/1.0/legalcode 11 | 12 | replaceFront method added by bp2008, Sept 2017 13 | 14 | other modifications made by bp2008 15 | 16 | */ 17 | 18 | /* Creates a new queue. A queue is a first-in-first-out (FIFO) data structure - 19 | * items are added to the end of the queue and removed from the front. 20 | */ 21 | function Queue() 22 | { 23 | // initialise the queue and offset 24 | var self = this; 25 | var queue = []; 26 | var offset = 0; 27 | 28 | /** 29 | * Returns the length of the queue. 30 | * @returns {Number} the length of the queue 31 | */ 32 | this.getLength = function () 33 | { 34 | return queue.length - offset; 35 | }; 36 | 37 | /** 38 | * Returns true if the queue is empty, and false otherwise. 39 | * @returns {Boolean} true if the queue is empty 40 | */ 41 | this.isEmpty = function () 42 | { 43 | return queue.length === offset; 44 | }; 45 | 46 | /** 47 | * Enqueues the specified item. 48 | * @param {Any} item the item to enqueue 49 | */ 50 | this.enqueue = function (item) 51 | { 52 | queue.push(item); 53 | }; 54 | 55 | /** 56 | * Dequeues an item and returns it. If the queue is empty, the value 'undefined' is returned. 57 | * @returns {Any} The item which was at the front of the queue, or 'undefined'. 58 | */ 59 | this.dequeue = function () 60 | { 61 | 62 | // if the queue is empty, return immediately 63 | if (self.isEmpty()) return undefined; 64 | 65 | // store the item at the front of the queue 66 | var item = queue[offset]; 67 | 68 | // Remove the item from the queue so it can be garbage collected. 69 | queue[offset] = undefined; 70 | 71 | // increment the offset and remove the free space if necessary 72 | offset++; 73 | if (queue.length > 16 && offset * 2 >= queue.length) 74 | { 75 | queue = queue.slice(offset); 76 | offset = 0; 77 | } 78 | 79 | // return the dequeued item 80 | return item; 81 | 82 | }; 83 | 84 | /** 85 | * Returns the item at the front of the queue (without dequeuing it). If the queue is empty then undefined is returned. 86 | * @returns {Any} The item which is at the front of the queue, or 'undefined'. 87 | */ 88 | this.peek = function () 89 | { 90 | return self.isEmpty() ? undefined : queue[offset]; 91 | }; 92 | 93 | /** 94 | * Replaces the item at the front of the queue with a different item. If the queue is empty then this method behaves like [enqueue]. 95 | * @param {Any} newFront the item to put at the front of the queue 96 | */ 97 | this.replaceFront = function (newFront) 98 | { 99 | if (self.isEmpty()) 100 | self.enqueue(newFront); 101 | else 102 | queue[offset] = newFront; 103 | }; 104 | 105 | /** 106 | * Returns an array containing all the items in the queue, in the order they would have been dequeued in. 107 | * @returns {Array} Returns an array containing all the items in the queue, in the order they would have been dequeued in. 108 | */ 109 | this.toArray = function () 110 | { 111 | var arr = new Array(self.getLength()); 112 | for (var i = offset, n = 0; i < queue.length; i++, n++) 113 | arr[n] = queue[i]; 114 | return arr; 115 | }; 116 | 117 | /** 118 | * Returns the first item that causes the specified predicate to return true. 119 | * @param {Function} where A function to which each item from the queue is passed. The function should return true when the desired item is passed in. 120 | * @returns {Any} Returns the first item that causes the specified predicate to return true. 121 | */ 122 | this.find = function (where) 123 | { 124 | for (var i = offset; i < queue.length; i++) 125 | if (where(queue[i])) 126 | return queue[i]; 127 | return undefined; 128 | }; 129 | 130 | /** 131 | * Removes all items that cause the specified predicate to return true. 132 | * @param {Function} where A function to which each item from the queue is passed. The function should return true when the desired item is passed in. 133 | * @returns {Any} Removes all items that cause the specified predicate to return true. 134 | */ 135 | this.removeAll = function (where) 136 | { 137 | // An alternate implementation would be to create a new array, fill it with non-matching items, and reset the offset. However the current implementation is likely faster when there is only one match. 138 | for (var i = offset; i < queue.length; i++) 139 | if (where(queue[i])) 140 | { 141 | queue.splice(i, 1); 142 | i--; 143 | } 144 | }; 145 | /** 146 | * Removes all items from the queue. 147 | */ 148 | this.clear = function () 149 | { 150 | queue = []; 151 | offset = 0; 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /ui3/libs-src/about-libs-src.txt: -------------------------------------------------------------------------------- 1 | This directory contains some of the source from which libs-ui3.css and libs-ui3.js, etc, were created. 2 | 3 | Other source files may be found in other directories, such as wdContextMenu and zebra_datepicker. -------------------------------------------------------------------------------- /ui3/libs-src/base64Array.js: -------------------------------------------------------------------------------- 1 | function base64Array(arr) 2 | { 3 | var s = ''; 4 | var size = 3 * 10250; // Encode small chunks at a time 5 | for (var i = 0; i < arr.length; i += size) 6 | { 7 | s += btoa(String.fromCharCode.apply(null, arr.slice(i, i + size))); 8 | } 9 | return s; 10 | } 11 | if (typeof btoa !== "function") 12 | { 13 | // A helper that returns Base64 characters and their indices. 14 | var chars = { 15 | ascii: function () 16 | { 17 | return 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; 18 | } 19 | }; 20 | /** 21 | * Binary to ASCII (encode data to Base64) 22 | * @param {String} data 23 | * @returns {String} 24 | */ 25 | window.btoa = function (data) 26 | { 27 | var ascii = chars.ascii(), 28 | len = data.length - 1, 29 | i = -1, 30 | b64 = []; 31 | 32 | while (i < len) 33 | { 34 | var code = data.charCodeAt(++i) << 16 | data.charCodeAt(++i) << 8 | data.charCodeAt(++i); 35 | b64.push(ascii[(code >>> 18) & 63] + ascii[(code >>> 12) & 63] + ascii[(code >>> 6) & 63] + ascii[code & 63]); 36 | } 37 | 38 | b64 = b64.join(''); 39 | var pads = data.length % 3; 40 | if (pads > 0) 41 | { 42 | b64 = b64.slice(0, pads - 3); 43 | 44 | while (b64.length % 4 !== 0) 45 | { 46 | b64 += '='; 47 | } 48 | } 49 | 50 | return b64; 51 | } 52 | } -------------------------------------------------------------------------------- /ui3/libs-src/basic-event-timer.js: -------------------------------------------------------------------------------- 1 | /** 2 | Constructor for BasicEventTimer which helps measure execution time of code. 3 | 4 | A class which makes it easy to time different parts of a procedure individually and later report the time in seconds taken for each part. This class is NOT thread-safe. 5 | 6 | Example: 7 | 8 | BasicEventTimer timer = new BasicEventTimer(); 9 | 10 | timer.Start("Event 1"); 11 | timed_procedure_1(); 12 | 13 | timer.Start("Event 2"); 14 | timed_procedure_2(); 15 | timer.Stop(); 16 | 17 | untimed_procedure(); 18 | 19 | timer.Start("Event 3"); 20 | timed_procedure_3(); 21 | timer.Stop(); 22 | 23 | Console.WriteLine(timer.ToString(Environment.NewLine)); 24 | 25 | Example output: 26 | 0.01 - Procedure 1 27 | 50.15 - Procedure 2 28 | 1.51 - Procedure 3 29 | @param {Boolean} mergeSameEventTimes If true, multiple events with the same name will have their times added together into one record. Useful when repeating a sequence of operations in a loop. 30 | */ 31 | function BasicEventTimer(mergeSameEventTimes) 32 | { 33 | var self = this; 34 | var dict_events = {}; 35 | var events = []; 36 | var currentEvent; 37 | 38 | /** 39 | * Starts timing a new event, automatically stopping the previous event, if there was one. 40 | * @param {String} name Name of the event. 41 | */ 42 | this.start = function (name) 43 | { 44 | self.stop(); 45 | if (typeof name === "undefined") 46 | name = "undefined"; 47 | 48 | if (mergeSameEventTimes) 49 | { 50 | currentEvent = dict_events[name]; 51 | if (currentEvent) 52 | currentEvent.watch.start(); 53 | else 54 | events.push(currentEvent = dict_events[name] = new TimedEvent(name)); 55 | } 56 | else 57 | events.push(currentEvent = dict_events[name] = new TimedEvent(name)); 58 | } 59 | 60 | /** Stops time measurement for the previously started event, if there was one. */ 61 | this.stop = function () 62 | { 63 | if (currentEvent) 64 | currentEvent.watch.stop(); 65 | } 66 | 67 | /** 68 | * Returns the time (in milliseconds) elapsed for the most recent occurrence of the named event. -1 if the named event is not found. 69 | * @param {String} name Name of the event. 70 | */ 71 | this.duration = function (name) 72 | { 73 | if (typeof name === "undefined") 74 | name = "undefined"; 75 | var e = dict_events[name]; 76 | if (e) 77 | return e.watch.elapsedMs(); 78 | return -1; 79 | } 80 | 81 | /** 82 | * Returns a string containing the time in seconds measured for each event. Events are separated by the specified string. 83 | * @param {String} separator Separator to go between events. If undefined, '\r\n' will be used instead. 84 | */ 85 | this.toString = function (separator) 86 | { 87 | if (typeof separator === "undefined") 88 | separator = '\r\n'; 89 | var labels = new Array(events.length); 90 | for (var i = 0; i < events.length; i++) 91 | labels[i] = events[i].name + ": " + events[i].watch.elapsedMs().toFixed(1) + "ms"; 92 | return labels.join(separator); 93 | } 94 | 95 | /** 96 | * Logs the events and their times to the console. 97 | * @param {String} title Optional string to log before logging the events and their times. 98 | * */ 99 | this.log = function (title) 100 | { 101 | if (typeof title === "undefined") 102 | title = ''; 103 | else 104 | title += '\r\n'; 105 | console.log(title + self.toString('\r\n')); 106 | } 107 | 108 | function TimedEvent(name) 109 | { 110 | this.name = name; 111 | this.watch = new Stopwatch(); 112 | this.watch.start(); 113 | } 114 | } 115 | function Stopwatch() 116 | { 117 | var accumulatedTime = 0; 118 | var startTime = 0; 119 | var isStarted = false; 120 | 121 | this.start = function () 122 | { 123 | if (!isStarted) 124 | { 125 | startTime = performance.now(); 126 | isStarted = true; 127 | } 128 | }; 129 | this.stop = function () 130 | { 131 | if (isStarted) 132 | { 133 | accumulatedTime += performance.now() - startTime; 134 | isStarted = false; 135 | } 136 | }; 137 | this.elapsedMs = function () 138 | { 139 | if (isStarted) 140 | return accumulatedTime + (performance.now() - startTime); 141 | return accumulatedTime; 142 | } 143 | this.reset = function () 144 | { 145 | accumulatedTime = 0; 146 | startTime = 0; 147 | isStarted = false; 148 | } 149 | } -------------------------------------------------------------------------------- /ui3/libs-src/client-zip@2.3.1.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Skipped minification because the original files appears to be already minified. 3 | * Original file: /npm/client-zip@2.3.1/index.js 4 | * 5 | * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files 6 | */ 7 | "stream"in Blob.prototype||Object.defineProperty(Blob.prototype,"stream",{value(){return new Response(this).body}}),"setBigUint64"in DataView.prototype||Object.defineProperty(DataView.prototype,"setBigUint64",{value(n,e,t){const i=Number(0xffffffffn&e),o=Number(e>>32n);this.setUint32(n+(t?0:4),i,t),this.setUint32(n+(t?4:0),o,t)}});var n=n=>new DataView(new ArrayBuffer(n)),e=n=>new Uint8Array(n.buffer||n),t=n=>(new TextEncoder).encode(String(n)),i=n=>Math.min(4294967295,Number(n)),o=n=>Math.min(65535,Number(n));function f(n,i){if(void 0===i||i instanceof Date||(i=new Date(i)),n instanceof File)return{isFile:1,t:i||new Date(n.lastModified),i:n.stream()};if(n instanceof Response)return{isFile:1,t:i||new Date(n.headers.get("Last-Modified")||Date.now()),i:n.body};if(void 0===i)i=new Date;else if(isNaN(i))throw new Error("Invalid modification date.");if(void 0===n)return{isFile:0,t:i};if("string"==typeof n)return{isFile:1,t:i,i:t(n)};if(n instanceof Blob)return{isFile:1,t:i,i:n.stream()};if(n instanceof Uint8Array||n instanceof ReadableStream)return{isFile:1,t:i,i:n};if(n instanceof ArrayBuffer||ArrayBuffer.isView(n))return{isFile:1,t:i,i:e(n)};if(Symbol.asyncIterator in n)return{isFile:1,t:i,i:r(n)};throw new TypeError("Unsupported input format.")}function r(n){const e="next"in n?n:n[Symbol.asyncIterator]();return new ReadableStream({async pull(n){let t=0;for(;n.desiredSize>t;){const i=await e.next();if(!i.value){n.close();break}{const e=s(i.value);n.enqueue(e),t+=e.byteLength}}}})}function s(n){return"string"==typeof n?t(n):n instanceof Uint8Array?n:e(n)}function a(n,e,i){if(void 0===e||e instanceof Uint8Array||(e=t(e)),n instanceof File)return{o:u(e||t(n.name)),A:BigInt(n.size)};if(n instanceof Response){const o=n.headers.get("content-disposition"),f=o&&o.match(/;\s*filename\*?=["']?(.*?)["']?$/i),r=f&&f[1]||n.url&&new URL(n.url).pathname.split("/").findLast(Boolean),s=r&&decodeURIComponent(r),a=i||+n.headers.get("content-length");return{o:u(e||t(s)),A:BigInt(a)}}return e=u(e,void 0!==n||void 0!==i),"string"==typeof n?{o:e,A:BigInt(t(n).length)}:n instanceof Blob?{o:e,A:BigInt(n.size)}:n instanceof ArrayBuffer||ArrayBuffer.isView(n)?{o:e,A:BigInt(n.byteLength)}:{o:e,A:A(n,i)}}function A(n,e){return e>-1?BigInt(e):n?void 0:0n}function u(n,e=1){if(!n||n.every((n=>47===n)))throw new Error("The file must have a name.");if(e)for(;47===n[n.length-1];)n=n.subarray(0,-1);else 47!==n[n.length-1]&&(n=new Uint8Array([...n,47]));return n}var d=new WebAssembly.Instance(new WebAssembly.Module(Uint8Array.from(atob("AGFzbQEAAAABCgJgAABgAn9/AXwDAwIAAQUDAQACBwkCAW0CAAFjAAEIAQAKlQECSQEDfwNAIAEhAEEAIQIDQCAAQQF2IABBAXFBoIbi7X5scyEAIAJBAWoiAkEIRw0ACyABQQJ0IAA2AgAgAUEBaiIBQYACRw0ACwtJAQF/IAFBf3MhAUGAgAQhAkGAgAQgAGohAANAIAFB/wFxIAItAABzQQJ0KAIAIAFBCHZzIQEgAkEBaiICIABJDQALIAFBf3O4Cw"),(n=>n.charCodeAt(0))))),{c,m}=d.exports,l=e(m).subarray(65536);function y(n,e=0){for(const t of function*(n){for(;n.length>65536;)yield n.subarray(0,65536),n=n.subarray(65536);n.length&&(yield n)}(n))l.set(t),e=c(t.length,e);return e}function B(n,e,t=0){const i=n.getSeconds()>>1|n.getMinutes()<<5|n.getHours()<<11,o=n.getDate()|n.getMonth()+1<<5|n.getFullYear()-1980<<9;e.setUint16(t,i,1),e.setUint16(t+2,o,1)}function w(t){const i=n(30);return i.setUint32(0,1347093252),i.setUint32(4,754976768),B(t.t,i,10),i.setUint16(26,t.o.length,1),e(i)}async function*I(n){let{i:e}=n;if("then"in e&&(e=await e),e instanceof Uint8Array)yield e,n.u=y(e,0),n.A=BigInt(e.length);else{n.A=0n;const t=e.getReader();for(;;){const{value:e,done:i}=await t.read();if(i)break;n.u=y(e,n.u),n.A+=BigInt(e.length),yield e}}}function g(t,o){const f=n(16+(o?8:0));return f.setUint32(0,1347094280),f.setUint32(4,t.isFile?t.u:0,1),o?(f.setBigUint64(8,t.A,1),f.setBigUint64(16,t.A,1)):(f.setUint32(8,i(t.A),1),f.setUint32(12,i(t.A),1)),e(f)}function b(t,o,f=0){const r=n(46);return r.setUint32(0,1347092738),r.setUint32(4,755182848),r.setUint16(8,2048),B(t.t,r,12),r.setUint32(16,t.isFile?t.u:0,1),r.setUint32(20,i(t.A),1),r.setUint32(24,i(t.A),1),r.setUint16(28,t.o.length,1),r.setUint16(30,f,1),r.setUint16(40,t.isFile?33204:16893,1),r.setUint32(42,i(o),1),e(r)}function p(t,i,o){const f=n(o);return f.setUint16(0,1,1),f.setUint16(2,o-4,1),16&o&&(f.setBigUint64(4,t.A,1),f.setBigUint64(12,t.A,1)),f.setBigUint64(o-8,i,1),e(f)}function D(n){return n instanceof File||n instanceof Response?[[n],[n]]:[[n.input,n.name,n.size],[n.input,n.lastModified]]}var h=n=>function(n){let e=BigInt(22),t=0n,i=0;for(const o of n){if(!o.o)throw new Error("Every file must have a non-empty name.");if(void 0===o.A)throw new Error(`Missing size for file "${(new TextDecoder).decode(o.o)}".`);const n=o.A>=0xffffffffn,f=t>=0xffffffffn;t+=BigInt(46+o.o.length+(n&&8))+o.A,e+=BigInt(o.o.length+46+(12*f|28*n)),i||(i=n)}return(i||t>=0xffffffffn)&&(e+=BigInt(76)),e+t}(function*(n){for(const e of n)yield a(...D(e)[0])}(n));function F(n,e={}){const t={"Content-Type":"application/zip","Content-Disposition":"attachment"};return("bigint"==typeof e.length||Number.isInteger(e.length))&&e.length>0&&(t["Content-Length"]=String(e.length)),e.metadata&&(t["Content-Length"]=String(h(e.metadata))),new Response(Q(n),{headers:t})}function Q(t){return r(async function*(t){const f=[];let r=0n,s=0n,a=0;for await(const n of t){yield w(n),yield n.o,n.isFile&&(yield*I(n));const e=n.A>=0xffffffffn,t=12*(r>=0xffffffffn)|28*e;yield g(n,e),f.push(b(n,r,t)),f.push(n.o),t&&f.push(p(n,r,t)),e&&(r+=8n),s++,r+=BigInt(46+n.o.length)+n.A,a||(a=e)}let A=0n;for(const n of f)yield n,A+=BigInt(n.length);if(a||r>=0xffffffffn){const t=n(76);t.setUint32(0,1347094022),t.setBigUint64(4,BigInt(44),1),t.setUint32(12,755182848),t.setBigUint64(24,s,1),t.setBigUint64(32,s,1),t.setBigUint64(40,A,1),t.setBigUint64(48,r,1),t.setUint32(56,1347094023),t.setBigUint64(64,r+A,1),t.setUint32(72,1,1),yield e(t)}const u=n(22);u.setUint32(0,1347093766),u.setUint16(8,o(s),1),u.setUint16(10,o(s),1),u.setUint32(12,i(A),1),u.setUint32(16,i(r),1),yield e(u)}(async function*(n){for await(const e of n){const[n,t]=D(e);yield Object.assign(f(...t),a(...n))}}(t)))}window.clientZip = { downloadZip:F, makeZip: Q, predictLength: h }; -------------------------------------------------------------------------------- /ui3/libs-src/clipboard.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/libs-src/clipboard.js -------------------------------------------------------------------------------- /ui3/libs-src/datepicker.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Zebra_DatePicker: a lightweight jQuery date picker plugin 4 | 5 | Default theme 6 | 7 | copyright (c) 2011 - 2014 Stefan Gabos 8 | http://stefangabos.ro/jquery/zebra-datepicker/ 9 | 10 | */ 11 | 12 | .Zebra_DatePicker *, 13 | .Zebra_DatePicker *:after, 14 | .Zebra_DatePicker *:before { -moz-box-sizing: content-box !important; -webkit-box-sizing: content-box !important; box-sizing: content-box !important } 15 | 16 | .Zebra_DatePicker { position: absolute; z-index: 1200; font-family: Verdana, Arial, sans-serif; font-size: 13px; top: 0 } 17 | 18 | .Zebra_DatePicker * { margin: 0; padding: 0; border: none } 19 | 20 | /* = GLOBALS 21 | ----------------------------------------------------------------------------------------------------------------------*/ 22 | .Zebra_DatePicker table { border-collapse: collapse; border-spacing: 0; width: auto; table-layout: auto; border: 1px solid #969BA7 } 23 | .Zebra_DatePicker table.dp_header { border-bottom: none } 24 | .Zebra_DatePicker table.dp_footer { border-top: none } 25 | 26 | .Zebra_DatePicker td, 27 | .Zebra_DatePicker th { text-align: center; padding: 5px 0 } 28 | 29 | .Zebra_DatePicker td { cursor: pointer } 30 | 31 | .Zebra_DatePicker .dp_daypicker, 32 | .Zebra_DatePicker .dp_monthpicker, 33 | .Zebra_DatePicker .dp_yearpicker { } 34 | 35 | .Zebra_DatePicker .dp_daypicker td, 36 | .Zebra_DatePicker .dp_daypicker th, 37 | .Zebra_DatePicker .dp_monthpicker td, 38 | .Zebra_DatePicker .dp_yearpicker td { color: #d8d8d8; width: 30px; border: none } 39 | 40 | /* = VISIBLE/HIDDEN STATES (USE TRANSITIONS FOR EFFECTS) 41 | ----------------------------------------------------------------------------------------------------------------------*/ 42 | .Zebra_DatePicker.dp_visible { visibility: visible; filter: alpha(opacity=100); -khtml-opacity: 1; -moz-opacity: 1; opacity: 1; transition: opacity 0.2s ease-in-out } 43 | .Zebra_DatePicker.dp_hidden { visibility: hidden; filter: alpha(opacity=0); -khtml-opacity: 0; -moz-opacity: 0; opacity: 0 } 44 | 45 | /* = HEADER 46 | ----------------------------------------------------------------------------------------------------------------------*/ 47 | .Zebra_DatePicker .dp_header td { color: #FFF } 48 | 49 | .Zebra_DatePicker .dp_header .dp_previous, 50 | .Zebra_DatePicker .dp_header .dp_next { width: 30px } 51 | 52 | .Zebra_DatePicker .dp_header .dp_caption { } 53 | .Zebra_DatePicker .dp_header .dp_hover { background: #195f88; color: #FFF } 54 | 55 | /* = DATEPICKER 56 | ----------------------------------------------------------------------------------------------------------------------*/ 57 | .Zebra_DatePicker .dp_daypicker th { color: #969BA7 } 58 | .Zebra_DatePicker td.dp_not_in_month { color: #393E45; cursor: default } 59 | .Zebra_DatePicker td.dp_not_in_month_selectable { color: #393E45; cursor: pointer } 60 | .Zebra_DatePicker td.dp_weekend { } 61 | .Zebra_DatePicker td.dp_weekend_disabled { color: #CCC; cursor: default } 62 | .Zebra_DatePicker td.dp_selected { background: #0097F0; color: #FFF !important } 63 | .Zebra_DatePicker td.dp_week_number { color: #FFF; cursor: text; font-style: italic } 64 | 65 | /* = MONTHPICKER 66 | ----------------------------------------------------------------------------------------------------------------------*/ 67 | .Zebra_DatePicker .dp_monthpicker td { width: 33% } 68 | 69 | /* = YEARPICKER 70 | ----------------------------------------------------------------------------------------------------------------------*/ 71 | .Zebra_DatePicker .dp_yearpicker td { width: 33% } 72 | 73 | /* = FOOTER 74 | ----------------------------------------------------------------------------------------------------------------------*/ 75 | .Zebra_DatePicker .dp_footer { } 76 | .Zebra_DatePicker .dp_footer .dp_hover { color: #FFF } 77 | 78 | /* = SELECT CURRENT DAY 79 | ----------------------------------------------------------------------------------------------------------------------*/ 80 | .Zebra_DatePicker .dp_today { color: #FFF; padding: 3px } 81 | 82 | /* = CLEAR DATE 83 | ----------------------------------------------------------------------------------------------------------------------*/ 84 | .Zebra_DatePicker .dp_clear { color: #FFF; padding: 3px } 85 | 86 | /* = SOME MORE GLOBALS (MUST BE LAST IN ORDER TO OVERWRITE PREVIOUS PROPERTIES) 87 | ----------------------------------------------------------------------------------------------------------------------*/ 88 | .Zebra_DatePicker td.dp_current { color: #0097F0 } 89 | .Zebra_DatePicker td.dp_disabled_current { color: #969BA7 } 90 | .Zebra_DatePicker td.dp_disabled { background: #F3F3F3; color: #CDCDCD; cursor: default } 91 | .Zebra_DatePicker td.dp_hover { background: #195f88; color: #FFF } 92 | 93 | /* = ICON 94 | ----------------------------------------------------------------------------------------------------------------------*/ 95 | button.Zebra_DatePicker_Icon { display: block; position: absolute; width: 16px; height: 16px; background: #000 no-repeat left top; text-indent: -9000px; border: none; cursor: pointer; padding: 0; line-height: 0; vertical-align: top } 96 | button.Zebra_DatePicker_Icon_Disabled { background-color: #000 } 97 | 98 | /* don't set vertical margins! */ 99 | button.Zebra_DatePicker_Icon { margin: 0 0 0 3px } 100 | button.Zebra_DatePicker_Icon_Inside_Right { margin: 0 3px 0 0 } 101 | button.Zebra_DatePicker_Icon_Inside_Left { margin: 0 0 0 3px } -------------------------------------------------------------------------------- /ui3/libs-src/jquery.cookie.js: -------------------------------------------------------------------------------- 1 | /** 2 | * jQuery Cookie plugin 3 | * 4 | * Copyright (c) 2010 Klaus Hartl (stilbuero.de) 5 | * Dual licensed under the MIT and GPL licenses: 6 | * http://www.opensource.org/licenses/mit-license.php 7 | * http://www.gnu.org/licenses/gpl.html 8 | * 9 | */ 10 | jQuery.cookie = function (key, value, options) 11 | { 12 | 13 | // key and at least value given, set cookie... 14 | if (arguments.length > 1 && String(value) !== "[object Object]") 15 | { 16 | options = jQuery.extend({}, options); 17 | 18 | if (value === null || value === undefined) 19 | { 20 | options.expires = -1; 21 | } 22 | 23 | if (typeof options.expires === 'number') 24 | { 25 | var days = options.expires, t = options.expires = new Date(); 26 | t.setDate(t.getDate() + days); 27 | } 28 | 29 | value = String(value); 30 | 31 | return (document.cookie = [ 32 | encodeURIComponent(key), '=', 33 | options.raw ? value : encodeURIComponent(value), 34 | options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE 35 | options.path ? '; path=' + options.path : '', 36 | options.domain ? '; domain=' + options.domain : '', 37 | options.secure ? '; secure' : '' 38 | ].join('')); 39 | } 40 | 41 | // key and possibly options given, get cookie... 42 | options = value || {}; 43 | var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent; 44 | return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null; 45 | }; -------------------------------------------------------------------------------- /ui3/libs-src/jquery.longpress.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Longpress is a jQuery plugin that makes it easy to support long press 3 | * events on mobile devices and desktop borwsers. 4 | * 5 | * @name longpress 6 | * @version 0.1.2 7 | * @requires jQuery v1.2.3+ 8 | * @author Vaidik Kapoor 9 | * @license MIT License - http://www.opensource.org/licenses/mit-license.php 10 | * 11 | * For usage and examples, check out the README at: 12 | * http://github.com/vaidik/jquery-longpress/ 13 | * 14 | * Copyright (c) 2008-2013, Vaidik Kapoor (kapoor [*dot*] vaidik -[at]- gmail [*dot*] com) 15 | * 16 | * Modified for UI3 by bp2008 17 | */ 18 | 19 | (function ($) 20 | { 21 | $.fn.longpress = function (longCallback, shortCallback, duration) 22 | { 23 | if (typeof duration === "undefined") 24 | { 25 | duration = 500; 26 | } 27 | 28 | return this.each(function () 29 | { 30 | var $this = $(this); 31 | 32 | // to keep track of how long something was pressed 33 | var timeout = null; 34 | var mouse_down_x = 0; 35 | var mouse_down_y = 0; 36 | var mouseMoveTolerance = 5; 37 | // mousedown or touchstart callback 38 | function mousedown_callback(e) 39 | { 40 | if (e.which != 1 && e.which != 0) 41 | return; 42 | var context = this; 43 | mouseCoordFixer.fix(e); 44 | mouse_down_x = e.mouseX; 45 | mouse_down_y = e.mouseY; 46 | // set a timeout to call the longpress callback when time elapses 47 | clearTimeout(timeout); 48 | timeout = setTimeout(function () 49 | { 50 | timeout = null; 51 | if (typeof longCallback === "function") 52 | { 53 | longCallback.call(context, e); 54 | } else 55 | { 56 | $.error('Callback required for long press. You provided: ' + typeof longCallback); 57 | } 58 | }, duration); 59 | } 60 | 61 | // mouseup or touchend callback 62 | function mouseup_callback(e) 63 | { 64 | if (e.which != 1 && e.which != 0) 65 | return; 66 | if (timeout == null && e.type.indexOf('touch') == 0) 67 | e.preventDefault(); 68 | if (timeout != null) 69 | { 70 | // cancel the timeout 71 | clearTimeout(timeout); 72 | timeout = null; 73 | 74 | // call the shortCallback if provided 75 | if (typeof shortCallback === "function") 76 | { 77 | shortCallback.call($(this), e); 78 | } else if (typeof shortCallback === "undefined") 79 | { 80 | ; 81 | } else 82 | { 83 | $.error('Optional callback for short press should be a function.'); 84 | } 85 | } 86 | } 87 | 88 | // cancel long press event if the finger or mouse was moved 89 | function move_callback(e) 90 | { 91 | mouseCoordFixer.fix(e); 92 | if (Math.abs(mouse_down_x - e.mouseX) > mouseMoveTolerance 93 | || Math.abs(mouse_down_y - e.mouseY) > mouseMoveTolerance) 94 | { 95 | clearTimeout(timeout); 96 | timeout = null; 97 | } 98 | } 99 | 100 | // Browser Support 101 | $this.on('mousedown', mousedown_callback); 102 | $this.on('mouseup', mouseup_callback); 103 | $this.on('mousemove', move_callback); 104 | 105 | // Mobile Support 106 | $this.on('touchstart', mousedown_callback); 107 | $this.on('touchend', mouseup_callback); 108 | $this.on('touchmove', move_callback); 109 | }); 110 | }; 111 | var mouseCoordFixer = 112 | { 113 | last: { 114 | x: 0, y: 0 115 | } 116 | , fix: function (e) 117 | { 118 | if (e.alreadyMouseCoordFixed) 119 | return; 120 | e.alreadyMouseCoordFixed = true; 121 | if (typeof e.pageX == "undefined") 122 | { 123 | if (e.originalEvent && e.originalEvent.touches && e.originalEvent.touches.length > 0) 124 | { 125 | mouseCoordFixer.last.x = e.mouseX = e.originalEvent.touches[0].pageX + $(window).scrollLeft(); 126 | mouseCoordFixer.last.y = e.mouseY = e.originalEvent.touches[0].pageY + $(window).scrollTop(); 127 | } 128 | else if (e.touches && e.touches.length > 0) 129 | { 130 | mouseCoordFixer.last.x = e.mouseX = e.touches[0].pageX; 131 | mouseCoordFixer.last.y = e.mouseY = e.touches[0].pageY; 132 | } 133 | else 134 | { 135 | e.mouseX = mouseCoordFixer.last.x; 136 | e.mouseY = mouseCoordFixer.last.y; 137 | } 138 | } 139 | else 140 | { 141 | mouseCoordFixer.last.x = e.mouseX = e.pageX + $(window).scrollLeft(); 142 | mouseCoordFixer.last.y = e.mouseY = e.pageY + $(window).scrollTop(); 143 | } 144 | } 145 | }; 146 | } (jQuery)); -------------------------------------------------------------------------------- /ui3/libs-src/jquery.ui2modal.js: -------------------------------------------------------------------------------- 1 | /* 2 | * UI3Modal - jQuery Plugin 3 | * Created for UI2, a custom Blue Iris web interface. Adapted for UI3. 4 | */ 5 | /// 6 | 7 | (function ($) 8 | { 9 | var zIndexAutoIncrement = 200; 10 | $.fn.modal = function (options) 11 | { 12 | var dialog = new UI2Dialog(this, options); 13 | show(dialog); 14 | return dialog; 15 | } 16 | function UI2Dialog($content, options) 17 | { 18 | this.isOpen = false; 19 | this.$content = $content; 20 | this.settings = $.extend( 21 | { 22 | // These are the default settings 23 | maxWidth: 999999, 24 | maxHeight: 999999, 25 | sizeToFitContent: false, 26 | shrinkOnBothResizePasses: false, 27 | removeElementOnClose: false, 28 | onClosing: null, 29 | overlayOpacity: 0.3 30 | }, options); 31 | } 32 | function show(self) 33 | { 34 | if (self.isOpen) 35 | return; 36 | self.isOpen = true; 37 | 38 | self.myIndex = zIndexAutoIncrement; 39 | self.$overlay = $(document.createElement('div')); 40 | self.$overlay.addClass("ui2modal_overlay"); 41 | self.$overlay.css("position", "absolute"); 42 | self.$overlay.css("width", "100%"); 43 | self.$overlay.css("height", "100%"); 44 | self.$overlay.css("top", "0px"); 45 | self.$overlay.css("left", "0px"); 46 | self.$overlay.css("background-color", "#000000"); 47 | self.$overlay.css("opacity", self.settings.overlayOpacity.toString()); 48 | self.$overlay.css("z-index", ++zIndexAutoIncrement); 49 | self.$overlay.on("contextmenu", function () { self.close(); return false; }); 50 | self.$overlay.click(function () { self.close(); }); 51 | 52 | self.$dialog = $(document.createElement('div')); 53 | self.$dialog.addClass("ui2modal"); 54 | self.$dialog.css("position", "absolute"); 55 | self.$dialog.css("border", "4px ridge #377EC0"); 56 | self.$dialog.css("background-color", "#373737"); 57 | self.$dialog.css("color", "#DDDDDD"); 58 | self.$dialog.css("overflow-y", "auto"); 59 | self.$dialog.css("z-index", ++zIndexAutoIncrement); 60 | self.$dialog.append(self.$content); 61 | 62 | self.$closebtn = $('
' 63 | + '' 64 | + '' 65 | + '' 66 | + '
'); 67 | self.$closebtn.addClass("ui2modal_close"); 68 | self.$closebtn.css("position", "absolute"); 69 | self.$closebtn.css("width", "25px"); 70 | self.$closebtn.css("height", "25px"); 71 | self.$closebtn.css("cursor", "pointer"); 72 | self.$closebtn.css("z-index", ++zIndexAutoIncrement); 73 | self.$closebtn.click(function () { self.close(); }); 74 | 75 | $("body").append(self.$overlay); 76 | $("body").append(self.$dialog); 77 | $("body").append(self.$closebtn); 78 | self.$content.show(); 79 | 80 | $(window).bind("resize.ui2modal" + self.myIndex + " orientationchange.ui2modal" + self.myIndex, function () { onResize(self); }); 81 | 82 | onResize(self); 83 | } 84 | UI2Dialog.prototype.close = function (suppressCallback) 85 | { 86 | if (!this.isOpen) 87 | return; 88 | this.isOpen = false; 89 | 90 | if (typeof suppressCallback == "undefined" || suppressCallback == null) 91 | suppressCallback = false; 92 | 93 | if (typeof this.settings.onClosing == "function" && !suppressCallback) 94 | if (this.settings.onClosing()) 95 | return false; 96 | 97 | $(window).unbind(".ui2modal" + this.myIndex); 98 | 99 | if (this.settings.removeElementOnClose) 100 | this.$content.remove(); 101 | else 102 | { 103 | this.$content.hide(); 104 | $("body").append(this.$content); 105 | } 106 | 107 | this.$overlay.remove(); 108 | this.$dialog.remove(); 109 | this.$closebtn.remove(); 110 | 111 | return true; 112 | } 113 | function onResize(self, isSecondPass) 114 | { 115 | var windowW = $(window).width(); 116 | var windowH = $(window).height(); 117 | 118 | var dialogW = windowW * 0.7; 119 | var dialogH = windowH * 0.8; 120 | 121 | if (dialogW < 300) 122 | dialogW = 300; 123 | if (dialogH < 150) 124 | dialogH = 150; 125 | 126 | if (self.settings.sizeToFitContent && (self.settings.shrinkOnBothResizePasses || isSecondPass)) 127 | { 128 | var contentW = self.$content.outerWidth(true); 129 | var contentH = self.$content.outerHeight(true); 130 | if (dialogW > contentW) 131 | dialogW = contentW; 132 | if (dialogH > contentH) 133 | dialogH = contentH; 134 | } 135 | 136 | if (dialogW > self.settings.maxWidth) 137 | dialogW = self.settings.maxWidth; 138 | if (dialogH > self.settings.maxHeight) 139 | dialogH = self.settings.maxHeight; 140 | 141 | var dialogT = ((windowH - dialogH) / 2); 142 | var dialogL = ((windowW - dialogW) / 2); 143 | 144 | self.$dialog.css("top", dialogT + "px"); 145 | self.$dialog.css("left", dialogL + "px"); 146 | self.$dialog.css("width", dialogW + "px"); 147 | self.$dialog.css("height", dialogH + "px"); 148 | 149 | self.$closebtn.css("top", (dialogT - 8) + "px"); 150 | self.$closebtn.css("left", ((dialogL + dialogW) - 8) + "px"); 151 | 152 | if (self.settings.sizeToFitContent) 153 | { 154 | if (!isSecondPass) 155 | onResize(self, true); 156 | } 157 | } 158 | }(jQuery)); -------------------------------------------------------------------------------- /ui3/libs-src/jsonview/MIT_LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /ui3/libs-src/jsonview/change_notice.txt: -------------------------------------------------------------------------------- 1 | CHANGE NOTICE 2 | 3 | The script of this library has been significantly modified by the UI2/UI3 projects. -------------------------------------------------------------------------------- /ui3/libs-src/jsonview/jsonview.min.css: -------------------------------------------------------------------------------- 1 | .jsonview{font-family:monospace;font-size:1.1em;white-space:pre-wrap}.jsonview .prop{font-weight:700;text-decoration:none;color:#000}.jsonview .null,.jsonview .undefined{color:red}.jsonview .bool,.jsonview .num{color:#00f}.jsonview .string{color:green;white-space:pre-wrap}.jsonview .string.multiline{display:inline-block;vertical-align:text-top}.jsonview .collapser{position:absolute;left:-1em;cursor:pointer}.jsonview .collapsible{transition:height 1.2s;transition:width 1.2s}.jsonview .collapsible.collapsed{height:.8em;width:1em;display:inline-block;overflow:hidden;margin:0}.jsonview .collapsible.collapsed:before{content:"...";width:1em;margin-left:.2em}.jsonview .collapser.collapsed{transform:rotate(0)}.jsonview .q{display:inline-block;width:0;color:transparent}.jsonview li{position:relative}.jsonview ul{list-style:none;margin:0 0 0 2em;padding:0}.jsonview h1{font-size:1.2em} -------------------------------------------------------------------------------- /ui3/libs-src/jsonview/jsonview.min.js: -------------------------------------------------------------------------------- 1 | (function(m){var q="object array number string boolean date null".split(" ");var p=function(){function a(b){null==b&&(b={});this.options=b}a.prototype.htmlEncode=function(b){return null!==b?b.toString().replace(/&/g,"&").replace(/"/g,""").replace(//g,">"):""};a.prototype.jsString=function(b){b=JSON.stringify(b).slice(1,-1);return this.htmlEncode(b)};a.prototype.decorateWithSpan=function(b,c){return''+this.htmlEncode(b)+""};a.prototype.valueToHTML= 2 | function(b,c){null==c&&(c=0);var a=Object.prototype.toString.call(b).match(/\s(.+)]/)[1].toLowerCase();if(this.options.strict&&!m.inArray(a,q))throw Error(""+a+" is not a valid JSON value type");return this[""+a+"ToHTML"].call(this,b,c)};a.prototype.nullToHTML=function(b){return this.decorateWithSpan("null","null")};a.prototype.dateToHTML=function(b){return this.stringToHTML(b)};a.prototype.functionToHTML=function(b){return this.decorateWithSpan("function","function")};a.prototype.undefinedToHTML= 3 | function(){return this.decorateWithSpan("undefined","undefined")};a.prototype.numberToHTML=function(b){return this.decorateWithSpan(b,"num")};a.prototype.stringToHTML=function(b){if(/^(http|https|file):\/\/[^\s]+$/i.test(b))return'"'+this.jsString(b)+'"';var c="";b=this.jsString(b);if(this.options.nl2br){var a=/([^>\\r\\n]?)(\\r\\n|\\n\\r|\\r|\\n)/g;a.test(b)&&(c=" multiline",b=(b+"").replace(a,"$1
"))}return'"'+b+'"'};a.prototype.booleanToHTML=function(b){return this.decorateWithSpan(b,"bool")};a.prototype.arrayToHTML=function(b,a){var c,d;null==a&&(a=0);var e=!1;var f="";var h=b.length;var l=c=0;for(d=b.length;c"+this.valueToHTML(l,a+1),1",h--;return e?'[
    '+f+"
]":"[ ]"};a.prototype.objectToHTML=function(b,a){var c;null==a&&(a=0);var d=!1;var e="";var f=0;for(c in b)f++;for(c in b){var h= 5 | b[c];d=!0;var l=this.options.escape?this.jsString(c):c;e+='
  • "'+l+'": '+this.valueToHTML(h,a+1);1";f--}return d?'{
      '+e+"
    }":"{ }"};a.prototype.jsonToHTML=function(b){return'
    '+this.valueToHTML(b)+"
    "};return a}();"undefined"!==typeof module&&null!==module&&(module.exports=p);var n=function(){function a(){}a.bindEvent= 6 | function(b,a){b.firstChild.addEventListener("click",function(b){return function(c){return b.toggle(c.target.parentNode.firstChild,a)}}(this));var c=document.createElement("div");c.className="collapser";c.innerHTML=a.collapsed?"+":"-";c.addEventListener("click",function(b){return function(c){return b.toggle(c.target,a)}}(this));b.insertBefore(c,b.firstChild);if(a.collapsed)return this.collapse(c)};a.expand=function(b){var a=this.collapseTarget(b);if(""!==a.style.display){var g=a.parentNode.getElementsByClassName("ellipsis")[0]; 7 | a.parentNode.removeChild(g);a.style.display="";return b.innerHTML="-"}};a.collapse=function(b){var a=this.collapseTarget(b);if("none"!==a.style.display){a.style.display="none";var g=document.createElement("span");g.className="ellipsis";g.innerHTML=" … ";a.parentNode.insertBefore(g,a);return b.innerHTML="+"}};a.toggle=function(a,c){var b;null==c&&(c={});var d="none"===this.collapseTarget(a).style.display?"expand":"collapse";if(c.recursive_collapser){var e=a.parentNode.getElementsByClassName("collapser"); 8 | var f=[];var h=0;for(b=e.length;h ul > li .collapsible").siblings(".collapser").each(function(){return k[b](this)})})}var c=a[0];var g=a[1]||{};g=m.extend({collapsed:!1,nl2br:!1,recursive_collapser:!1,escape:!0,strict:!1},g);var d=new p(g);"[object String]"===Object.prototype.toString.call(c)&&(c=JSON.parse(c));var e=d.jsonToHTML(c);return this.each(function(){var a;var b= 10 | m(this);b.html(e);var c=b[0].getElementsByClassName("collapsible");var d=[];var k=0;for(a=c.length;k 6 | "use strict"; 7 | (function ($) 8 | { 9 | $.fn.lightbox = function (options) 10 | { 11 | return new Lightbox(this, options); 12 | } 13 | function Lightbox($img, options) 14 | { 15 | var $overlay, $bigImg, isIn; 16 | $img.css("cursor", "zoom-in"); 17 | $img.click(toggle); 18 | function toggle(e) 19 | { 20 | if (isIn) 21 | { 22 | $overlay.remove(); 23 | $bigImg.remove(); 24 | } 25 | else 26 | { 27 | $overlay = $('
    '); 28 | $overlay.css("cursor", "zoom-out") 29 | .click(toggle); 30 | $("body").append($overlay); 31 | $bigImg = $(''); 32 | $bigImg.attr('src', $img.attr('src')); 33 | $overlay.append($bigImg); 34 | $overlay.fadeIn(200); 35 | } 36 | isIn = !isIn; 37 | } 38 | } 39 | }(jQuery)); 40 | -------------------------------------------------------------------------------- /ui3/libs-src/lightbox.min.js: -------------------------------------------------------------------------------- 1 | (function(c){function e(b,e){function g(e){f?(a.remove(),d.remove()):(a=c('
    '),a.css("cursor","zoom-out").click(g),c("body").append(a),d=c(''),d.attr("src",b.attr("src")),a.append(d),a.fadeIn(200));f=!f}var a,d,f;b.css("cursor","zoom-in");b.click(g)} 2 | c.fn.lightbox=function(b){return new e(this,b)}})(jQuery); -------------------------------------------------------------------------------- /ui3/libs-src/loginScriptsSrc.js: -------------------------------------------------------------------------------- 1 | function ExecJSON(args, callbackSuccess, callbackFail, jsonBaseUrl, appPathFallback) 2 | { 3 | if (typeof jsonBaseUrl === "undefined" || jsonBaseUrl === null) 4 | jsonBaseUrl = appPath; 5 | var reqUrl = jsonBaseUrl + "json" + "?_" + encodeURIComponent(args.cmd); 6 | $.ajax({ 7 | type: "POST", 8 | url: reqUrl, 9 | contentType: "text/plain", 10 | data: JSON.stringify(args), 11 | dataType: "json", 12 | success: function (c) 13 | { 14 | callbackSuccess && callbackSuccess(c); 15 | }, 16 | error: function (jqXHR, textStatus, errorThrown) 17 | { 18 | if (jqXHR && jqXHR.status === 404) 19 | { 20 | if (jsonBaseUrl === appPath && appPath !== "" && !appPathFallback) 21 | { 22 | console.log('JSON API unreachable at "' + reqUrl + '"'); 23 | ExecJSON(args, callbackSuccess, callbackFail, "", true); // First fallback 24 | return; 25 | } 26 | else if (jsonBaseUrl === "" && appPath !== "/") 27 | { 28 | ExecJSON(args, callbackSuccess, callbackFail, "/", true); // Second fallback 29 | return; 30 | } 31 | } 32 | callbackFail && callbackFail(jqXHR, textStatus, errorThrown); 33 | } 34 | }); 35 | } 36 | var UrlParameters = { 37 | loaded: !1, 38 | parsed_url_params: {}, 39 | Get: function (a) 40 | { 41 | if (!this.loaded) 42 | { 43 | var b = this.parsed_url_params; 44 | window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi, function (a, c, e) 45 | { 46 | b[c.toLowerCase()] = decodeURIComponent(e) 47 | }); 48 | this.loaded = !0 49 | } 50 | return "undefined" != typeof this.parsed_url_params[a.toLowerCase()] ? this.parsed_url_params[a.toLowerCase()] : "" 51 | } 52 | }; -------------------------------------------------------------------------------- /ui3/libs-src/md5.js: -------------------------------------------------------------------------------- 1 | // From http://www.myersdaily.org/joseph/javascript/md5-text.html 2 | 3 | function md5cycle(x, k) { 4 | var a = x[0], b = x[1], c = x[2], d = x[3]; 5 | 6 | a = ff(a, b, c, d, k[0], 7, -680876936); 7 | d = ff(d, a, b, c, k[1], 12, -389564586); 8 | c = ff(c, d, a, b, k[2], 17, 606105819); 9 | b = ff(b, c, d, a, k[3], 22, -1044525330); 10 | a = ff(a, b, c, d, k[4], 7, -176418897); 11 | d = ff(d, a, b, c, k[5], 12, 1200080426); 12 | c = ff(c, d, a, b, k[6], 17, -1473231341); 13 | b = ff(b, c, d, a, k[7], 22, -45705983); 14 | a = ff(a, b, c, d, k[8], 7, 1770035416); 15 | d = ff(d, a, b, c, k[9], 12, -1958414417); 16 | c = ff(c, d, a, b, k[10], 17, -42063); 17 | b = ff(b, c, d, a, k[11], 22, -1990404162); 18 | a = ff(a, b, c, d, k[12], 7, 1804603682); 19 | d = ff(d, a, b, c, k[13], 12, -40341101); 20 | c = ff(c, d, a, b, k[14], 17, -1502002290); 21 | b = ff(b, c, d, a, k[15], 22, 1236535329); 22 | 23 | a = gg(a, b, c, d, k[1], 5, -165796510); 24 | d = gg(d, a, b, c, k[6], 9, -1069501632); 25 | c = gg(c, d, a, b, k[11], 14, 643717713); 26 | b = gg(b, c, d, a, k[0], 20, -373897302); 27 | a = gg(a, b, c, d, k[5], 5, -701558691); 28 | d = gg(d, a, b, c, k[10], 9, 38016083); 29 | c = gg(c, d, a, b, k[15], 14, -660478335); 30 | b = gg(b, c, d, a, k[4], 20, -405537848); 31 | a = gg(a, b, c, d, k[9], 5, 568446438); 32 | d = gg(d, a, b, c, k[14], 9, -1019803690); 33 | c = gg(c, d, a, b, k[3], 14, -187363961); 34 | b = gg(b, c, d, a, k[8], 20, 1163531501); 35 | a = gg(a, b, c, d, k[13], 5, -1444681467); 36 | d = gg(d, a, b, c, k[2], 9, -51403784); 37 | c = gg(c, d, a, b, k[7], 14, 1735328473); 38 | b = gg(b, c, d, a, k[12], 20, -1926607734); 39 | 40 | a = hh(a, b, c, d, k[5], 4, -378558); 41 | d = hh(d, a, b, c, k[8], 11, -2022574463); 42 | c = hh(c, d, a, b, k[11], 16, 1839030562); 43 | b = hh(b, c, d, a, k[14], 23, -35309556); 44 | a = hh(a, b, c, d, k[1], 4, -1530992060); 45 | d = hh(d, a, b, c, k[4], 11, 1272893353); 46 | c = hh(c, d, a, b, k[7], 16, -155497632); 47 | b = hh(b, c, d, a, k[10], 23, -1094730640); 48 | a = hh(a, b, c, d, k[13], 4, 681279174); 49 | d = hh(d, a, b, c, k[0], 11, -358537222); 50 | c = hh(c, d, a, b, k[3], 16, -722521979); 51 | b = hh(b, c, d, a, k[6], 23, 76029189); 52 | a = hh(a, b, c, d, k[9], 4, -640364487); 53 | d = hh(d, a, b, c, k[12], 11, -421815835); 54 | c = hh(c, d, a, b, k[15], 16, 530742520); 55 | b = hh(b, c, d, a, k[2], 23, -995338651); 56 | 57 | a = ii(a, b, c, d, k[0], 6, -198630844); 58 | d = ii(d, a, b, c, k[7], 10, 1126891415); 59 | c = ii(c, d, a, b, k[14], 15, -1416354905); 60 | b = ii(b, c, d, a, k[5], 21, -57434055); 61 | a = ii(a, b, c, d, k[12], 6, 1700485571); 62 | d = ii(d, a, b, c, k[3], 10, -1894986606); 63 | c = ii(c, d, a, b, k[10], 15, -1051523); 64 | b = ii(b, c, d, a, k[1], 21, -2054922799); 65 | a = ii(a, b, c, d, k[8], 6, 1873313359); 66 | d = ii(d, a, b, c, k[15], 10, -30611744); 67 | c = ii(c, d, a, b, k[6], 15, -1560198380); 68 | b = ii(b, c, d, a, k[13], 21, 1309151649); 69 | a = ii(a, b, c, d, k[4], 6, -145523070); 70 | d = ii(d, a, b, c, k[11], 10, -1120210379); 71 | c = ii(c, d, a, b, k[2], 15, 718787259); 72 | b = ii(b, c, d, a, k[9], 21, -343485551); 73 | 74 | x[0] = add32(a, x[0]); 75 | x[1] = add32(b, x[1]); 76 | x[2] = add32(c, x[2]); 77 | x[3] = add32(d, x[3]); 78 | 79 | } 80 | 81 | function cmn(q, a, b, x, s, t) { 82 | a = add32(add32(a, q), add32(x, t)); 83 | return add32((a << s) | (a >>> (32 - s)), b); 84 | } 85 | 86 | function ff(a, b, c, d, x, s, t) { 87 | return cmn((b & c) | ((~b) & d), a, b, x, s, t); 88 | } 89 | 90 | function gg(a, b, c, d, x, s, t) { 91 | return cmn((b & d) | (c & (~d)), a, b, x, s, t); 92 | } 93 | 94 | function hh(a, b, c, d, x, s, t) { 95 | return cmn(b ^ c ^ d, a, b, x, s, t); 96 | } 97 | 98 | function ii(a, b, c, d, x, s, t) { 99 | return cmn(c ^ (b | (~d)), a, b, x, s, t); 100 | } 101 | 102 | function md51(s) { 103 | txt = ''; 104 | var n = s.length, 105 | state = [1732584193, -271733879, -1732584194, 271733878], i; 106 | for (i=64; i<=s.length; i+=64) { 107 | md5cycle(state, md5blk(s.substring(i-64, i))); 108 | } 109 | s = s.substring(i-64); 110 | var tail = [0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0]; 111 | for (i=0; i>2] |= s.charCodeAt(i) << ((i%4) << 3); 113 | tail[i>>2] |= 0x80 << ((i%4) << 3); 114 | if (i > 55) { 115 | md5cycle(state, tail); 116 | for (i=0; i<16; i++) tail[i] = 0; 117 | } 118 | tail[14] = n*8; 119 | md5cycle(state, tail); 120 | return state; 121 | } 122 | 123 | /* there needs to be support for Unicode here, 124 | * unless we pretend that we can redefine the MD-5 125 | * algorithm for multi-byte characters (perhaps 126 | * by adding every four 16-bit characters and 127 | * shortening the sum to 32 bits). Otherwise 128 | * I suggest performing MD-5 as if every character 129 | * was two bytes--e.g., 0040 0025 = @%--but then 130 | * how will an ordinary MD-5 sum be matched? 131 | * There is no way to standardize text to something 132 | * like UTF-8 before transformation; speed cost is 133 | * utterly prohibitive. The JavaScript standard 134 | * itself needs to look at this: it should start 135 | * providing access to strings as preformed UTF-8 136 | * 8-bit unsigned value arrays. 137 | */ 138 | function md5blk(s) { /* I figured global was faster. */ 139 | var md5blks = [], i; /* Andy King said do it this way. */ 140 | for (i=0; i<64; i+=4) { 141 | md5blks[i>>2] = s.charCodeAt(i) 142 | + (s.charCodeAt(i+1) << 8) 143 | + (s.charCodeAt(i+2) << 16) 144 | + (s.charCodeAt(i+3) << 24); 145 | } 146 | return md5blks; 147 | } 148 | 149 | var hex_chr = '0123456789abcdef'.split(''); 150 | 151 | function rhex(n) 152 | { 153 | var s='', j=0; 154 | for(; j<4; j++) 155 | s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] 156 | + hex_chr[(n >> (j * 8)) & 0x0F]; 157 | return s; 158 | } 159 | 160 | function hex(x) { 161 | for (var i=0; i> 16) + (y >> 16) + (lsw >> 16); 184 | return (msw << 16) | (lsw & 0xFFFF); 185 | } 186 | } -------------------------------------------------------------------------------- /ui3/libs-src/nosleep.js.7z: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/libs-src/nosleep.js.7z -------------------------------------------------------------------------------- /ui3/libs-src/point-in-polygon.js: -------------------------------------------------------------------------------- 1 | /* 2 | The MIT License (MIT) 3 | 4 | Copyright (c) 2016 James Halliday 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | */ 24 | function pointInPolygon(point, vs) { 25 | // ray-casting algorithm based on 26 | // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html 27 | 28 | var x = point[0], y = point[1]; 29 | 30 | var inside = false; 31 | for (var i = 0, j = vs.length - 1; i < vs.length; j = i++) { 32 | var xi = vs[i][0], yi = vs[i][1]; 33 | var xj = vs[j][0], yj = vs[j][1]; 34 | 35 | var intersect = ((yi > y) != (yj > y)) 36 | && (x < (xj - xi) * (y - yi) / (yj - yi) + xi); 37 | if (intersect) inside = !inside; 38 | } 39 | 40 | return inside; 41 | }; -------------------------------------------------------------------------------- /ui3/libs-src/promise.polyfill.min.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(0,function(){"use strict";function e(e){var t=this.constructor;return this.then(function(n){return t.resolve(e()).then(function(){return n})},function(n){return t.resolve(e()).then(function(){return t.reject(n)})})}function t(e){return new this(function(t,n){function o(e,n){if(n&&("object"==typeof n||"function"==typeof n)){var f=n.then;if("function"==typeof f)return void f.call(n,function(t){o(e,t)},function(n){r[e]={status:"rejected",reason:n},0==--i&&t(r)})}r[e]={status:"fulfilled",value:n},0==--i&&t(r)}if(!e||"undefined"==typeof e.length)return n(new TypeError(typeof e+" "+e+" is not iterable(cannot read property Symbol(Symbol.iterator))"));var r=Array.prototype.slice.call(e);if(0===r.length)return t([]);for(var i=r.length,f=0;r.length>f;f++)o(f,r[f])})}function n(e){return!(!e||"undefined"==typeof e.length)}function o(){}function r(e){if(!(this instanceof r))throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=undefined,this._deferreds=[],l(e,this)}function i(e,t){for(;3===e._state;)e=e._value;0!==e._state?(e._handled=!0,r._immediateFn(function(){var n=1===e._state?t.onFulfilled:t.onRejected;if(null!==n){var o;try{o=n(e._value)}catch(r){return void u(t.promise,r)}f(t.promise,o)}else(1===e._state?f:u)(t.promise,e._value)})):e._deferreds.push(t)}function f(e,t){try{if(t===e)throw new TypeError("A promise cannot be resolved with itself.");if(t&&("object"==typeof t||"function"==typeof t)){var n=t.then;if(t instanceof r)return e._state=3,e._value=t,void c(e);if("function"==typeof n)return void l(function(e,t){return function(){e.apply(t,arguments)}}(n,t),e)}e._state=1,e._value=t,c(e)}catch(o){u(e,o)}}function u(e,t){e._state=2,e._value=t,c(e)}function c(e){2===e._state&&0===e._deferreds.length&&r._immediateFn(function(){e._handled||r._unhandledRejectionFn(e._value)});for(var t=0,n=e._deferreds.length;n>t;t++)i(e,e._deferreds[t]);e._deferreds=null}function l(e,t){var n=!1;try{e(function(e){n||(n=!0,f(t,e))},function(e){n||(n=!0,u(t,e))})}catch(o){if(n)return;n=!0,u(t,o)}}var a=setTimeout,s="undefined"!=typeof setImmediate?setImmediate:null;r.prototype["catch"]=function(e){return this.then(null,e)},r.prototype.then=function(e,t){var n=new this.constructor(o);return i(this,new function(e,t,n){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.promise=n}(e,t,n)),n},r.prototype["finally"]=e,r.all=function(e){return new r(function(t,o){function r(e,n){try{if(n&&("object"==typeof n||"function"==typeof n)){var u=n.then;if("function"==typeof u)return void u.call(n,function(t){r(e,t)},o)}i[e]=n,0==--f&&t(i)}catch(c){o(c)}}if(!n(e))return o(new TypeError("Promise.all accepts an array"));var i=Array.prototype.slice.call(e);if(0===i.length)return t([]);for(var f=i.length,u=0;i.length>u;u++)r(u,i[u])})},r.allSettled=t,r.resolve=function(e){return e&&"object"==typeof e&&e.constructor===r?e:new r(function(t){t(e)})},r.reject=function(e){return new r(function(t,n){n(e)})},r.race=function(e){return new r(function(t,o){if(!n(e))return o(new TypeError("Promise.race accepts an array"));for(var i=0,f=e.length;f>i;i++)r.resolve(e[i]).then(t,o)})},r._immediateFn="function"==typeof s&&function(e){s(e)}||function(e){a(e,0)},r._unhandledRejectionFn=function(e){void 0!==console&&console&&console.warn("Possible Unhandled Promise Rejection:",e)};var d=function(){if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if("undefined"!=typeof global)return global;throw Error("unable to locate global object")}();"function"!=typeof d.Promise?d.Promise=r:(d.Promise.prototype["finally"]||(d.Promise.prototype["finally"]=e),d.Promise.allSettled||(d.Promise.allSettled=t))}); 2 | -------------------------------------------------------------------------------- /ui3/libs-src/seeded-random.js: -------------------------------------------------------------------------------- 1 | // From https://stackoverflow.com/questions/521295/seeding-the-random-number-generator-in-javascript 2 | // and https://github.com/bryc/code/blob/master/jshash/PRNGs.md 3 | 4 | /** 5 | * Construct one of these and call its [rand] function to create random numbers using a specific seed. 6 | * @param {String} seed Seed string 7 | */ 8 | function SeededRandom(seed) 9 | { 10 | if (typeof seed !== "string") 11 | throw new Error("SeededRandom requires a seed string"); 12 | 13 | // Create xmur3 state: 14 | var seeder = xmur3(seed); 15 | 16 | // Output four 32-bit hashes to provide the seed for sfc32. 17 | var randGenFn = sfc32(seeder(), seeder(), seeder(), seeder()); 18 | 19 | /** Returns a random number between 0 and 1. */ 20 | this.rand = randGenFn; 21 | 22 | function xmur3(str) 23 | { 24 | for (var i = 0, h = 1779033703 ^ str.length; i < str.length; i++) 25 | { 26 | h = Math.imul(h ^ str.charCodeAt(i), 3432918353); 27 | h = h << 13 | h >>> 19; 28 | } 29 | return function () 30 | { 31 | h = Math.imul(h ^ (h >>> 16), 2246822507); 32 | h = Math.imul(h ^ (h >>> 13), 3266489909); 33 | return (h ^= h >>> 16) >>> 0; 34 | } 35 | } 36 | function sfc32(a, b, c, d) 37 | { 38 | return function () 39 | { 40 | a >>>= 0; b >>>= 0; c >>>= 0; d >>>= 0; 41 | var t = (a + b) | 0; 42 | a = b ^ b >>> 9; 43 | b = c + (c << 3) | 0; 44 | c = (c << 21 | c >>> 11); 45 | d = d + 1 | 0; 46 | t = t + d | 0; 47 | c = c + t | 0; 48 | return (t >>> 0) / 4294967296; 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /ui3/libs-src/simple-scrollbar.css: -------------------------------------------------------------------------------- 1 | .ss-wrapper { 2 | overflow: hidden; 3 | width: 100%; 4 | height: 100%; 5 | position: relative; 6 | z-index: 1; 7 | float: left; 8 | } 9 | 10 | .ss-content { 11 | height: 100%; 12 | width: 100%; 13 | padding: 0 32px 0 0; 14 | position: relative; 15 | right: -18px; 16 | overflow: auto; 17 | box-sizing: border-box; 18 | } 19 | 20 | .ss-scroll { 21 | position: relative; 22 | background: rgba(0, 0, 0, 0.1); 23 | width: 9px; 24 | border-radius: 4px; 25 | top: 0; 26 | z-index: 2; 27 | cursor: pointer; 28 | opacity: 0; 29 | transition: opacity 0.25s linear; 30 | } 31 | 32 | .ss-hidden { 33 | display: none; 34 | } 35 | 36 | .ss-container:hover .ss-scroll { 37 | opacity: 1; 38 | } 39 | 40 | .ss-grabbed { 41 | -o-user-select: none; 42 | -ms-user-select: none; 43 | -moz-user-select: none; 44 | -webkit-user-select: none; 45 | user-select: none; 46 | } 47 | -------------------------------------------------------------------------------- /ui3/libs-src/simple-scrollbar.min.js: -------------------------------------------------------------------------------- 1 | // MIT License 2 | (function(e,d){function g(a){a.hasOwnProperty("data-simple-scrollbar")||Object.defineProperty(a,"data-simple-scrollbar",new SimpleScrollbar(a))}function l(a,b){function c(a){var c=a.pageY-e;e=a.pageY;h(function(){b.el.scrollTop+=c/b.scrollRatio})}function f(){a.classList.remove("ss-grabbed");d.body.classList.remove("ss-grabbed");d.removeEventListener("mousemove",c);d.removeEventListener("mouseup",f)}var e;a.addEventListener("mousedown",function(b){e=b.pageY;a.classList.add("ss-grabbed");d.body.classList.add("ss-grabbed"); 3 | d.addEventListener("mousemove",c);d.addEventListener("mouseup",f);return!1})}function f(a){this.target=a;this.bar='
    ';this.wrapper=d.createElement("div");this.wrapper.setAttribute("class","ss-wrapper");this.el=d.createElement("div");this.el.setAttribute("class","ss-content");for(this.wrapper.appendChild(this.el);this.target.firstChild;)this.el.appendChild(this.target.firstChild);this.target.appendChild(this.wrapper);this.target.insertAdjacentHTML("beforeend",this.bar);this.bar= 4 | this.target.lastChild;l(this.bar,this);this.moveBar();this.el.addEventListener("scroll",this.moveBar.bind(this));this.el.addEventListener("mouseenter",this.moveBar.bind(this));this.target.classList.add("ss-container");var b=window.getComputedStyle(a);"0px"===b.height&&"0px"!==b["max-height"]&&(a.style.height=b["max-height"])}function k(){for(var a=d.querySelectorAll("*[ss-container]"),b=0;bdiv{position:relative;overflow:hidden;margin:0 0 6px;padding:15px 15px 15px 50px;width:300px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background-position:15px center;background-repeat:no-repeat;-moz-box-shadow:0 0 12px #999;-webkit-box-shadow:0 0 12px #999;box-shadow:0 0 12px #999;color:#fff;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}#toast-container>:hover{-moz-box-shadow:0 0 12px #000;-webkit-box-shadow:0 0 12px #000;box-shadow:0 0 12px #000;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100);cursor:pointer}#toast-container>.toast-info{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=)!important}#toast-container>.toast-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=)!important}#toast-container>.toast-success{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==)!important}#toast-container>.toast-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=)!important}#toast-container.toast-bottom-center>div,#toast-container.toast-top-center>div{width:300px;margin:auto}#toast-container.toast-bottom-full-width>div,#toast-container.toast-top-full-width>div{width:96%;margin:auto}.toast{background-color:#030303}.toast-success{background-color:#51a351}.toast-error{background-color:#bd362f}.toast-info{background-color:#2f96b4}.toast-warning{background-color:#f89406}.toast-progress{position:absolute;left:0;bottom:0;height:4px;background-color:#000;opacity:.4;-ms-filter:alpha(Opacity=40);filter:alpha(opacity=40)}@media all and (max-width:240px){#toast-container>div{padding:8px 8px 8px 50px;width:11em}#toast-container .toast-close-button{right:-.2em;top:-.2em}}@media all and (min-width:241px) and (max-width:480px){#toast-container>div{padding:8px 8px 8px 50px;width:18em}#toast-container .toast-close-button{right:-.2em;top:-.2em}}@media all and (min-width:481px) and (max-width:768px){#toast-container>div{padding:15px 15px 15px 50px;width:25em}} -------------------------------------------------------------------------------- /ui3/libs-src/toastr.min.js: -------------------------------------------------------------------------------- 1 | !function(e){e(["jquery"],function(e){return function(){function t(e,t,n){return f({type:O.error,iconClass:g().iconClasses.error,message:e,optionsOverride:n,title:t})}function n(t,n){return t||(t=g()),v=e("#"+t.containerId),v.length?v:(n&&(v=c(t)),v)}function i(e,t,n){return f({type:O.info,iconClass:g().iconClasses.info,message:e,optionsOverride:n,title:t})}function o(e){w=e}function s(e,t,n){return f({type:O.success,iconClass:g().iconClasses.success,message:e,optionsOverride:n,title:t})}function a(e,t,n){return f({type:O.warning,iconClass:g().iconClasses.warning,message:e,optionsOverride:n,title:t})}function r(e){var t=g();v||n(t),l(e,t)||u(t)}function d(t){var i=g();return v||n(i),t&&0===e(":focus",t).length?void h(t):void(v.children().length&&v.remove())}function u(t){for(var n=v.children(),i=n.length-1;i>=0;i--)l(e(n[i]),t)}function l(t,n){return t&&0===e(":focus",t).length?(t[n.hideMethod]({duration:n.hideDuration,easing:n.hideEasing,complete:function(){h(t)}}),!0):!1}function c(t){return v=e("
    ").attr("id",t.containerId).addClass(t.positionClass).attr("aria-live","polite").attr("role","alert"),v.appendTo(e(t.target)),v}function p(){return{tapToDismiss:!0,toastClass:"toast",containerId:"toast-container",debug:!1,showMethod:"fadeIn",showDuration:300,showEasing:"swing",onShown:void 0,hideMethod:"fadeOut",hideDuration:1e3,hideEasing:"swing",onHidden:void 0,extendedTimeOut:1e3,iconClasses:{error:"toast-error",info:"toast-info",success:"toast-success",warning:"toast-warning"},iconClass:"toast-info",positionClass:"toast-top-right",timeOut:5e3,titleClass:"toast-title",messageClass:"toast-message",target:"body",closeHtml:'',newestOnTop:!0,preventDuplicates:!1,progressBar:!1}}function m(e){w&&w(e)}function f(t){function i(t){return!e(":focus",l).length||t?(clearTimeout(O.intervalId),l[r.hideMethod]({duration:r.hideDuration,easing:r.hideEasing,complete:function(){h(l),r.onHidden&&"hidden"!==b.state&&r.onHidden(),b.state="hidden",b.endTime=new Date,m(b)}})):void 0}function o(){(r.timeOut>0||r.extendedTimeOut>0)&&(u=setTimeout(i,r.extendedTimeOut),O.maxHideTime=parseFloat(r.extendedTimeOut),O.hideEta=(new Date).getTime()+O.maxHideTime)}function s(){clearTimeout(u),O.hideEta=0,l.stop(!0,!0)[r.showMethod]({duration:r.showDuration,easing:r.showEasing})}function a(){var e=(O.hideEta-(new Date).getTime())/O.maxHideTime*100;f.width(e+"%")}var r=g(),d=t.iconClass||r.iconClass;if("undefined"!=typeof t.optionsOverride&&(r=e.extend(r,t.optionsOverride),d=t.optionsOverride.iconClass||d),r.preventDuplicates){if(t.message===C)return;C=t.message}T++,v=n(r,!0);var u=null,l=e("
    "),c=e("
    "),p=e("
    "),f=e("
    "),w=e(r.closeHtml),O={intervalId:null,hideEta:null,maxHideTime:null},b={toastId:T,state:"visible",startTime:new Date,options:r,map:t};return t.iconClass&&l.addClass(r.toastClass).addClass(d),t.title&&(c.append(t.title).addClass(r.titleClass),l.append(c)),t.message&&(p.append(t.message).addClass(r.messageClass),l.append(p)),r.closeButton&&(w.addClass("toast-close-button").attr("role","button"),l.prepend(w)),r.progressBar&&(f.addClass("toast-progress"),l.prepend(f)),l.hide(),r.newestOnTop?v.prepend(l):v.append(l),l[r.showMethod]({duration:r.showDuration,easing:r.showEasing,complete:r.onShown}),r.timeOut>0&&(u=setTimeout(i,r.timeOut),O.maxHideTime=parseFloat(r.timeOut),O.hideEta=(new Date).getTime()+O.maxHideTime,r.progressBar&&(O.intervalId=setInterval(a,10))),l.hover(s,o),!r.onclick&&r.tapToDismiss&&l.click(i),r.closeButton&&w&&w.click(function(e){e.stopPropagation?e.stopPropagation():void 0!==e.cancelBubble&&e.cancelBubble!==!0&&(e.cancelBubble=!0),i(!0)}),r.onclick&&l.click(function(){r.onclick(),i()}),m(b),r.debug&&console&&console.log(b),l}function g(){return e.extend({},p(),b.options)}function h(e){v||(v=n()),e.is(":visible")||(e.remove(),e=null,0===v.children().length&&(v.remove(),C=void 0))}var v,w,C,T=0,O={error:"error",info:"info",success:"success",warning:"warning"},b={clear:r,remove:d,error:t,getContainer:n,info:i,options:{},subscribe:o,success:s,version:"2.1.0",warning:a};return b}()})}("function"==typeof define&&define.amd?define:function(e,t){"undefined"!=typeof module&&module.exports?module.exports=t(require("jquery")):window.toastr=t(window.jQuery)}); -------------------------------------------------------------------------------- /ui3/libs-src/wdContextMenu/change_notice.txt: -------------------------------------------------------------------------------- 1 | CHANGE NOTICE 2 | 3 | The script and CSS of this library have been significantly modified by the UI2/UI3 projects. -------------------------------------------------------------------------------- /ui3/libs-src/wdContextMenu/contextmenu.css: -------------------------------------------------------------------------------- 1 | .b-m-mpanel { 2 | background-color: #F0F0F0; 3 | border: 1px solid #718BB7; 4 | padding: 2px 0; 5 | position: absolute; 6 | z-index: 99997; 7 | left:0px; 8 | top:0px; 9 | color: Black; 10 | font-size: 12px; 11 | cursor: default; 12 | } 13 | .b-m-split { 14 | height: 0px; 15 | border-top: 1px solid #D0CFCF; 16 | border-bottom: 1px solid #FFFFFF; 17 | font-size: 0px; 18 | margin: 2px 2px; 19 | } 20 | .b-m-item, .b-m-idisable 21 | { 22 | padding: 3px 1px; 23 | border: 1px solid transparent; 24 | margin: 0 2px 0 3px; 25 | cursor: normal; 26 | line-height: 100%; 27 | } 28 | .b-m-idisable 29 | { 30 | color:#808080; 31 | } 32 | .b-m-ibody, .b-m-arrow { 33 | overflow: hidden; 34 | text-overflow: ellipsis; 35 | 36 | } 37 | .b-m-arrow { 38 | background: url(data:image/gif;base64,R0lGODlhBQAJAMQUAFSg6UGJ2TyE04rD/CluvlWUzo7D9ixwwDiC1j2I3UeLyTmE0zJ1v2eg1Tp6zmKq8ZXL/ypxv1Kg7Ct1yv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABQALAAAAAAFAAkAAAUcIEKNVCKQE7SMkzEE1AQ8DTNJRRQrBHuQDhIlBAA7) right no-repeat; 39 | } 40 | .b-m-idisable .b-m-arrow 41 | { 42 | background:none; 43 | } 44 | .b-m-icon 45 | { 46 | display: inline-block; 47 | vertical-align:middle; 48 | margin-right: 8px; 49 | width: 16px; 50 | height: 16px; 51 | } 52 | .b-m-ifocus { 53 | background: url(data:image/gif;base64,R0lGODlhAQAWAIAAAOvz/dno+yH5BAAAAAAALAAAAAABABYAAAIFhI+hy1oAOw==) repeat-x bottom; 54 | border: 1px solid #AACCF6; 55 | padding: 3px 1px; 56 | margin: 0 2px 0 3px; 57 | cursor: normal; 58 | line-height:100%; 59 | } 60 | .b-m-idisable .b-m-icon { 61 | visibility:hidden; 62 | } -------------------------------------------------------------------------------- /ui3/libs-src/wdContextMenu/m_arrow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/libs-src/wdContextMenu/m_arrow.gif -------------------------------------------------------------------------------- /ui3/libs-src/wdContextMenu/m_item.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/libs-src/wdContextMenu/m_item.gif -------------------------------------------------------------------------------- /ui3/libs-src/wdContextMenu/m_splitLine.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/libs-src/wdContextMenu/m_splitLine.gif -------------------------------------------------------------------------------- /ui3/libs-src/wdContextMenu/menu_bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/libs-src/wdContextMenu/menu_bg.gif -------------------------------------------------------------------------------- /ui3/libs-src/wdContextMenu/readme: -------------------------------------------------------------------------------- 1 | 1. Introduction 2 | This is wdTree version1.4 and allowed to use freely (LGPL). 3 | 4 | 2. Browsers Supported 5 | FireFox2.0+ IE6+ Opera9+ Safari3+ Chrome 6 | 7 | 3. Installation & Usage 8 | Download the package and unzip to a directory. 9 | Copy unzipped directory to apache www directory/sub-directory. 10 | Open sample.htm in your browser. 11 | 12 | 13 | 4. About web-delicious.com 14 | We are an IT outsourcing company location in Shanghai, China. 15 | We provide end-to-end solutions in web development (Web 2.0, PHP, ASP.NET, ASP, JSP, XML, Flash), 16 | application development and IT consulting services at very reasonable price. 17 | www.web-delicious.com 18 | 19 | 20 | 5.Credits 21 | jQuery is a new kind of JavaScript Library. http://jquery.com/ 22 | SyntaxHighlighter is a fully functional self-contained code syntax highlighter developed in JavaScript. 23 | http://alexgorbatchev.com/wiki/SyntaxHighlighter 24 | 25 | -------------------------------------------------------------------------------- /ui3/libs-src/zebra_datepicker/change_notice.txt: -------------------------------------------------------------------------------- 1 | CHANGE NOTICE 2 | 3 | The script and CSS of this library have been significantly modified by the UI2/UI3 projects. -------------------------------------------------------------------------------- /ui3/libs-src/zebra_datepicker/default.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Zebra_DatePicker: a lightweight jQuery date picker plugin 4 | 5 | Default theme 6 | 7 | copyright (c) 2011 - 2014 Stefan Gabos 8 | http://stefangabos.ro/jquery/zebra-datepicker/ 9 | 10 | */ 11 | 12 | .Zebra_DatePicker *, 13 | .Zebra_DatePicker *:after, 14 | .Zebra_DatePicker *:before { -moz-box-sizing: content-box !important; -webkit-box-sizing: content-box !important; box-sizing: content-box !important } 15 | 16 | .Zebra_DatePicker { position: absolute; background: #666; border: 3px solid #666; z-index: 1200; font-family: Tahoma, Arial, Helvetica, sans-serif; font-size: 13px; top: 0 } 17 | 18 | .Zebra_DatePicker * { margin: 0; padding: 0; color: #000; background: transparent; border: none } 19 | 20 | /* = GLOBALS 21 | ----------------------------------------------------------------------------------------------------------------------*/ 22 | .Zebra_DatePicker table { border-collapse: collapse; border-spacing: 0; width: auto; table-layout: auto; } 23 | 24 | .Zebra_DatePicker td, 25 | .Zebra_DatePicker th { text-align: center; padding: 5px 0 } 26 | 27 | .Zebra_DatePicker td { cursor: pointer } 28 | 29 | .Zebra_DatePicker .dp_daypicker, 30 | .Zebra_DatePicker .dp_monthpicker, 31 | .Zebra_DatePicker .dp_yearpicker { margin-top: 3px } 32 | 33 | .Zebra_DatePicker .dp_daypicker td, 34 | .Zebra_DatePicker .dp_daypicker th, 35 | .Zebra_DatePicker .dp_monthpicker td, 36 | .Zebra_DatePicker .dp_yearpicker td { background: #E8E8E8; width: 30px; border: 1px solid #7BACD2 } 37 | 38 | .Zebra_DatePicker, 39 | .Zebra_DatePicker .dp_header .dp_hover, 40 | .Zebra_DatePicker .dp_footer .dp_hover { -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px } 41 | 42 | /* = VISIBLE/HIDDEN STATES (USE TRANSITIONS FOR EFFECTS) 43 | ----------------------------------------------------------------------------------------------------------------------*/ 44 | .Zebra_DatePicker.dp_visible { visibility: visible; filter: alpha(opacity=100); -khtml-opacity: 1; -moz-opacity: 1; opacity: 1; transition: opacity 0.2s ease-in-out } 45 | .Zebra_DatePicker.dp_hidden { visibility: hidden; filter: alpha(opacity=0); -khtml-opacity: 0; -moz-opacity: 0; opacity: 0 } 46 | 47 | /* = HEADER 48 | ----------------------------------------------------------------------------------------------------------------------*/ 49 | .Zebra_DatePicker .dp_header td { color: #FFF } 50 | 51 | .Zebra_DatePicker .dp_header .dp_previous, 52 | .Zebra_DatePicker .dp_header .dp_next { width: 30px } 53 | 54 | .Zebra_DatePicker .dp_header .dp_caption { font-weight: bold } 55 | .Zebra_DatePicker .dp_header .dp_hover { background: #222; color: #FFF } 56 | 57 | /* = DATEPICKER 58 | ----------------------------------------------------------------------------------------------------------------------*/ 59 | .Zebra_DatePicker .dp_daypicker th { background: #FFCC33 } 60 | .Zebra_DatePicker td.dp_not_in_month { background: #F3F3F3; color: #CDCDCD; cursor: default } 61 | .Zebra_DatePicker td.dp_not_in_month_selectable { background: #F3F3F3; color: #CDCDCD; cursor: pointer } 62 | .Zebra_DatePicker td.dp_weekend { background: #D8D8D8 } 63 | .Zebra_DatePicker td.dp_weekend_disabled { color: #CCC; cursor: default } 64 | .Zebra_DatePicker td.dp_selected { background: #5A4B4B; color: #FFF !important } 65 | .Zebra_DatePicker td.dp_week_number { background: #FFCC33; color: #555; cursor: text; font-style: italic } 66 | 67 | /* = MONTHPICKER 68 | ----------------------------------------------------------------------------------------------------------------------*/ 69 | .Zebra_DatePicker .dp_monthpicker td { width: 33% } 70 | 71 | /* = YEARPICKER 72 | ----------------------------------------------------------------------------------------------------------------------*/ 73 | .Zebra_DatePicker .dp_yearpicker td { width: 33% } 74 | 75 | /* = FOOTER 76 | ----------------------------------------------------------------------------------------------------------------------*/ 77 | .Zebra_DatePicker .dp_footer { margin-top: 3px } 78 | .Zebra_DatePicker .dp_footer .dp_hover { background: #222; color: #FFF } 79 | 80 | /* = SELECT CURRENT DAY 81 | ----------------------------------------------------------------------------------------------------------------------*/ 82 | .Zebra_DatePicker .dp_today { color: #FFF; padding: 3px } 83 | 84 | /* = CLEAR DATE 85 | ----------------------------------------------------------------------------------------------------------------------*/ 86 | .Zebra_DatePicker .dp_clear { color: #FFF; padding: 3px } 87 | 88 | /* = SOME MORE GLOBALS (MUST BE LAST IN ORDER TO OVERWRITE PREVIOUS PROPERTIES) 89 | ----------------------------------------------------------------------------------------------------------------------*/ 90 | .Zebra_DatePicker td.dp_current { color: #C40000 } 91 | .Zebra_DatePicker td.dp_disabled_current { color: #E38585 } 92 | .Zebra_DatePicker td.dp_disabled { background: #F3F3F3; color: #CDCDCD; cursor: default } 93 | .Zebra_DatePicker td.dp_hover { background: #482424; color: #FFF } 94 | 95 | /* = ICON 96 | ----------------------------------------------------------------------------------------------------------------------*/ 97 | button.Zebra_DatePicker_Icon { display: block; position: absolute; width: 16px; height: 16px; background: url('../images/calendar.png') no-repeat left top; text-indent: -9000px; border: none; cursor: pointer; padding: 0; line-height: 0; vertical-align: top } 98 | button.Zebra_DatePicker_Icon_Disabled { background-image: url('../images/calendar-disabled.png') } 99 | 100 | /* don't set vertical margins! */ 101 | button.Zebra_DatePicker_Icon { margin: 0 0 0 3px } 102 | button.Zebra_DatePicker_Icon_Inside_Right { margin: 0 3px 0 0 } 103 | button.Zebra_DatePicker_Icon_Inside_Left { margin: 0 0 0 3px } -------------------------------------------------------------------------------- /ui3/noimage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/noimage.png -------------------------------------------------------------------------------- /ui3/pnacl/pnacl_player.nmf: -------------------------------------------------------------------------------- 1 | { 2 | "program": { 3 | "portable": { 4 | "pnacl-translate": { 5 | "url": "pnacl_player.pexe" 6 | }, 7 | "pnacl-debug": { 8 | "url": "pnacl_player_unstripped.bc" 9 | } 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /ui3/pnacl/pnacl_player.pexe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/pnacl/pnacl_player.pexe -------------------------------------------------------------------------------- /ui3/reset.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Reset UI3 Settings 5 | 11 | 12 | 13 |

    Reset UI3 Settings

    14 |

    UI3 stores its settings in your browser using Local Storage.

    15 |

    The button below will clear all items in Local Storage for the origin "[ERROR]":

    16 |

    17 |

    This affects only the web browser you are currently accessing this page with.

    18 |

    For more information and advanced storage management, including the ability to import and export your settings, visit storageinfo.htm.

    19 |

    Go to UI3

    20 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /ui3/trigger24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bp2008/ui3/3305fad8635035df1afe2b76c54010de76c0aa86/ui3/trigger24.png -------------------------------------------------------------------------------- /ui3serviceworker.js: -------------------------------------------------------------------------------- 1 | // Currently, UI3's service worker does not do anything meaningful, but in the future it may extended to handle Web Push notifications or other background tasks. 2 | 3 | self.addEventListener('install', function (event) 4 | { 5 | console.log('UI3 Service Worker installing...'); 6 | self.skipWaiting(); 7 | }); 8 | 9 | self.addEventListener('activate', function (event) 10 | { 11 | console.log('UI3 Service Worker activating...'); 12 | }); 13 | 14 | self.addEventListener('fetch', function (event) 15 | { 16 | // Stub necessary for browser to suggest installing PWA. 17 | }); 18 | 19 | 20 | --------------------------------------------------------------------------------