From 7e4f1d542e00b4d3121da6ae5524e95867f2371b Mon Sep 17 00:00:00 2001
From: root
Date: Fri, 13 Nov 2009 20:18:55 -0500
Subject: better comments, email subscriptions, corrected view counter, some
ie7 issues, wiki optional with settings.WIKI_ON, site can be mounted on
arbitrary url prefix, english language improvements, added feedback form,
versioned css and js files to force browser cache reload when
settings.RESOURCE_REVISION is incremented , other fixes
---
templates/content/js/com.cnprog.admin.js | 13 +
templates/content/js/com.cnprog.i18n.js | 31 +-
templates/content/js/com.cnprog.post.js | 314 +++++++++------
templates/content/js/com.cnprog.utils.js | 7 +-
templates/content/js/jquery.form.js | 654 +++++++++++++++++++++++++++++++
templates/content/js/wmd/wmd.js | 2 +-
6 files changed, 875 insertions(+), 146 deletions(-)
create mode 100644 templates/content/js/com.cnprog.admin.js
create mode 100644 templates/content/js/jquery.form.js
(limited to 'templates/content/js')
diff --git a/templates/content/js/com.cnprog.admin.js b/templates/content/js/com.cnprog.admin.js
new file mode 100644
index 00000000..73b5768f
--- /dev/null
+++ b/templates/content/js/com.cnprog.admin.js
@@ -0,0 +1,13 @@
+$().ready( function(){
+ var options = {
+ success: function(a,b){$('.admin #action_status').html($.i18n._('changes saved'));},
+ dataType:'json',
+ timeout:5000,
+ url: $.i18n._('/') + $.i18n._('moderate-user/') + viewUserID + '/'
+ };
+ var form = $('.admin #moderate_user_form').ajaxForm(options);
+ var box = $('.admin input#id_is_approved').click(function(){
+ $('.admin #action_status').html($.i18n._('sending data...'));
+ form.ajaxSubmit(options);
+ });
+});
diff --git a/templates/content/js/com.cnprog.i18n.js b/templates/content/js/com.cnprog.i18n.js
index 6ba8b59d..d2356abc 100644
--- a/templates/content/js/com.cnprog.i18n.js
+++ b/templates/content/js/com.cnprog.i18n.js
@@ -20,7 +20,7 @@ var i18nZh = {
'post recovered':"操作成功!该帖子已被恢复。",
'post deleted':"操作成功!该帖子已删除。",
'add comment':'添加评论',
- 'community reputation points':'社区积分',
+ 'community karma points':'社区积分',
'to comment, need':'评论需要',
'delete this comment':'删除此评论',
'hide comments':"隐藏评论",
@@ -53,27 +53,29 @@ var i18nZh = {
'redo':'重做',
'enter image url':'输入图片地址
示例:
http://www.example.com/image.jpg \"我的截图\"',
'enter url':'输入Web地址
示例:
http://www.cnprog.com/ \"我的网站\"
"',
- 'upload image':'或者上传本地图片:',
+ 'upload image':'或者上传本地图片:'
};
var i18nEn = {
- '>15 points requried to upvote':'>15 points requried to upvote ',
+ '/':'/',
+ 'need >15 points to report spam':'need >15 points to report spam ',
+ '>15 points requried to upvote':'>15 points required to upvote ',
'tags cannot be empty':'please enter at least one tag',
- 'anonymous users cannot vote':'anonymous users cannot vote ',
- 'anonymous users cannot select favorite questions':'anonymous users cannot select favorite questions ',
- 'to comment, need': 'to comment, need reputation ',
+ 'anonymous users cannot vote':'sorry, anonymous users cannot vote ',
+ 'anonymous users cannot select favorite questions':'sorry, anonymous users cannot select favorite questions ',
+ 'to comment, need': '(to comment other people\'s posts, karma ',
'please see':'please see ',
- 'community reputation points':' ',
+ 'community karma points':' or more is necessary) - ',
'upload image':'Upload image:',
'enter image url':'enter URL of the image, e.g. http://www.example.com/image.jpg \"image title\"',
'enter url':'enter Web address, e.g. http://www.example.com \"page title\"',
'daily vote cap exhausted':'sorry, you\'ve used up todays vote cap',
- 'cannot pick own answer as best':'cannot accept own answer',
- 'cannot revoke old vote':'older votes cannot be revoked',
+ 'cannot pick own answer as best':'sorry, you cannot accept your own answer',
+ 'cannot revoke old vote':'sorry, older votes cannot be revoked',
'please confirm offensive':'are you sure this post is offensive, contains spam, advertising, malicious remarks, etc.?',
- 'flag offensive cap exhausted':'sorry, you\'ve used up todays cap of flagging offensive messages',
+ 'flag offensive cap exhausted':'sorry, you\'ve used up todays cap of flagging offensive messages ',
'confirm delete':'are you sure you want to delete this?',
- 'anonymous users cannot delete/undelete':'anonymous users cannot delete or undelete posts',
+ 'anonymous users cannot delete/undelete':'sorry, anonymous users cannot delete or undelete posts',
'post recovered':'your post is now restored!',
'post deleted':'your post has been deleted',
'confirm delete comment':'do you really want to delete this comment?',
@@ -82,6 +84,9 @@ var i18nEn = {
'content minchars': 'please enter more than {0} characters',
'title minchars':"please enter at least {0} characters",
'characters':'characters left',
+ 'cannot vote for own posts':'sorry, you cannot vote for your own posts',
+ 'cannot flag message as offensive twice':'cannot flag message as offensive twice ',
+ '>100 points required to downvote':'>100 points required to downvote '
};
var i18nEs = {
@@ -106,7 +111,7 @@ var i18nEs = {
'post recovered':"publicación recuperada",
'post deleted':"publicación borrada。",
'add comment':'agregar comentario',
- 'community reputation points':'reputación comunitaria',
+ 'community karma points':'reputación comunitaria',
'to comment, need':'para comentar, necesita reputación',
'delete this comment':'borrar este comentario',
'hide comments':"ocultar comentarios",
@@ -141,7 +146,7 @@ var i18nEs = {
'enter url':'introduzca direcciones web, ejemplo:
http://www.cnprog.com/ \"titulo del enlace\""',
'upload image':'cargar imagen:',
'questions/' : 'preguntas/',
- 'vote/' : 'votar/',
+ 'vote/' : 'votar/'
};
var i18n = {
diff --git a/templates/content/js/com.cnprog.post.js b/templates/content/js/com.cnprog.post.js
index aa6c51b6..58db9b33 100644
--- a/templates/content/js/com.cnprog.post.js
+++ b/templates/content/js/com.cnprog.post.js
@@ -52,31 +52,25 @@ var Vote = function(){
var acceptAnonymousMessage = $.i18n._('insufficient privilege');
var acceptOwnAnswerMessage = $.i18n._('cannot pick own answer as best');
- var favoriteAnonymousMessage = $.i18n._('anonymous users cannot select favorite questions')
- + ""
- + $.i18n._('please login') + "";
- var voteAnonymousMessage = $.i18n._('anonymous users cannot vote')
- + ""
+
+ var pleaseLogin = ""
+ $.i18n._('please login') + "";
- var upVoteRequiredScoreMessage = $.i18n._('>15 points requried to upvote')
- + $.i18n._('please see') + "faq";
- var downVoteRequiredScoreMessage = $.i18n._('>100 points requried to downvote')
- + $.i18n._('please see') + "faq";
+
+ var pleaseSeeFAQ = $.i18n._('please see') + "faq";
+
+ var favoriteAnonymousMessage = $.i18n._('anonymous users cannot select favorite questions')
+ var voteAnonymousMessage = $.i18n._('anonymous users cannot vote') + pleaseLogin;
+ var upVoteRequiredScoreMessage = $.i18n._('>15 points requried to upvote') + pleaseSeeFAQ;
+ var downVoteRequiredScoreMessage = $.i18n._('>100 points required to downvote') + pleaseSeeFAQ;
var voteOwnDeniedMessage = $.i18n._('cannot vote for own posts');
- var voteRequiredMoreVotes = $.i18n._('daily vote cap exhausted')
- + $.i18n._('please see') + "faq";
- var voteDenyCancelMessage = $.i18n._('cannot revoke old vote')
- + $.i18n._('please see') + "faq";
+ var voteRequiredMoreVotes = $.i18n._('daily vote cap exhausted') + pleaseSeeFAQ;
+ var voteDenyCancelMessage = $.i18n._('cannot revoke old vote') + pleaseSeeFAQ;
var offensiveConfirmation = $.i18n._('please confirm offensive');
- var offensiveAnonymousMessage = $.i18n._('anonymous users cannot flag offensive posts')
- + ""
- + $.i18n._('please login') + "";
- var offensiveTwiceMessage = $.i18n._('cannot flag message as offensive twice')
- + $.i18n._('please see') + "faq";
- var offensiveNoFlagsLeftMessage = $.i18n._('flag offensive cap exhausted')
- + $.i18n._('please see') + "faq";
- var offensiveNoPermissionMessage = $.i18n._('need >15 points to report spam')
- + $.i18n._('please see') + "faq";
+ var offensiveAnonymousMessage = $.i18n._('anonymous users cannot flag offensive posts') + pleaseLogin;
+ var offensiveTwiceMessage = $.i18n._('cannot flag message as offensive twice') + pleaseSeeFAQ;
+ var offensiveNoFlagsLeftMessage = $.i18n._('flag offensive cap exhausted') + pleaseSeeFAQ;
+ var offensiveNoPermissionMessage = $.i18n._('need >15 points to report spam') + pleaseSeeFAQ;
var removeConfirmation = $.i18n._('confirm delete');
var removeAnonymousMessage = $.i18n._('anonymous users cannot delete/undelete');
var recoveredMessage = $.i18n._('post recovered');
@@ -94,7 +88,7 @@ var Vote = function(){
removeQuestion: 9,
removeAnswer:10,
questionSubscribeUpdates:11,
- questionUnsubscribeUpdates:12,
+ questionUnsubscribeUpdates:12
};
var getFavoriteButton = function(){
@@ -131,7 +125,7 @@ var Vote = function(){
};
var getOffensiveQuestionFlag = function(){
- var offensiveQuestionFlag = 'table[id=question-table] span[class='+ offensiveClassFlag +']';
+ var offensiveQuestionFlag = '#question-table span[class='+ offensiveClassFlag +']';
return $(offensiveQuestionFlag);
};
@@ -157,17 +151,17 @@ var Vote = function(){
var setVoteImage = function(voteType, undo, object){
var flag = undo ? "" : "-on";
var arrow = (voteType == VoteType.questionUpVote || voteType == VoteType.answerUpVote) ? "up" : "down";
- object.attr("src", "/content/images/vote-arrow-"+ arrow + flag +".png");
+ object.attr("src", $.i18n._("/") + "content/images/vote-arrow-"+ arrow + flag +".png");
// if undo voting, then undo the pair of arrows.
if(undo){
if(voteType == VoteType.questionUpVote || voteType == VoteType.questionDownVote){
- $(getQuestionVoteUpButton()).attr("src", "/content/images/vote-arrow-up.png");
- $(getQuestionVoteDownButton()).attr("src", "/content/images/vote-arrow-down.png");
+ $(getQuestionVoteUpButton()).attr("src", $.i18n._("/") + "content/images/vote-arrow-up.png");
+ $(getQuestionVoteDownButton()).attr("src", $.i18n._("/") + "content/images/vote-arrow-down.png");
}
else{
- $(getAnswerVoteUpButton(postId)).attr("src", "/content/images/vote-arrow-up.png");
- $(getAnswerVoteDownButton(postId)).attr("src", "/content/images/vote-arrow-down.png");
+ $(getAnswerVoteUpButton(postId)).attr("src", $.i18n._("/") + "content/images/vote-arrow-up.png");
+ $(getAnswerVoteDownButton(postId)).attr("src", $.i18n._("/") + "content/images/vote-arrow-down.png");
}
}
};
@@ -182,42 +176,42 @@ var Vote = function(){
if(questionAuthorId == currentUserId){
var acceptedButtons = 'div.'+ voteContainerId +' img[id^='+ imgIdPrefixAccept +']';
$(acceptedButtons).unbind('click').click(function(event){
- Vote.accept($(event.target))
+ Vote.accept($(event.target));
});
}
// set favorite question
var favoriteButton = getFavoriteButton();
favoriteButton.unbind('click').click(function(event){
- Vote.favorite($(event.target))
+ Vote.favorite($(event.target));
});
// question vote up
var questionVoteUpButton = getQuestionVoteUpButton();
questionVoteUpButton.unbind('click').click(function(event){
- Vote.vote($(event.target), VoteType.questionUpVote)
+ Vote.vote($(event.target), VoteType.questionUpVote);
});
var questionVoteDownButton = getQuestionVoteDownButton();
questionVoteDownButton.unbind('click').click(function(event){
- Vote.vote($(event.target), VoteType.questionDownVote)
+ Vote.vote($(event.target), VoteType.questionDownVote);
});
var answerVoteUpButton = getAnswerVoteUpButtons();
answerVoteUpButton.unbind('click').click(function(event){
- Vote.vote($(event.target), VoteType.answerUpVote)
+ Vote.vote($(event.target), VoteType.answerUpVote);
});
var answerVoteDownButton = getAnswerVoteDownButtons();
answerVoteDownButton.unbind('click').click(function(event){
- Vote.vote($(event.target), VoteType.answerDownVote)
+ Vote.vote($(event.target), VoteType.answerDownVote);
});
getOffensiveQuestionFlag().unbind('click').click(function(event){
- Vote.offensive(this, VoteType.offensiveQuestion)
+ Vote.offensive(this, VoteType.offensiveQuestion);
});
getOffensiveAnswerFlags().unbind('click').click(function(event){
- Vote.offensive(this, VoteType.offensiveAnswer)
+ Vote.offensive(this, VoteType.offensiveAnswer);
});
getremoveQuestionLink().unbind('click').click(function(event){
@@ -234,7 +228,7 @@ var Vote = function(){
});
getremoveAnswersLinks().unbind('click').click(function(event){
- Vote.remove(this, VoteType.removeAnswer)
+ Vote.remove(this, VoteType.removeAnswer);
});
};
@@ -243,14 +237,14 @@ var Vote = function(){
type: "POST",
cache: false,
dataType: "json",
- url: "/" + $.i18n._("questions/") + questionId + "/" + $.i18n._("vote/"),
+ url: $.i18n._("/") + $.i18n._("questions/") + questionId + "/" + $.i18n._("vote/"),
data: { "type": voteType, "postId": postId },
error: handleFail,
success: function(data){callback(object, voteType, data)}});
};
var handleFail = function(xhr, msg){
- alert("Callback invoke error: " + msg)
+ alert("Callback invoke error: " + msg);
};
// callback function for Accept Answer action
@@ -262,19 +256,19 @@ var Vote = function(){
showMessage(object, acceptOwnAnswerMessage);
}
else if(data.status == "1"){
- object.attr("src", "/content/images/vote-accepted.png");
+ object.attr("src", $.i18n._("/") + "content/images/vote-accepted.png");
$("#"+answerContainerIdPrefix+postId).removeClass("accepted-answer");
$("#"+commentLinkIdPrefix+postId).removeClass("comment-link-accepted");
}
else if(data.success == "1"){
var acceptedButtons = 'div.'+ voteContainerId +' img[id^='+ imgIdPrefixAccept +']';
- $(acceptedButtons).attr("src", "/content/images/vote-accepted.png");
+ $(acceptedButtons).attr("src", $.i18n._("/") + "content/images/vote-accepted.png");
var answers = ("div[id^="+answerContainerIdPrefix +"]");
$(answers).removeClass("accepted-answer");
var commentLinks = ("div[id^="+answerContainerIdPrefix +"] div[id^="+ commentLinkIdPrefix +"]");
$(commentLinks).removeClass("comment-link-accepted");
- object.attr("src", "/content/images/vote-accepted-on.png");
+ object.attr("src", $.i18n._("/") + "content/images/vote-accepted-on.png");
$("#"+answerContainerIdPrefix+postId).addClass("accepted-answer");
$("#"+commentLinkIdPrefix+postId).addClass("comment-link-accepted");
}
@@ -288,7 +282,7 @@ var Vote = function(){
showMessage(object, favoriteAnonymousMessage.replace("{{QuestionID}}", questionId));
}
else if(data.status == "1"){
- object.attr("src", "/content/images/vote-favorite-off.png");
+ object.attr("src", $.i18n._("/") + "content/images/vote-favorite-off.png");
var fav = getFavoriteNumber();
fav.removeClass("my-favorite-number");
if(data.count == 0)
@@ -296,7 +290,7 @@ var Vote = function(){
fav.text(data.count);
}
else if(data.success == "1"){
- object.attr("src", "/content/images/vote-favorite-on.png");
+ object.attr("src", $.i18n._("/") + "/content/images/vote-favorite-on.png");
var fav = getFavoriteNumber();
fav.text(data.count);
fav.addClass("my-favorite-number");
@@ -310,69 +304,75 @@ var Vote = function(){
if(data.allowed == "0" && data.success == "0"){
showMessage(object, voteAnonymousMessage.replace("{{QuestionID}}", questionId));
}
- else if(data.allowed == "-3"){
+ else if (data.allowed == "-3"){
showMessage(object, voteRequiredMoreVotes);
}
- else if(data.allowed == "-2"){
- if(voteType == VoteType.questionUpVote || voteType == VoteType.answerUpVote){
+ else if (data.allowed == "-2"){
+ if (voteType == VoteType.questionUpVote || voteType == VoteType.answerUpVote){
showMessage(object, upVoteRequiredScoreMessage);
}
- else if(voteType == VoteType.questionDownVote || voteType == VoteType.answerDownVote){
+ else if (voteType == VoteType.questionDownVote || voteType == VoteType.answerDownVote){
showMessage(object, downVoteRequiredScoreMessage);
}
}
- else if(data.allowed == "-1"){
+ else if (data.allowed == "-1"){
showMessage(object, voteOwnDeniedMessage);
}
- else if(data.status == "2"){
+ else if (data.status == "2"){
showMessage(object, voteDenyCancelMessage);
}
- else if(data.status == "1"){
+ else if (data.status == "1"){
setVoteImage(voteType, true, object);
setVoteNumber(object, data.count);
}
- else if(data.success == "1"){
+ else if (data.success == "1"){
setVoteImage(voteType, false, object);
setVoteNumber(object, data.count);
- if(data.message.length > 0)
+ if (data.message.length > 0){
showMessage(object, data.message);
+ }
}
};
var callback_offensive = function(object, voteType, data){
object = $(object);
- if(data.allowed == "0" && data.success == "0"){
+ if (data.allowed == "0" && data.success == "0"){
showMessage(object, offensiveAnonymousMessage.replace("{{QuestionID}}", questionId));
}
- else if(data.allowed == "-3"){
+ else if (data.allowed == "-3"){
showMessage(object, offensiveNoFlagsLeftMessage);
}
- else if(data.allowed == "-2"){
+ else if (data.allowed == "-2"){
showMessage(object, offensiveNoPermissionMessage);
}
- else if(data.status == "1"){
+ else if (data.status == "1"){
showMessage(object, offensiveTwiceMessage);
}
- else if(data.success == "1"){
+ else if (data.success == "1"){
$(object).children('span[class=darkred]').text("("+ data.count +")");
}
};
var callback_remove = function(object, voteType, data){
- if(data.allowed == "0" && data.success == "0"){
+ if (data.allowed == "0" && data.success == "0"){
showMessage(object, removeAnonymousMessage.replace("{{QuestionID}}", questionId));
}
else if (data.success == "1"){
- if (removeActionType == 'delete'){
- postNode.addClass('deleted');
- postRemoveLink.innerHTML = $.i18n._('undelete');
- showMessage(object, deletedMessage);
- }
- else if (removeActionType == 'undelete') {
- postNode.removeClass('deleted');
- postRemoveLink.innerHTML = $.i18n._('delete');
- showMessage(object, recoveredMessage);
- }
+ if (voteType == VoteType.removeQuestion){
+ window.location.href = $.i18n._("/") + $.i18n._("questions/");
+ }
+ else {
+ if (removeActionType == 'delete'){
+ postNode.addClass('deleted');
+ postRemoveLink.innerHTML = $.i18n._('undelete');
+ showMessage(object, deletedMessage);
+ }
+ else if (removeActionType == 'undelete') {
+ postNode.removeClass('deleted');
+ postRemoveLink.innerHTML = $.i18n._('delete');
+ showMessage(object, recoveredMessage);
+ }
+ }
}
};
@@ -391,7 +391,7 @@ var Vote = function(){
},
favorite: function(object){
- if(!currentUserId || currentUserId.toUpperCase() == "NONE"){
+ if (!currentUserId || currentUserId.toUpperCase() == "NONE"){
showMessage(object, favoriteAnonymousMessage.replace("{{QuestionID}}", questionId));
return false;
}
@@ -399,14 +399,14 @@ var Vote = function(){
},
vote: function(object, voteType){
- if(!currentUserId || currentUserId.toUpperCase() == "NONE"){
+ if (!currentUserId || currentUserId.toUpperCase() == "NONE"){
showMessage(object, voteAnonymousMessage.replace("{{QuestionID}}", questionId));
return false;
}
- if(voteType == VoteType.answerUpVote){
+ if (voteType == VoteType.answerUpVote){
postId = object.attr("id").substring(imgIdPrefixAnswerVoteup.length);
}
- else if(voteType == VoteType.answerDownVote){
+ else if (voteType == VoteType.answerDownVote){
postId = object.attr("id").substring(imgIdPrefixAnswerVotedown.length);
}
@@ -414,39 +414,43 @@ var Vote = function(){
},
offensive: function(object, voteType){
- if(!currentUserId || currentUserId.toUpperCase() == "NONE"){
+ if (!currentUserId || currentUserId.toUpperCase() == "NONE"){
showMessage($(object), offensiveAnonymousMessage.replace("{{QuestionID}}", questionId));
return false;
}
- if(confirm(offensiveConfirmation)){
+ if (confirm(offensiveConfirmation)){
postId = object.id.substr(object.id.lastIndexOf('-') + 1);
submit(object, voteType, callback_offensive);
}
},
remove: function(object, voteType){
- if(!currentUserId || currentUserId.toUpperCase() == "NONE"){
+ if (!currentUserId || currentUserId.toUpperCase() == "NONE"){
showMessage($(object), removeAnonymousMessage.replace("{{QuestionID}}", questionId));
return false;
}
- if(confirm(removeConfirmation)){
- bits = object.id.split('-');
- postId = bits.pop();/* this seems to be used within submit! */
- postType = bits.shift();
-
- if (postType == 'answer'){
- postNode = $('#answer-container-' + postId);
- postRemoveLink = object;
- if (postNode.hasClass('deleted')){
- removeActionType = 'undelete';
- }
- else {
- removeActionType = 'delete';
- }
- }
+ bits = object.id.split('-');
+ postId = bits.pop();/* this seems to be used within submit! */
+ postType = bits.shift();
+
+ var do_proceed = false;
+ if (postType == 'answer'){
+ postNode = $('#answer-container-' + postId);
+ postRemoveLink = object;
+ if (postNode.hasClass('deleted')){
+ removeActionType = 'undelete';
+ do_proceed = true;
+ }
+ else {
+ removeActionType = 'delete';
+ do_proceed = confirm(removeConfirmation);
+ }
+ }
+ else {
+ do_proceed = confirm(removeConfirmation);
+ }
+ if (do_proceed) {
submit($(object), voteType, callback_remove);
-
-
}
}
}
@@ -457,21 +461,24 @@ var Vote = function(){
function createComments(type) {
var objectType = type;
var jDivInit = function(id) {
- return $("#comments-" + objectType + '-' + id);
+ return $("#comments-container-" + objectType + '-' + id);
};
var appendLoaderImg = function(id) {
- appendLoader("#comments-" + objectType + '-' + id + " div.comments");
+ appendLoader("#comments-container-" + objectType + '-' + id);
};
- var canPostComments = function(id, jDiv) {
- var jHidden = jDiv.siblings("#can-post-comments-" + objectType + '-' + id);
+ var canPostComments = function(id) {
+ var jHidden = $("#can-post-comments-" + objectType + '-' + id);
return jHidden.val().toLowerCase() == "true";
};
- var renderForm = function(id, jDiv) {
+ var renderForm = function(id) {
var formId = "form-comments-" + objectType + "-" + id;
- if (canPostComments(id, jDiv)) {
+ var jDiv = $('#comments-link-' + objectType + "-" + id).parent();
+ $(jDiv).css('background','none');
+ $(jDiv).css('padding-left',0);
+ if (canPostComments(id)) {
if (jDiv.find("#" + formId).length == 0) {
var form = '