custom.js 57 KB

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