custom.js 62 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672
  1. /*jslint browser: true*/
  2. /*global $, jQuery, alert*/
  3. var idleTime = 0;
  4. var hasCookie = false;
  5. $(document).ajaxComplete(function () {
  6. pageLoad();
  7. });
  8. $(document).ready(function () {
  9. pageLoad();
  10. var clipboard = new Clipboard('.clipboard');
  11. clipboard.on('success', function(e) {
  12. message('Clipboard',e.text,'bottom-right','#FFF','info','5000');
  13. e.clearSelection();
  14. });
  15. /* ===========================================================
  16. Loads the correct sidebar on window load.
  17. collapses the sidebar on window resize.
  18. Sets the min-height of #page-wrapper to window size.
  19. =========================================================== */
  20. "use strict";
  21. var body = $("body");
  22. $(function () {
  23. //$("#preloader").fadeOut();
  24. var set = function () {
  25. var topOffset = 60,
  26. width = (window.innerWidth > 0) ? window.innerWidth : this.screen.width,
  27. height = ((window.innerHeight > 0) ? window.innerHeight : this.screen.height) - 1;
  28. if (width < 768) {
  29. $('div.navbar-collapse').addClass('collapse');
  30. topOffset = 100; /* 2-row-menu */
  31. } else {
  32. $('div.navbar-collapse').removeClass('collapse');
  33. }
  34. /* ===== This is for resizing window ===== */
  35. if (width < 1170) {
  36. body.addClass('content-wrapper');
  37. $(".sidebar-nav, .slimScrollDiv").css("overflow-x", "visible").parent().css("overflow", "visible");
  38. } else {
  39. body.removeClass('content-wrapper');
  40. }
  41. height = height - topOffset;
  42. if (height < 1) {
  43. height = 1;
  44. }
  45. if (height > topOffset) {
  46. $("#page-wrapper").css("min-height", (height) + "px");
  47. }
  48. },
  49. url = window.location,
  50. element = $('ul.nav a').filter(function () {
  51. return this.href === url || url.href.indexOf(this.href) === 0;
  52. }).addClass('activez').parent().parent().addClass('ok').parent();
  53. if (element.is('li')) {
  54. element.addClass('activezo');
  55. }
  56. $(window).ready(set);
  57. $(window).bind("resize", set);
  58. });
  59. body.trigger("resize");
  60. //Increment the idle time counter every minute.
  61. var idleInterval = setInterval(timerIncrement, 60000); // 1 minute
  62. hasCookie = (getCookie('organizrToken')) ? true : false;
  63. //Zero the idle timer on mouse movement.
  64. $(this).mousemove(function (e) {
  65. idleTime = 0;
  66. });
  67. $(this).keypress(function (e) {
  68. idleTime = 0;
  69. });
  70. });
  71. function pageLoad(){
  72. "use strict";
  73. //Start Organizr
  74. $(function () {
  75. $('#side-menu').metisMenu();
  76. if($('#preloader:visible').length == 1){
  77. $("#preloader").fadeOut();
  78. }
  79. lazyload();
  80. });
  81. $(".colorpicker").asColorPicker({
  82. mode: 'complex',
  83. color: {
  84. format: false,
  85. alphaConvert: false
  86. }
  87. });
  88. $(function () {
  89. $(".metadata-actors").owlCarousel({
  90. autoplay: true,
  91. slideSpeed : 300,
  92. paginationSpeed : 400,
  93. margin:40,
  94. nav:false,
  95. autoplay:true,
  96. dots:false,
  97. responsive:{
  98. 0:{
  99. items:2
  100. },
  101. 500:{
  102. items:3
  103. },
  104. 650:{
  105. items:4
  106. },
  107. 800:{
  108. items:5
  109. },
  110. 950:{
  111. items:6
  112. },
  113. 992:{
  114. items:4
  115. },
  116. 1250:{
  117. items:5
  118. },
  119. 1400:{
  120. items:6
  121. },
  122. 1550:{
  123. items:7
  124. },
  125. 1700:{
  126. items:8
  127. },
  128. 1850:{
  129. items:9
  130. }
  131. },
  132. //singleItem:true
  133. // "singleItem:true" is a shortcut for:
  134. items : 1,
  135. // itemsDesktop : false,
  136. // itemsDesktopSmall : false,
  137. // itemsTablet: false,
  138. // itemsMobile : false
  139. });
  140. $('.recent-items').owlCarousel({
  141. margin:40,
  142. nav:false,
  143. autoplay:false,
  144. dots:false,
  145. responsive:{
  146. 0:{
  147. items:2
  148. },
  149. 500:{
  150. items:3
  151. },
  152. 650:{
  153. items:4
  154. },
  155. 800:{
  156. items:5
  157. },
  158. 950:{
  159. items:6
  160. },
  161. 1100:{
  162. items:7
  163. },
  164. 1250:{
  165. items:8
  166. },
  167. 1400:{
  168. items:9
  169. },
  170. 1550:{
  171. items:10
  172. },
  173. 1700:{
  174. items:11
  175. },
  176. 1850:{
  177. items:12
  178. },
  179. 2000:{
  180. items:13
  181. },
  182. 2150:{
  183. items:14
  184. },
  185. 2300:{
  186. items:15
  187. },
  188. 2450:{
  189. items:16
  190. }
  191. }
  192. })
  193. });
  194. /* ===== Theme Settings ===== */
  195. /* ===== Collapsible Panels JS ===== */
  196. (function ($, window, document) {
  197. var panelSelector = '[data-perform="panel-collapse"]',
  198. panelRemover = '[data-perform="panel-dismiss"]';
  199. $(panelSelector).each(function () {
  200. var collapseOpts = {
  201. toggle: false
  202. },
  203. parent = $(this).closest('.panel'),
  204. wrapper = parent.find('.panel-wrapper'),
  205. child = $(this).children('i');
  206. if (!wrapper.length) {
  207. wrapper = parent.children('.panel-heading').nextAll().wrapAll('<div/>').parent().addClass('panel-wrapper');
  208. collapseOpts = {};
  209. }
  210. wrapper.collapse(collapseOpts).on('hide.bs.collapse', function () {
  211. child.removeClass('ti-minus').addClass('ti-plus');
  212. }).on('show.bs.collapse', function () {
  213. child.removeClass('ti-plus').addClass('ti-minus');
  214. });
  215. });
  216. /* ===== Collapse Panels ===== */
  217. $(document).on('click', panelSelector, function (e) {
  218. e.preventDefault();
  219. var parent = $(this).closest('.panel'),
  220. wrapper = parent.find('.panel-wrapper');
  221. $(this).children('i').toggleClass('ti-plus').toggleClass('ti-minus');
  222. wrapper.collapse('toggle');
  223. });
  224. /* ===== Remove Panels ===== */
  225. $(document).on('click', panelRemover, function (e) {
  226. e.preventDefault();
  227. var removeParent = $(this).closest('.panel');
  228. function removeElement() {
  229. var col = removeParent.parent();
  230. removeParent.remove();
  231. col.filter(function () {
  232. return ($(this).is('[class*="col-"]') && $(this).children('*').length === 0);
  233. }).remove();
  234. }
  235. removeElement();
  236. });
  237. }(jQuery, window, document));
  238. /* ===== Tooltip Initialization ===== */
  239. $(function () {
  240. $('[data-toggle="tooltip"]').tooltip();
  241. /*$('body').tooltip({
  242. selector: '[data-toggle="tooltip"]'
  243. });*/
  244. });
  245. /* ===== Popover Initialization ===== */
  246. $(function () {
  247. $('[data-toggle="popover"]').popover();
  248. });
  249. $(function () {
  250. // Switchery
  251. var elems = Array.prototype.slice.call(document.querySelectorAll('.js-switch'));
  252. $('.js-switch').each(function() {
  253. if ($(this).attr('data-switchery') !== 'true'){
  254. new Switchery($(this)[0], $(this).data());
  255. }
  256. });
  257. });
  258. /* ===== Task Initialization ===== */
  259. $(".list-task li label").on("click", function () {
  260. $(this).toggleClass("task-done");
  261. });
  262. $(".settings_box a").on("click", function () {
  263. $("ul.theme_color").toggleClass("theme_block");
  264. });
  265. /* ===== Collepsible Toggle ===== */
  266. $(".collapseble").on("click", function () {
  267. $(".collapseblebox").fadeToggle(350);
  268. });
  269. /* ===== Sidebar ===== */
  270. $('.slimscrollright').slimScroll({
  271. height: '100%',
  272. position: 'right',
  273. size: "5px",
  274. color: '#dcdcdc'
  275. });
  276. $('.slimscrollsidebar').slimScroll({
  277. height: '100%',
  278. position: 'left',
  279. size: "6px",
  280. color: 'rgba(0,0,0,0.5)'
  281. });
  282. $('.chat-list').slimScroll({
  283. height: '100%',
  284. position: 'right',
  285. size: "0px",
  286. color: '#dcdcdc'
  287. });
  288. /* ===== Resize all elements ===== */
  289. /* ===== Visited ul li ===== */
  290. /*$('.visited li a').on("click", function (e) {
  291. $('.visited li').removeClass('active');
  292. var $parent = $(this).parent();
  293. if (!$parent.hasClass('active')) {
  294. $parent.addClass('active');
  295. }
  296. e.preventDefault();
  297. });*/
  298. /* =================================================================
  299. Update 1.5
  300. this is for close icon when navigation open in mobile view
  301. ================================================================= */
  302. $(".navbar-toggle").on("click", function () {
  303. $(".navbar-toggle i").toggleClass("ti-menu").addClass("ti-close");
  304. });
  305. /* magnific stuff */
  306. $('.image-popup-vertical-fit').magnificPopup({
  307. type: 'image',
  308. closeOnContentClick: true,
  309. mainClass: 'mfp-img-mobile',
  310. image: {
  311. verticalFit: true
  312. }
  313. });
  314. $('.image-popup-fit-width').magnificPopup({
  315. type: 'image',
  316. closeOnContentClick: true,
  317. image: {
  318. verticalFit: false
  319. }
  320. });
  321. $('.image-popup-no-margins').magnificPopup({
  322. type: 'image',
  323. closeOnContentClick: true,
  324. closeBtnInside: false,
  325. fixedContentPos: true,
  326. mainClass: 'mfp-no-margins mfp-with-zoom', // class to remove default margin from left and right side
  327. image: {
  328. verticalFit: true
  329. },
  330. zoom: {
  331. enabled: true,
  332. duration: 300 // don't foget to change the duration also in CSS
  333. }
  334. });
  335. $('.popup-gallery').magnificPopup({
  336. delegate: 'a',
  337. type: 'image',
  338. tLoading: 'Loading image #%curr%...',
  339. mainClass: 'mfp-img-mobile',
  340. gallery: {
  341. enabled: true,
  342. navigateByImgClick: true,
  343. preload: [0,1] // Will preload 0 - before current, and 1 after the current image
  344. },
  345. image: {
  346. tError: '<a href="%url%">The image #%curr%</a> could not be loaded.',
  347. titleSrc: function(item) {
  348. return item.el.attr('title') + '<small>by Marsel Van Oosten</small>';
  349. }
  350. }
  351. });
  352. $('.zoom-gallery').magnificPopup({
  353. delegate: 'a',
  354. type: 'image',
  355. closeOnContentClick: false,
  356. closeBtnInside: false,
  357. mainClass: 'mfp-with-zoom mfp-img-mobile',
  358. image: {
  359. verticalFit: true,
  360. titleSrc: function(item) {
  361. return item.el.attr('title') + ' &middot; <a class="image-source-link" href="'+item.el.attr('data-source')+'" target="_blank">image source</a>';
  362. }
  363. },
  364. gallery: {
  365. enabled: true
  366. },
  367. zoom: {
  368. enabled: true,
  369. duration: 300, // don't foget to change the duration also in CSS
  370. opener: function(element) {
  371. return element.find('img');
  372. }
  373. }
  374. });
  375. $('#image-popups').magnificPopup({
  376. delegate: 'a',
  377. type: 'image',
  378. removalDelay: 500, //delay removal by X to allow out-animation
  379. callbacks: {
  380. beforeOpen: function() {
  381. // just a hack that adds mfp-anim class to markup
  382. this.st.image.markup = this.st.image.markup.replace('mfp-figure', 'mfp-figure mfp-with-anim');
  383. this.st.mainClass = this.st.el.attr('data-effect');
  384. }
  385. },
  386. closeOnContentClick: true,
  387. midClick: true // allow opening popup on middle mouse click. Always set it to true if you don't provide alternative source.
  388. });
  389. $('.popup-youtube, .popup-vimeo, .popup-gmaps').magnificPopup({
  390. disableOn: 700,
  391. type: 'iframe',
  392. mainClass: 'mfp-fade',
  393. removalDelay: 160,
  394. preloader: false,
  395. fixedContentPos: false
  396. });
  397. $('.popup-with-form').magnificPopup({
  398. type: 'inline',
  399. preloader: true,
  400. removalDelay: 500,
  401. // When elemened is focused, some mobile browsers in some cases zoom in
  402. // It looks not nice, so we disable it:
  403. callbacks: {
  404. beforeOpen: function() {
  405. if($(window).width() < 700) {
  406. this.st.focus = false;
  407. } else {
  408. this.st.focus = '#name';
  409. }
  410. this.st.mainClass = this.st.el.attr('data-effect');
  411. }
  412. }
  413. });
  414. // Inline popups
  415. $('.inline-popups').magnificPopup({
  416. removalDelay: 500, //delay removal by X to allow out-animation
  417. closeOnBgClick: true,
  418. //closeOnContentClick: true,
  419. callbacks: {
  420. beforeOpen: function() {
  421. this.st.mainClass = this.st.el.attr('data-effect');
  422. }
  423. },
  424. midClick: true // allow opening popup on middle mouse click. Always set it to true if you don't provide alternative source.
  425. });
  426. $('.simple-ajax-popup-align-top').magnificPopup({
  427. type: 'ajax',
  428. alignTop: true,
  429. overflowY: 'scroll' // as we know that popup content is tall we set scroll overflow by default to avoid jump
  430. });
  431. $('.simple-ajax-popup').magnificPopup({
  432. type: 'ajax'
  433. });
  434. }
  435. /* ===== Login and Recover Password ===== */
  436. $(document).on("click", "#to-recover", function(e) {
  437. $("#loginform").slideUp();
  438. $("#recoverform").fadeIn();
  439. });
  440. $(document).on("click", ".to-register", function(e) {
  441. $("#loginform").slideUp();
  442. $("#registerForm").removeClass('hidden');
  443. $("#registerform").fadeIn();
  444. });
  445. $(document).on("click", "#leave-recover", function(e) {
  446. $("#loginform").slideDown();
  447. $("#recoverform").fadeOut();
  448. });
  449. $(document).on("click", "#leave-registration", function(e) {
  450. $("#registerform").fadeOut();
  451. $("#registerForm").addClass('hidden');
  452. $("#loginform").slideDown();
  453. });
  454. $(document).on("click", ".updateNow", function(e) {
  455. updateNow();
  456. });
  457. $(document).on("click", ".show-login", function(e) {
  458. buildLogin();
  459. });
  460. $(document).on("click", ".depenency-item", function(e) {
  461. alert($(this).attr('data-name'));
  462. });
  463. $(document).on("click", ".login-button", function(e) {
  464. e.preventDefault;
  465. $('div.login-box').block({
  466. message: '<h5><img width="20" src="plugins/images/busy.gif" /> Just a moment...</h4>',
  467. css: {
  468. color: '#fff',
  469. border: '1px solid #2cabe3',
  470. backgroundColor: '#2cabe3'
  471. }
  472. });
  473. var post = $( '#loginform' ).serializeArray();
  474. organizrAPI('POST','api/?v1/login',post).success(function(data) {
  475. var html = JSON.parse(data);
  476. if(html.data == true){
  477. location.reload();
  478. }else if(html.data == 'mismatch'){
  479. $('div.login-box').unblock({});
  480. $.toast().reset('all');
  481. message('Login Error',' Wrong username/email/password combo','bottom-right','#FFF','warning','10000');
  482. console.error('Organizr Function: Login failed - wrong username/email/password');
  483. }
  484. }).fail(function(xhr) {
  485. console.error("Organizr Function: Login Failed");
  486. });
  487. });
  488. $(document).on("click", ".register-button", function(e) {
  489. e.preventDefault;
  490. var post = $( '#registerForm' ).serializeArray();
  491. organizrAPI('POST','api/?v1/register',post).success(function(data) {
  492. var html = JSON.parse(data);
  493. console.log(html);
  494. if(html.data == true){
  495. location.reload();
  496. }else if(html.data == 'mismatch'){
  497. $.toast().reset('all');
  498. message('Registration Error',' Wrong Registration Password','bottom-right','#FFF','warning','10000');
  499. console.error('Organizr Function: Registration failed - Wrong Registration Password');
  500. }else if(html.data == 'username taken'){
  501. $.toast().reset('all');
  502. message('Registration Error',' Registration Error - Username/Email Taken','bottom-right','#FFF','warning','10000');
  503. console.error('Organizr Function: Registration Failed - Username/Email Taken');
  504. }
  505. }).fail(function(xhr) {
  506. console.error("Organizr Function: Login Failed");
  507. });
  508. });
  509. $(document).on("click", ".open-close", function () {
  510. $("body").toggleClass("show-sidebar");
  511. });
  512. //EDIT GROUP GET ID
  513. $(document).on("click", ".editGroupButton", function () {
  514. $('#edit-group-form [name=groupName]').val($(this).parent().parent().attr("data-group"));
  515. $('#edit-group-form [name=id]').val($(this).parent().parent().attr("data-id"));
  516. $('#edit-group-form [name=groupImage]').val($(this).parent().parent().attr("data-image"));
  517. $('#edit-group-form [name=oldGroupName]').val($(this).parent().parent().attr("data-group"));
  518. });
  519. //EDIT GROUP
  520. $(document).on("click", ".editGroup", function () {
  521. //Create POST Array
  522. var post = {
  523. action:'editUserGroup',
  524. api:'api/?v1/settings/user/manage/groups',
  525. id:$('#edit-group-form [name=id]').val(),
  526. groupName:$('#edit-group-form [name=groupName]').val(),
  527. groupImage:$('#edit-group-form [name=groupImage]').val(),
  528. oldGroupName:$('#edit-group-form [name=oldGroupName]').val(),
  529. messageTitle:'',
  530. messageBody:'Edited User Group '+$('#edit-group-form [name=groupName]').val(),
  531. error:'Organizr Function: User Group API Connection Failed'
  532. };
  533. if (typeof post.id == 'undefined' || post.id == '') {
  534. message('New Group Error',' Could not get Group ID','bottom-right','#FFF','error','5000');
  535. }
  536. if (typeof post.groupName == 'undefined' || post.groupName == '') {
  537. message('New Group Error',' Please set a Group Name','bottom-right','#FFF','warning','5000');
  538. }
  539. if (typeof post.groupImage == 'undefined' || post.groupImage == '') {
  540. message('New Group Error',' Please set a Group Image','bottom-right','#FFF','warning','5000');
  541. }
  542. if(post.id !== '' && post.groupName !== '' && post.groupImage !== '' ){
  543. var callbacks = $.Callbacks();
  544. callbacks.add( buildGroupManagement );
  545. settingsAPI(post,callbacks);
  546. clearForm('#edit-group-form');
  547. $.magnificPopup.close();
  548. }
  549. });
  550. //CHANGE DEFAULT GROUP
  551. $(document).on("click", ".changeDefaultGroup", function () {
  552. //Create POST Array
  553. var post = {
  554. action:'changeDefaultGroup',
  555. api:'api/?v1/settings/user/manage/groups',
  556. id:$(this).parent().parent().attr("data-id"),
  557. oldGroupID:$('#manageGroupTable').find('tr[data-default=true]').attr("data-group-id"),
  558. oldGroupName:$('#manageGroupTable').find('tr[data-default=true]').attr("data-group"),
  559. newGroupID:$(this).parent().parent().attr("data-group-id"),
  560. newGroupName:$(this).parent().parent().attr("data-group"),
  561. messageTitle:'',
  562. messageBody:'Changed Default Group to '+$(this).parent().parent().attr("data-group"),
  563. error:'Organizr Function: User Group API Connection Failed'
  564. };
  565. var callbacks = $.Callbacks();
  566. callbacks.add( buildGroupManagement );
  567. settingsAPI(post,callbacks);
  568. });
  569. //DELETE GROUP
  570. $(document).on("click", ".deleteUserGroup", function () {
  571. //Create POST Array
  572. var post = {
  573. action:'deleteUserGroup',
  574. api:'api/?v1/settings/user/manage/groups',
  575. id:$(this).parent().parent().attr("data-id"),
  576. groupID:$(this).parent().parent().attr("data-group-id"),
  577. groupName:$(this).parent().parent().attr("data-group"),
  578. messageTitle:'',
  579. messageBody:'Deleted User Group '+$(this).parent().parent().attr("data-group"),
  580. error:'Organizr Function: User Group API Connection Failed'
  581. };
  582. var callbacks = $.Callbacks();
  583. callbacks.add( buildGroupManagement );
  584. settingsAPI(post,callbacks);
  585. });
  586. //ADD GROUP
  587. $(document).on("click", ".addNewGroup", function () {
  588. //Create POST Array
  589. var post = {
  590. action:'addUserGroup',
  591. api:'api/?v1/settings/user/manage/groups',
  592. newGroupID:parseInt($('#manageGroupTable').find('tr[data-group-id]:nth-last-child(2)').attr('data-group-id')) + 1,
  593. newGroupName:$('#new-group-form [name=groupName]').val(),
  594. newGroupImage:$('#new-group-form [name=groupImage]').val(),
  595. messageTitle:'',
  596. messageBody:'Created User Group '+$('#new-group-form [name=groupName]').val(),
  597. error:'Organizr Function: User Group API Connection Failed'
  598. };
  599. if (typeof post.newGroupID == 'undefined' || post.newGroupID == '') {
  600. message('New Group Error',' Could not get next Group ID','bottom-right','#FFF','error','5000');
  601. }
  602. if (typeof post.newGroupName == 'undefined' || post.newGroupName == '') {
  603. message('New Group Error',' Please set a Group Name','bottom-right','#FFF','warning','5000');
  604. }
  605. if (typeof post.newGroupImage == 'undefined' || post.newGroupImage == '') {
  606. message('New Group Error',' Please set a Group Image','bottom-right','#FFF','warning','5000');
  607. }
  608. if(post.newGroupID !== '' && post.newGroupName !== '' && post.newGroupImage !== '' ){
  609. var callbacks = $.Callbacks();
  610. callbacks.add( buildGroupManagement );
  611. settingsAPI(post,callbacks);
  612. clearForm('#new-group-form');
  613. $.magnificPopup.close();
  614. }
  615. });
  616. // ADD USER
  617. $(document).on("click", ".addNewUser", function () {
  618. //Create POST Array
  619. var post = {
  620. action:'addNewUser',
  621. api:'api/?v1/settings/user/manage/users',
  622. username:$('#new-user-form [name=username]').val(),
  623. email:$('#new-user-form [name=email]').val(),
  624. password:$('#new-user-form [name=password]').val(),
  625. messageTitle:'',
  626. messageBody:'Added New User: '+$('#new-user-form [name=username]').val(),
  627. error:'Organizr Function: User API Connection Failed'
  628. };
  629. if (typeof post.username == 'undefined' || post.username == '') {
  630. message('New User Error',' Please set a Username','bottom-right','#FFF','error','5000');
  631. }
  632. if (typeof post.email == 'undefined' || post.email == '') {
  633. message('New User Error',' Please set an Email','bottom-right','#FFF','warning','5000');
  634. }
  635. if (typeof post.password == 'undefined' || post.password == '') {
  636. message('New User Error',' Please set a Password','bottom-right','#FFF','warning','5000');
  637. }
  638. if(post.username !== '' && post.email !== '' && post.password !== '' ){
  639. var callbacks = $.Callbacks();
  640. callbacks.add( buildUserManagement );
  641. settingsAPI(post,callbacks);
  642. clearForm('#new-user-form');
  643. $.magnificPopup.close();
  644. }
  645. });
  646. //EDIT GROUP GET ID
  647. $(document).on("click", ".editUserButton", function () {
  648. $('#edit-user-form [name=username]').val($(this).parent().parent().attr("data-username"));
  649. $('#edit-user-form [name=id]').val($(this).parent().parent().attr("data-id"));
  650. $('#edit-user-form [name=email]').val($(this).parent().parent().attr("data-email"));
  651. });
  652. //EDIT GROUP
  653. $(document).on("click", ".editUserAdmin", function () {
  654. //Create POST Array
  655. var post = {
  656. action:'editUser',
  657. api:'api/?v1/settings/user/manage/users',
  658. id:$('#edit-user-form [name=id]').val(),
  659. username:$('#edit-user-form [name=username]').val(),
  660. email:$('#edit-user-form [name=email]').val(),
  661. password:$('#edit-user-form [name=password]').val(),
  662. messageTitle:'',
  663. messageBody:'Edited User '+$('#edit-user-form [name=username]').val(),
  664. error:'Organizr Function: API Connection Failed'
  665. };
  666. if (typeof post.id == 'undefined' || post.id == '') {
  667. message('Edit User Error',' Could not get User ID','bottom-right','#FFF','error','5000');
  668. }
  669. if (typeof post.username == 'undefined' || post.username == '') {
  670. message('Edit User Error',' Please set a Username','bottom-right','#FFF','warning','5000');
  671. }
  672. if (typeof post.email == 'undefined' || post.email == '') {
  673. message('Edit User Error',' Please set a User Email','bottom-right','#FFF','warning','5000');
  674. }
  675. if (post.password !== '' && post.password !== $('#edit-user-form [name=password2]').val()){
  676. message('Edit User Error',' Passwords do not match!','bottom-right','#FFF','warning','5000');
  677. }
  678. console.log(post);
  679. if(post.id !== '' && post.username !== '' && post.email !== '' ){
  680. var callbacks = $.Callbacks();
  681. callbacks.add( buildUserManagement );
  682. settingsAPI(post,callbacks);
  683. clearForm('#edit-user-form');
  684. $.magnificPopup.close();
  685. }
  686. });
  687. // CHANGE USER GROUP
  688. $(document).on("change", ".userGroupSelect", function () {
  689. //Create POST Array
  690. var post = {
  691. action:'changeGroup',
  692. api:'api/?v1/settings/user/manage/users',
  693. id:$(this).parent().parent().attr("data-id"),
  694. username:$(this).parent().parent().attr("data-username"),
  695. oldGroup:$(this).parent().parent().attr("data-group"),
  696. newGroupID:$(this).find("option:selected").val(),
  697. newGroupName:$(this).find("option:selected").text(),
  698. messageTitle:'',
  699. messageBody:'User Info updated for '+$(this).parent().parent().attr("data-username"),
  700. error:'Organizr Function: User API Connection Failed'
  701. };
  702. var callbacks = $.Callbacks();
  703. callbacks.add( buildUserManagement );
  704. settingsAPI(post,callbacks);
  705. });
  706. // DELETE USER
  707. //DELETE GROUP
  708. $(document).on("click", ".deleteUser", function () {
  709. var user = $(this);
  710. swal({
  711. title: window.lang.translate('Delete ')+user.parent().parent().attr("data-username")+'?',
  712. type: "warning",
  713. showCancelButton: true,
  714. confirmButtonColor: "#DD6B55",
  715. confirmButtonText: window.lang.translate('Yes'),
  716. cancelButtonText: window.lang.translate('No'),
  717. closeOnConfirm: true,
  718. closeOnCancel: true
  719. }, function(isConfirm){
  720. if (isConfirm) {
  721. //Create POST Array
  722. var post = {
  723. action:'deleteUser',
  724. api:'api/?v1/settings/user/manage/users',
  725. id:user.parent().parent().attr("data-id"),
  726. username:user.parent().parent().attr("data-username"),
  727. messageTitle:'',
  728. messageBody:window.lang.translate('Deleted User')+': '+user.parent().parent().attr("data-username"),
  729. error:'Organizr Function: User API Connection Failed'
  730. };
  731. var callbacks = $.Callbacks();
  732. callbacks.add( buildUserManagement );
  733. settingsAPI(post,callbacks);
  734. }
  735. });
  736. });
  737. // CHANGE TAB GROUP
  738. $(document).on("change", ".tabGroupSelect", function () {
  739. //Create POST Array
  740. var post = {
  741. action:'changeGroup',
  742. api:'api/?v1/settings/tab/editor/tabs',
  743. id:$(this).parent().parent().attr("data-id"),
  744. tab:$(this).parent().parent().attr("data-name"),
  745. oldGroupID:$(this).parent().parent().attr("data-group-id"),
  746. newGroupID:$(this).find("option:selected").val(),
  747. newGroupName:$(this).find("option:selected").text(),
  748. messageTitle:'',
  749. messageBody:'Tab Info updated for '+$(this).parent().parent().attr("data-name"),
  750. error:'Organizr Function: Tab API Connection Failed'
  751. };
  752. var callbacks = $.Callbacks();
  753. callbacks.add( buildTabEditor );
  754. settingsAPI(post,callbacks);
  755. });
  756. // CHANGE TAB CATEGORY
  757. $(document).on("change", ".tabCategorySelect", function () {
  758. //Create POST Array
  759. var post = {
  760. action:'changeCategory',
  761. api:'api/?v1/settings/tab/editor/tabs',
  762. id:$(this).parent().parent().attr("data-id"),
  763. tab:$(this).parent().parent().attr("data-name"),
  764. newCategoryID:$(this).find("option:selected").val(),
  765. newCategoryName:$(this).find("option:selected").text(),
  766. messageTitle:'',
  767. messageBody:'Tab Info updated for '+$(this).parent().parent().attr("data-name"),
  768. error:'Organizr Function: Tab API Connection Failed'
  769. };
  770. var callbacks = $.Callbacks();
  771. callbacks.add( buildTabEditor );
  772. settingsAPI(post,callbacks);
  773. });
  774. // CHANGE TAB TYPE
  775. $(document).on("change", ".tabTypeSelect", function () {
  776. //Create POST Array
  777. var post = {
  778. action:'changeType',
  779. api:'api/?v1/settings/tab/editor/tabs',
  780. id:$(this).parent().parent().attr("data-id"),
  781. tab:$(this).parent().parent().attr("data-name"),
  782. newTypeID:$(this).find("option:selected").val(),
  783. newTypeName:$(this).find("option:selected").text(),
  784. messageTitle:'',
  785. messageBody:'Tab Info updated for '+$(this).parent().parent().attr("data-name"),
  786. error:'Organizr Function: Tab API Connection Failed'
  787. };
  788. var callbacks = $.Callbacks();
  789. callbacks.add( buildTabEditor );
  790. settingsAPI(post,callbacks);
  791. });
  792. // CHANGE ENABLED TAB
  793. $(document).on("change", ".enabledSwitch", function () {
  794. //Create POST Array
  795. var post = {
  796. action:'changeEnabled',
  797. api:'api/?v1/settings/tab/editor/tabs',
  798. id:$(this).parent().parent().attr("data-id"),
  799. tab:$(this).parent().parent().attr("data-name"),
  800. tabEnabled:$(this).prop("checked") ? 1 : 0,
  801. tabEnabledWord:$(this).prop("checked") ? "On" : "Off",
  802. messageTitle:'',
  803. messageBody:'Tab Info updated for '+$(this).parent().parent().attr("data-name"),
  804. error:'Organizr Function: Tab API Connection Failed'
  805. };
  806. var callbacks = $.Callbacks();
  807. callbacks.add( buildTabEditor );
  808. settingsAPI(post,callbacks);
  809. });
  810. // CHANGE SPLASH TAB
  811. $(document).on("change", ".splashSwitch", function () {
  812. //Create POST Array
  813. var post = {
  814. action:'changeSplash',
  815. api:'api/?v1/settings/tab/editor/tabs',
  816. id:$(this).parent().parent().attr("data-id"),
  817. tab:$(this).parent().parent().attr("data-name"),
  818. tabSplash:$(this).prop("checked") ? 1 : 0,
  819. tabSplashWord:$(this).prop("checked") ? "On" : "Off",
  820. messageTitle:'',
  821. messageBody:'Tab Info updated for '+$(this).parent().parent().attr("data-name"),
  822. error:'Organizr Function: Tab API Connection Failed'
  823. };
  824. var callbacks = $.Callbacks();
  825. callbacks.add( buildTabEditor );
  826. settingsAPI(post,callbacks);
  827. });
  828. // CHANGE DEFAULT TAB
  829. $(document).on("change", ".defaultSwitch", function () {
  830. //Create POST Array
  831. var post = {
  832. action:'changeDefault',
  833. api:'api/?v1/settings/tab/editor/tabs',
  834. id:$(this).parent().parent().parent().attr("data-id"),
  835. tab:$(this).parent().parent().parent().attr("data-name"),
  836. messageTitle:'',
  837. messageBody:'Changed Default Tab to: '+$(this).parent().parent().parent().attr("data-name"),
  838. error:'Organizr Function: Tab API Connection Failed'
  839. };
  840. var callbacks = $.Callbacks();
  841. callbacks.add( buildTabEditor );
  842. settingsAPI(post,callbacks);
  843. });
  844. //DELETE TAB
  845. $(document).on("click", ".deleteTab", function () {
  846. var user = $(this);
  847. swal({
  848. title: window.lang.translate('Delete ')+user.parent().parent().attr("data-name")+'?',
  849. type: "warning",
  850. showCancelButton: true,
  851. confirmButtonColor: "#DD6B55",
  852. confirmButtonText: window.lang.translate('Yes'),
  853. cancelButtonText: window.lang.translate('No'),
  854. closeOnConfirm: true,
  855. closeOnCancel: true
  856. }, function(isConfirm){
  857. if (isConfirm) {
  858. //Create POST Array
  859. var post = {
  860. action:'deleteTab',
  861. api:'api/?v1/settings/tab/editor/tabs',
  862. id:user.parent().parent().attr("data-id"),
  863. tab:user.parent().parent().attr("data-name"),
  864. messageTitle:'',
  865. messageBody:window.lang.translate('Deleted Tab')+': '+user.parent().parent().attr("data-name"),
  866. error:'Organizr Function: Tab Editor API Connection Failed'
  867. };
  868. var callbacks = $.Callbacks();
  869. callbacks.add( buildTabEditor );
  870. settingsAPI(post,callbacks);
  871. }
  872. });
  873. });
  874. //EDIT TAB GET ID
  875. $(document).on("click", ".editTabButton", function () {
  876. $('#edit-tab-form [name=tabName]').val($(this).parent().parent().attr("data-name"));
  877. $('#edit-tab-form [name=tabURL]').val($(this).parent().parent().attr("data-url"));
  878. $('#edit-tab-form [name=tabImage]').val($(this).parent().parent().attr("data-image"));
  879. $('#edit-tab-form [name=id]').val($(this).parent().parent().attr("data-id"));
  880. if( $(this).parent().parent().attr("data-url").indexOf('/?v') > 0){
  881. $('#edit-tab-form [name=tabURL]').prop('disabled', 'true');
  882. }else{
  883. $('#edit-tab-form [name=tabURL]').prop('disabled', null);
  884. }
  885. });
  886. //EDIT TAB
  887. $(document).on("click", ".editTab", function () {
  888. //Create POST Array
  889. var post = {
  890. action:'editTab',
  891. api:'api/?v1/settings/tab/editor/tabs',
  892. id:$('#edit-tab-form [name=id]').val(),
  893. tabName:$('#edit-tab-form [name=tabName]').val(),
  894. tabImage:$('#edit-tab-form [name=tabImage]').val(),
  895. tabURL:$('#edit-tab-form [name=tabURL]').val(),
  896. messageTitle:'',
  897. messageBody:'Edited Tab '+$('#edit-tab-form [name=tabName]').val(),
  898. error:'Organizr Function: Tab Editor API Connection Failed'
  899. };
  900. if (typeof post.id == 'undefined' || post.id == '') {
  901. message('Edit Tab Error',' Could not get Tab ID','bottom-right','#FFF','error','5000');
  902. }
  903. if (typeof post.tabName == 'undefined' || post.tabName == '') {
  904. message('Edit Tab Error',' Please set a Tab Name','bottom-right','#FFF','warning','5000');
  905. }
  906. if (typeof post.tabImage == 'undefined' || post.tabImage == '') {
  907. message('Edit Tab Error',' Please set a Tab Image','bottom-right','#FFF','warning','5000');
  908. }
  909. if (typeof post.tabURL == 'undefined' || post.tabURL == '') {
  910. message('Edit Tab Error',' Please set a Tab URL','bottom-right','#FFF','warning','5000');
  911. }
  912. if(post.id !== '' && post.tabName !== '' && post.tabImage !== '' && post.tabURL !== '' ){
  913. var callbacks = $.Callbacks();
  914. callbacks.add( buildTabEditor );
  915. settingsAPI(post,callbacks);
  916. clearForm('#edit-tab-form');
  917. $.magnificPopup.close();
  918. }
  919. });
  920. //ADD NEW TAB
  921. $(document).on("click", ".addNewTab", function () {
  922. //Create POST Array
  923. var post = {
  924. action:'addNewTab',
  925. api:'api/?v1/settings/tab/editor/tabs',
  926. tabOrder:parseInt($('#tabEditorTable').find('tr[data-order]').last().attr('data-order')) + 1,
  927. tabName:$('#new-tab-form [name=tabName]').val(),
  928. tabImage:$('#new-tab-form [name=tabImage]').val(),
  929. tabURL:$('#new-tab-form [name=tabURL]').val(),
  930. tabGroupID:1,
  931. tabEnabled:0,
  932. tabDefault:0,
  933. tabType:1,
  934. messageTitle:'',
  935. messageBody:'Created Tab '+$('#new-tab-form [name=tabName]').val(),
  936. error:'Organizr Function: Tab API Connection Failed'
  937. };
  938. if (typeof post.tabOrder == 'undefined' || post.tabOrder == '') {
  939. message('New Tab Error',' Could not get next Group ID','bottom-right','#FFF','error','5000');
  940. }
  941. if (typeof post.tabName == 'undefined' || post.tabName == '') {
  942. message('New Tab Error',' Please set a Tab Name','bottom-right','#FFF','error','5000');
  943. }
  944. if (typeof post.tabURL == 'undefined' || post.tabURL == '') {
  945. message('New Tab Error',' Please set a Tab URL','bottom-right','#FFF','warning','5000');
  946. }
  947. if (typeof post.tabImage == 'undefined' || post.tabImage == '') {
  948. message('New Tab Error',' Please set a Tab Image','bottom-right','#FFF','warning','5000');
  949. }
  950. if(post.tabOrder !== '' && post.tabName !== '' && post.tabURL !== '' && post.tabImage !== '' ){
  951. var callbacks = $.Callbacks();
  952. callbacks.add( buildTabEditor );
  953. settingsAPI(post,callbacks);
  954. clearForm('#new-tab-form');
  955. $.magnificPopup.close();
  956. }
  957. });
  958. //ADD NEW CATEGORY
  959. $(document).on("click", ".addNewCategory", function () {
  960. //Create POST
  961. var nextID = [];
  962. $($('#categoryEditorTable').find('tr[data-category-id]')).each(function () {
  963. nextID.push($(this).attr('data-category-id'));
  964. });
  965. var post = {
  966. action:'addNewCategory',
  967. api:'api/?v1/settings/tab/editor/categories',
  968. categoryOrder:parseInt($('#categoryEditorTable').find('tr[data-order]').last().attr('data-order')) + 1,
  969. categoryName:$('#new-category-form [name=name]').val(),
  970. categoryImage:$('#new-category-form [name=image]').val(),
  971. categoryID:Math.max.apply( null, nextID ) + 1,
  972. categoryDefault:0,
  973. messageTitle:'',
  974. messageBody:'Created Category '+$('#new-category-form [name=name]').val(),
  975. error:'Organizr Function: API Connection Failed'
  976. };
  977. console.log(post);
  978. if (typeof post.categoryID == 'undefined' || post.categoryID == '') {
  979. message('New Category Error',' Could not get next Category ID','bottom-right','#FFF','error','5000');
  980. }
  981. if (typeof post.categoryName == 'undefined' || post.categoryName == '') {
  982. message('New Category Error',' Please set a Category Name','bottom-right','#FFF','error','5000');
  983. }
  984. if (typeof post.categoryOrder == 'undefined' || post.categoryOrder == '') {
  985. message('New Category Error',' Could not get Category Order','bottom-right','#FFF','warning','5000');
  986. }
  987. if (typeof post.categoryImage == 'undefined' || post.categoryImage == '') {
  988. message('New Category Error',' Please set a Category Image','bottom-right','#FFF','warning','5000');
  989. }
  990. if(post.categoryID !== '' && post.categoryName !== '' && post.categoryOrder !== '' && post.categoryImage !== '' ){
  991. var callbacks = $.Callbacks();
  992. callbacks.add( buildCategoryEditor );
  993. settingsAPI(post,callbacks);
  994. clearForm('#new-category-form');
  995. $.magnificPopup.close();
  996. }
  997. });
  998. //DELETE CATEGORY
  999. $(document).on("click", ".deleteCategory", function () {
  1000. var category = $(this);
  1001. swal({
  1002. title: window.lang.translate('Delete ')+category.parent().parent().attr("data-name")+'?',
  1003. type: "warning",
  1004. showCancelButton: true,
  1005. confirmButtonColor: "#DD6B55",
  1006. confirmButtonText: window.lang.translate('Yes'),
  1007. cancelButtonText: window.lang.translate('No'),
  1008. closeOnConfirm: true,
  1009. closeOnCancel: true
  1010. }, function(isConfirm){
  1011. if (isConfirm) {
  1012. //Create POST Array
  1013. var post = {
  1014. action:'deleteCategory',
  1015. api:'api/?v1/settings/tab/editor/categories',
  1016. id:category.parent().parent().attr("data-id"),
  1017. category:category.parent().parent().attr("data-name"),
  1018. messageTitle:'',
  1019. messageBody:window.lang.translate('Deleted Category')+': '+category.parent().parent().attr("data-name"),
  1020. error:'Organizr Function: API Connection Failed'
  1021. };
  1022. var callbacks = $.Callbacks();
  1023. callbacks.add( buildCategoryEditor );
  1024. settingsAPI(post,callbacks);
  1025. }
  1026. });
  1027. });
  1028. //EDIT CATEGORY GET ID
  1029. $(document).on("click", ".editCategoryButton", function () {
  1030. $('#edit-category-form [name=name]').val($(this).parent().parent().attr("data-name"));
  1031. $('#edit-category-form [name=image]').val($(this).parent().parent().attr("data-image"));
  1032. $('#edit-category-form [name=id]').val($(this).parent().parent().attr("data-id"));
  1033. });
  1034. //EDIT CATEGORY
  1035. $(document).on("click", ".editCategory", function () {
  1036. //Create POST Array
  1037. var post = {
  1038. action:'editCategory',
  1039. api:'api/?v1/settings/tab/editor/categories',
  1040. id:$('#edit-category-form [name=id]').val(),
  1041. name:$('#edit-category-form [name=name]').val(),
  1042. image:$('#edit-category-form [name=image]').val(),
  1043. messageTitle:'',
  1044. messageBody:'Edited Category '+$('#edit-category-form [name=name]').val(),
  1045. error:'Organizr Function: API Connection Failed'
  1046. };
  1047. console.log(post)
  1048. if (typeof post.id == 'undefined' || post.id == '') {
  1049. message('Edit Tab Error',' Could not get Tab ID','bottom-right','#FFF','error','5000');
  1050. }
  1051. if (typeof post.name == 'undefined' || post.name == '') {
  1052. message('Edit Tab Error',' Please set a Tab Name','bottom-right','#FFF','warning','5000');
  1053. }
  1054. if (typeof post.image == 'undefined' || post.image == '') {
  1055. message('Edit Tab Error',' Please set a Tab Image','bottom-right','#FFF','warning','5000');
  1056. }
  1057. if(post.id !== '' && post.name !== '' && post.image !== ''){
  1058. var callbacks = $.Callbacks();
  1059. callbacks.add( buildCategoryEditor );
  1060. settingsAPI(post,callbacks);
  1061. clearForm('#edit-category-form');
  1062. $.magnificPopup.close();
  1063. }
  1064. });
  1065. //CHANGE DEFAULT CATEGORY
  1066. $(document).on("click", ".changeDefaultCategory", function () {
  1067. //Create POST Array
  1068. var post = {
  1069. action:'changeDefault',
  1070. api:'api/?v1/settings/tab/editor/categories',
  1071. id:$(this).parent().parent().attr("data-id"),
  1072. oldCategoryName:$('#categoryEditorTable').find('tr[data-default=true]').attr("data-name"),
  1073. newCategoryName:$(this).parent().parent().attr("data-name"),
  1074. messageTitle:'',
  1075. messageBody:'Changed Default Category to '+$(this).parent().parent().attr("data-name"),
  1076. error:'Organizr Function: API Connection Failed'
  1077. };
  1078. var callbacks = $.Callbacks();
  1079. callbacks.add( buildCategoryEditor );
  1080. settingsAPI(post,callbacks);
  1081. });
  1082. // CHANGE CUSTOMIZE Options
  1083. $(document).on('change asColorPicker::clear asColorPicker::close', '#customize-appearance-form :input', function(e) {
  1084. $(this).attr('data-changed', true);
  1085. switch ($(this).attr('type')) {
  1086. case 'switch':
  1087. case 'checkbox':
  1088. var value = $(this).prop("checked") ? true : false;
  1089. break;
  1090. default:
  1091. var value = $(this).val();
  1092. }
  1093. var post = {
  1094. action:'editCustomizeAppearance',
  1095. api:'api/?v1/settings/customize/appearance',
  1096. name:$(this).attr("name"),
  1097. value:value,
  1098. messageTitle:'',
  1099. messageBody:'Updated Value for '+$(this).parent().parent().find('label').text(),
  1100. error:'Organizr Function: API Connection Failed'
  1101. };
  1102. console.log(post);
  1103. $('#customize-appearance-reload').removeClass('hidden');
  1104. var callbacks = $.Callbacks();
  1105. //callbacks.add( buildCustomizeAppearance );
  1106. settingsAPI(post,callbacks);
  1107. if($(this).hasClass('themeChanger')){
  1108. changeTheme(value);
  1109. }
  1110. if($(this).hasClass('styleChanger')){
  1111. changeStyle(value);
  1112. }
  1113. });
  1114. //DELETE IMAGE
  1115. $(document).on("click", ".deleteImage", function () {
  1116. var image = $(this);
  1117. swal({
  1118. title: window.lang.translate('Delete ')+image.attr("data-image-name")+'?',
  1119. type: "warning",
  1120. showCancelButton: true,
  1121. confirmButtonColor: "#DD6B55",
  1122. confirmButtonText: window.lang.translate('Yes'),
  1123. cancelButtonText: window.lang.translate('No'),
  1124. closeOnConfirm: true,
  1125. closeOnCancel: true
  1126. }, function(isConfirm){
  1127. if (isConfirm) {
  1128. //Create POST Array
  1129. var post = {
  1130. action:'deleteImage',
  1131. api:'api/?v1/settings/image/manager/view',
  1132. imageName:image.attr("data-image-name"),
  1133. imagePath:image.attr("data-image-path"),
  1134. messageTitle:'',
  1135. messageBody:window.lang.translate('Deleted Image')+': '+image.attr("data-image-name"),
  1136. error:'Organizr Function: User API Connection Failed'
  1137. };
  1138. var callbacks = $.Callbacks();
  1139. callbacks.add( buildImageManagerView );
  1140. settingsAPI(post,callbacks);
  1141. }
  1142. });
  1143. });
  1144. // RELOAD Page
  1145. $(document).on("click", ".reload", function () {
  1146. location.reload();
  1147. });
  1148. // ENABLE PLUGIN
  1149. $(document).on('click', '.enablePlugin', function() {
  1150. var post = {
  1151. action:'enable',
  1152. api:'api/?v1/settings/plugins/list',
  1153. name:$(this).attr('data-plugin-name'),
  1154. configName:$(this).attr('data-config-name'),
  1155. messageTitle:'',
  1156. messageBody:'Enabling '+$(this).attr('data-plugin-name'),
  1157. error:'Organizr Function: API Connection Failed'
  1158. };
  1159. //$('#customize-appearance-reload').removeClass('hidden');
  1160. var callbacks = $.Callbacks();
  1161. //callbacks.add( buildCustomizeAppearance );
  1162. settingsAPI(post,callbacks);
  1163. ajaxloader(".content-wrap","in");
  1164. setTimeout(function(){ buildPlugins();ajaxloader(); }, 3000);
  1165. });
  1166. // DISABLE PLUGIN
  1167. $(document).on('click', '.disablePlugin', function() {
  1168. var plugin = $(this);
  1169. swal({
  1170. title: window.lang.translate('Disable')+' '+plugin.attr("data-plugin-name")+'?',
  1171. type: "warning",
  1172. showCancelButton: true,
  1173. confirmButtonColor: "#DD6B55",
  1174. confirmButtonText: window.lang.translate('Yes'),
  1175. cancelButtonText: window.lang.translate('No'),
  1176. closeOnConfirm: true,
  1177. closeOnCancel: true
  1178. }, function(isConfirm){
  1179. if (isConfirm) {
  1180. //Create POST Array
  1181. var post = {
  1182. action:'disable',
  1183. api:'api/?v1/settings/plugins/list',
  1184. name:plugin.attr('data-plugin-name'),
  1185. configName:plugin.attr('data-config-name'),
  1186. messageTitle:'',
  1187. messageBody:'Disabling '+plugin.attr('data-plugin-name'),
  1188. error:'Organizr Function: API Connection Failed'
  1189. };
  1190. //$('#customize-appearance-reload').removeClass('hidden');
  1191. var callbacks = $.Callbacks();
  1192. //callbacks.add( buildCustomizeAppearance );
  1193. settingsAPI(post,callbacks);
  1194. ajaxloader(".content-wrap","in");
  1195. setTimeout(function(){ buildPlugins();ajaxloader(); }, 3000);
  1196. }
  1197. });
  1198. });
  1199. // SSO Option change
  1200. $(document).on('change asColorPicker::close', '#sso-form :input', function(e) {
  1201. var input = $(this);
  1202. switch ($(this).attr('type')) {
  1203. case 'switch':
  1204. case 'checkbox':
  1205. var value = $(this).prop("checked") ? true : false;
  1206. break;
  1207. default:
  1208. var value = $(this).val();
  1209. }
  1210. var post = {
  1211. api:'api/?v1/update/config',
  1212. name:$(this).attr("name"),
  1213. type:$(this).attr("data-type"),
  1214. value:value,
  1215. messageTitle:'',
  1216. messageBody:'Updated Value for '+$(this).parent().parent().find('label').text(),
  1217. error:'Organizr Function: API Connection Failed'
  1218. };
  1219. var callbacks = $.Callbacks();
  1220. //callbacks.add( buildCustomizeAppearance );
  1221. settingsAPI(post,callbacks);
  1222. //disable button then renable
  1223. $('#sso-form :input').prop('disabled', 'true');
  1224. setTimeout(
  1225. function(){
  1226. $('#sso-form :input').prop('disabled', null);
  1227. input.emulateTab();
  1228. },
  1229. 2000
  1230. );
  1231. });
  1232. // MAIN SETTINGS PAGE
  1233. $(document).on('change asColorPicker::close', '#settings-main-form :input', function(e) {
  1234. var input = $(this);
  1235. switch ($(this).attr('type')) {
  1236. case 'switch':
  1237. case 'checkbox':
  1238. var value = $(this).prop("checked") ? true : false;
  1239. break;
  1240. default:
  1241. var value = $(this).val();
  1242. }
  1243. var post = {
  1244. api:'api/?v1/update/config',
  1245. name:$(this).attr("name"),
  1246. type:$(this).attr("data-type"),
  1247. value:value,
  1248. messageTitle:'',
  1249. messageBody:'Updated Value for '+$(this).parent().parent().find('label').text(),
  1250. error:'Organizr Function: API Connection Failed'
  1251. };
  1252. var callbacks = $.Callbacks();
  1253. //callbacks.add( buildCustomizeAppearance );
  1254. settingsAPI(post,callbacks);
  1255. //disable button then renable
  1256. $('#settings-main-form :input').prop('disabled', 'true');
  1257. setTimeout(
  1258. function(){
  1259. $('#settings-main-form :input').prop('disabled', null);
  1260. input.emulateTab();
  1261. },
  1262. 2000
  1263. );
  1264. });
  1265. // AUTH BACKEND HIDE SHOW
  1266. $(document).on('change', '#authSelect, #authBackendSelect', function(e) {
  1267. changeAuth();
  1268. });
  1269. $(document).on("click", ".getSSOPlexToken", function () {
  1270. $('.ssoPlexTokenMessage').text("Grabbing Token");
  1271. $('.ssoPlexTokenHeader').addClass('panel-info').removeClass('panel-warning').removeClass('panel-danger');
  1272. var plex_username = $('#sso-plex-token-form [name=username]').val().trim();
  1273. var plex_password = $('#sso-plex-token-form [name=password]').val().trim();
  1274. if ((plex_password !== '') && (plex_password !== '')) {
  1275. $.ajax({
  1276. type: 'POST',
  1277. headers: {
  1278. 'X-Plex-Product':'Organizr',
  1279. 'X-Plex-Version':'2.0',
  1280. 'X-Plex-Client-Identifier':'01010101-10101010'
  1281. },
  1282. url: 'https://plex.tv/users/sign_in.json',
  1283. data: {
  1284. 'user[login]': plex_username,
  1285. 'user[password]': plex_password,
  1286. force: true
  1287. },
  1288. cache: false,
  1289. async: true,
  1290. complete: function(xhr, status) {
  1291. var result = $.parseJSON(xhr.responseText);
  1292. if (xhr.status === 201) {
  1293. $('.ssoPlexTokenMessage').text(xhr.statusText);
  1294. $('.ssoPlexTokenHeader').addClass('panel-success').removeClass('panel-info').removeClass('panel-warning').removeClass('panel-danger');
  1295. $('#sso-form [name=plexToken]').val(result.user.authToken);
  1296. $('#sso-form [name=plexToken]').change();
  1297. } else {
  1298. $('.ssoPlexTokenMessage').text(xhr.statusText);
  1299. $('.ssoPlexTokenHeader').addClass('panel-danger').removeClass('panel-info').removeClass('panel-warning');
  1300. }
  1301. }
  1302. });
  1303. } else {
  1304. $('.ssoPlexTokenMessage').text("Enter Username and Password");
  1305. $('.ssoPlexTokenHeader').addClass('panel-warning').removeClass('panel-info').removeClass('panel-danger');
  1306. }
  1307. });
  1308. $(document).on("click", ".getPlexMachineSSO", function () {
  1309. var plex_token = $('#sso-form [name=plexToken]').val().trim();
  1310. if (plex_token !== '') {
  1311. $('.ssoPlexMachineMessage').text("Grabbing List");
  1312. $('.ssoPlexMachineHeader').addClass('panel-info').removeClass('panel-warning').removeClass('panel-danger');
  1313. $.ajax({
  1314. type: 'GET',
  1315. headers: {
  1316. 'X-Plex-Product':'Organizr',
  1317. 'X-Plex-Version':'2.0',
  1318. 'X-Plex-Client-Identifier':'01010101-10101010',
  1319. 'X-Plex-Token':plex_token,
  1320. },
  1321. url: 'https://plex.tv/pms/servers.xml',
  1322. cache: false,
  1323. async: true,
  1324. complete: function(xhr, status) {
  1325. var result = $.parseXML(xhr.responseText);
  1326. if (xhr.status === 200) {
  1327. $('.ssoPlexMachineMessage').text('Choose Plex Server');
  1328. $('.ssoPlexMachineHeader').addClass('panel-success').removeClass('panel-info').removeClass('panel-warning');
  1329. var machines = '<option lang="en">Choose Plex Machine</option>';
  1330. $('Server', result).each(function(){
  1331. if($(this).attr('owned') == 1){
  1332. var name = $(this).attr('name');
  1333. var machine = $(this).attr('machineIdentifier');
  1334. machines += '<option value="'+machine+'">'+name+'</option>';
  1335. }
  1336. })
  1337. var listing = `<select class="form-control" id="ssoPlexMachineSelector" data-type="select">`+machines+`</select>`;
  1338. $('.ssoPlexMachineListing').html(listing);
  1339. } else {
  1340. $('.ssoPlexTokenMessage').text(xhr.statusText);
  1341. $('.ssoPlexTokenHeader').addClass('panel-danger').removeClass('panel-info').removeClass('panel-warning');
  1342. }
  1343. }
  1344. });
  1345. } else {
  1346. $('.ssoPlexMachineMessage').text("Plex Token Needed");
  1347. $('.ssoPlexMachineHeader').addClass('panel-warning').removeClass('panel-info').removeClass('panel-danger');
  1348. }
  1349. });
  1350. $(document).on('change', '#ssoPlexMachineSelector', function(e) {
  1351. $('#sso-form [name=plexID]').val($(this).val());
  1352. $('#sso-form [name=plexID]').change();
  1353. });
  1354. $(document).on("click", ".getauthPlexToken", function () {
  1355. $('.authPlexTokenMessage').text("Grabbing Token");
  1356. $('.authPlexTokenHeader').addClass('panel-info').removeClass('panel-warning').removeClass('panel-danger');
  1357. var plex_username = $('#auth-plex-token-form [name=username]').val().trim();
  1358. var plex_password = $('#auth-plex-token-form [name=password]').val().trim();
  1359. if ((plex_password !== '') && (plex_password !== '')) {
  1360. $.ajax({
  1361. type: 'POST',
  1362. headers: {
  1363. 'X-Plex-Product':'Organizr',
  1364. 'X-Plex-Version':'2.0',
  1365. 'X-Plex-Client-Identifier':'01010101-10101010'
  1366. },
  1367. url: 'https://plex.tv/users/sign_in.json',
  1368. data: {
  1369. 'user[login]': plex_username,
  1370. 'user[password]': plex_password,
  1371. force: true
  1372. },
  1373. cache: false,
  1374. async: true,
  1375. complete: function(xhr, status) {
  1376. var result = $.parseJSON(xhr.responseText);
  1377. if (xhr.status === 201) {
  1378. $('.authPlexTokenMessage').text(xhr.statusText);
  1379. $('.authPlexTokenHeader').addClass('panel-success').removeClass('panel-info').removeClass('panel-warning').removeClass('panel-danger');
  1380. $('#settings-main-form [name=plexToken]').val(result.user.authToken);
  1381. $('#settings-main-form [name=plexToken]').change();
  1382. } else {
  1383. $('.authPlexTokenMessage').text(xhr.statusText);
  1384. $('.authPlexTokenHeader').addClass('panel-danger').removeClass('panel-info').removeClass('panel-warning');
  1385. }
  1386. }
  1387. });
  1388. } else {
  1389. $('.authPlexTokenMessage').text("Enter Username and Password");
  1390. $('.authPlexTokenHeader').addClass('panel-warning').removeClass('panel-info').removeClass('panel-danger');
  1391. }
  1392. });
  1393. $(document).on("click", ".getPlexMachineAuth", function () {
  1394. var plex_token = $('#settings-main-form [name=plexToken]').val().trim();
  1395. if (plex_token !== '') {
  1396. $('.authPlexMachineMessage').text("Grabbing List");
  1397. $('.authPlexMachineHeader').addClass('panel-info').removeClass('panel-warning').removeClass('panel-danger');
  1398. $.ajax({
  1399. type: 'GET',
  1400. headers: {
  1401. 'X-Plex-Product':'Organizr',
  1402. 'X-Plex-Version':'2.0',
  1403. 'X-Plex-Client-Identifier':'01010101-10101010',
  1404. 'X-Plex-Token':plex_token,
  1405. },
  1406. url: 'https://plex.tv/pms/servers.xml',
  1407. cache: false,
  1408. async: true,
  1409. complete: function(xhr, status) {
  1410. var result = $.parseXML(xhr.responseText);
  1411. if (xhr.status === 200) {
  1412. $('.authPlexMachineMessage').text('Choose Plex Server');
  1413. $('.authPlexMachineHeader').addClass('panel-success').removeClass('panel-info').removeClass('panel-warning');
  1414. var machines = '<option lang="en">Choose Plex Machine</option>';
  1415. $('Server', result).each(function(){
  1416. if($(this).attr('owned') == 1){
  1417. var name = $(this).attr('name');
  1418. var machine = $(this).attr('machineIdentifier');
  1419. machines += '<option value="'+machine+'">'+name+'</option>';
  1420. }
  1421. })
  1422. var listing = `<select class="form-control" id="authPlexMachineSelector" data-type="select">`+machines+`</select>`;
  1423. $('.authPlexMachineListing').html(listing);
  1424. } else {
  1425. $('.authPlexTokenMessage').text(xhr.statusText);
  1426. $('.authPlexTokenHeader').addClass('panel-danger').removeClass('panel-info').removeClass('panel-warning');
  1427. }
  1428. }
  1429. });
  1430. } else {
  1431. $('.authPlexMachineMessage').text("Plex Token Needed");
  1432. $('.authPlexMachineHeader').addClass('panel-warning').removeClass('panel-info').removeClass('panel-danger');
  1433. }
  1434. });
  1435. $(document).on('change', '#authPlexMachineSelector', function(e) {
  1436. $('#settings-main-form [name=plexID]').val($(this).val());
  1437. $('#settings-main-form [name=plexID]').change();
  1438. });
  1439. $(document).on("click", ".closeErrorPage", function () {
  1440. $('.error-page').html('');
  1441. $('.error-page').fadeOut();
  1442. });
  1443. // test Location
  1444. $(document).on("click", ".testPath", function () {
  1445. var path = $("#form-location").val();
  1446. if (typeof path == 'undefined' || path == '') {
  1447. message('Path Error',' Please enter a path for DB','bottom-right','#FFF','warning','10000');
  1448. }else{
  1449. organizrAPI('POST','api/?v1/wizard_path',{path:path}).success(function(data) {
  1450. var html = JSON.parse(data);
  1451. console.log(html)
  1452. if(html.data == true){
  1453. message('Path',' Path is good to go','bottom-right','#FFF','success','10000');
  1454. }else{
  1455. message('Path Error',' Path is not writable','bottom-right','#FFF','warning','10000');
  1456. }
  1457. }).fail(function(xhr) {
  1458. console.error("Organizr Function: Connection Failed");
  1459. });
  1460. }
  1461. });
  1462. // Save Homepage Form
  1463. $(document).on('change asColorPicker::close', '.homepageForm :input', function(e) {
  1464. var input = $(this);
  1465. switch ($(this).attr('type')) {
  1466. case 'switch':
  1467. case 'checkbox':
  1468. var value = $(this).prop("checked") ? true : false;
  1469. break;
  1470. default:
  1471. var value = $(this).val();
  1472. }
  1473. var post = {
  1474. api:'api/?v1/update/config',
  1475. name:$(this).attr("name"),
  1476. type:$(this).attr("data-type"),
  1477. value:value,
  1478. messageTitle:'',
  1479. messageBody:'Updated Value for '+$(this).parent().parent().find('label').text(),
  1480. error:'Organizr Function: API Connection Failed'
  1481. };
  1482. var callbacks = $.Callbacks();
  1483. //callbacks.add( buildCustomizeAppearance );
  1484. settingsAPI(post,callbacks);
  1485. //disable button then renable
  1486. $('.homepageForm :input').prop('disabled', 'true');
  1487. setTimeout(
  1488. function(){
  1489. $('.homepageForm :input').prop('disabled', null);
  1490. input.emulateTab();
  1491. },
  1492. 2000
  1493. );
  1494. });
  1495. $(document).on({
  1496. mouseenter: function () {
  1497. $(this).find('.progress').toggleClass('progress-lg');
  1498. $(this).find('.progress').find('span').toggleClass('hidden');
  1499. $(this).find('.white-box').toggleClass('nowPlayingHover');
  1500. },
  1501. mouseleave: function () {
  1502. $(this).find('.progress').toggleClass('progress-lg');
  1503. $(this).find('.progress').find('span').toggleClass('hidden');
  1504. $(this).find('.white-box').toggleClass('nowPlayingHover');
  1505. }
  1506. }, '.nowPlayingItem');
  1507. // recent filter
  1508. $(document).on("click", ".recent-filter li>a", function () {
  1509. var filter = $(this).attr('data-filter');
  1510. console.log(filter);
  1511. if(filter == 'all'){
  1512. $('.plex-recent').find('.recent-item').parent().removeClass('hidden');
  1513. }else{
  1514. $('.plex-recent').find('.recent-item').parent().removeClass('hidden');
  1515. $('.plex-recent').find('.recent-item:not(.'+ filter + ')').parent().addClass('hidden');
  1516. }
  1517. });
  1518. // refresh cache image
  1519. $(document).on("click", ".refreshImage", function(e) {
  1520. message('',' Refreshing Image...','bottom-right','#FFF','success','1000');
  1521. e.preventDefault;
  1522. var orginalElement = $(this).parent().parent().parent().parent().find('.imageSource');
  1523. console.log(orginalElement)
  1524. var original = $(this).attr('data-image');
  1525. orginalElement.attr('src', original);
  1526. console.log('replaced image with : '+original);
  1527. setTimeout(function(){
  1528. message('Image Refreshed ',' Clear Cache Please','bottom-right','#FFF','success','3000');
  1529. }, 1000);
  1530. });
  1531. // open tab code
  1532. $(document).on("click", ".openTab", function(e) {
  1533. if($(this).attr("data-open-tab") === "true") {
  1534. var tabName = $(this).attr("data-tab-name");
  1535. var container = $("#container-"+tabName);
  1536. var activeFrame = container.children('iframe');
  1537. if(activeFrame.length === 1){
  1538. $('#menu-'+tabName+' a').trigger("click");
  1539. activeFrame.attr("src", $(this).attr("data-url"));
  1540. }else{
  1541. container.attr("data-url", $(this).attr("data-url"));
  1542. $('#menu-'+tabName+' a').trigger("click");
  1543. }
  1544. }else{
  1545. var source = $(this).attr("data-url");
  1546. window.open(source, '_blank');
  1547. }
  1548. });
  1549. // metadata start
  1550. $(document).on("click", ".metadata-get", function(e) {
  1551. $('.metadata-info').html('');
  1552. var key = $(this).attr('data-key');
  1553. var uid = $(this).attr('data-uid');
  1554. var source = $(this).attr('data-source');
  1555. switch (source) {
  1556. case 'plex':
  1557. var action = 'getPlexMetadata';
  1558. break;
  1559. case 'emby':
  1560. var action = 'getEmbyMetadata';
  1561. break;
  1562. default:
  1563. }
  1564. ajaxloader(".content-wrap","in");
  1565. organizrAPI('POST','api/?v1/homepage/connect',{action:action, key:key}).success(function(data) {
  1566. var response = JSON.parse(data);
  1567. console.log(response);
  1568. $('.'+uid+'-metadata-info').html(buildMetadata(response.data, source));
  1569. $('.'+uid).trigger('click')
  1570. }).fail(function(xhr) {
  1571. console.error("Organizr Function: API Connection Failed");
  1572. });
  1573. ajaxloader();
  1574. });
  1575. // sad play/resume
  1576. $(document).on("click", ".downloader", function(e) {
  1577. var action = $(this).attr('data-action');
  1578. var source = $(this).attr('data-source');
  1579. var target = $(this).attr('data-target');
  1580. console.log(action);
  1581. console.log(source);
  1582. console.log(target);
  1583. ajaxloader(".content-wrap","in");
  1584. organizrAPI('POST','api/?v1/downloader',{action:action, source:source, target:target}).success(function(data) {
  1585. var response = JSON.parse(data);
  1586. console.log(response);
  1587. homepageDownloader(source);
  1588. }).fail(function(xhr) {
  1589. console.error("Organizr Function: API Connection Failed");
  1590. });
  1591. ajaxloader();
  1592. });
  1593. /* ===== Open-Close Right Sidebar ===== */
  1594. $(document).on("click", ".right-side-toggle", function () {
  1595. $(".right-sidebar").slideDown(50).toggleClass("shw-rside");
  1596. $(".fxhdr").on("click", function () {
  1597. $("body").toggleClass("fix-header"); /* Fix Header JS */
  1598. });
  1599. $(".fxsdr").on("click", function () {
  1600. $("body").toggleClass("fix-sidebar"); /* Fix Sidebar JS */
  1601. });
  1602. /* ===== Service Panel JS ===== */
  1603. var fxhdr = $('.fxhdr');
  1604. if ($("body").hasClass("fix-header")) {
  1605. fxhdr.attr('checked', true);
  1606. } else {
  1607. fxhdr.attr('checked', false);
  1608. }
  1609. });