388 lines
No EOL
8.7 KiB
JavaScript
388 lines
No EOL
8.7 KiB
JavaScript
/*jshint bitwise:true, curly:true, devel:true, eqeqeq:true, evil:true, forin:false, noarg:true, noempty:true, nonew:true, undef:true, strict:false, browser:true, jquery:true */
|
|
|
|
Array.prototype.inArray = function (value) {
|
|
for (var i = 0; i < this.length; i++) {
|
|
if (this[i] === value) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|
|
var AdminCP = function() {
|
|
var self = this;
|
|
var args = arguments;
|
|
$(function(){
|
|
self.init.apply(self, args);
|
|
});
|
|
};
|
|
|
|
AdminCP.prototype = {
|
|
z: 5,
|
|
animSpeed: 'normal',
|
|
curSection: 'login',
|
|
curPrefPane: 'administration',
|
|
curAboutPane: 'about',
|
|
|
|
init: function(options) {
|
|
this.initializing = true;
|
|
this.loginForm();
|
|
this.initEvents();
|
|
if (this.loaded()) {
|
|
this.afterLogin();
|
|
} else {
|
|
$('#login-password')[0].focus();
|
|
}
|
|
|
|
this.initializing = false;
|
|
},
|
|
|
|
loginForm: function() {
|
|
$('#login-loading').fadeTo(1, 0);
|
|
},
|
|
|
|
initEvents: function() {
|
|
var self = this;
|
|
|
|
$('#login-form').submit(function() { self.login(); return false; });
|
|
$('#n-prefs').click(function() { self.show('preferences'); return false; });
|
|
$('#n-bans').click(function() { self.show('bans'); return false; });
|
|
$('#n-about').click(function() { self.show('about'); return false; });
|
|
},
|
|
|
|
afterLogin: function() {
|
|
var self = this;
|
|
|
|
// Login and logout
|
|
$('#login-password')[0].blur();
|
|
$('.logout').click(function() { self.logout(); return false; });
|
|
|
|
// Show the nav
|
|
if (this.initializing) {
|
|
$('#nav ul').css('display', 'block');
|
|
} else {
|
|
$('#nav ul').slideDown();
|
|
}
|
|
|
|
// Some css for betterlookingness
|
|
$('#preferences-form fieldset:odd').addClass('odd');
|
|
$('#preferences-form fieldset:even').addClass('even');
|
|
|
|
$('#bans-list li:odd').addClass('odd');
|
|
$('#bans-list li:even').addClass('even');
|
|
|
|
// Hide the loading thingie
|
|
$('.sn-loading').fadeTo(1, 0);
|
|
|
|
// Events after load
|
|
this.initEventsAfter();
|
|
|
|
// If they want to go directly to a section
|
|
var anchor = this.getAnchor();
|
|
|
|
if (anchor.length > 0 && ['preferences', 'bans', 'about'].inArray(anchor)) {
|
|
self.show(anchor);
|
|
} else {
|
|
self.show('preferences');
|
|
}
|
|
},
|
|
|
|
initEventsAfter: function() {
|
|
var self = this;
|
|
|
|
// Navigation
|
|
$('#sn-administration').click(function() { self.showPrefPane('administration'); return false; });
|
|
$('#sn-display').click(function() { self.showPrefPane('display'); return false; });
|
|
$('#sn-about').click(function() { self.showAboutPane('about'); return false; });
|
|
$('#sn-contact').click(function() { self.showAboutPane('contact'); return false; });
|
|
$('#sn-resetall').click(function() { self.resetPrefs(); return false; });
|
|
$('#sn-unbanall').click(function() { self.unbanAll(); return false; });
|
|
|
|
// Bans
|
|
$('.unban-link').click(function() {
|
|
self.unban($(this).parent().find('.ip').html(), $(this).parent());
|
|
return false;
|
|
});
|
|
|
|
// Preferences
|
|
$('#preferences-form input').keypress(function(e) {
|
|
var key = window.event ? e.keyCode : e.which;
|
|
if (key === 13 || key === 3) {
|
|
self.changePref.apply(self, [$(this).attr('rel'), this.value]);
|
|
return false;
|
|
}
|
|
}).focus(function() {
|
|
this.name = this.value;
|
|
}).blur(function() {
|
|
if (this.name !== this.value) {
|
|
self.changePref.apply(self, [$(this).attr('rel'), this.value]);
|
|
}
|
|
});
|
|
|
|
$('#preferences-form select').change(function() {
|
|
self.changePref.apply(self, [$(this).attr('rel'), $(this).find('option:selected').attr('rel')]);
|
|
});
|
|
},
|
|
|
|
changePref: function(pref, value) {
|
|
this.loading();
|
|
var pars = {
|
|
mode: 'setpreference',
|
|
preference: pref,
|
|
'value': value
|
|
};
|
|
this.ajax(function(json) {
|
|
if (!json.error) {
|
|
this.done();
|
|
} else {
|
|
alert(json.error);
|
|
}
|
|
}, pars);
|
|
},
|
|
|
|
resetPrefs: function() {
|
|
this.loading();
|
|
|
|
var pars = {
|
|
mode: 'resetpreferences'
|
|
};
|
|
|
|
this.ajax(function(json) {
|
|
this.done();
|
|
if (json.prefs) {
|
|
for (pref in json.prefs) {
|
|
var value = json.prefs[pref];
|
|
var el = $('#preferences-form input[@rel=' + pref + '], select[@rel=' + pref + ']')[0];
|
|
|
|
if (el.type === 'text') {
|
|
el.value = value;
|
|
} else {
|
|
if (value === true) { value = 'true'; }
|
|
if (value === false) { value = 'false'; }
|
|
|
|
$('#preferences-form select[@rel=' + pref + ']')
|
|
.find('option')
|
|
.removeAttr('selected')
|
|
.end()
|
|
.find('option[@rel=' + value + ']')
|
|
.attr('selected', 'yeah');
|
|
}
|
|
}
|
|
}
|
|
}, pars);
|
|
},
|
|
|
|
invalidPassword: function() {
|
|
// Shake the login form
|
|
$('#login-form')
|
|
.animate({ marginLeft: -145 }, 100)
|
|
.animate({ marginLeft: -155 }, 100)
|
|
.animate({ marginLeft: -145 }, 100)
|
|
.animate({ marginLeft: -155 }, 100)
|
|
.animate({ marginLeft: -150 }, 50);
|
|
|
|
$('#login-password').val('').focus();
|
|
},
|
|
|
|
login: function() {
|
|
if (this.loaded()) {
|
|
alert('Something _really_ weird has happened. Refresh and pretend nothing ever happened.');
|
|
return;
|
|
}
|
|
|
|
var self = this;
|
|
var pars = {
|
|
mode: 'login',
|
|
password: $('#login-password').val()
|
|
};
|
|
|
|
this.loginLoading();
|
|
|
|
this.ajax(function() {
|
|
this.ajax(function(json) {
|
|
self.loginDone();
|
|
if (json.error) {
|
|
self.invalidPassword();
|
|
return;
|
|
}
|
|
|
|
$('#content').append(json.html);
|
|
self.afterLogin.apply(self);
|
|
}, pars);
|
|
}, pars);
|
|
|
|
},
|
|
|
|
logout: function() {
|
|
var self = this;
|
|
var pars = {
|
|
mode: 'logout'
|
|
};
|
|
|
|
this.loading();
|
|
|
|
this.ajax(function() {
|
|
$('#login-password').val('');
|
|
$('#nav ul').slideUp();
|
|
self.show('login', function() {
|
|
$('#login-password')[0].focus();
|
|
$('.section').not('#login').remove();
|
|
self.done();
|
|
});
|
|
}, pars);
|
|
},
|
|
|
|
show: function(section, callback) {
|
|
// var sections = ['login', 'preferences', 'bans', 'about'];
|
|
// if (!sections.inArray(section)) section = 'preferences';
|
|
|
|
if ($.browser.msie) {
|
|
if (section === 'preferences') {
|
|
$('#preferences select').css('display', 'block');
|
|
} else {
|
|
$('#preferences select').css('display', 'none');
|
|
}
|
|
}
|
|
|
|
if (section === this.curSection) { return; }
|
|
|
|
this.curSection = section;
|
|
|
|
$('#' + section)[0].style.zIndex = ++this.z;
|
|
|
|
if (this.initializing) {
|
|
$('#' + section).css('display', 'block');
|
|
} else {
|
|
$('#' + section).fadeIn(this.animSpeed, callback);
|
|
}
|
|
},
|
|
|
|
showPrefPane: function(pane) {
|
|
var self = this;
|
|
|
|
if (pane === this.curPrefPane) { return; }
|
|
this.curPrefPane = pane;
|
|
$('#preferences .cp-pane').css('display', 'none');
|
|
$('#cp-pane-' + pane).css('display', 'block').fadeIn(this.animSpeed, function() {
|
|
if (self.curPrefPane === pane) {
|
|
$('#preferences .cp-pane').not('#cp-pane-' + pane).css('display', 'none');
|
|
} else {
|
|
$('#cp-pane-' + pane).css('display', 'none');
|
|
}
|
|
});
|
|
},
|
|
|
|
showAboutPane: function(pane) {
|
|
var self = this;
|
|
|
|
if (pane === this.curAboutPane) { return; }
|
|
this.curAboutPane = pane;
|
|
$('#about .cp-pane').css('display', 'none');
|
|
$('#cp-pane-' + pane).css('display', 'block').fadeIn(this.animSpeed, function() {
|
|
if (self.curAboutPane === pane) {
|
|
$('#about .cp-pane').not('#cp-pane-' + pane).css('display', 'none');
|
|
} else {
|
|
$('#cp-pane-' + pane).css('display', 'none');
|
|
}
|
|
});
|
|
},
|
|
|
|
ajax: function(callback, pars, html) {
|
|
var self = this;
|
|
|
|
$.post('ajax.php', pars, function(parse) {
|
|
// alert(parse);
|
|
if (parse) {
|
|
if (html) {
|
|
callback.apply(self, [parse]);
|
|
} else {
|
|
callback.apply(self, [self.json(parse)]);
|
|
}
|
|
} else {
|
|
callback.apply(self);
|
|
}
|
|
});
|
|
},
|
|
|
|
json: function(parse) {
|
|
var json = eval('(' + parse + ')');
|
|
return json;
|
|
},
|
|
|
|
loaded: function() {
|
|
return ($('#cp-loaded').length === 1);
|
|
},
|
|
|
|
loading: function() {
|
|
$('#' + this.curSection + ' .sn-loading').fadeTo(this.animSpeed, 1);
|
|
},
|
|
|
|
done: function() {
|
|
$('#' + this.curSection + ' .sn-loading').fadeTo(this.animSpeed, 0);
|
|
},
|
|
|
|
loginLoading: function() {
|
|
$('#login-password').animate({
|
|
width: 134
|
|
});
|
|
|
|
$('#login-loading').fadeTo(this.animSpeed, 1);
|
|
|
|
},
|
|
|
|
loginDone: function() {
|
|
$('#login-password').animate({
|
|
width: 157
|
|
});
|
|
$('#login-loading').fadeTo(this.animSpeed, 0);
|
|
},
|
|
|
|
getAnchor: function() {
|
|
var href = window.location.href;
|
|
if (href.indexOf('#') > -1 ) {
|
|
return href.substr(href.indexOf('#') + 1).toLowerCase();
|
|
}
|
|
return '';
|
|
},
|
|
|
|
unban: function(ip, el) {
|
|
var self = this;
|
|
|
|
this.loading();
|
|
var pars = {
|
|
mode: 'unban',
|
|
'ip': ip
|
|
};
|
|
|
|
this.ajax(function(json) {
|
|
if (!json.error) {
|
|
$(el).fadeOut(function() {
|
|
$(this).remove();
|
|
$('#bans-list li:odd').removeClass('even').addClass('odd');
|
|
$('#bans-list li:even').removeClass('odd').addClass('even');
|
|
}, this.animSpeed);
|
|
}
|
|
self.done();
|
|
}, pars);
|
|
},
|
|
|
|
unbanAll: function() {
|
|
this.loading();
|
|
|
|
var pars = {
|
|
mode: 'unbanall'
|
|
};
|
|
|
|
this.ajax(function(json) {
|
|
this.done();
|
|
$('#bans-list').fadeOut(this.animSpeed, function() {
|
|
$('#bans-list').children().remove();
|
|
$('#bans-list').fadeIn();
|
|
});
|
|
}, pars);
|
|
}
|
|
|
|
};
|
|
|
|
var cp = new AdminCP(); |