diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index c332722894..8681ceec1b 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -2,16 +2,13 @@ var ajaxify = {}; -(function ($) { +(function () { /*global app, templates, utils*/ var location = document.location || window.location, rootUrl = location.protocol + '//' + (location.hostname || location.host) + (location.port ? ':' + location.port : ''), content = null; - var current_state = null; - var executed = {}; - var events = []; ajaxify.register_events = function (new_page_events) { for (var i = 0, ii = events.length; i < ii; i++) { @@ -114,7 +111,7 @@ var ajaxify = {}; require(['vendor/async'], function(async) { $('#content [widget-area]').each(function() { - widgetLocations.push(this.getAttribute('widget-area')); + widgetLocations.push($(this).attr('widget-area')); }); async.each(widgetLocations, function(location, next) { @@ -127,7 +124,9 @@ var ajaxify = {}; if (!renderedWidgets.length) { $('body [no-widget-class]').each(function() { - this.className = this.getAttribute('no-widget-class'); + var $this = $(this); + $this.removeClass(); + $this.addClass($this.attr('no-widget-class')); }); } @@ -174,7 +173,7 @@ var ajaxify = {}; app.previousUrl = window.location.href; } - if (this.getAttribute('data-ajaxify') === 'false') { + if ($(this).attr('data-ajaxify') === 'false') { return; } @@ -198,4 +197,4 @@ var ajaxify = {}; }); }); -}(jQuery)); +}()); diff --git a/public/src/app.js b/public/src/app.js index 9e7b1af06a..17415d392d 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -1,10 +1,10 @@ var socket, config, app = { - "username": null, - "uid": null, - "isFocused": true, - "currentRoom": null + 'username': null, + 'uid': null, + 'isFocused': true, + 'currentRoom': null }; (function () { @@ -284,7 +284,7 @@ var socket, app.populateOnlineUsers = function () { var uids = []; - jQuery('.post-row').each(function () { + $('.post-row').each(function () { var uid = $(this).attr('data-uid'); if(uids.indexOf(uid) === -1) { uids.push(uid); @@ -293,8 +293,8 @@ var socket, socket.emit('user.getOnlineUsers', uids, function (err, users) { - jQuery('.username-field').each(function (index, element) { - var el = jQuery(this), + $('.username-field').each(function (index, element) { + var el = $(this), uid = el.parents('li').attr('data-uid'); if (uid && users[uid]) { @@ -314,19 +314,19 @@ var socket, parts = path.split('/'), active = parts[parts.length - 1]; - jQuery('#main-nav li').removeClass('active'); + $('#main-nav li').removeClass('active'); if (active) { - jQuery('#main-nav li a').each(function () { - var href = this.getAttribute('href'); + $('#main-nav li a').each(function () { + var href = $(this).attr('href'); if (active == "sort-posts" || active == "sort-reputation" || active == "search" || active == "latest" || active == "online") active = 'users'; if (href && href.match(active)) { - jQuery(this.parentNode).addClass('active'); + $(this.parentNode).addClass('active'); return false; } }); } - }; + } app.createUserTooltips = function() { $('img[title].teaser-pic,img[title].user-img').each(function() { @@ -342,7 +342,7 @@ var socket, selector:'.fa-circle.status', placement: 'top' }); - } + }; app.makeNumbersHumanReadable = function(elements) { elements.each(function() { @@ -459,7 +459,7 @@ var socket, } previousScrollTop = currentScrollTop; }); - } + }; var titleObj = { active: false, @@ -596,7 +596,7 @@ var socket, }); }; - jQuery('document').ready(function () { + $('document').ready(function () { $('#search-form').on('submit', function () { var input = $(this).find('input'); ajaxify.go("search/" + input.val()); diff --git a/public/src/forum/accountheader.js b/public/src/forum/accountheader.js index 15c94f573e..e49c1eddac 100644 --- a/public/src/forum/accountheader.js +++ b/public/src/forum/accountheader.js @@ -9,7 +9,7 @@ define(function() { hideLinks(); selectActivePill(); - } + }; AccountHeader.createMenu = function() { var userslug = $('.account-username-box').attr('data-userslug'); @@ -30,7 +30,7 @@ define(function() { selectActivePill(); hideLinks(); }); - } + }; function hideLinks() { var yourid = templates.get('yourid'), diff --git a/public/src/forum/admin/categories.js b/public/src/forum/admin/categories.js index 8278d7423e..f963c6918d 100644 --- a/public/src/forum/admin/categories.js +++ b/public/src/forum/admin/categories.js @@ -57,7 +57,7 @@ define(['uploader'], function(uploader) { function updateCategoryOrders() { var categories = $('.admin-categories #entry-container').children(); - for(var i=0; i' + - '' + - '' + - '' + - '' + - '' + - ' ' + resultObj.username; - - resultsFrag.appendChild(liEl.cloneNode(true)); + liEl = $('
  • ') + .attr('data-uid', resultObj.uid) + .html('
    ' + + '
    ' + + '' + + '' + + '' + + '
    ' + + '
    ' + + ' ' + resultObj.username); + + resultsEl.append(liEl); } - - resultsEl.html(resultsFrag); }); }, 250); }); @@ -262,7 +263,7 @@ define(['uploader'], function(uploader) { resultsEl.off().on('click', '[data-priv]', function(e) { var btnEl = $(this), uid = btnEl.parents('li[data-uid]').attr('data-uid'), - privilege = this.getAttribute('data-priv'); + privilege = btnEl.attr('data-priv'); e.preventDefault(); socket.emit('admin.categories.setPrivilege', { @@ -278,7 +279,7 @@ define(['uploader'], function(uploader) { }); modal.off().on('click', '.members li > img', function() { - searchEl.val(this.getAttribute('title')); + searchEl.val($(this).attr('title')); searchEl.keyup(); }); @@ -287,33 +288,31 @@ define(['uploader'], function(uploader) { if(err) { return app.alertError(err.message); } - var groupsFrag = document.createDocumentFragment(), - numResults = results.length, - trEl = document.createElement('tr'), + var numResults = results.length, + trEl, resultObj; - for(var x=0;x' + - '' + - '
    ' + - '' + - '' + - '
    ' + - ''; - - groupsFrag.appendChild(trEl.cloneNode(true)); + trEl = $('') + .attr('data-gid', resultObj.gid) + .html('

    ' + resultObj.name + '

    ' + + '' + + '
    ' + + '' + + '' + + '
    ' + + ''); + groupsResultsEl.append(trEl); } - - groupsResultsEl.html(groupsFrag); }); groupsResultsEl.off().on('click', '[data-gpriv]', function(e) { var btnEl = $(this), gid = btnEl.parents('tr[data-gid]').attr('data-gid'), - privilege = this.getAttribute('data-gpriv'); + privilege = btnEl.attr('data-gpriv'); e.preventDefault(); + socket.emit('admin.categories.setGroupPrivilege', { cid: cid, gid: gid, @@ -324,7 +323,7 @@ define(['uploader'], function(uploader) { btnEl.toggleClass('active'); } }); - }) + }); modal.modal(); }; @@ -338,57 +337,40 @@ define(['uploader'], function(uploader) { var readLength = privilegeList['+r'].length, writeLength = privilegeList['+w'].length, modLength = privilegeList['mods'].length, - readFrag = document.createDocumentFragment(), - writeFrag = document.createDocumentFragment(), - modFrag = document.createDocumentFragment(), - liEl = document.createElement('li'), - x, userObj; + liEl, x, userObj; if (readLength > 0) { - for(x=0;x'; - readFrag.appendChild(liEl.cloneNode(true)); + liEl = $('
  • ').attr('data-uid', userObj.uid).html(''); + readMembers.append(liEl); } } else { - liEl.className = 'empty'; - liEl.innerHTML = 'All users can read and see this category'; - readFrag.appendChild(liEl.cloneNode(true)); + liEl = $('
  • ').addClass('empty').html('All users can read and see this category'); + readMembers.append(liEl); } if (writeLength > 0) { for(x=0;x'; - writeFrag.appendChild(liEl.cloneNode(true)); + $('
  • ').attr('data-uid', userObj.uid).html(''); + writeMembers.append(liEl); } } else { - liEl.className = 'empty'; - liEl.innerHTML = 'All users can write to this category'; - writeFrag.appendChild(liEl.cloneNode(true)); + liEl = $('
  • ').addClass('empty').html('All users can write to this category'); + writeMembers.append(liEl); } if (modLength > 0) { - for(x=0;x'; - modFrag.appendChild(liEl.cloneNode(true)); + liEl = $('
  • ').attr('data-uid', userObj.uid).html(''); + moderatorsEl.append(liEl); } } else { - liEl.className = 'empty'; - liEl.innerHTML = 'No moderators'; - modFrag.appendChild(liEl.cloneNode(true)); + liEl = $('
  • ').addClass('empty').html('No moderators'); + moderatorsEl.appendChild(liEl); } - - readMembers.html(readFrag); - writeMembers.html(writeFrag); - moderatorsEl.html(modFrag); }); }; diff --git a/public/src/forum/admin/footer.js b/public/src/forum/admin/footer.js index f81e23d110..cff9f24f90 100644 --- a/public/src/forum/admin/footer.js +++ b/public/src/forum/admin/footer.js @@ -1,18 +1,28 @@ -jQuery('document').ready(function() { - // On menu click, change "active" state - var menuEl = document.querySelector('.sidebar-nav'), - liEls = menuEl.querySelectorAll('li') - parentEl = null; +$(function() { + + var menuEl = $('.sidebar-nav'), + liEls = menuEl.find('li'), + parentEl, + activate = function(li) { + liEls.removeClass('active'); + li.addClass('active'); + }; - menuEl.addEventListener('click', function(e) { - parentEl = e.target.parentNode; - if (parentEl.nodeName === 'LI') { - for (var x = 0, numLis = liEls.length; x < numLis; x++) { - if (liEls[x] !== parentEl) jQuery(liEls[x]).removeClass('active'); - else jQuery(parentEl).addClass('active'); - } + // also on ready, check the pathname, maybe it was a page refresh and no item was clicked + liEls.each(function(i, li){ + li = $(li); + if ((li.find('a').attr('href') || '').indexOf(location.pathname) >= 0) { + activate(li); + } + }); + + // On menu click, change "active" state + menuEl.on('click', function(e) { + parentEl = $(e.target).parent(); + if (parentEl.is('li')) { + activate(parentEl); } - }, false); + }); }); socket.emit('admin.config.get', function(err, config) { diff --git a/public/src/forum/admin/groups.js b/public/src/forum/admin/groups.js index ad530c12a9..c5b69e8743 100644 --- a/public/src/forum/admin/groups.js +++ b/public/src/forum/admin/groups.js @@ -3,9 +3,9 @@ define(function() { Groups.init = function() { var yourid = templates.get('yourid'), - createEl = document.getElementById('create'), + createEl = $('#create'), createModal = $('#create-modal'), - createSubmitBtn = document.getElementById('create-modal-go'), + createSubmitBtn = $('#create-modal-go'), createNameEl = $('#create-group-name'), detailsModal = $('#group-details-modal'), detailsSearch = detailsModal.find('#group-details-search'), @@ -15,14 +15,14 @@ define(function() { searchDelay = undefined, listEl = $('#groups-list'); - createEl.addEventListener('click', function() { + createEl.on('click', function() { createModal.modal('show'); setTimeout(function() { createNameEl.focus(); }, 250); - }, false); + }); - createSubmitBtn.addEventListener('click', function() { + createSubmitBtn.on('click', function() { var submitObj = { name: createNameEl.val(), description: $('#create-group-desc').val() @@ -37,7 +37,7 @@ define(function() { errorText = 'Please choose another name

    There seems to be a group with this name already.

    '; break; case 'name-too-short': - errorText = 'Please specify a grou name

    A group name is required for administrative purposes.

    '; + errorText = 'Please specify a group name

    A group name is required for administrative purposes.

    '; break; default: errorText = 'Uh-Oh

    There was a problem creating your group. Please try again later!

    '; @@ -57,8 +57,9 @@ define(function() { }); listEl.on('click', 'button[data-action]', function() { - var action = this.getAttribute('data-action'), - gid = $(this).parents('li[data-gid]').attr('data-gid'); + var el = $(this), + action = el.attr('data-action'), + gid = el.parents('li[data-gid]').attr('data-gid'); switch (action) { case 'delete': @@ -80,28 +81,20 @@ define(function() { var formEl = detailsModal.find('form'), nameEl = formEl.find('#change-group-name'), descEl = formEl.find('#change-group-desc'), - memberIcon = document.createElement('li'), numMembers = groupObj.members.length, - membersFrag = document.createDocumentFragment(), - memberIconImg, x; - + x; nameEl.val(groupObj.name); descEl.val(groupObj.description); - // Member list - memberIcon.innerHTML = ''; - memberIconImg = memberIcon.querySelector('img'); - memberIconLabel = memberIcon.querySelector('span'); if (numMembers > 0) { + groupMembersEl.empty(); for (x = 0; x < numMembers; x++) { - memberIconImg.src = groupObj.members[x].picture; - memberIconLabel.innerHTML = groupObj.members[x].username; - memberIcon.setAttribute('data-uid', groupObj.members[x].uid); - membersFrag.appendChild(memberIcon.cloneNode(true)); + var memberIcon = $('
  • ') + .append($('').attr('src', groupObj.members[x].picture)) + .append($('').attr('data-uid', groupObj.members[x].uid).html(groupObj.members[x].username)); + groupMembersEl.append(memberIcon); } - groupMembersEl.html(''); - groupMembersEl[0].appendChild(membersFrag); } detailsModal.attr('data-gid', groupObj.gid); @@ -118,43 +111,39 @@ define(function() { searchDelay = setTimeout(function() { var searchText = searchEl.value, - resultsEl = document.getElementById('group-details-search-results'), - foundUser = document.createElement('li'), - foundUserImg, foundUserLabel; - - foundUser.innerHTML = ''; - foundUserImg = foundUser.getElementsByTagName('img')[0]; - foundUserLabel = foundUser.getElementsByTagName('span')[0]; + resultsEl = $('#group-details-search-results'), + foundUser; socket.emit('admin.user.search', searchText, function(err, results) { if (!err && results && results.users.length > 0) { - var numResults = results.users.length, - resultsSlug = document.createDocumentFragment(), - x; + var numResults = results.users.length, x; if (numResults > 4) numResults = 4; + + resultsEl.empty(); for (x = 0; x < numResults; x++) { - foundUserImg.src = results.users[x].picture; - foundUserLabel.innerHTML = results.users[x].username; - foundUser.setAttribute('title', results.users[x].username); - foundUser.setAttribute('data-uid', results.users[x].uid); - resultsSlug.appendChild(foundUser.cloneNode(true)); - } + foundUser = $('
  • '); + foundUser + .attr({title: results.users[x].username, 'data-uid': results.users[x].uid}) + .append($('').attr('src', results.users[x].picture)) + .append($('').html(results.users[x].username)); - resultsEl.innerHTML = ''; - resultsEl.appendChild(resultsSlug); - } else resultsEl.innerHTML = '
  • No Users Found
  • '; + resultsEl.appendChild(foundUser); + } + } else { + resultsEl.html('
  • No Users Found
  • '); + } }); }, 200); }); searchResults.on('click', 'li[data-uid]', function() { - var userLabel = this, - uid = parseInt(this.getAttribute('data-uid')), + var userLabel = $(this), + uid = parseInt(userLabel.attr('data-uid')), gid = detailsModal.attr('data-gid'), members = []; groupMembersEl.find('li[data-uid]').each(function() { - members.push(parseInt(this.getAttribute('data-uid'))); + members.push(parseInt($(this).attr('data-uid'))); }); if (members.indexOf(uid) === -1) { @@ -170,7 +159,7 @@ define(function() { }); groupMembersEl.on('click', 'li[data-uid]', function() { - var uid = this.getAttribute('data-uid'), + var uid = $(this).attr('data-uid'), gid = detailsModal.attr('data-gid'); socket.emit('admin.groups.get', gid, function(err, groupObj){ diff --git a/public/src/forum/admin/languages.js b/public/src/forum/admin/languages.js index 44182e3a13..207a75fedb 100644 --- a/public/src/forum/admin/languages.js +++ b/public/src/forum/admin/languages.js @@ -1,5 +1,5 @@ define(['forum/admin/settings'], function(Settings) { - jQuery('document').ready(function() { + $(function() { Settings.prepare(); }); }); \ No newline at end of file diff --git a/public/src/forum/admin/settings.js b/public/src/forum/admin/settings.js index 44f0e22cc2..6f164115f4 100644 --- a/public/src/forum/admin/settings.js +++ b/public/src/forum/admin/settings.js @@ -15,38 +15,38 @@ define(['uploader'], function(uploader) { } // Populate the fields on the page from the config - var fields = document.querySelectorAll('#content [data-field]'), + var fields = $('#content [data-field]'), numFields = fields.length, - saveBtn = document.getElementById('save'), - x, key, inputType; + saveBtn = $('#save'), + x, key, inputType, field; for (x = 0; x < numFields; x++) { - key = fields[x].getAttribute('data-field'); - inputType = fields[x].getAttribute('type'); - if (fields[x].nodeName === 'INPUT') { + field = fields.eq(x); + key = field.attr('data-field'); + inputType = field.attr('type'); + if (field.is('input')) { if (app.config[key]) { switch (inputType) { case 'text': case 'password': case 'textarea': case 'number': - fields[x].value = app.config[key]; + field.val(app.config[key]); break; case 'checkbox': - fields[x].checked = parseInt(app.config[key], 10) === 1; + field.prop('checked', parseInt(app.config[key], 10) === 1); break; } } - } else if (fields[x].nodeName === 'TEXTAREA') { - if (app.config[key]) fields[x].value = app.config[key]; - } else if (fields[x].nodeName === 'SELECT') { - if (app.config[key]) fields[x].value = app.config[key]; + } else if (field.is('textarea')) { + if (app.config[key]) field.val(app.config[key]); + } else if (field.is('select')) { + if (app.config[key]) field.val(app.config[key]); } } - saveBtn.addEventListener('click', function(e) { - + saveBtn.on('click', function(e) { e.preventDefault(); for (x = 0; x < numFields; x++) { @@ -55,27 +55,28 @@ define(['uploader'], function(uploader) { }); function saveField(field) { - var key = field.getAttribute('data-field'), + field = $(field); + var key = field.attr('data-field'), value; - if (field.nodeName === 'INPUT') { - inputType = field.getAttribute('type'); + if (field.is('input')) { + inputType = field.attr('type'); switch (inputType) { case 'text': case 'password': case 'textarea': case 'number': - value = field.value; + value = field.val(); break; case 'checkbox': - value = field.checked ? '1' : '0'; + value = field.prop('checked') ? '1' : '0'; break; } - } else if (field.nodeName === 'TEXTAREA') { - value = field.value; - } else if (field.nodeName === 'SELECT') { - value = field.value; + } else if (field.is('textarea')) { + value = field.val(); + } else if (field.is('select')) { + value = field.val(); } socket.emit('admin.config.set', { diff --git a/public/src/forum/admin/themes.js b/public/src/forum/admin/themes.js index e448fb072c..d5873a7164 100644 --- a/public/src/forum/admin/themes.js +++ b/public/src/forum/admin/themes.js @@ -2,17 +2,21 @@ define(['forum/admin/settings'], function(Settings) { var Themes = {}; Themes.init = function() { - var scriptEl = document.createElement('script'); - scriptEl.src = 'http://api.bootswatch.com/3/?callback=bootswatchListener'; - document.body.appendChild(scriptEl); + var scriptEl = $(' - + + - + - @@ -37,9 +47,9 @@ }); + - diff --git a/public/templates/composer.tpl b/public/templates/composer.tpl index 584ba48153..e600021dc0 100644 --- a/public/templates/composer.tpl +++ b/public/templates/composer.tpl @@ -1,14 +1,5 @@
    - -
    @@ -22,7 +13,6 @@
    -
    @@ -41,16 +31,26 @@ - - - - - - + + + + + + + + +
    - + + + + + +
    diff --git a/public/templates/header.tpl b/public/templates/header.tpl index 4a5aa70794..decbae43da 100644 --- a/public/templates/header.tpl +++ b/public/templates/header.tpl @@ -18,6 +18,13 @@ + + diff --git a/src/meta.js b/src/meta.js index cb8f43c3fb..f4411904fd 100644 --- a/src/meta.js +++ b/src/meta.js @@ -239,6 +239,7 @@ var fs = require('fs'), 'src/templates.js', 'src/ajaxify.js', 'src/translator.js', + 'src/overrides.js', 'src/utils.js' ], minFile: nconf.get('relative_path') + 'nodebb.min.js', diff --git a/src/routes/admin.js b/src/routes/admin.js index d04ac78b80..1741f62c6f 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -109,20 +109,22 @@ var nconf = require('nconf'), return res.redirect('/403'); } - var allowedTypes = ['image/png', 'image/jpeg', 'image/jpg', 'image/gif']; - var params = null; + var allowedTypes = ['image/png', 'image/jpeg', 'image/jpg', 'image/gif'], + params = null, er; try { params = JSON.parse(req.body.params); } catch (e) { - return res.send({ + er = { error: 'Error uploading file! Error :' + e.message - }); + }; + return res.send(req.xhr ? er : JSON.stringify(er)); } if (allowedTypes.indexOf(req.files.userPhoto.type) === -1) { - res.send({ + er = { error: 'Allowed image types are png, jpg and gif!' - }); + }; + res.send(req.xhr ? er : JSON.stringify(er)); return; } @@ -136,12 +138,12 @@ var nconf = require('nconf'), return res.redirect('/403'); } - var allowedTypes = ['image/x-icon', 'image/vnd.microsoft.icon']; + var allowedTypes = ['image/x-icon', 'image/vnd.microsoft.icon'], + er; if (allowedTypes.indexOf(req.files.userPhoto.type) === -1) { - res.send({ - error: 'You can only upload icon file type!' - }); + er = {error: 'You can only upload icon file type!'}; + res.send(req.xhr ? er : JSON.stringify(er)); return; } @@ -149,14 +151,12 @@ var nconf = require('nconf'), fs.unlink(req.files.userPhoto.path); if(err) { - return res.send({ - error: err.message - }); + er = {error: err.message}; + return res.send(req.xhr ? er : JSON.stringify(er)); } - res.json({ - path: image.url - }); + var rs = {path: image.url}; + res.send(req.xhr ? rs : JSON.stringify(rs)); }); }); @@ -166,12 +166,12 @@ var nconf = require('nconf'), return res.redirect('/403'); } - var allowedTypes = ['image/png', 'image/jpeg', 'image/jpg', 'image/gif']; + var allowedTypes = ['image/png', 'image/jpeg', 'image/pjpeg', 'image/jpg', 'image/gif'], + er; if (allowedTypes.indexOf(req.files.userPhoto.type) === -1) { - res.send({ - error: 'Allowed image types are png, jpg and gif!' - }); + er = {error: 'Allowed image types are png, jpg and gif!'}; + res.send(req.xhr ? er : JSON.stringify(er)); return; } @@ -191,17 +191,16 @@ var nconf = require('nconf'), function uploadImage(filename, req, res) { function done(err, image) { + var er, rs; fs.unlink(req.files.userPhoto.path); if(err) { - return res.send({ - error: err.message - }); + er = {error: err.message}; + return res.send(req.xhr ? er : JSON.stringify(er)); } - res.json({ - path: image.url - }); + rs = {path: image.url}; + res.send(req.xhr ? rs : JSON.stringify(rs)); } if(plugins.hasListeners('filter:uploadImage')) { diff --git a/src/routes/api.js b/src/routes/api.js index 7737f49e38..4b326fe565 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -469,16 +469,25 @@ var path = require('path'), async.map(files, filesIterator, function(err, images) { deleteTempFiles(); + if(err) { - return res.json(500, err.message); + return res.send(500, err.message); } - res.json(200, images); + + // if this was not a XMLHttpRequest (hence the req.xhr check http://expressjs.com/api.html#req.xhr) + // then most likely it's submit via the iFrame workaround, via the jquery.form plugin's ajaxSubmit() + // we need to send it as text/html so IE8 won't trigger a file download for the json response + // malsup.com/jquery/form/#file-upload + + // Also, req.send is safe for both types, if the response was an object, res.send will automatically submit as application/json + // expressjs.com/api.html#res.send + res.send(200, req.xhr ? images : JSON.stringify(images)); }); } app.post('/post/upload', function(req, res, next) { upload(req, res, function(file, next) { - if(file.type.match('image.*')) { + if(file.type.match(/image./)) { posts.uploadPostImage(file, next); } else { posts.uploadPostFile(file, next); @@ -488,7 +497,7 @@ var path = require('path'), app.post('/topic/thumb/upload', function(req, res, next) { upload(req, res, function(file, next) { - if(file.type.match('image.*')) { + if(file.type.match(/image./)) { topics.uploadTopicThumb(file, next); } else { res.json(500, {message: 'Invalid File'});