custom.js 62 KB

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