Explorar o código

update all plugin js files

CauseFX %!s(int64=5) %!d(string=hai) anos
pai
achega
0be9da6218
Modificáronse 5 ficheiros con 828 adicións e 1008 borrados
  1. 168 182
      api/plugins/js/chat.js
  2. 1 110
      api/plugins/js/healthChecks.js
  3. 397 421
      api/plugins/js/invites.js
  4. 205 223
      api/plugins/js/php-mailer.js
  5. 57 72
      api/plugins/js/speedTest.js

+ 168 - 182
api/plugins/js/chat.js

@@ -1,200 +1,186 @@
 // FUNCTIONS FOR CHAT
-chatLaunch()
+$('body').arrive('#activeInfo', {onceOnly: true}, function() {
+	chatLaunch();
+});
 function chatLaunch(){
-    if(typeof activeInfo == 'undefined'){
-        setTimeout(function () {
-            chatLaunch();
-        }, 1000);
-    }else{
-        if(activeInfo.plugins["CHAT-enabled"] == true && activeInfo.plugins.includes["CHAT-authKey-include"] !== '' && activeInfo.plugins.includes["CHAT-appID-include"] !== '' && activeInfo.plugins.includes["CHAT-cluster-include"] !== ''){
-            if (activeInfo.user.groupID <= activeInfo.plugins.includes["CHAT-Auth-include"]) {
-                var menuList = `<li><a class=""  href="javascript:void(0)" onclick="tabActions(event,'chat','plugin');chatEntry();"><i class="fa fa-comments-o fa-fw"></i> <span lang="en">Chat</span><small class="chat-counter label label-rouded label-info pull-right hidden">0</small></a></li>`;
-				var htmlDOM = `
-                <div id="container-plugin-chat" class="plugin-container hidden">
-                    <div class="chat-main-box bg-org">
-                        <!-- .chat-left-panel -->
-                        <div class="chat-left-aside">
-                            <div class="open-panel"><i class="ti-angle-right"></i></div>
-                            <div class="chat-left-inner bg-org"><ul class="chatonline style-none "></ul></div>
-                        </div>
-                        <!-- .chat-left-panel -->
-                        <!-- .chat-right-panel -->
-                        <div class="chat-right-aside">
-                            <div class="chat-box">
-                                <ul class="chat-list p-t-30"></ul>
-                                <div class="row send-chat-box">
-                                    <div class="col-sm-12">
-                                        <textarea class="form-control chat-input-send" placeholder="Type your message" lang="en"></textarea>
-                                        <div class="custom-send">
-                                            <button type="button" class="btn btn-info btn-lg custom-send-button"><i class="fa fa-paper-plane fa-2x"></i> </button>
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <!-- .chat-right-panel -->
-                    </div>
-                </div>
-		    	`;
-				$('.append-menu').after(menuList);
-	            $('.plugin-listing').append(htmlDOM);
-	            pageLoad();
-                // Enable pusher logging - don't include this in production
-                //Pusher.logToConsole = true;
-                // Add API Key & cluster here to make the connection
-                var pusher = new Pusher(activeInfo.plugins.includes["CHAT-authKey-include"], {
-                    cluster: activeInfo.plugins.includes["CHAT-cluster-include"],
-                    encrypted: true
-                });
-                // Enter a unique channel you wish your users to be subscribed in.
-                var channel = pusher.subscribe('org_channel');
-                // bind the server event to get the response data and append it to the message div
-                channel.bind('my-event',
-                    function(data) {
-                        formatMessage(data);
-                        $('.chat-list').append(formatMessage(data));
-                        $('.custom-send').html('<button type="button" class="btn btn-info btn-lg custom-send-button"><i class="fa fa-paper-plane fa-2x"></i> </button>');
-                        $(".chat-list").scrollTop($(".chat-list")[0].scrollHeight);
-                        if($('#container-plugin-chat').hasClass('hidden')){
-                            var chatSound =  new Audio(activeInfo.plugins.includes["CHAT-newMessageSound-include"]);
-                            chatSound.play();
-                            message(data.username,data.message,activeInfo.settings.notifications.position,"#FFF","success","20000");
-                            $('.profile-image').addClass('animated loop-animation rubberBand');
-                            $('.chat-counter').removeClass('hidden').html(parseInt($('.chat-counter').text()) + 1);
-                        }
-                    });
-                // check if the user is subscribed to the above channel
-                channel.bind('pusher:subscription_succeeded', function(members) {
-	                organizrConsole('Plugin Function','Chat Websocket Connected!');
-	                organizrConsole('Plugin Function','Connecting to Organizr Chat DB');
-                    getMessagesAndUsers(activeInfo.settings.homepage.refresh["CHAT-userRefreshTimeout"], true);
-                });
-                /*jslint browser: true*/
-                /*global $, jQuery, alert*/
-                $(document).ready(function () {
-                    "use strict";
-                    $('.chat-left-inner > .chatonline').slimScroll({
-                        height: '100%',
-                        position: 'right',
-                        size: "0px",
-                        color: '#dcdcdc'
-
-                    });
-                    $('.chat-list').slimScroll({
-                        height: '100%',
-                        position: 'right',
-                        size: "0px",
-                        color: '#dcdcdc',
-                        start: 'bottom',
-                    });
-                    $(".open-panel").on("click", function () {
-                        $(".chat-left-aside").toggleClass("open-pnl");
-                        $(".open-panel i").toggleClass("ti-angle-left");
-                    });
-                });
-			}
-        }
-    }
+	if(activeInfo.plugins["CHAT-enabled"] == true && activeInfo.plugins.includes["CHAT-authKey-include"] !== '' && activeInfo.plugins.includes["CHAT-appID-include"] !== '' && activeInfo.plugins.includes["CHAT-cluster-include"] !== ''){
+		if (activeInfo.user.groupID <= activeInfo.plugins.includes["CHAT-Auth-include"]) {
+			var menuList = `<li><a class=""  href="javascript:void(0)" onclick="tabActions(event,'chat','plugin');chatEntry();"><i class="fa fa-comments-o fa-fw"></i> <span lang="en">Chat</span><small class="chat-counter label label-rouded label-info pull-right hidden">0</small></a></li>`;
+			var htmlDOM = `
+			<div id="container-plugin-chat" class="plugin-container hidden">
+				<div class="chat-main-box bg-org">
+					<!-- .chat-left-panel -->
+					<div class="chat-left-aside">
+						<div class="open-panel"><i class="ti-angle-right"></i></div>
+						<div class="chat-left-inner bg-org"><ul class="chatonline style-none "></ul></div>
+					</div>
+					<!-- .chat-left-panel -->
+					<!-- .chat-right-panel -->
+					<div class="chat-right-aside">
+						<div class="chat-box">
+							<ul class="chat-list p-t-30"></ul>
+							<div class="row send-chat-box">
+								<div class="col-sm-12">
+									<textarea class="form-control chat-input-send" placeholder="Type your message" lang="en"></textarea>
+									<div class="custom-send">
+										<button type="button" class="btn btn-info btn-lg custom-send-button"><i class="fa fa-paper-plane fa-2x"></i> </button>
+									</div>
+								</div>
+							</div>
+						</div>
+					</div>
+					<!-- .chat-right-panel -->
+				</div>
+			</div>
+			`;
+			$('.append-menu').after(menuList);
+			$('.plugin-listing').append(htmlDOM);
+			pageLoad();
+			// Enable pusher logging - don't include this in production
+			//Pusher.logToConsole = true;
+			// Add API Key & cluster here to make the connection
+			var pusher = new Pusher(activeInfo.plugins.includes["CHAT-authKey-include"], {
+				cluster: activeInfo.plugins.includes["CHAT-cluster-include"],
+				encrypted: true
+			});
+			// Enter a unique channel you wish your users to be subscribed in.
+			var channel = pusher.subscribe('org_channel');
+			// bind the server event to get the response data and append it to the message div
+			channel.bind('my-event',
+				function(data) {
+					formatMessage(data);
+					$('.chat-list').append(formatMessage(data));
+					$('.custom-send').html('<button type="button" class="btn btn-info btn-lg custom-send-button"><i class="fa fa-paper-plane fa-2x"></i> </button>');
+					$(".chat-list").scrollTop($(".chat-list")[0].scrollHeight);
+					if($('#container-plugin-chat').hasClass('hidden')){
+						var chatSound =  new Audio(activeInfo.plugins.includes["CHAT-newMessageSound-include"]);
+						chatSound.play();
+						message(data.username,data.message,activeInfo.settings.notifications.position,"#FFF","success","20000");
+						$('.profile-image').addClass('animated loop-animation rubberBand');
+						$('.chat-counter').removeClass('hidden').html(parseInt($('.chat-counter').text()) + 1);
+					}
+				});
+			// check if the user is subscribed to the above channel
+			channel.bind('pusher:subscription_succeeded', function(members) {
+				organizrConsole('Plugin Function','Chat Websocket Connected!');
+				organizrConsole('Plugin Function','Connecting to Organizr Chat DB');
+				getMessagesAndUsers(activeInfo.settings.homepage.refresh["CHAT-userRefreshTimeout"], true);
+			});
+			/*jslint browser: true*/
+			/*global $, jQuery, alert*/
+			$(document).ready(function () {
+				"use strict";
+				$('.chat-left-inner > .chatonline').slimScroll({
+					height: '100%',
+					position: 'right',
+					size: "0px",
+					color: '#dcdcdc'
+				});
+				$('.chat-list').slimScroll({
+					height: '100%',
+					position: 'right',
+					size: "0px",
+					color: '#dcdcdc',
+					start: 'bottom',
+				});
+				$(".open-panel").on("click", function () {
+					$(".chat-left-aside").toggleClass("open-pnl");
+					$(".open-panel i").toggleClass("ti-angle-left");
+				});
+			});
+		}
+	}
 }
-$(document).on('click', '#CHAT-settings-button', function() {
-    ajaxloader(".content-wrap","in");
-	organizrAPI2('GET','api/v2/plugins/chat/settings').success(function(data) {
-        var response = data.response;
-        $('#CHAT-settings-items').html(buildFormGroup(response.data));
-    }).fail(function(xhr) {
-        console.error("Organizr Function: API Connection Failed");
-    });
-    ajaxloader();
-});
+
 //Chat functions!
 $(document).on('keypress', '.chat-input-send', function(ev) {
-    var keycode = (ev.keyCode ? ev.keyCode : ev.which);
-    if (keycode == '13') {
-        ev.preventDefault();
-        $('.custom-send-button').click();
-    }
+	var keycode = (ev.keyCode ? ev.keyCode : ev.which);
+	if (keycode == '13') {
+		ev.preventDefault();
+		$('.custom-send-button').click();
+	}
 });
 // Send the Message enter by User
 $('body').on('click', '.custom-send-button', function(e) {
-    e.preventDefault();
-    var message = $('.chat-input-send').val();
-    // Validate Name field
-    if (message !== '') {
-        organizrAPI2('POST','api/v2/plugins/chat/message',{ message : message }).success(function(data) {
-            // Nada yet
-        }).fail(function(xhr) {
-            console.error("Organizr Function: API Connection Failed");
-        });
-        // Clear the message input field
-        $('.chat-input-send').val('');
-        // Show a loading image while sending
-        $('.custom-send').html('<button type="button" class="btn btn-info btn-lg custom-send-button" disabled><i class="fa fa-spinner fa-pulse fa-2x"></i> </button>');
-    }
+	e.preventDefault();
+	var message = $('.chat-input-send').val();
+	// Validate Name field
+	if (message !== '') {
+		organizrAPI2('POST','api/v2/plugins/chat/message',{ message : message }).success(function(data) {
+			// Nada yet
+		}).fail(function(xhr) {
+			console.error("Organizr Function: API Connection Failed");
+		});
+		// Clear the message input field
+		$('.chat-input-send').val('');
+		// Show a loading image while sending
+		$('.custom-send').html('<button type="button" class="btn btn-info btn-lg custom-send-button" disabled><i class="fa fa-spinner fa-pulse fa-2x"></i> </button>');
+	}
 });
 function formatMessage(msg){
-    var className = 'odd';
-    if(msg.username == activeInfo.user.username){
-        if(activeInfo.user.username == 'Guest' && activeInfo.user.uid !== msg.uid){
-            className = '';
-        }
-    }else{
-        className = '';
-    }
-    return `
-        <li class="`+className+`">
-            <div class="chat-image"> <img alt="male" src="`+msg.gravatar+`"> </div>
-            <div class="chat-body">
-                <div class="chat-text">
-                    <h4>`+msg.username+`</h4>
-                    <p> `+msg.message+` </p> <b>`+moment.utc(msg.date, "YYYY-MM-DD hh:mm").local().format('LLL')+`</b> </div>
-            </div>
-        </li>
-    `;
+	var className = 'odd';
+	if(msg.username == activeInfo.user.username){
+		if(activeInfo.user.username == 'Guest' && activeInfo.user.uid !== msg.uid){
+			className = '';
+		}
+	}else{
+		className = '';
+	}
+	return `
+		<li class="`+className+`">
+			<div class="chat-image"> <img alt="male" src="`+msg.gravatar+`"> </div>
+			<div class="chat-body">
+				<div class="chat-text">
+					<h4>`+msg.username+`</h4>
+					<p> `+msg.message+` </p> <b>`+moment.utc(msg.date, "YYYY-MM-DD hh:mm").local().format('LLL')+`</b> </div>
+			</div>
+		</li>
+	`;
 }
 function formatUsers(array){
-    var users = {};
-    var userList = '';
-    array.reverse();
-    $.each(array, function (i, v){
-        if(!users.hasOwnProperty(v.username)){
-            users[v.username] = {
-                'last':v.date,
-                'gravatar':v.gravatar
-            }
-        }
-    });
-    $.each(users, function (i, v) {
-        userList += `
-            <li>
-                <a href="javascript:void(0)"><img src="`+v.gravatar+`" alt="user-img" class="img-circle"> <span>`+i+`<small class="text-success">`+moment.utc(v.last, "YYYY-MM-DD hh:mm[Z]").local().fromNow()+`</small></span></a>
-            </li>
-        `;
-    });
-    userList += '<li class="p-20"></li>';
-    return userList;
+	var users = {};
+	var userList = '';
+	array.reverse();
+	$.each(array, function (i, v){
+		if(!users.hasOwnProperty(v.username)){
+			users[v.username] = {
+				'last':v.date,
+				'gravatar':v.gravatar
+			}
+		}
+	});
+	$.each(users, function (i, v) {
+		userList += `
+			<li>
+				<a href="javascript:void(0)"><img src="`+v.gravatar+`" alt="user-img" class="img-circle"> <span>`+i+`<small class="text-success">`+moment.utc(v.last, "YYYY-MM-DD hh:mm[Z]").local().fromNow()+`</small></span></a>
+			</li>
+		`;
+	});
+	userList += '<li class="p-20"></li>';
+	return userList;
 }
 function chatEntry(){
-    $(".chat-list").scrollTop($(".chat-list")[0].scrollHeight);
-    $('.chat-input-send').focus();
-    $('.chat-counter').addClass('hidden').html('0');
+	$(".chat-list").scrollTop($(".chat-list")[0].scrollHeight);
+	$('.chat-input-send').focus();
+	$('.chat-counter').addClass('hidden').html('0');
 }
 function getMessagesAndUsers(timeout, initial = false){
-    var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh["CHAT-userRefreshTimeout"];
-    organizrAPI2('GET','api/v2/plugins/chat/message').success(function(data) {
-        var response = data.response;
-        if(initial == true){
-            $.each(response.data, function (i, v){
-                $('.chat-list').append(formatMessage(v));
-            });
-        }
-        $('.chatonline').html(formatUsers(response.data));
-    }).fail(function(xhr) {
-        console.error("Organizr Function: API Connection Failed");
-    });
-    var timeoutTitle = 'ChatUserList';
-    if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
-    timeouts[timeoutTitle] = setTimeout(function(){ getMessagesAndUsers(timeout, false); }, timeout);
+	var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh["CHAT-userRefreshTimeout"];
+	organizrAPI2('GET','api/v2/plugins/chat/message').success(function(data) {
+		var response = data.response;
+		if(initial == true){
+			$.each(response.data, function (i, v){
+				$('.chat-list').append(formatMessage(v));
+			});
+		}
+		$('.chatonline').html(formatUsers(response.data));
+	}).fail(function(xhr) {
+		console.error("Organizr Function: API Connection Failed");
+	});
+	var timeoutTitle = 'ChatUserList';
+	if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
+	timeouts[timeoutTitle] = setTimeout(function(){ getMessagesAndUsers(timeout, false); }, timeout);
 }
 $(document).on('click', '.profile-pic', function(e) {
-    $('.profile-image').removeClass('animated loop-animation rubberBand');
-});
+	$('.profile-image').removeClass('animated loop-animation rubberBand');
+});

+ 1 - 110
api/plugins/js/healthChecks.js

@@ -1,110 +1 @@
-/* HEALTHCHECKS.IO JS FILE */
-
-// FUNCTIONS
-
-// EVENTS and LISTENERS
-
-// CHANGE CUSTOMIZE Options
-//
-$(document).on('click', '#HEALTHCHECKS-settings-button', function() {
-    ajaxloader(".content-wrap","in");
-    organizrAPI2('GET','api/v2/plugins/healthchecks/settings').success(function(data) {
-        var response = data.response;
-        $('#HEALTHCHECKS-settings-items').html(buildFormGroup(response.data));
-        var elAddButtonStart = $('#HEALTHCHECKS-settings-page [id*="Services"] .row.start');
-        var testone = $('#HEALTHCHECKS-settings-page [id*="Services"] .row.m-b-40').first('span')
-        var testtwo = $('#HEALTHCHECKS-settings-page [id*="Services"] .row.m-b-40 span')
-        $(elAddButtonStart).after('<div class="row"><button type="button" class="btn btn-info pull-right m-r-20 addNewHCService" ><i class="fa fa-plus"></i> Add New Service</button></div>');
-        $.each(testtwo, function(key,val) {
-            var el = $(val);
-            var text = el.text();
-            if(text === 'Service Name'){
-                $(this).after('&nbsp;<div class="pull-right text-danger removeHCService mouse"><i class="fa fa-close text-danger"></i></div>');
-            }
-        })
-
-    }).fail(function(xhr) {
-        console.error("Organizr Function: API Connection Failed");
-    });
-    ajaxloader();
-});
-$(document).on('click', '.addNewHCService', function() {
-    var lastEl = $('#HEALTHCHECKS-settings-page [name*="HEALTHCHECKS-all-items"]').last().attr('name');
-    var newNum = 0;
-    if(typeof lastEl !== 'undefined'){
-        lastEl = Number($('#HEALTHCHECKS-settings-page [name*="HEALTHCHECKS-all-items"]').last().attr('name').replace(/\D/g, ''));
-        newNum = lastEl + 1;
-    }
-    var copyEl = '' +
-        '<div class="row m-b-40">\n' +
-        '\t<!-- INPUT BOX  Yes Multiple -->\n' +
-        '\t<div class="col-md-6 p-b-10">\n' +
-        '\t\t<div class="form-group">\n' +
-        '\t\t\t<label class="control-label col-md-12"><span lang="en">Service Name</span>&nbsp;<div class="pull-right text-danger removeHCService mouse"><i class="fa fa-close text-danger"></i></div></label>\n' +
-        '\t\t\t<div class="col-md-12"> <input data-changed="false" lang="en" type="text" class="form-control" value="" name="HEALTHCHECKS-all-items[999999].name" data-type="input" data-label="Service Name" autocomplete="new-password"> </div> <!-- end div -->\n' +
-        '\t\t</div>\n' +
-        '\t</div>\n' +
-        '\t<!--/ INPUT BOX -->\n' +
-        '\n' +
-        '\t<!-- INPUT BOX  Yes Multiple -->\n' +
-        '\t<div class="col-md-6 p-b-10">\n' +
-        '\t\t<div class="form-group">\n' +
-        '\t\t\t<label class="control-label col-md-12"><span lang="en">UUID</span></label>\n' +
-        '\t\t\t<div class="col-md-12"> <input data-changed="false" lang="en" type="text" class="form-control" value="" name="HEALTHCHECKS-all-items[999999].uuid" data-type="input" data-label="UUID" autocomplete="new-password"> </div> <!-- end div -->\n' +
-        '\t\t</div>\n' +
-        '\t</div>\n' +
-        '\t<!--/ INPUT BOX -->\n' +
-        '\n' +
-        '\t<!-- INPUT BOX  Yes Multiple -->\n' +
-        '\t<div class="col-md-6 p-b-10">\n' +
-        '\t\t<div class="form-group">\n' +
-        '\t\t\t<label class="control-label col-md-12"><span lang="en">External URL</span></label>\n' +
-        '\t\t\t<div class="col-md-12"> <input data-changed="false" lang="en" type="text" class="form-control" value="" name="HEALTHCHECKS-all-items[999999].external" data-type="input" data-label="External URL" autocomplete="new-password"> </div> <!-- end div -->\n' +
-        '\t\t</div>\n' +
-        '\t</div>\n' +
-        '\t<!--/ INPUT BOX -->\n' +
-        '\n' +
-        '\t<!-- INPUT BOX  Yes Multiple -->\n' +
-        '\t<div class="col-md-6 p-b-10">\n' +
-        '\t\t<div class="form-group">\n' +
-        '\t\t\t<label class="control-label col-md-12"><span lang="en">Internal URL</span></label>\n' +
-        '\t\t\t<div class="col-md-12"> <input data-changed="false" lang="en" type="text" class="form-control" value="" name="HEALTHCHECKS-all-items[999999].internal" data-type="input" data-label="Internal URL" autocomplete="new-password"> </div> <!-- end div -->\n' +
-        '\t\t</div>\n' +
-        '\t</div>\n' +
-        '\t<!--/ INPUT BOX -->\n' +
-        '\n' +
-        '\t<!-- INPUT BOX  Yes Multiple -->\n' +
-        '\t<div class="col-md-6 p-b-10">\n' +
-        '\t\t<div class="form-group">\n' +
-        '\t\t\t<label class="control-label col-md-12"><span lang="en">Enabled</span></label>\n' +
-        '\t\t\t<div class="col-md-12"> <input data-changed="false" type="checkbox" class="js-switch" data-size="small" data-color="#99d683" data-secondary-color="#f96262" name="HEALTHCHECKS-all-items[999999].enabled" value="" checked="" data-type="switch" data-label="Enabled"><input data-changed="false" type="hidden" name="HEALTHCHECKS-all-items[999999].enabled" value=""> </div> <!-- end div -->\n' +
-        '\t\t</div>\n' +
-        '\t</div>\n' +
-        '\t<!--/ INPUT BOX -->\n' +
-        '</div>'
-//smallLabel+'<input data-changed="false" type="checkbox" class="js-switch'+extraClass+'" data-size="small" data-color="#99d683" data-secondary-color="#f96262"'+name+value+tof(item.value,'c')+id+disabled+type+label+attr+' /><input data-changed="false" type="hidden"'+name+'value="false">';
-    var elAddButtonStart = $('#HEALTHCHECKS-settings-page [id*="Services"] .row.start');
-    var copiedEl = $(copyEl).clone();
-    copiedEl.find("input").each(function() {
-        var currentName = $(this).attr("name");
-        var newName = currentName.replace('999999', newNum);
-        $(this).attr("name", newName);
-        $(this).attr("value", "");
-    });
-    $(copiedEl).appendTo(elAddButtonStart);
-    $(function () {
-        // Switchery
-        var elems = Array.prototype.slice.call(document.querySelectorAll('.js-switch'));
-        $('.js-switch').each(function() {
-            if ($(this).attr('data-switchery') !== 'true'){
-                new Switchery($(this)[0], $(this).data());
-            }
-        });
-    });
-
-});
-
-$(document).on('click', '.removeHCService', function() {
-    $(this).closest('.row').remove();
-    $('#HEALTHCHECKS-settings-page-save').removeClass('hidden');
-});
+/* HEALTHCHECKS.IO JS FILE IS NO LONGER NEEDED OR USED */

+ 397 - 421
api/plugins/js/invites.js

@@ -1,231 +1,223 @@
 /* INVITES JS FILE */
+$('body').arrive('#activeInfo', {onceOnly: true}, function() {
+	inviteLaunch();
+});
 // FUNCTIONS
-inviteLaunch()
 function inviteLaunch(){
-    if(typeof activeInfo == 'undefined'){
-        setTimeout(function () {
-            inviteLaunch();
-        }, 1000);
-    }else{
-        var menuList = '';
-    	var htmlDOM = `
-    	<div id="invite-area" class="white-popup mfp-with-anim mfp-hide">
-    		<div class="col-md-10 col-md-offset-1">
-    			<div class="invite-div"></div>
-    		</div>
-    	</div>
-    	`;
-        if(activeInfo.plugins["INVITES-enabled"] == true){
-            if (activeInfo.user.loggedin === true && activeInfo.user.groupID <= 1) {
-                menuList = `<li><a class="inline-popups inviteModal" href="#invite-area" data-effect="mfp-zoom-out"><i class="fa fa-ticket fa-fw"></i> <span lang="en">Manage Invites</span></a></li>`;
-                htmlDOM += `
-            	<div id="new-invite-area" class="white-popup mfp-with-anim mfp-hide">
-            		<div class="col-md-10 col-md-offset-1">
-                        <div class="col-md-12">
-                            <div class="panel panel-info m-b-0">
-                                <div class="panel-heading" lang="en">New Invite</div>
-                                <div class="panel-wrapper collapse in" aria-expanded="true">
-                                    <div class="panel-body">
-
-                                        <form id="new-invite-form">
-                                            <fieldset style="border:0;">
-                                            <div class="form-group">
-                                                <label class="control-label" for="new-invite-form-inputUsername" lang="en">Name or Username</label>
-                                                <input type="text" class="form-control" id="new-invite-form-inputUsername" name="username" required="" autofocus="">
-                                            </div>
-                                            <div class="form-group">
-                                                <label class="control-label" for="new-invite-form-inputEmail" lang="en">Email</label>
-                                                <input type="text" class="form-control" id="new-invite-form-inputEmail" name="email" required="" autofocus="">
-                                            </div>
-                                            </fieldset>
-                                            <button class="btn btn-sm btn-info btn-rounded waves-effect waves-light pull-right row b-none" onclick="createNewInvite();" type="button"><span class="btn-label"><i class="fa fa-plus"></i></span><span lang="en">Create/Send Invite</span></button>
-                                            <div class="clearfix"></div>
-                                        </form>
-
-
-
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="clearfix"></div>
-            		</div>
-            	</div>`;
-            }else if (activeInfo.user.loggedin === false){
-                menuList = `<li><a class="inline-popups inviteModal" href="#invite-area" data-effect="mfp-zoom-out"><i class="fa fa-ticket fa-fw"></i> <span lang="en">Use Invite Code</span></a></li>`;
-            }
-            $('.append-menu').after(menuList);
-            $('.organizr-area').after(htmlDOM);
-            pageLoad();
-            getInvite();
-        }
-    }
+	var menuList = '';
+	var htmlDOM = `
+	<div id="invite-area" class="white-popup mfp-with-anim mfp-hide">
+		<div class="col-md-10 col-md-offset-1">
+			<div class="invite-div"></div>
+		</div>
+	</div>
+	`;
+	if(activeInfo.plugins["INVITES-enabled"] == true){
+		if (activeInfo.user.loggedin === true && activeInfo.user.groupID <= 1) {
+			menuList = `<li><a class="inline-popups inviteModal" href="#invite-area" data-effect="mfp-zoom-out"><i class="fa fa-ticket fa-fw"></i> <span lang="en">Manage Invites</span></a></li>`;
+			htmlDOM += `
+			<div id="new-invite-area" class="white-popup mfp-with-anim mfp-hide">
+				<div class="col-md-10 col-md-offset-1">
+					<div class="col-md-12">
+						<div class="panel panel-info m-b-0">
+							<div class="panel-heading" lang="en">New Invite</div>
+							<div class="panel-wrapper collapse in" aria-expanded="true">
+								<div class="panel-body">
+									<form id="new-invite-form">
+										<fieldset style="border:0;">
+										<div class="form-group">
+											<label class="control-label" for="new-invite-form-inputUsername" lang="en">Name or Username</label>
+											<input type="text" class="form-control" id="new-invite-form-inputUsername" name="username" required="" autofocus="">
+										</div>
+										<div class="form-group">
+											<label class="control-label" for="new-invite-form-inputEmail" lang="en">Email</label>
+											<input type="text" class="form-control" id="new-invite-form-inputEmail" name="email" required="" autofocus="">
+										</div>
+										</fieldset>
+										<button class="btn btn-sm btn-info btn-rounded waves-effect waves-light pull-right row b-none" onclick="createNewInvite();" type="button"><span class="btn-label"><i class="fa fa-plus"></i></span><span lang="en">Create/Send Invite</span></button>
+										<div class="clearfix"></div>
+									</form>
+								</div>
+							</div>
+						</div>
+					</div>
+					<div class="clearfix"></div>
+				</div>
+			</div>`;
+		}else if (activeInfo.user.loggedin === false){
+			menuList = `<li><a class="inline-popups inviteModal" href="#invite-area" data-effect="mfp-zoom-out"><i class="fa fa-ticket fa-fw"></i> <span lang="en">Use Invite Code</span></a></li>`;
+		}
+		$('.append-menu').after(menuList);
+		$('.organizr-area').after(htmlDOM);
+		pageLoad();
+		getInvite();
+	}
 }
 function joinPlex(){
-    var username = $('#invitePlexJoinUsername');
-    var email = $('#invitePlexJoinEmail');
-    var password = $('#invitePlexJoinPassword');
-    if(username.val() == ''){
-        username.focus();
-        message('Invite Error',' Please Enter Username',activeInfo.settings.notifications.position,'#FFF','warning','5000');
-    }else if(email.val() == ''){
-        email.focus();
-        message('Invite Error',' Please Enter Email',activeInfo.settings.notifications.position,'#FFF','warning','5000');
-    }else if(password.val() == ''){
-        password.focus();
-        message('Invite Error',' Please Enter Password',activeInfo.settings.notifications.position,'#FFF','warning','5000');
-    }
-    if(email.val() !== '' && username.val() !== '' && password.val() !== ''){
-        organizrAPI2('POST','api/v2/plex/register',{username:username.val(), email:email.val(), password:password.val()}).success(function(data) {
-    		var response = data.response;
-            if(response.result === 'success'){
-                $('.invite-step-3-plex-no').toggleClass('hidden');
-                $('.invite-step-3-plex-yes').toggleClass('hidden');
-                message('Invite Function',' User Created',activeInfo.settings.notifications.position,'#FFF','success','5000');
-                $('#inviteUsernameInvite').val(username.val());
-                hasPlexUsername();
-            }else{
-                message('Invite Error',' '+response.message,activeInfo.settings.notifications.position,'#FFF','warning','5000');
-            }
-    	}).fail(function(xhr) {
-	        OrganizrApiError(xhr, 'Plex Signup Error');
-    	});
-    }
+	var username = $('#invitePlexJoinUsername');
+	var email = $('#invitePlexJoinEmail');
+	var password = $('#invitePlexJoinPassword');
+	if(username.val() == ''){
+		username.focus();
+		message('Invite Error',' Please Enter Username',activeInfo.settings.notifications.position,'#FFF','warning','5000');
+	}else if(email.val() == ''){
+		email.focus();
+		message('Invite Error',' Please Enter Email',activeInfo.settings.notifications.position,'#FFF','warning','5000');
+	}else if(password.val() == ''){
+		password.focus();
+		message('Invite Error',' Please Enter Password',activeInfo.settings.notifications.position,'#FFF','warning','5000');
+	}
+	if(email.val() !== '' && username.val() !== '' && password.val() !== ''){
+		organizrAPI2('POST','api/v2/plex/register',{username:username.val(), email:email.val(), password:password.val()}).success(function(data) {
+			var response = data.response;
+			if(response.result === 'success'){
+				$('.invite-step-3-plex-no').toggleClass('hidden');
+				$('.invite-step-3-plex-yes').toggleClass('hidden');
+				message('Invite Function',' User Created',activeInfo.settings.notifications.position,'#FFF','success','5000');
+				$('#inviteUsernameInvite').val(username.val());
+				hasPlexUsername();
+			}else{
+				message('Invite Error',' '+response.message,activeInfo.settings.notifications.position,'#FFF','warning','5000');
+			}
+		}).fail(function(xhr) {
+			OrganizrApiError(xhr, 'Plex Signup Error');
+		});
+	}
 }
 
 function joinEmby(){
-    var username = $('#inviteEmbyJoinUsername');
-    var email = $('#inviteEmbyJoinEmail');
-    var password = $('#inviteEmbyJoinPassword');
-    if(username.val() == ''){
-        username.focus();
-        message('Invite Error',' Please Enter Username',activeInfo.settings.notifications.position,'#FFF','warning','5000');
-    }else if(email.val() == ''){
-        email.focus();
-        message('Invite Error',' Please Enter Email',activeInfo.settings.notifications.position,'#FFF','warning','5000');
-    }else if(password.val() == ''){
-        password.focus();
-        message('Invite Error',' Please Enter Password',activeInfo.settings.notifications.position,'#FFF','warning','5000');
-    }
-    if(email.val() !== '' && username.val() !== '' && password.val() !== ''){
-        organizrAPI2('POST','api/v2/emby/register',{username:username.val(), email:email.val(), password:password.val()}).success(function(data) {
-    		var response = data.response;
-            if(response.result === 'success'){
-                $('.invite-step-3-emby-no').toggleClass('hidden');
-                $('.invite-step-3-emby-yes').toggleClass('hidden');
-                message('Invite Function',' User Created',activeInfo.settings.notifications.position,'#FFF','success','5000');
-                $('#inviteUsernameInviteEmby').val(username.val());
-                hasEmbyUsername();
-            }else{
-                message('Invite Error',' '+response.message,activeInfo.settings.notifications.position,'#FFF','warning','5000');
-            }
-    	}).fail(function(xhr) {
-	        OrganizrApiError(xhr, 'Emby Signup Error');
-    	});
-    }
+	var username = $('#inviteEmbyJoinUsername');
+	var email = $('#inviteEmbyJoinEmail');
+	var password = $('#inviteEmbyJoinPassword');
+	if(username.val() == ''){
+		username.focus();
+		message('Invite Error',' Please Enter Username',activeInfo.settings.notifications.position,'#FFF','warning','5000');
+	}else if(email.val() == ''){
+		email.focus();
+		message('Invite Error',' Please Enter Email',activeInfo.settings.notifications.position,'#FFF','warning','5000');
+	}else if(password.val() == ''){
+		password.focus();
+		message('Invite Error',' Please Enter Password',activeInfo.settings.notifications.position,'#FFF','warning','5000');
+	}
+	if(email.val() !== '' && username.val() !== '' && password.val() !== ''){
+		organizrAPI2('POST','api/v2/emby/register',{username:username.val(), email:email.val(), password:password.val()}).success(function(data) {
+			var response = data.response;
+			if(response.result === 'success'){
+				$('.invite-step-3-emby-no').toggleClass('hidden');
+				$('.invite-step-3-emby-yes').toggleClass('hidden');
+				message('Invite Function',' User Created',activeInfo.settings.notifications.position,'#FFF','success','5000');
+				$('#inviteUsernameInviteEmby').val(username.val());
+				hasEmbyUsername();
+			}else{
+				message('Invite Error',' '+response.message,activeInfo.settings.notifications.position,'#FFF','warning','5000');
+			}
+		}).fail(function(xhr) {
+			OrganizrApiError(xhr, 'Emby Signup Error');
+		});
+	}
 }
 
 function inviteHasAccount(type,value){
-    switch (type) {
-        case 'plex':
-            if(value){
-                $('.invite-step-2').toggleClass('hidden');
-                $('.invite-step-3-plex-yes').toggleClass('hidden');
-            }else{
-                $('.invite-step-2').toggleClass('hidden');
-                $('.invite-step-3-plex-no').toggleClass('hidden');
-            }
-            break;
-        case 'emby' :
-          if(value){
-            $('.invite-step-2').toggleClass('hidden');
-            $('.invite-step-3-emby-yes').toggleClass('hidden');
-          }else{
-            $('.invite-step-2').toggleClass('hidden');
-            $('.invite-step-3-emby-no').toggleClass('hidden');
-          }
-          break;
-        default:
-        alert(type+' is not set up yet');
-    }
+	switch (type) {
+		case 'plex':
+			if(value){
+				$('.invite-step-2').toggleClass('hidden');
+				$('.invite-step-3-plex-yes').toggleClass('hidden');
+			}else{
+				$('.invite-step-2').toggleClass('hidden');
+				$('.invite-step-3-plex-no').toggleClass('hidden');
+			}
+			break;
+		case 'emby' :
+		  if(value){
+			$('.invite-step-2').toggleClass('hidden');
+			$('.invite-step-3-emby-yes').toggleClass('hidden');
+		  }else{
+			$('.invite-step-2').toggleClass('hidden');
+			$('.invite-step-3-emby-no').toggleClass('hidden');
+		  }
+		  break;
+		default:
+		alert(type+' is not set up yet');
+	}
 }
 function hasPlexUsername(){
-    var code = $('#inviteCodeInput').val().toUpperCase();
-    var username = $('#inviteUsernameInvite');
-    if(username.val() == ''){
-        username.focus();
-        message('Invite Error',' Please Enter Username',activeInfo.settings.notifications.position,'#FFF','warning','5000');
-    }else{
-        var post = {
-            usedby:username.val()
-        };
-        ajaxloader(".content-wrap","in");
-        organizrAPI2('POST','api/v2/plugins/invites/' + code,post).success(function(data) {
-            var response = data.response;
-            if(response.result === 'success'){
-                $('.invite-step-3-plex-yes').toggleClass('hidden');
-                $('.invite-step-4-plex-accept').toggleClass('hidden');
-                if(local('get', 'invite')){
-            		local('remove', 'invite');
-            	}
-            }else{
-                message('Invite Error',response.message,activeInfo.settings.notifications.position,'#FFF','warning','5000');
-            }
-            ajaxloader();;
-        }).fail(function(xhr) {
-	        OrganizrApiError(xhr);
-            ajaxloader();
-        });
-    }
+	var code = $('#inviteCodeInput').val().toUpperCase();
+	var username = $('#inviteUsernameInvite');
+	if(username.val() == ''){
+		username.focus();
+		message('Invite Error',' Please Enter Username',activeInfo.settings.notifications.position,'#FFF','warning','5000');
+	}else{
+		var post = {
+			usedby:username.val()
+		};
+		ajaxloader(".content-wrap","in");
+		organizrAPI2('POST','api/v2/plugins/invites/' + code,post).success(function(data) {
+			var response = data.response;
+			if(response.result === 'success'){
+				$('.invite-step-3-plex-yes').toggleClass('hidden');
+				$('.invite-step-4-plex-accept').toggleClass('hidden');
+				if(local('get', 'invite')){
+					local('remove', 'invite');
+				}
+			}else{
+				message('Invite Error',response.message,activeInfo.settings.notifications.position,'#FFF','warning','5000');
+			}
+			ajaxloader();;
+		}).fail(function(xhr) {
+			OrganizrApiError(xhr);
+			ajaxloader();
+		});
+	}
 }
 function hasEmbyUsername(){
-    var code = $('#inviteCodeInput').val().toUpperCase();
-    var username = $('#inviteUsernameInviteEmby');
-    if(username.val() == ''){
-        username.focus();
-        message('Invite Error',' Please Enter Username',activeInfo.settings.notifications.position,'#FFF','warning','5000');
-    }else{
-        var post = {
-            usedby:username.val()
-        };
-        ajaxloader(".content-wrap","in");
-        organizrAPI2('POST','api/v2/plugins/invites/' + code,post).success(function(data) {
-	        var response = data.response;
-	        if(response.result === 'success'){
-                $('.invite-step-3-emby-yes').toggleClass('hidden');
-                $('.invite-step-4-emby-accept').toggleClass('hidden');
-                if(local('get', 'invite')){
-            		local('remove', 'invite');
-            	}
-            }else{
-                message('Invite Error',response.message,activeInfo.settings.notifications.position,'#FFF','warning','5000');
-            }
-            ajaxloader();;
-        }).fail(function(xhr) {
-	        OrganizrApiError(xhr);
-            ajaxloader();
-        });
-    }
+	var code = $('#inviteCodeInput').val().toUpperCase();
+	var username = $('#inviteUsernameInviteEmby');
+	if(username.val() == ''){
+		username.focus();
+		message('Invite Error',' Please Enter Username',activeInfo.settings.notifications.position,'#FFF','warning','5000');
+	}else{
+		var post = {
+			usedby:username.val()
+		};
+		ajaxloader(".content-wrap","in");
+		organizrAPI2('POST','api/v2/plugins/invites/' + code,post).success(function(data) {
+			var response = data.response;
+			if(response.result === 'success'){
+				$('.invite-step-3-emby-yes').toggleClass('hidden');
+				$('.invite-step-4-emby-accept').toggleClass('hidden');
+				if(local('get', 'invite')){
+					local('remove', 'invite');
+				}
+			}else{
+				message('Invite Error',response.message,activeInfo.settings.notifications.position,'#FFF','warning','5000');
+			}
+			ajaxloader();;
+		}).fail(function(xhr) {
+			OrganizrApiError(xhr);
+			ajaxloader();
+		});
+	}
 }
 function verifyInvite(){
-    var code = $('#inviteCodeInput').val().toUpperCase();
-    ajaxloader(".content-wrap","in");
-    organizrAPI2('GET','api/v2/plugins/invites/'+code).success(function(data) {
-        var response = data.response;
-        if(response.result === 'success'){
-            $('.invite-step-1').toggleClass('hidden');
-            $('.invite-step-2').toggleClass('hidden');
-        }else{
-            message('Invite Error',response.message,activeInfo.settings.notifications.position,'#FFF','warning','5000');
-        }
-        if(local('get', 'invite')){
-            local('remove', 'invite');
-        }
-        ajaxloader();;
-    }).fail(function(xhr) {
-	    OrganizrApiError(xhr);
-        ajaxloader();
-    });
+	var code = $('#inviteCodeInput').val().toUpperCase();
+	ajaxloader(".content-wrap","in");
+	organizrAPI2('GET','api/v2/plugins/invites/'+code).success(function(data) {
+		var response = data.response;
+		if(response.result === 'success'){
+			$('.invite-step-1').toggleClass('hidden');
+			$('.invite-step-2').toggleClass('hidden');
+		}else{
+			message('Invite Error',response.message,activeInfo.settings.notifications.position,'#FFF','warning','5000');
+		}
+		if(local('get', 'invite')){
+			local('remove', 'invite');
+		}
+		ajaxloader();;
+	}).fail(function(xhr) {
+		OrganizrApiError(xhr);
+		ajaxloader();
+	});
 }
 function getInvite(invite=null){
 	if(invite){
@@ -237,232 +229,216 @@ function getInvite(invite=null){
 	if(local('get', 'invite')){
 		//show error page
 		$('.inviteModal').trigger('click');
-        $('#inviteCodeInput').val(local('get', 'invite'));
+		$('#inviteCodeInput').val(local('get', 'invite'));
 		window.history.pushState({}, document.title, "./" );
-        local('remove', 'invite');
+		local('remove', 'invite');
 	}
 
 }
 function createNewInvite(){
-    var username = $('#new-invite-form-inputUsername');
-    var email = $('#new-invite-form-inputEmail');
-    if(username.val() == ''){
-        username.focus();
-        message('Invite Error',' Please Enter Username',activeInfo.settings.notifications.position,'#FFF','warning','5000');
-    }else if(email.val() == ''){
-        email.focus();
-        message('Invite Error',' Please Enter Email',activeInfo.settings.notifications.position,'#FFF','warning','5000');
-    }
+	var username = $('#new-invite-form-inputUsername');
+	var email = $('#new-invite-form-inputEmail');
+	if(username.val() == ''){
+		username.focus();
+		message('Invite Error',' Please Enter Username',activeInfo.settings.notifications.position,'#FFF','warning','5000');
+	}else if(email.val() == ''){
+		email.focus();
+		message('Invite Error',' Please Enter Email',activeInfo.settings.notifications.position,'#FFF','warning','5000');
+	}
 
-    if(email.val() !== '' && username.val() !== ''){
-        var post = {
-            code:createRandomString(6).toUpperCase(),
-            email:email.val(),
-            username:username.val(),
-        };
-        ajaxloader(".content-wrap","in");
-        organizrAPI2('POST','api/v2/plugins/invites',post).success(function(data) {
-            var response = data.response;
-            $.magnificPopup.close();
-            ajaxloader();
-            message('Invite',' Invite Created',activeInfo.settings.notifications.position,'#FFF','success','5000');
-        }).fail(function(xhr) {
-	        OrganizrApiError(xhr);
-            ajaxloader();
-            message('Invite Error',' An Error Occured',activeInfo.settings.notifications.position,'#FFF','error','5000');
-        });
-    }
+	if(email.val() !== '' && username.val() !== ''){
+		var post = {
+			code:createRandomString(6).toUpperCase(),
+			email:email.val(),
+			username:username.val(),
+		};
+		ajaxloader(".content-wrap","in");
+		organizrAPI2('POST','api/v2/plugins/invites',post).success(function(data) {
+			var response = data.response;
+			$.magnificPopup.close();
+			ajaxloader();
+			message('Invite',' Invite Created',activeInfo.settings.notifications.position,'#FFF','success','5000');
+		}).fail(function(xhr) {
+			OrganizrApiError(xhr);
+			ajaxloader();
+			message('Invite Error',' An Error Occured',activeInfo.settings.notifications.position,'#FFF','error','5000');
+		});
+	}
 
 }
 function deleteInvite(code, id){
-    ajaxloader(".content-wrap","in");
-    organizrAPI2('DELETE','api/v2/plugins/invites/' + code).success(function(data) {
-        var response = data.response;
-        $('#inviteItem-'+id).remove();
-        //$.magnificPopup.close();
-        ajaxloader();
-        message('Invite',' Invite Deleted',activeInfo.settings.notifications.position,'#FFF','success','5000');
-    }).fail(function(xhr) {
-        console.error("Organizr Function: API Connection Failed");
-        ajaxloader();
-        message('Invite Error',' An Error Occured',activeInfo.settings.notifications.position,'#FFF','error','5000');
-    });
+	ajaxloader(".content-wrap","in");
+	organizrAPI2('DELETE','api/v2/plugins/invites/' + code).success(function(data) {
+		var response = data.response;
+		$('#inviteItem-'+id).remove();
+		//$.magnificPopup.close();
+		ajaxloader();
+		message('Invite',' Invite Deleted',activeInfo.settings.notifications.position,'#FFF','success','5000');
+	}).fail(function(xhr) {
+		console.error("Organizr Function: API Connection Failed");
+		ajaxloader();
+		message('Invite Error',' An Error Occured',activeInfo.settings.notifications.position,'#FFF','error','5000');
+	});
 
 }
 // EVENTS and LISTENERS
 function buildInvites(array){
-    if(array.length == 0){
+	if(array.length == 0){
 		return '<h2 class="text-center" lang="en">No Invites</h2>';
 	}
-    var invites = '';
+	var invites = '';
 	$.each(array, function(i,v) {
-        v.dateused = (v.dateused) ? v.dateused : '-';
-        v.usedby = (v.usedby) ? v.usedby : '-';
-        v.ip = (v.ip) ? v.ip : '-';
-        invites += `
-        <tr id="inviteItem-`+v.id+`">
-            <td class="text-center">`+v.id+`</td>
-            <td>`+v.username+`</td>
-            <td>`+v.email+`</td>
-            <td>`+v.code+`</td>
-            <td>`+v.date+`</td>
-            <td>`+v.dateused+`</td>
-            <td>`+v.usedby+`</td>
-            <td>`+v.ip+`</td>
-            <td>`+v.valid+`</td>
-            <td><button type="button" class="btn btn-danger btn-outline btn-circle btn-lg m-r-5" onclick="deleteInvite('`+v.code+`','`+v.id+`');"><i class="ti-trash"></i></button></td>
-        </tr>
-        `;
-    });
-    return invites;
+		v.dateused = (v.dateused) ? v.dateused : '-';
+		v.usedby = (v.usedby) ? v.usedby : '-';
+		v.ip = (v.ip) ? v.ip : '-';
+		invites += `
+		<tr id="inviteItem-`+v.id+`">
+			<td class="text-center">`+v.id+`</td>
+			<td>`+v.username+`</td>
+			<td>`+v.email+`</td>
+			<td>`+v.code+`</td>
+			<td>`+v.date+`</td>
+			<td>`+v.dateused+`</td>
+			<td>`+v.usedby+`</td>
+			<td>`+v.ip+`</td>
+			<td>`+v.valid+`</td>
+			<td><button type="button" class="btn btn-danger btn-outline btn-circle btn-lg m-r-5" onclick="deleteInvite('`+v.code+`','`+v.id+`');"><i class="ti-trash"></i></button></td>
+		</tr>
+		`;
+	});
+	return invites;
 }
 $(document).on('click', '.inviteModal', function() {
-    var htmlDOM = '';
-    if (activeInfo.user.loggedin === true && activeInfo.user.groupID <= 1) {
-        ajaxloader(".content-wrap","in");
-        organizrAPI2('GET','api/v2/plugins/invites').success(function(data) {
-            var response = data.response;
-            var htmlDOM = '';
-            htmlDOM = `
-            <div class="col-md-12">
-                <div class="panel bg-org panel-info">
-                    <div class="panel-heading">
-                        <span lang="en">Manage Invites</span>
-                        <button type="button" class="btn btn-info btn-circle pull-right popup-with-form" href="#new-invite-area" data-effect="mfp-3d-unfold"><i class="fa fa-plus"></i> </button>
-                    </div>
-                    <div class="table-responsive">
-                        <table class="table table-hover manage-u-table">
-                            <thead>
-                                <tr>
-                                    <th width="70" class="text-center">#</th>
-                                    <th lang="en">USERNAME</th>
-                                    <th lang="en">EMAIL</th>
-                                    <th lang="en">INVITE CODE</th>
-                                    <th lang="en">DATE SENT</th>
-                                    <th lang="en">DATE USED</th>
-                                    <th lang="en">USED BY</th>
-                                    <th lang="en">IP ADDRESS</th>
-                                    <th lang="en">VALID</th>
-                                    <th lang="en">DELETE</th>
-                                </tr>
-                            </thead>
-                            <tbody id="manageInviteTable">
-                                `+buildInvites(response.data)+`
-                            </tbody>
-                        </table>
-                    </div>
-                </div>
-            </div>
-            <div class="clearfix"></div>
-            `;
-            $('.invite-div').html(htmlDOM);
-        }).fail(function(xhr) {
-            console.error("Organizr Function: API Connection Failed");
-        });
-        ajaxloader();
-    }else if (activeInfo.user.loggedin === false){
-        htmlDOM = `
-        <div class="col-md-12">
-            <div class="panel panel-info m-b-0">
-                <div class="panel-heading" lang="en">Use Invite Code</div>
-                <div class="panel-wrapper collapse in" aria-expanded="true">
-                    <div class="panel-body">
-                        <div class="form-group invite-step-1">
-                            <div class="input-group" style="width: 100%;">
-                                <div class="input-group-addon hidden-xs"><i class="ti-lock"></i></div>
-                                <input type="text" class="form-control text-uppercase" id="inviteCodeInput" placeholder="Code" autocomplete="off" autocorrect="off" autocapitalize="off" maxlength="6" spellcheck="false" autofocus="" required="">
-                            </div>
-                            <br />
-                            <button class="btn btn-block btn-info" onclick="verifyInvite();">Verify</button>
-
-                        </div>
-                        <div class="form-group invite-step-2 hidden">
-
-
-                            <div class="row">
-                                <h2 class="text-center" lang="en">Do you have a `+activeInfo.plugins.includes["INVITES-type-include"].toUpperCase()+` account?</h2>
-                                <div class="col-lg-6">
-                                    <button class="btn btn-block btn-info m-b-10" onclick="inviteHasAccount('`+activeInfo.plugins.includes["INVITES-type-include"]+`',true);" lang="en">Yes</button>
-                                </div>
-                                <div class="col-lg-6">
-                                    <button class="btn btn-block btn-primary m-b-10" onclick="inviteHasAccount('`+activeInfo.plugins.includes["INVITES-type-include"]+`',false);" lang="en">No</button>
-                                </div>
-                            </div>
-
-                        </div>
-                        <div class="form-group invite-step-3-plex-yes hidden">
-                            <div class="input-group" style="width: 100%;">
-                                <div class="input-group-addon hidden-xs"><i class="ti-user"></i></div>
-                                <input type="text" class="form-control" id="inviteUsernameInvite" placeholder="Plex Username or Email" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" autofocus="" required="">
-                            </div>
-                            <br />
-                            <button class="btn btn-block btn-info" onclick="hasPlexUsername();">Submit</button>
-                        </div>
-                        <div class="form-group invite-step-3-plex-no hidden">
-                            <div class="input-group" style="width: 100%;">
-                                <div class="input-group-addon hidden-xs"><i class="ti-user"></i></div>
-                                <input type="text" class="form-control" id="invitePlexJoinUsername" lang="en" placeholder="Username" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" autofocus="" required="">
-                            </div>
-                            <div class="input-group" style="width: 100%;">
-                                <div class="input-group-addon hidden-xs"><i class="ti-email"></i></div>
-                                <input type="text" class="form-control" id="invitePlexJoinEmail" lang="en" placeholder="E-Mail" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" required="">
-                            </div>
-                            <div class="input-group" style="width: 100%;">
-                                <div class="input-group-addon hidden-xs"><i class="ti-user"></i></div>
-                                <input type="password" class="form-control" id="invitePlexJoinPassword" lang="en" placeholder="Password" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"  required="">
-                            </div>
-                            <br />
-                            <button class="btn btn-block btn-info" onclick="joinPlex();">Submit</button>
-                        </div>
-                        <div class="form-group invite-step-4-plex-accept hidden">
-                            <h4 class="" lang="en">You have been invited.  Please check your email or goto <a href="https://plex.tv" target="_blank">PLEX.TV</a> and login to accept the invite.  Once you have done that, you may head back here and login with your credentials.</h4>
-                        </div>
-                        <!-- Begin Emby Invites -->
-                        <div class="form-group invite-step-3-emby-yes hidden">
-                            <div class="input-group" style="width: 100%;">
-                                <div class="input-group-addon hidden-xs"><i class="ti-user"></i></div>
-                                <input type="text" class="form-control" id="inviteUsernameInviteEmby" placeholder="Emby Username" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" autofocus="" required="">
-                            </div>
-                            <br />
-                            <button class="btn btn-block btn-info" onclick="hasEmbyUsername();">Submit</button>
-                        </div>
-                        <div class="form-group invite-step-3-emby-no hidden">
-                            <div class="input-group" style="width: 100%;">
-                                <div class="input-group-addon hidden-xs"><i class="ti-user"></i></div>
-                                <input type="text" class="form-control" id="inviteEmbyJoinUsername" lang="en" placeholder="Username" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" autofocus="" required="">
-                            </div>
-                            <div class="input-group" style="width: 100%;">
-                                <div class="input-group-addon hidden-xs"><i class="ti-email"></i></div>
-                                <input type="text" class="form-control" id="inviteEmbyJoinEmail" lang="en" placeholder="E-Mail" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" required="">
-                            </div>
-                            <div class="input-group" style="width: 100%;">
-                                <div class="input-group-addon hidden-xs"><i class="ti-user"></i></div>
-                                <input type="password" class="form-control" id="inviteEmbyJoinPassword" lang="en" placeholder="Password" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"  required="">
-                            </div>
-                            <br />
-                            <button class="btn btn-block btn-info" onclick="joinEmby();">Submit</button>
-                        </div>
-                        <div class="form-group invite-step-4-emby-accept hidden">
-                            <h4 class="" lang="en">You Have been added to emby!</h4>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="clearfix"></div>
-        `;
-        $('.invite-div').html(htmlDOM);
-    }
-});
-
-$(document).on('click', '#INVITES-settings-button', function() {
-    ajaxloader(".content-wrap","in");
-    organizrAPI2('GET','api/v2/plugins/invites/settings').success(function(data) {
-        var response = data.response;
-        $('#INVITES-settings-items').html(buildFormGroup(response.data));
-        $('.selectpicker').selectpicker();
-    }).fail(function(xhr) {
-        console.error("Organizr Function: API Connection Failed");
-    });
-    ajaxloader();
+	var htmlDOM = '';
+	if (activeInfo.user.loggedin === true && activeInfo.user.groupID <= 1) {
+		ajaxloader(".content-wrap","in");
+		organizrAPI2('GET','api/v2/plugins/invites').success(function(data) {
+			var response = data.response;
+			var htmlDOM = '';
+			htmlDOM = `
+			<div class="col-md-12">
+				<div class="panel bg-org panel-info">
+					<div class="panel-heading">
+						<span lang="en">Manage Invites</span>
+						<button type="button" class="btn btn-info btn-circle pull-right popup-with-form" href="#new-invite-area" data-effect="mfp-3d-unfold"><i class="fa fa-plus"></i> </button>
+					</div>
+					<div class="table-responsive">
+						<table class="table table-hover manage-u-table">
+							<thead>
+								<tr>
+									<th width="70" class="text-center">#</th>
+									<th lang="en">USERNAME</th>
+									<th lang="en">EMAIL</th>
+									<th lang="en">INVITE CODE</th>
+									<th lang="en">DATE SENT</th>
+									<th lang="en">DATE USED</th>
+									<th lang="en">USED BY</th>
+									<th lang="en">IP ADDRESS</th>
+									<th lang="en">VALID</th>
+									<th lang="en">DELETE</th>
+								</tr>
+							</thead>
+							<tbody id="manageInviteTable">
+								`+buildInvites(response.data)+`
+							</tbody>
+						</table>
+					</div>
+				</div>
+			</div>
+			<div class="clearfix"></div>
+			`;
+			$('.invite-div').html(htmlDOM);
+		}).fail(function(xhr) {
+			console.error("Organizr Function: API Connection Failed");
+		});
+		ajaxloader();
+	}else if (activeInfo.user.loggedin === false){
+		htmlDOM = `
+		<div class="col-md-12">
+			<div class="panel panel-info m-b-0">
+				<div class="panel-heading" lang="en">Use Invite Code</div>
+				<div class="panel-wrapper collapse in" aria-expanded="true">
+					<div class="panel-body">
+						<div class="form-group invite-step-1">
+							<div class="input-group" style="width: 100%;">
+								<div class="input-group-addon hidden-xs"><i class="ti-lock"></i></div>
+								<input type="text" class="form-control text-uppercase" id="inviteCodeInput" placeholder="Code" autocomplete="off" autocorrect="off" autocapitalize="off" maxlength="6" spellcheck="false" autofocus="" required="">
+							</div>
+							<br />
+							<button class="btn btn-block btn-info" onclick="verifyInvite();">Verify</button>
+						</div>
+						<div class="form-group invite-step-2 hidden">
+							<div class="row">
+								<h2 class="text-center" lang="en">Do you have a `+activeInfo.plugins.includes["INVITES-type-include"].toUpperCase()+` account?</h2>
+								<div class="col-lg-6">
+									<button class="btn btn-block btn-info m-b-10" onclick="inviteHasAccount('`+activeInfo.plugins.includes["INVITES-type-include"]+`',true);" lang="en">Yes</button>
+								</div>
+								<div class="col-lg-6">
+									<button class="btn btn-block btn-primary m-b-10" onclick="inviteHasAccount('`+activeInfo.plugins.includes["INVITES-type-include"]+`',false);" lang="en">No</button>
+								</div>
+							</div>
+						</div>
+						<div class="form-group invite-step-3-plex-yes hidden">
+							<div class="input-group" style="width: 100%;">
+								<div class="input-group-addon hidden-xs"><i class="ti-user"></i></div>
+								<input type="text" class="form-control" id="inviteUsernameInvite" placeholder="Plex Username or Email" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" autofocus="" required="">
+							</div>
+							<br />
+							<button class="btn btn-block btn-info" onclick="hasPlexUsername();">Submit</button>
+						</div>
+						<div class="form-group invite-step-3-plex-no hidden">
+							<div class="input-group" style="width: 100%;">
+								<div class="input-group-addon hidden-xs"><i class="ti-user"></i></div>
+								<input type="text" class="form-control" id="invitePlexJoinUsername" lang="en" placeholder="Username" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" autofocus="" required="">
+							</div>
+							<div class="input-group" style="width: 100%;">
+								<div class="input-group-addon hidden-xs"><i class="ti-email"></i></div>
+								<input type="text" class="form-control" id="invitePlexJoinEmail" lang="en" placeholder="E-Mail" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" required="">
+							</div>
+							<div class="input-group" style="width: 100%;">
+								<div class="input-group-addon hidden-xs"><i class="ti-user"></i></div>
+								<input type="password" class="form-control" id="invitePlexJoinPassword" lang="en" placeholder="Password" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"  required="">
+							</div>
+							<br />
+							<button class="btn btn-block btn-info" onclick="joinPlex();">Submit</button>
+						</div>
+						<div class="form-group invite-step-4-plex-accept hidden">
+							<h4 class="" lang="en">You have been invited.  Please check your email or goto <a href="https://plex.tv" target="_blank">PLEX.TV</a> and login to accept the invite.  Once you have done that, you may head back here and login with your credentials.</h4>
+						</div>
+						<!-- Begin Emby Invites -->
+						<div class="form-group invite-step-3-emby-yes hidden">
+							<div class="input-group" style="width: 100%;">
+								<div class="input-group-addon hidden-xs"><i class="ti-user"></i></div>
+								<input type="text" class="form-control" id="inviteUsernameInviteEmby" placeholder="Emby Username" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" autofocus="" required="">
+							</div>
+							<br />
+							<button class="btn btn-block btn-info" onclick="hasEmbyUsername();">Submit</button>
+						</div>
+						<div class="form-group invite-step-3-emby-no hidden">
+							<div class="input-group" style="width: 100%;">
+								<div class="input-group-addon hidden-xs"><i class="ti-user"></i></div>
+								<input type="text" class="form-control" id="inviteEmbyJoinUsername" lang="en" placeholder="Username" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" autofocus="" required="">
+							</div>
+							<div class="input-group" style="width: 100%;">
+								<div class="input-group-addon hidden-xs"><i class="ti-email"></i></div>
+								<input type="text" class="form-control" id="inviteEmbyJoinEmail" lang="en" placeholder="E-Mail" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" required="">
+							</div>
+							<div class="input-group" style="width: 100%;">
+								<div class="input-group-addon hidden-xs"><i class="ti-user"></i></div>
+								<input type="password" class="form-control" id="inviteEmbyJoinPassword" lang="en" placeholder="Password" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"  required="">
+							</div>
+							<br />
+							<button class="btn btn-block btn-info" onclick="joinEmby();">Submit</button>
+						</div>
+						<div class="form-group invite-step-4-emby-accept hidden">
+							<h4 class="" lang="en">You Have been added to emby!</h4>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+		<div class="clearfix"></div>
+		`;
+		$('.invite-div').html(htmlDOM);
+	}
 });

+ 205 - 223
api/plugins/js/php-mailer.js

@@ -1,262 +1,244 @@
 /* PHP MAILER JS FILE */
-
+$('body').arrive('#activeInfo', {onceOnly: true}, function() {
+	phpmLaunch();
+});
 // FUNCTIONS
-phpmLaunch();
+
 function phpmLaunch(){
-    if(typeof activeInfo == 'undefined'){
-        setTimeout(function () {
-            phpmLaunch();
-        }, 1000);
-    }else{
-        if(activeInfo.plugins["PHPMAILER-enabled"] == true){
-            if (activeInfo.user.loggedin === true && activeInfo.user.groupID <= 1) {
-                var menuList = `<li><a class="inline-popups emailModal" href="#email-area" data-effect="mfp-zoom-out"><i class="fa fa-envelope fa-fw"></i> <span lang="en">E-Mail Center</span></a></li>`;
-                var htmlDOM = `
-            	<div id="email-area" class="white-popup mfp-with-anim mfp-hide">
-            		<div class="col-md-10 col-md-offset-1">
-            			<div class="email-div"></div>
-            		</div>
-            	</div>
-            	`;
-                $('.organizr-area').after(htmlDOM);
-                $('.append-menu').after(menuList);
-                pageLoad();
-            }
-        }
-    }
+	if(activeInfo.plugins["PHPMAILER-enabled"] == true){
+		if (activeInfo.user.loggedin === true && activeInfo.user.groupID <= 1) {
+			var menuList = `<li><a class="inline-popups emailModal" href="#email-area" data-effect="mfp-zoom-out"><i class="fa fa-envelope fa-fw"></i> <span lang="en">E-Mail Center</span></a></li>`;
+			var htmlDOM = `
+			<div id="email-area" class="white-popup mfp-with-anim mfp-hide">
+				<div class="col-md-10 col-md-offset-1">
+					<div class="email-div"></div>
+				</div>
+			</div>
+			`;
+			$('.organizr-area').after(htmlDOM);
+			$('.append-menu').after(menuList);
+			pageLoad();
+		}
+	}
+
 }
 function sendMail(){
-    var to = $('#sendEmailToInput').val();
-    var subject = $('#sendEmailSubjectInput').val();
-    var body = tinyMCE.get('sendEmail').getContent();
-    if(to == ''){
-        messageSingle('','Please Enter Email',activeInfo.settings.notifications.position,'#FFF','error','5000');
-    }else if(subject == ''){
-        messageSingle('','Please Enter Subject',activeInfo.settings.notifications.position,'#FFF','error','5000');
-    }else if(body == ''){
-        messageSingle('','Please Enter Body',activeInfo.settings.notifications.position,'#FFF','error','5000');
-    }else{
-	    messageSingle('','Sending Message',activeInfo.settings.notifications.position,'#FFF','success','5000');
-    }
-    if(to !== '' && subject !== '' && body !== ''){
-        var post = {
-            bcc:to,
-            subject:subject,
-            body:body
-        };
-        ajaxloader(".content-wrap","in");
-        organizrAPI2('POST','api/v2/plugins/php-mailer/email/send',post).success(function(data) {
-            var response = data.response;
-            if(response.result == 'success'){
-                $.magnificPopup.close();
-                messageSingle('',window.lang.translate('Email Sent Successful'),activeInfo.settings.notifications.position,'#FFF','success','5000');
-            }else{
-                messageSingle('',response.message,activeInfo.settings.notifications.position,'#FFF','error','5000');
-            }
-        }).fail(function(xhr) {
-	        OrganizrApiError(xhr);
-        });
-        ajaxloader();
-    }
+	var to = $('#sendEmailToInput').val();
+	var subject = $('#sendEmailSubjectInput').val();
+	var body = tinyMCE.get('sendEmail').getContent();
+	if(to == ''){
+		messageSingle('','Please Enter Email',activeInfo.settings.notifications.position,'#FFF','error','5000');
+	}else if(subject == ''){
+		messageSingle('','Please Enter Subject',activeInfo.settings.notifications.position,'#FFF','error','5000');
+	}else if(body == ''){
+		messageSingle('','Please Enter Body',activeInfo.settings.notifications.position,'#FFF','error','5000');
+	}else{
+		messageSingle('','Sending Message',activeInfo.settings.notifications.position,'#FFF','success','5000');
+	}
+	if(to !== '' && subject !== '' && body !== ''){
+		var post = {
+			bcc:to,
+			subject:subject,
+			body:body
+		};
+		ajaxloader(".content-wrap","in");
+		organizrAPI2('POST','api/v2/plugins/php-mailer/email/send',post).success(function(data) {
+			var response = data.response;
+			if(response.result == 'success'){
+				$.magnificPopup.close();
+				messageSingle('',window.lang.translate('Email Sent Successful'),activeInfo.settings.notifications.position,'#FFF','success','5000');
+			}else{
+				messageSingle('',response.message,activeInfo.settings.notifications.position,'#FFF','error','5000');
+			}
+		}).fail(function(xhr) {
+			OrganizrApiError(xhr);
+		});
+		ajaxloader();
+	}
 }
 function buildUserList(array){
-    var users = '';
-    var htmlDOM = '';
+	var users = '';
+	var htmlDOM = '';
 	$.each(array, function(i,v) {
-        users += '<option value="'+v+'">'+i+'</option>';
-    });
-    htmlDOM = `
-    <select multiple id="email-user-list" name="email-user-list[]">`+users+`</select>
-    <div class="button-box m-t-20">
-        <a id="select-all-users-list" class="btn btn-danger btn-outline" href="#">select all</a>
-        <a id="deselect-all-users-list" class="btn btn-info btn-outline" href="#">deselect all</a>
-        <a id="minimize-users-list" class="btn btn-primary btn-outline" href="#">minimize</a>
-    </div>`;
-    return htmlDOM;
+		users += '<option value="'+v+'">'+i+'</option>';
+	});
+	htmlDOM = `
+	<select multiple id="email-user-list" name="email-user-list[]">`+users+`</select>
+	<div class="button-box m-t-20">
+		<a id="select-all-users-list" class="btn btn-danger btn-outline" href="#">select all</a>
+		<a id="deselect-all-users-list" class="btn btn-info btn-outline" href="#">deselect all</a>
+		<a id="minimize-users-list" class="btn btn-primary btn-outline" href="#">minimize</a>
+	</div>`;
+	return htmlDOM;
 }
 function buildEmailModal(){
-    var htmlDOM = `
-    <div class="row">
-        <div class="col-md-12">
-            <div class="panel panel-info m-0">
-                <div class="panel-heading">
-                    <span lang="en">Email Users</span>
-                    <div class="btn-group pull-right">
-
+	var htmlDOM = `
+	<div class="row">
+		<div class="col-md-12">
+			<div class="panel panel-info m-0">
+				<div class="panel-heading">
+					<span lang="en">Email Users</span>
+					<div class="btn-group pull-right">
 						<button class="btn btn-info waves-effect waves-light loadUserList" type="button">
 							<i class="fa fa-user"></i>
 						</button>
-                        <button class="btn btn-info waves-effect waves-light" type="button" onclick="$('.mce-i-template').trigger('click');">
+						<button class="btn btn-info waves-effect waves-light" type="button" onclick="$('.mce-i-template').trigger('click');">
 							<i class="fa fa-files-o"></i>
 						</button>
-                        <button class="btn btn-info waves-effect waves-light unhide-user-list hidden" type="button">
+						<button class="btn btn-info waves-effect waves-light unhide-user-list hidden" type="button">
 							<i class="fa fa-eye"></i>
 						</button>
 						<button class="btn btn-info waves-effect waves-light" onclick="sendMail();"><i class="fa fa-paper-plane"></i></button>
-
-	                </div>
-                </div>
-                <div class="panel-wrapper collapse in main-email-panel" aria-expanded="true">
-                    <div class="panel-body">
-                        <div class="form-body">
-                            <div class="row">
-                                <div class="col-md-6">
-                                    <div class="form-group">
-                                        <label class="control-label" lang="en">To:</label>
-                                        <input type="text" id="sendEmailToInput" class="form-control"></div>
-                                </div>
-                                <div class="col-md-6">
-                                    <div class="form-group">
-                                        <label class="control-label" lang="en">Subject</label>
-                                        <input type="text" id="sendEmailSubjectInput" class="form-control"></div>
-                                </div>
-                                <div class="col-md-12" id="user-list-div">
-
-
-                                </div>
-                            </div>
-                            <!--/row-->
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-    <textarea id="sendEmail" name="area"></textarea>
-    `;
-    $('.email-div').html(htmlDOM);
-    if ($("#sendEmail").length > 0) {
-        var templates = [];
-        if(activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-One"] !== ''){
-            templates.push(
-                {
-                    title: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-OneName"],
-                    description: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-OneSubject"],
-                    content: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-One"],
-                }
-            )
-        }
-        if(activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-Two"] !== ''){
-            templates.push(
-                {
-                    title: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-TwoName"],
-                    description: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-TwoSubject"],
-                    content: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-Two"],
-                }
-            )
-        }
-        if(activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-Three"] !== ''){
-            templates.push(
-                {
-                    title: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-ThreeName"],
-                    description: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-ThreeSubject"],
-                    content: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-Three"],
-                }
-            )
-        }
-        if(activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-Four"] !== ''){
-            templates.push(
-                {
-                    title: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-FourName"],
-                    description: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-FourSubject"],
-                    content: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-Four"],
-                }
-            )
-        }
-        tinymce.init({
-            selector: "textarea#sendEmail",
-            theme: "modern",
-            height: 300,
-            plugins: [
-                "advlist autolink link image lists charmap print preview hr anchor pagebreak spellchecker", "searchreplace wordcount visualblocks visualchars code fullscreen insertdatetime media nonbreaking", "save table contextmenu directionality emoticons template paste textcolor"
-            ],
-            toolbar: "insertfile template undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image | print preview media fullpage | forecolor backcolor",
-            templates: templates,
-            init_instance_callback: function (editor) {
-                editor.on('BeforeSetContent', function (e) {
-                    //tinyMCE.get('sendEmail').execCommand('selectAll');
-                    //tinyMCE.get('sendEmail').execCommand('delete');
-                    $.each(e.target.settings.templates, function(i,v) {
-                        if($.trim(v.content) == $.trim(e.content)){
-                            $('#sendEmailSubjectInput').val(v.description);
-                        }
-                    });
-                });
-              }
-        });
-    }
+					</div>
+				</div>
+				<div class="panel-wrapper collapse in main-email-panel" aria-expanded="true">
+					<div class="panel-body">
+						<div class="form-body">
+							<div class="row">
+								<div class="col-md-6">
+									<div class="form-group">
+										<label class="control-label" lang="en">To:</label>
+										<input type="text" id="sendEmailToInput" class="form-control"></div>
+								</div>
+								<div class="col-md-6">
+									<div class="form-group">
+										<label class="control-label" lang="en">Subject</label>
+										<input type="text" id="sendEmailSubjectInput" class="form-control"></div>
+								</div>
+								<div class="col-md-12" id="user-list-div"></div>
+							</div>
+							<!--/row-->
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+	<textarea id="sendEmail" name="area"></textarea>
+	`;
+	$('.email-div').html(htmlDOM);
+	if ($("#sendEmail").length > 0) {
+		var templates = [];
+		if(activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-One"] !== ''){
+			templates.push(
+				{
+					title: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-OneName"],
+					description: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-OneSubject"],
+					content: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-One"],
+				}
+			)
+		}
+		if(activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-Two"] !== ''){
+			templates.push(
+				{
+					title: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-TwoName"],
+					description: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-TwoSubject"],
+					content: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-Two"],
+				}
+			)
+		}
+		if(activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-Three"] !== ''){
+			templates.push(
+				{
+					title: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-ThreeName"],
+					description: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-ThreeSubject"],
+					content: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-Three"],
+				}
+			)
+		}
+		if(activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-Four"] !== ''){
+			templates.push(
+				{
+					title: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-FourName"],
+					description: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-FourSubject"],
+					content: activeInfo.plugins.includes["PHPMAILER-emailTemplateCustom-include-Four"],
+				}
+			)
+		}
+		tinymce.init({
+			selector: "textarea#sendEmail",
+			theme: "modern",
+			height: 300,
+			plugins: [
+				"advlist autolink link image lists charmap print preview hr anchor pagebreak spellchecker", "searchreplace wordcount visualblocks visualchars code fullscreen insertdatetime media nonbreaking", "save table contextmenu directionality emoticons template paste textcolor"
+			],
+			toolbar: "insertfile template undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image | print preview media fullpage | forecolor backcolor",
+			templates: templates,
+			init_instance_callback: function (editor) {
+				editor.on('BeforeSetContent', function (e) {
+					//tinyMCE.get('sendEmail').execCommand('selectAll');
+					//tinyMCE.get('sendEmail').execCommand('delete');
+					$.each(e.target.settings.templates, function(i,v) {
+						if($.trim(v.content) == $.trim(e.content)){
+							$('#sendEmailSubjectInput').val(v.description);
+						}
+					});
+				});
+			  }
+		});
+	}
 
 }
 // EVENTS and LISTENERS
 $(document).on("change", "#email-user-list", function () {
-    $('#sendEmailToInput').val($('#email-user-list').val());
+	$('#sendEmailToInput').val($('#email-user-list').val());
 });
 $(document).on('click', '.loadUserList', function() {
-    ajaxloader(".content-wrap","in");
-    organizrAPI2('GET','api/v2/plugins/php-mailer/email/list').success(function(data) {
-        var response = data.response;
-        $('#user-list-div').html(buildUserList(response.data));
-        $('#email-user-list').multiSelect();
-    }).fail(function(xhr) {
-	    OrganizrApiError(xhr);
-    });
-    ajaxloader();
+	ajaxloader(".content-wrap","in");
+	organizrAPI2('GET','api/v2/plugins/php-mailer/email/list').success(function(data) {
+		var response = data.response;
+		$('#user-list-div').html(buildUserList(response.data));
+		$('#email-user-list').multiSelect();
+	}).fail(function(xhr) {
+		OrganizrApiError(xhr);
+	});
+	ajaxloader();
 });
 $(document).on("click", ".emailModal", function(e) {
-    buildEmailModal();
+	buildEmailModal();
 });
 $(document).on("click", ".show-login", function(e) {
-    setTimeout(addForgotPassword, 1000);
+	setTimeout(addForgotPassword, 1000);
 });
 $(document).on("click", "#select-all-users-list", function(e) {
-    $('#email-user-list').multiSelect('select_all');
-    return false;
+	$('#email-user-list').multiSelect('select_all');
+	return false;
 });
 $(document).on("click", "#deselect-all-users-list", function(e) {
-    $('#email-user-list').multiSelect('deselect_all');
-    return false;
+	$('#email-user-list').multiSelect('deselect_all');
+	return false;
 });
 $(document).on("click", "#minimize-users-list, .unhide-user-list", function(e) {
-    $('.main-email-panel').toggleClass('hidden');
-    $('.loadUserList').toggleClass('hidden');
-    $('.unhide-user-list').toggleClass('hidden');
-    return false;
+	$('.main-email-panel').toggleClass('hidden');
+	$('.loadUserList').toggleClass('hidden');
+	$('.unhide-user-list').toggleClass('hidden');
+	return false;
 });
 function addForgotPassword(){
-    var item = '';
-    if(activeInfo.plugins["PHPMAILER-enabled"] == true){
-        if (activeInfo.user.loggedin === false) {
-            item = `<a href="javascript:void(0)" id="to-recover" class="text-dark pull-right"><i class="fa fa-lock m-r-5"></i> <span lang="en">Forgot pwd?</span></a>`;
-            $('.remember-me').after(item);
-        }
-    }
+	var item = '';
+	if(activeInfo.plugins["PHPMAILER-enabled"] == true){
+		if (activeInfo.user.loggedin === false) {
+			item = `<a href="javascript:void(0)" id="to-recover" class="text-dark pull-right"><i class="fa fa-lock m-r-5"></i> <span lang="en">Forgot pwd?</span></a>`;
+			$('.remember-me').after(item);
+		}
+	}
 }
-$(document).on('click', '#PHPMAILER-settings-button', function() {
-    ajaxloader(".content-wrap","in");
-    organizrAPI2('GET','api/v2/plugins/php-mailer/settings').success(function(data) {
-        var response = data.response;
-        $('#PHPMAILER-settings-items').html(buildFormGroup(response.data));
-    }).fail(function(xhr) {
-	    OrganizrApiError(xhr);
-    });
-    ajaxloader();
-});
 // SEND TEST EMAIL
 $(document).on('click', '.phpmSendTestEmail', function() {
-    messageSingle('',window.lang.translate('Sending Test E-Mail'),activeInfo.settings.notifications.position,'#FFF','info','5000');
-    ajaxloader(".content-wrap","in");
-    organizrAPI2('GET','api/v2/plugins/php-mailer/email/test').success(function(data) {
-        var response = data.response;
-        if(response.message !== null && response.message.indexOf('|||DEBUG|||') == 0){
-            messageSingle('',window.lang.translate('Press F11 to check Console for output'),activeInfo.settings.notifications.position,'#FFF','warning','5000');
-	        console.warn(response.message);
-        }else if(response.result == 'success') {
-            messageSingle('',window.lang.translate('Email Test Successful'),activeInfo.settings.notifications.position,'#FFF','success','20000');
-        }else{
-            messageSingle('',response.message,activeInfo.settings.notifications.position,'#FFF','error','5000');
-        }
-    }).fail(function(xhr, data) {
-	    OrganizrApiError(xhr, 'Mailer Error');
-    });
-    ajaxloader();
-});
+	messageSingle('',window.lang.translate('Sending Test E-Mail'),activeInfo.settings.notifications.position,'#FFF','info','5000');
+	ajaxloader(".content-wrap","in");
+	organizrAPI2('GET','api/v2/plugins/php-mailer/email/test').success(function(data) {
+		var response = data.response;
+		if(response.message !== null && response.message.indexOf('|||DEBUG|||') == 0){
+			messageSingle('',window.lang.translate('Press F11 to check Console for output'),activeInfo.settings.notifications.position,'#FFF','warning','5000');
+			console.warn(response.message);
+		}else if(response.result == 'success') {
+			messageSingle('',window.lang.translate('Email Test Successful'),activeInfo.settings.notifications.position,'#FFF','success','20000');
+		}else{
+			messageSingle('',response.message,activeInfo.settings.notifications.position,'#FFF','error','5000');
+		}
+	}).fail(function(xhr, data) {
+		OrganizrApiError(xhr, 'Mailer Error');
+	});
+	ajaxloader();
+});

+ 57 - 72
api/plugins/js/speedTest.js

@@ -1,4 +1,7 @@
 /* SPEEDTEST JS FILE */
+$('body').arrive('#activeInfo', {onceOnly: true}, function() {
+	speedTestLaunch();
+});
 function clamp(num, min, max) {
   return num <= min ? min : num >= max ? max : num;
 }
@@ -56,82 +59,64 @@ function initUI(){
 	$('#uploadPercent').attr('class', 'css-bar css-bar-0 css-bar-lg css-bar-warning pull-right').attr('data-label', '0Mbps');
 }
 // FUNCTIONS
-speedTestLaunch()
 function speedTestLaunch(){
-    if(typeof activeInfo == 'undefined'){
-        setTimeout(function () {
-            speedTestLaunch();
-        }, 1000);
-    }else{
-        if(activeInfo.plugins["SPEEDTEST-enabled"] == true){
-            if (activeInfo.user.groupID <= activeInfo.plugins.includes["SPEEDTEST-Auth-include"]) {
-                var menuList = `<li><a class="inline-popups speedTestModal" href="#speedtest-area" data-effect="mfp-zoom-out"><i class="fa fa-rocket fa-fw"></i> <span lang="en">Test Server Speed</span></a></li>`;
-				var htmlDOM = `
-		    	<div id="speedtest-area" class="white-popup mfp-with-anim mfp-hide">
-		    		<div class="col-md-4 col-md-offset-4">
-						<div class="panel bg-org panel-info">
-							<div class="panel-heading">
-								<span lang="en">Test Speed to Server</span>
-								<button id="startStopBtn" onclick="startStop()" class="btn btn-info waves-effect waves-light pull-right"><span lang="en" id="speedTestButtonText">Start</span> <i class="fa fa-rocket m-l-5"></i></button>
-							</div>
-							<div class="panel-body">
-								<div id="test">
-									<div class="row hidden-xs">
-										<div class="col-md-6 col-xs-6"><div id="downloadPercent" data-label="0Mbps" style="font-size: 15px;"></div></div>
-										<div class="col-md-6 col-xs-6"><div id="uploadPercent" data-label="0Mbps" style="font-size: 15px;"></div></div>
+	if(activeInfo.plugins["SPEEDTEST-enabled"] == true){
+		if (activeInfo.user.groupID <= activeInfo.plugins.includes["SPEEDTEST-Auth-include"]) {
+			var menuList = `<li><a class="inline-popups speedTestModal" href="#speedtest-area" data-effect="mfp-zoom-out"><i class="fa fa-rocket fa-fw"></i> <span lang="en">Test Server Speed</span></a></li>`;
+			var htmlDOM = `
+			<div id="speedtest-area" class="white-popup mfp-with-anim mfp-hide">
+				<div class="col-md-4 col-md-offset-4">
+					<div class="panel bg-org panel-info">
+						<div class="panel-heading">
+							<span lang="en">Test Speed to Server</span>
+							<button id="startStopBtn" onclick="startStop()" class="btn btn-info waves-effect waves-light pull-right"><span lang="en" id="speedTestButtonText">Start</span> <i class="fa fa-rocket m-l-5"></i></button>
+						</div>
+						<div class="panel-body">
+							<div id="test">
+								<div class="row hidden-xs">
+									<div class="col-md-6 col-xs-6"><div id="downloadPercent" data-label="0Mbps" style="font-size: 15px;"></div></div>
+									<div class="col-md-6 col-xs-6"><div id="uploadPercent" data-label="0Mbps" style="font-size: 15px;"></div></div>
+								</div>
+								<div class="progress progress-sm">
+									<div id="progress" class="progress-bar progress-bar-info active progress-bar-striped" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 0%">
+										<span class="sr-only">0% Complete (success)</span>
 									</div>
-									<div class="progress progress-sm">
-										<div id="progress" class="progress-bar progress-bar-info active progress-bar-striped" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 0%">
-											<span class="sr-only">0% Complete (success)</span>
+								</div>
+								<div class="white-box m-b-0">
+									<div class="user-btm-box">
+										<div class="col-md-3 col-xs-6 p-l-0 p-r-0 text-center">
+											<p class="text-success"><i class="ti-download fa-2x"></i></p>
+											<h1 id="dlText"></h1>
+											<h4 class="">Mbps</h4>
+										</div>
+										<div class="col-md-3 col-xs-6 p-l-0 p-r-0 text-center">
+											<p class="text-warning"><i class="ti-upload fa-2x"></i></p>
+											<h1 id="ulText"></h1>
+											<h4 class="">Mbps</h4>
+										</div>
+										<div class="col-md-3 col-xs-6 p-l-0 p-r-0 text-center">
+											<p class="text-purple"><i class="ti-direction-alt fa-2x"></i></p>
+											<h1 id="pingText"></h1>
+											<h4 class="">ms</h4>
+										</div>
+										<div class="col-md-3 col-xs-6 p-l-0 p-r-0 text-center">
+											<p class="text-info"><i class="ti-pulse fa-2x"></i></p>
+											<h1 id="jitText"></h1>
+											<h4 class="">ms</h4>
 										</div>
 									</div>
-				                    <div class="white-box m-b-0">
-				                        <div class="user-btm-box">
-				                            <div class="col-md-3 col-xs-6 p-l-0 p-r-0 text-center">
-				                                <p class="text-success"><i class="ti-download fa-2x"></i></p>
-				                                <h1 id="dlText"></h1>
-												<h4 class="">Mbps</h4>
-											</div>
-				                            <div class="col-md-3 col-xs-6 p-l-0 p-r-0 text-center">
-				                                <p class="text-warning"><i class="ti-upload fa-2x"></i></p>
-				                                <h1 id="ulText"></h1>
-												<h4 class="">Mbps</h4>
-											</div>
-				                            <div class="col-md-3 col-xs-6 p-l-0 p-r-0 text-center">
-				                                <p class="text-purple"><i class="ti-direction-alt fa-2x"></i></p>
-				                                <h1 id="pingText"></h1>
-												<h4 class="">ms</h4>
-											</div>
-				                            <div class="col-md-3 col-xs-6 p-l-0 p-r-0 text-center">
-				                                <p class="text-info"><i class="ti-pulse fa-2x"></i></p>
-				                                <h1 id="jitText"></h1>
-												<h4 class="">ms</h4>
-											</div>
-				                        </div>
-				                    </div>
 								</div>
-								<script type="text/javascript">initUI();</script>
 							</div>
-							<div class="panel-footer"> IP Address: <span id="ip"></span> </div>
+							<script type="text/javascript">initUI();</script>
 						</div>
-		    		</div>
-		    	</div>
-		    	`;
-				$('.append-menu').after(menuList);
-	            $('.organizr-area').after(htmlDOM);
-	            pageLoad();
-			}
-        }
-    }
-}
-
-$(document).on('click', '#SPEEDTEST-settings-button', function() {
-    ajaxloader(".content-wrap","in");
-    organizrAPI2('GET','api/v2/plugins/speedtest/settings').success(function(data) {
-        var response = data.response;
-        $('#SPEEDTEST-settings-items').html(buildFormGroup(response.data));
-    }).fail(function(xhr) {
-        console.error("Organizr Function: API Connection Failed");
-    });
-    ajaxloader();
-});
+						<div class="panel-footer"> IP Address: <span id="ip"></span> </div>
+					</div>
+				</div>
+			</div>
+			`;
+			$('.append-menu').after(menuList);
+			$('.organizr-area').after(htmlDOM);
+			pageLoad();
+		}
+	}
+}