| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  | "use strict"; | 
					
						
							| 
									
										
										
										
											2015-10-09 06:49:18 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-14 19:29:35 +08:00
										 |  |  | // Url retrieval function
 | 
					
						
							|  |  |  | window.baseUrl = function(path) { | 
					
						
							|  |  |  |     let basePath = document.querySelector('meta[name="base-url"]').getAttribute('content'); | 
					
						
							|  |  |  |     if (basePath[basePath.length-1] === '/') basePath = basePath.slice(0, basePath.length-1); | 
					
						
							|  |  |  |     if (path[0] === '/') path = path.slice(1); | 
					
						
							|  |  |  |     return basePath + '/' + path; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-15 01:47:33 +08:00
										 |  |  | const Vue = require("vue"); | 
					
						
							|  |  |  | const axios = require("axios"); | 
					
						
							| 
									
										
										
										
											2017-04-10 03:59:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | let axiosInstance = axios.create({ | 
					
						
							|  |  |  |     headers: { | 
					
						
							|  |  |  |         'X-CSRF-TOKEN': document.querySelector('meta[name=token]').getAttribute('content'), | 
					
						
							| 
									
										
										
										
											2017-04-15 01:47:33 +08:00
										 |  |  |         'baseURL': window.baseUrl('') | 
					
						
							| 
									
										
										
										
											2017-04-10 03:59:57 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2017-07-03 02:35:13 +08:00
										 |  |  | window.$http = axiosInstance; | 
					
						
							| 
									
										
										
										
											2017-04-10 03:59:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Vue.prototype.$http = axiosInstance; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-15 01:47:33 +08:00
										 |  |  | require("./vues/vues"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-10 03:59:57 +08:00
										 |  |  | // AngularJS - Create application and load components
 | 
					
						
							| 
									
										
										
										
											2017-04-15 01:47:33 +08:00
										 |  |  | const angular = require("angular"); | 
					
						
							|  |  |  | require("angular-resource"); | 
					
						
							|  |  |  | require("angular-animate"); | 
					
						
							|  |  |  | require("angular-sanitize"); | 
					
						
							|  |  |  | require("angular-ui-sortable"); | 
					
						
							| 
									
										
										
										
											2017-04-10 03:59:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-20 03:16:31 +08:00
										 |  |  | let ngApp = angular.module('bookStack', ['ngResource', 'ngAnimate', 'ngSanitize', 'ui.sortable']); | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  | // Translation setup
 | 
					
						
							|  |  |  | // Creates a global function with name 'trans' to be used in the same way as Laravel's translation system
 | 
					
						
							| 
									
										
										
										
											2017-04-15 01:47:33 +08:00
										 |  |  | const Translations = require("./translations"); | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  | let translator = new Translations(window.translations); | 
					
						
							|  |  |  | window.trans = translator.get.bind(translator); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  | // Global Event System
 | 
					
						
							| 
									
										
										
										
											2016-08-31 03:05:59 +08:00
										 |  |  | class EventManager { | 
					
						
							| 
									
										
										
										
											2016-07-27 01:03:10 +08:00
										 |  |  |     constructor() { | 
					
						
							|  |  |  |         this.listeners = {}; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     emit(eventName, eventData) { | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  |         if (typeof this.listeners[eventName] === 'undefined') return this; | 
					
						
							| 
									
										
										
										
											2016-12-20 03:16:31 +08:00
										 |  |  |         let eventsToStart = this.listeners[eventName]; | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  |         for (let i = 0; i < eventsToStart.length; i++) { | 
					
						
							| 
									
										
										
										
											2016-12-20 03:16:31 +08:00
										 |  |  |             let event = eventsToStart[i]; | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  |             event(eventData); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return this; | 
					
						
							| 
									
										
										
										
											2016-07-27 01:03:10 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     listen(eventName, callback) { | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  |         if (typeof this.listeners[eventName] === 'undefined') this.listeners[eventName] = []; | 
					
						
							|  |  |  |         this.listeners[eventName].push(callback); | 
					
						
							|  |  |  |         return this; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-11-12 20:41:34 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-12 20:41:34 +08:00
										 |  |  | window.Events = new EventManager(); | 
					
						
							| 
									
										
										
										
											2017-04-10 03:59:57 +08:00
										 |  |  | Vue.prototype.$events = window.Events; | 
					
						
							| 
									
										
										
										
											2016-08-14 19:29:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-12 20:41:34 +08:00
										 |  |  | // Load in angular specific items
 | 
					
						
							| 
									
										
										
										
											2017-04-15 01:47:33 +08:00
										 |  |  | const Services = require('./services'); | 
					
						
							|  |  |  | const Directives = require('./directives'); | 
					
						
							|  |  |  | const Controllers = require('./controllers'); | 
					
						
							| 
									
										
										
										
											2016-11-12 20:41:34 +08:00
										 |  |  | Services(ngApp, window.Events); | 
					
						
							|  |  |  | Directives(ngApp, window.Events); | 
					
						
							|  |  |  | Controllers(ngApp, window.Events); | 
					
						
							| 
									
										
										
										
											2015-12-31 02:38:18 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | //Global jQuery Config & Extensions
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Smooth scrolling
 | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  | jQuery.fn.smoothScrollTo = function () { | 
					
						
							|  |  |  |     if (this.length === 0) return; | 
					
						
							| 
									
										
										
										
											2017-01-15 00:36:12 +08:00
										 |  |  |     $('html, body').animate({ | 
					
						
							| 
									
										
										
										
											2015-12-31 02:38:18 +08:00
										 |  |  |         scrollTop: this.offset().top - 60 // Adjust to change final scroll position top margin
 | 
					
						
							| 
									
										
										
										
											2017-01-15 00:36:12 +08:00
										 |  |  |     }, 300); // Adjust to change animations speed (ms)
 | 
					
						
							| 
									
										
										
										
											2015-12-31 02:38:18 +08:00
										 |  |  |     return this; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Making contains text expression not worry about casing
 | 
					
						
							| 
									
										
										
										
											2016-07-27 01:03:10 +08:00
										 |  |  | jQuery.expr[":"].contains = $.expr.createPseudo(function (arg) { | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |     return function (elem) { | 
					
						
							| 
									
										
										
										
											2015-12-31 02:38:18 +08:00
										 |  |  |         return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2015-12-30 00:39:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-09 06:49:18 +08:00
										 |  |  | // Global jQuery Elements
 | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  | let notifications = $('.notification'); | 
					
						
							|  |  |  | let successNotification = notifications.filter('.pos'); | 
					
						
							|  |  |  | let errorNotification = notifications.filter('.neg'); | 
					
						
							|  |  |  | let warningNotification = notifications.filter('.warning'); | 
					
						
							|  |  |  | // Notification Events
 | 
					
						
							|  |  |  | window.Events.listen('success', function (text) { | 
					
						
							|  |  |  |     successNotification.hide(); | 
					
						
							|  |  |  |     successNotification.find('span').text(text); | 
					
						
							|  |  |  |     setTimeout(() => { | 
					
						
							|  |  |  |         successNotification.show(); | 
					
						
							|  |  |  |     }, 1); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | window.Events.listen('warning', function (text) { | 
					
						
							|  |  |  |     warningNotification.find('span').text(text); | 
					
						
							|  |  |  |     warningNotification.show(); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | window.Events.listen('error', function (text) { | 
					
						
							|  |  |  |     errorNotification.find('span').text(text); | 
					
						
							|  |  |  |     errorNotification.show(); | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2016-12-24 23:21:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  | // Notification hiding
 | 
					
						
							|  |  |  | notifications.click(function () { | 
					
						
							|  |  |  |     $(this).fadeOut(100); | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2016-12-24 23:21:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  | // Chapter page list toggles
 | 
					
						
							|  |  |  | $('.chapter-toggle').click(function (e) { | 
					
						
							|  |  |  |     e.preventDefault(); | 
					
						
							|  |  |  |     $(this).toggleClass('open'); | 
					
						
							|  |  |  |     $(this).closest('.chapter').find('.inset-list').slideToggle(180); | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2016-12-24 23:21:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  | // Back to top button
 | 
					
						
							|  |  |  | $('#back-to-top').click(function() { | 
					
						
							|  |  |  |      $('#header').smoothScrollTo(); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | let scrollTopShowing = false; | 
					
						
							|  |  |  | let scrollTop = document.getElementById('back-to-top'); | 
					
						
							|  |  |  | let scrollTopBreakpoint = 1200; | 
					
						
							|  |  |  | window.addEventListener('scroll', function() { | 
					
						
							|  |  |  |     let scrollTopPos = document.documentElement.scrollTop || document.body.scrollTop || 0; | 
					
						
							|  |  |  |     if (!scrollTopShowing && scrollTopPos > scrollTopBreakpoint) { | 
					
						
							|  |  |  |         scrollTop.style.display = 'block'; | 
					
						
							|  |  |  |         scrollTopShowing = true; | 
					
						
							|  |  |  |         setTimeout(() => { | 
					
						
							|  |  |  |             scrollTop.style.opacity = 0.4; | 
					
						
							|  |  |  |         }, 1); | 
					
						
							|  |  |  |     } else if (scrollTopShowing && scrollTopPos < scrollTopBreakpoint) { | 
					
						
							|  |  |  |         scrollTop.style.opacity = 0; | 
					
						
							|  |  |  |         scrollTopShowing = false; | 
					
						
							|  |  |  |         setTimeout(() => { | 
					
						
							|  |  |  |             scrollTop.style.display = 'none'; | 
					
						
							|  |  |  |         }, 500); | 
					
						
							| 
									
										
										
										
											2016-09-03 17:32:14 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2016-09-03 17:32:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  | // Common jQuery actions
 | 
					
						
							|  |  |  | $('[data-action="expand-entity-list-details"]').click(function() { | 
					
						
							|  |  |  |     $('.entity-list.compact').find('p').not('.empty-text').slideToggle(240); | 
					
						
							| 
									
										
										
										
											2015-10-08 06:17:48 +08:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-12 16:14:37 +08:00
										 |  |  | // Toggle thumbnail::hide image and reduce grid size
 | 
					
						
							| 
									
										
										
										
											2017-07-12 14:10:50 +08:00
										 |  |  | $(document).ready(function(){ | 
					
						
							|  |  |  |    $('[data-action="expand-thumbnail"]').click(function(){ | 
					
						
							| 
									
										
										
										
											2017-07-12 16:14:37 +08:00
										 |  |  |      $('.gallery-item').toggleClass("collapse").find('img').slideToggle(50); | 
					
						
							| 
									
										
										
										
											2017-07-12 14:10:50 +08:00
										 |  |  |    }); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  | // Popup close
 | 
					
						
							|  |  |  | $('.popup-close').click(function() { | 
					
						
							|  |  |  |     $(this).closest('.overlay').fadeOut(240); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | $('.overlay').click(function(event) { | 
					
						
							|  |  |  |     if (!$(event.target).hasClass('overlay')) return; | 
					
						
							|  |  |  |     $(this).fadeOut(240); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Detect IE for css
 | 
					
						
							|  |  |  | if(navigator.userAgent.indexOf('MSIE')!==-1 | 
					
						
							|  |  |  |     || navigator.appVersion.indexOf('Trident/') > 0 | 
					
						
							|  |  |  |     || navigator.userAgent.indexOf('Safari') !== -1){ | 
					
						
							|  |  |  |     $('body').addClass('flexbox-support'); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-31 04:48:57 +08:00
										 |  |  | // Page specific items
 | 
					
						
							| 
									
										
										
										
											2017-04-15 01:47:33 +08:00
										 |  |  | require("./pages/page-show"); |