custom.js 66 KB

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