custom.js 59 KB

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