diff options
Diffstat (limited to 'templates/content')
26 files changed, 1406 insertions, 254 deletions
diff --git a/templates/content/images/blue-up-arrow-h18px.png b/templates/content/images/blue-up-arrow-h18px.png Binary files differnew file mode 100644 index 00000000..e1f29e86 --- /dev/null +++ b/templates/content/images/blue-up-arrow-h18px.png diff --git a/templates/content/images/gray-up-arrow-h18px.png b/templates/content/images/gray-up-arrow-h18px.png Binary files differnew file mode 100644 index 00000000..78767445 --- /dev/null +++ b/templates/content/images/gray-up-arrow-h18px.png diff --git a/templates/content/images/cnprog_logo_200_56.gif b/templates/content/images/logo.gif Binary files differindex ab690de2..ab690de2 100644 --- a/templates/content/images/cnprog_logo_200_56.gif +++ b/templates/content/images/logo.gif diff --git a/templates/content/images/logo.png b/templates/content/images/logo.png Binary files differindex 640eb1da..b53732e3 100644 --- a/templates/content/images/logo.png +++ b/templates/content/images/logo.png diff --git a/templates/content/jquery-openid/images/blogger-1.png b/templates/content/jquery-openid/images/blogger-1.png Binary files differnew file mode 100644 index 00000000..8b360ea5 --- /dev/null +++ b/templates/content/jquery-openid/images/blogger-1.png diff --git a/templates/content/jquery-openid/images/claimid-0.png b/templates/content/jquery-openid/images/claimid-0.png Binary files differnew file mode 100644 index 00000000..4a0ea1b3 --- /dev/null +++ b/templates/content/jquery-openid/images/claimid-0.png diff --git a/templates/content/jquery-openid/images/flickr.png b/templates/content/jquery-openid/images/flickr.png Binary files differnew file mode 100644 index 00000000..142405a6 --- /dev/null +++ b/templates/content/jquery-openid/images/flickr.png diff --git a/templates/content/jquery-openid/images/livejournal-1.png b/templates/content/jquery-openid/images/livejournal-1.png Binary files differnew file mode 100644 index 00000000..e6436081 --- /dev/null +++ b/templates/content/jquery-openid/images/livejournal-1.png diff --git a/templates/content/jquery-openid/images/local-login.png b/templates/content/jquery-openid/images/local-login.png Binary files differnew file mode 100644 index 00000000..258cedac --- /dev/null +++ b/templates/content/jquery-openid/images/local-login.png diff --git a/templates/content/jquery-openid/images/myopenid-2.png b/templates/content/jquery-openid/images/myopenid-2.png Binary files differnew file mode 100644 index 00000000..f64fb8e8 --- /dev/null +++ b/templates/content/jquery-openid/images/myopenid-2.png diff --git a/templates/content/jquery-openid/images/openidico16.png b/templates/content/jquery-openid/images/openidico16.png Binary files differnew file mode 100644 index 00000000..ad718ac5 --- /dev/null +++ b/templates/content/jquery-openid/images/openidico16.png diff --git a/templates/content/jquery-openid/images/technorati-1.png b/templates/content/jquery-openid/images/technorati-1.png Binary files differnew file mode 100644 index 00000000..f7195240 --- /dev/null +++ b/templates/content/jquery-openid/images/technorati-1.png diff --git a/templates/content/jquery-openid/images/verisign-2.png b/templates/content/jquery-openid/images/verisign-2.png Binary files differnew file mode 100644 index 00000000..c1467008 --- /dev/null +++ b/templates/content/jquery-openid/images/verisign-2.png diff --git a/templates/content/jquery-openid/images/vidoop.png b/templates/content/jquery-openid/images/vidoop.png Binary files differnew file mode 100644 index 00000000..032c9e98 --- /dev/null +++ b/templates/content/jquery-openid/images/vidoop.png diff --git a/templates/content/jquery-openid/images/wordpress.png b/templates/content/jquery-openid/images/wordpress.png Binary files differnew file mode 100644 index 00000000..ee29f0cf --- /dev/null +++ b/templates/content/jquery-openid/images/wordpress.png diff --git a/templates/content/jquery-openid/jquery.openid.js b/templates/content/jquery-openid/jquery.openid.js index eec29ab2..763af2c6 100644 --- a/templates/content/jquery-openid/jquery.openid.js +++ b/templates/content/jquery-openid/jquery.openid.js @@ -13,6 +13,7 @@ $.fn.openid = function() { var $end = $this.find('p:has(input[name=openid_username])>span:eq(1)'); //needed for special effects only + var $localfs = $this.find('fieldset:has(input[name=username])'); var $usrfs = $this.find('fieldset:has(input[name=openid_username])'); var $idfs = $this.find('fieldset:has(input[name=openid_url])'); @@ -33,11 +34,23 @@ $.fn.openid = function() { return true; }; + var local = function() { + var $li = $(this); + $('#openid_form .providers li').removeClass('highlight'); + $li.addClass('highlight'); + $usrfs.hide(); + $idfs.hide(); + $localfs.show(); + $this.unbind('submit').submit(submitid); + return false; + }; + var direct = function() { var $li = $(this); - $li.parent().find('li').removeClass('highlight'); + $('#openid_form .providers li').removeClass('highlight'); $li.addClass('highlight'); $usrfs.fadeOut('slow'); + $localfs.fadeOut('slow'); $idfs.fadeOut('slow'); $id.val($this.find("li.highlight span").text()); setTimeout(function(){$('#bsignin').click()},1000); @@ -46,9 +59,10 @@ $.fn.openid = function() { var openid = function() { var $li = $(this); - $li.parent().find('li').removeClass('highlight'); + $('#openid_form .providers li').removeClass('highlight'); $li.addClass('highlight'); $usrfs.hide(); + $localfs.hide(); $idfs.show(); $id.focus(); $this.unbind('submit').submit(submitid); @@ -57,9 +71,10 @@ $.fn.openid = function() { var username = function() { var $li = $(this); - $li.parent().find('li').removeClass('highlight'); + $('#openid_form .providers li').removeClass('highlight'); $li.addClass('highlight'); $idfs.hide(); + $localfs.hide(); $usrfs.show(); $this.find('#enter_your_what').text($li.attr("title")); $front.text($li.find("span").text().split("username")[0]); @@ -69,6 +84,7 @@ $.fn.openid = function() { return false; }; + $this.find('li.local').click(local); $this.find('li.direct').click(direct); $this.find('li.openid').click(openid); $this.find('li.username').click(username); @@ -84,6 +100,9 @@ $.fn.openid = function() { }); $this.find('li span').hide(); $this.find('li').css('line-height', 0).css('cursor', 'pointer'); + $usrfs.hide(); + $idfs.hide(); + $localfs.hide(); $this.find('li:eq(0)').click(); return this; diff --git a/templates/content/jquery-openid/openid.css b/templates/content/jquery-openid/openid.css index e53c1823..88960b56 100644 --- a/templates/content/jquery-openid/openid.css +++ b/templates/content/jquery-openid/openid.css @@ -1,26 +1,49 @@ -fieldset {border-style:none;} +fieldset { border-style:none; } img {border-style:none;} -.logo_box {width:90px;height:40px;background:white;border:1px solid #dddddd;} +.logo_box {display:inline-block;float:left;width:90px;height:40px;background:white;border:1px solid #dddddd;} .openid_box img {margin-top:6px;} .aol_box img {margin-top:6px;} .yahoo_box img {margin-top:13px;} .google_box img {margin-top:6px;} +.local_login_box img {margin-top:2px;margin-left:-3px;} form.openid ul{ margin:0;padding:0;text-align:center; list-style-type:none; display:block;} -form.openid ul li {float:left; padding:4px;} +form.openid ul li {float:left; padding:4px;display:inline-block;} +form.openid ul li div {display:inline-block;} form.openid ul li span {padding:0 1em 0 3px} form.openid ul li.first_tiny_li {clear:left;} form.openid fieldset {clear:both;padding:10px 0px 0px 0px;} form.openid div+fieldset {display:none} -form.openid label {display:block; font-weight:bold; margin-bottom:.5em} +form.openid label {display:block; font-weight:bold;} input[name=openid_username] {width:8em} input[name=openid_identifier] {width:18em} form.openid ul li.highlight { -moz-border-radius:4px; -webkit-border-radius:4px; background-color: #FD6} -form.openid fieldset div {-moz-border-radius:4px; -webkit-border-radius:4px; - background: #DCDCDC; - padding:10px;display:inline-block} +form.openid fieldset div { + -moz-border-radius:4px; + -webkit-border-radius:4px; + background: #DCDCDC; + padding:10px; + display:inline-block; + float:left; +} +form.openid p {margin-bottom:4px;} form.openid fieldset div p {padding:0px;margin:0px;} +form.openid fieldset div p.login {padding:0px;margin:0 0 10px 0;} +form.openid label { + display:inline-block; + font-weight:normal; + width:6em; + text-align:right; +} +#local_login_fs div { + padding-bottom:4px; +} +#local_login_buttons { + text-align:center; + line-height:1.8em; + margin-top:3px; +} /*form.openid input[type='submit'] {margin-left:1em;}*/ #openid_username {background:#ffffa0;} #openid_url {background:#ffffa0;} @@ -31,3 +54,16 @@ background: url(images/openidico.png) no-repeat; #openid_login {float:left; width:30%; margin:2em 1em; text-align:center} #openid_login div{margin-top:0.5em} + +form.openid ul.errorlist { + border: none; + list-style-position:inside; + list-style-type: disc; + margin-bottom:5px; +} +form.openid ul.errorlist li { + text-align: left; + margin: 5px; + float: none; + color:blue; +} 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 90166eec..7562628b 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,28 @@ var i18nZh = { 'redo':'重做', 'enter image url':'<b>输入图片地址</b></p><p>示例:<br />http://www.example.com/image.jpg \"我的截图\"', 'enter url':'<b>输入Web地址</b></p><p>示例:<br />http://www.cnprog.com/ \"我的网站\"</p>"', - '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,11 +83,75 @@ 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 = { + 'insufficient privilege':'privilegio insuficiente', + 'cannot pick own answer as best':'no puede escoger su propia respuesta como la mejor', + 'anonymous users cannot select favorite questions':'usuarios anonimos no pueden seleccionar', + 'please login':'por favor inicie sesión', + 'anonymous users cannot vote':'usuarios anónimos no pueden votar', + '>15 points requried to upvote': '>15 puntos requeridos para votar positivamente', + '>100 points required to downvote':'>100 puntos requeridos para votar negativamente', + 'please see': 'por favor vea', + 'cannot vote for own posts':'no se puede votar por sus propias publicaciones', + 'daily vote cap exhausted':'cuota de votos diarios excedida', + 'cannot revoke old vote':'no puede revocar un voto viejo', + 'please confirm offensive':"por favor confirme ofensiva", + 'anonymous users cannot flag offensive posts':'usuarios anónimos no pueden marcar publicaciones como ofensivas', + 'cannot flag message as offensive twice':'no puede marcar mensaje como ofensivo dos veces', + 'flag offensive cap exhausted':'cuota para marcar ofensivas ha sido excedida', + 'need >15 points to report spam':"necesita >15 puntos para reportar spam", + 'confirm delete':"¿Está seguro que desea borrar esto?", + 'anonymous users cannot delete/undelete':"usuarios anónimos no pueden borrar o recuperar publicaciones", + 'post recovered':"publicación recuperada", + 'post deleted':"publicación borrada。", + 'add comment':'agregar comentario', + 'community karma points':'reputación comunitaria', + 'to comment, need':'para comentar, necesita reputación', + 'delete this comment':'borrar este comentario', + 'hide comments':"ocultar comentarios", + 'add a comment':"agregar comentarios", + 'comments':"comentarios", + 'confirm delete comment':"¿Realmente desea borrar este comentario?", + 'characters':'caracteres faltantes', + 'can write':'tiene ', + 'click to close':'haga click para cerrar', + 'loading...':'cargando...', + 'tags cannot be empty':'las etiquetas no pueden estar vacías', + 'tablimits info':"hasta 5 etiquetas de no mas de 20 caracteres cada una", + 'content cannot be empty':'el contenido no puede estar vacío', + 'content minchars': 'por favor introduzca mas de {0} caracteres', + 'please enter title':'por favor ingrese un título', + 'title minchars':"por favor introduzca al menos {0} caracteres", + 'delete':'borrar', + 'undelete': 'recuperar', + 'bold': 'negrita', + 'italic':'cursiva', + 'link':'enlace', + 'quote':'citar', + 'preformatted text':'texto preformateado', + 'image':'imagen', + 'numbered list':'lista numerada', + 'bulleted list':'lista no numerada', + 'heading':'标题', + 'horizontal bar':'barra horizontal', + 'undo':'deshacer', + 'redo':'rehacer', + 'enter image url':'introduzca la URL de la imagen, por ejemplo:<br />http://www.example.com/image.jpg \"titulo de imagen\"', + 'enter url':'introduzca direcciones web, ejemplo:<br />http://www.cnprog.com/ \"titulo del enlace\"</p>"', + 'upload image':'cargar imagen:', + 'questions/' : 'preguntas/', + 'vote/' : 'votar/' }; var i18n = { 'en':i18nEn, - 'zh_CN':i18nZh + 'zh_CN':i18nZh, + 'es':i18nEs }; var i18n_dict = i18n[i18nLang]; diff --git a/templates/content/js/com.cnprog.post.js b/templates/content/js/com.cnprog.post.js index 546cf101..5d58ff21 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') - + "<a href='/account/signin/?next=/questions/{{QuestionID}}'>" - + $.i18n._('please login') + "</a>"; - var voteAnonymousMessage = $.i18n._('anonymous users cannot vote') - + "<a href='/account/signin/?next=/questions/{{QuestionID}}'>" + + var pleaseLogin = "<a href='" + scriptUrl + $.i18n._("account/") + $.i18n._("signin/") + + "?next=" + scriptUrl + $.i18n._("questions/") + "{{QuestionID}}'>" + $.i18n._('please login') + "</a>"; - var upVoteRequiredScoreMessage = $.i18n._('>15 points requried to upvote') - + $.i18n._('please see') + "<a href='/faq'>faq</a>"; - var downVoteRequiredScoreMessage = $.i18n._('>100 points requried to downvote') - + $.i18n._('please see') + "<a href='/faq'>faq</a>"; + + var pleaseSeeFAQ = $.i18n._('please see') + "<a href='" + scriptUrl + $.i18n._("faq/") + "'>faq</a>"; + + 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') + "<a href='/faq'>faq</a>"; - var voteDenyCancelMessage = $.i18n._('cannot revoke old vote') - + $.i18n._('please see') + "<a href='/faq'>faq</a>"; + 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') - + "<a href='/account/signin/?next=/questions/{{QuestionID}}'>" - + $.i18n._('please login') + "</a>"; - var offensiveTwiceMessage = $.i18n._('cannot flag message as offensive twice') - + $.i18n._('please see') + "<a href='/faq'>faq</a>"; - var offensiveNoFlagsLeftMessage = $.i18n._('flag offensive cap exhausted') - + $.i18n._('please see') + "<a href='/faq'>faq</a>"; - var offensiveNoPermissionMessage = $.i18n._('need >15 points to report spam') - + $.i18n._('please see') + "<a href='/faq'>faq</a>"; + 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", scriptUrl + "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", scriptUrl + "content/images/vote-arrow-up.png"); + $(getQuestionVoteDownButton()).attr("src", scriptUrl + "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", scriptUrl + "content/images/vote-arrow-up.png"); + $(getAnswerVoteDownButton(postId)).attr("src", scriptUrl + "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: "/questions/" + questionId + "/vote/", + url: scriptUrl + $.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", scriptUrl + "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", scriptUrl + "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", scriptUrl + "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", scriptUrl + "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", scriptUrl + "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 = scriptUrl + $.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 = '<form id="' + formId + '" class="post-comments"><div>'; form += '<textarea name="comment" cols="60" rows="5" maxlength="300" onblur="'+ objectType +'Comments.updateTextCounter(this)" '; @@ -490,64 +497,79 @@ function createComments(type) { else { var divId = "comments-rep-needed-" + objectType + '-' + id; if (jDiv.find("#" + divId).length == 0) { - jDiv.append('<div id="' + divId + '" style="color:red">' + jDiv.append('<p id="' + divId + '" class="comment">' + $.i18n._('to comment, need') + ' ' + - + repNeededForComments + ' ' + $.i18n._('community reputation points') - + '<a href="/faq" class="comment-user">' + $.i18n._('please see') + 'faq</a></span>'); + + repNeededForComments + ' ' + $.i18n._('community karma points') + + '<a href="' + $.i18n._('/') + $.i18n._('faq/') + '" class="comment-user">' + + $.i18n._('please see') + 'faq</a></span></p>'); } } }; var getComments = function(id, jDiv) { - appendLoaderImg(id); - $.getJSON("/" + objectType + "s/" + id + "/comments/", function(json) { showComments(id, json); }); + //appendLoaderImg(id); + $.getJSON(scriptUrl + objectType + "s/" + id + "/" + $.i18n._("comments/") + , function(json) { showComments(id, json); }); }; var showComments = function(id, json) { var jDiv = jDivInit(id); - jDiv = jDiv.find("div.comments"); // this div should contain any fetched comments.. - jDiv.find("div[id^='comment-" + objectType + "-'" + "]").remove(); // clean previous calls.. - + //jDiv = jDiv.find("div.comments"); // this div should contain any fetched comments.. + //jDiv.find("div[id^='comment-" + objectType + "-'" + "]").remove(); // clean previous calls.. + jDiv.children().remove(); removeLoader(); - if (json && json.length > 0) { for (var i = 0; i < json.length; i++) renderComment(jDiv, json[i]); - jDiv.children().show(); } }; + var renderDeleteCommentIcon = function(post_id, delete_url){ + if (canPostComments(post_id)){ + var html = ''; + var img = scriptUrl + "content/images/close-small.png"; + var imgHover = scriptUrl + "content/images/close-small-hover.png"; + html += '<img class="delete-icon" onclick="' + objectType + 'Comments.deleteComment($(this), ' + post_id + ', \'' + delete_url + '\')" src="' + img; + html += '" onmouseover="$(this).attr(\'src\', \'' + imgHover + '\')" onmouseout="$(this).attr(\'src\', \'' + img + html += '\')" title="' + $.i18n._('delete this comment') + '" />'; + return html; + } + else{ + return ''; + } + } + // {"Id":6,"PostId":38589,"CreationDate":"an hour ago","Text":"hello there!","UserDisplayName":"Jarrod Dixon","UserUrl":"/users/3/jarrod-dixon","DeleteUrl":null} var renderComment = function(jDiv, json) { - var html = '<div id="comment-' + objectType + "-" + json.id + '" style="display:none">' + json.text; - html += json.user_url ? ' – <a href="' + json.user_url + '"' : '<span'; + var html = '<p id="comment-' + json.id + '" class="comment" style="display:none">' + json.text; + html += json.user_url ? ' - <a href="' + json.user_url + '"' : '<span'; html += ' class="comment-user">' + json.user_display_name + (json.user_url ? '</a>' : '</span>'); - html += ' <span class="comment-date">(' + json.add_date + ')</span>'; + html += ' (' + json.comment_age + ')'; + + if (json.delete_url){ + html += renderDeleteCommentIcon(json.object_id, json.delete_url); + } if (json.delete_url) { - var img = "/content/images/close-small.png"; - var imgHover = "/content/images/close-small-hover.png"; - html += '<img onclick="' + objectType + 'Comments.deleteComment($(this), ' + json.object_id + ', \'' + json.delete_url + '\')" src="' + img; - html += '" onmouseover="$(this).attr(\'src\', \'' + imgHover + '\')" onmouseout="$(this).attr(\'src\', \'' + img - html += '\')" title="' + $.i18n._('delete this comment') + '" />'; } - html += '</div>'; + html += '</p>'; jDiv.append(html); }; var postComment = function(id, formId) { - appendLoaderImg(id); + //appendLoaderImg(id); var formSelector = "#" + formId; var textarea = $(formSelector + " textarea"); + //todo fix url translations!!! $.ajax({ type: "POST", - url: "/" + objectType + "s/" + id + "/comments/", + url: scriptUrl + objectType + "s/" + id + "/" + $.i18n._("comments/"), dataType: "json", data: { comment: textarea.val() }, success: function(json) { @@ -569,18 +591,52 @@ function createComments(type) { init: function() { // Setup "show comments" clicks.. - $("a[id^='comments-link-" + objectType + "-" + "']").unbind("click").click(function() { commentsFactory[objectType].show($(this).attr("id").substr(("comments-link-" + objectType + "-").length)); }); + $("a[id^='comments-link-" + objectType + "-" + "']").unbind("click").click(function() { + commentsFactory[objectType].show($(this).attr("id").substr(("comments-link-" + objectType + "-").length)); + }); + + var cBox = $("[id^='comments-container-" + objectType + "']"); + cBox.each( function(i){ + var post_id = $(this).attr('id').replace('comments-container-' + objectType + '-', ''); + $(this).children().each( + function(i){ + var comment_id = $(this).attr('id').replace('comment-',''); + var delete_url = $.i18n._('/') + objectType + 's/' + post_id + '/' + + $.i18n._('comments/') + comment_id + '/' + $.i18n._('delete/'); + var html = $(this).html(); + var CommentsClass; + if (objectType == 'question'){ + CommentsClass = questionComments; + } + else if (objectType == 'answer') { + CommentsClass = answerComments; + } + var delete_icon = $(this).find('img.delete-icon'); + delete_icon.click(function(){CommentsClass.deleteComment($(this),comment_id,delete_url);}); + delete_icon.unbind('mouseover').bind('mouseover', + function(){ + $(this).attr('src',$.i18n._('/') + 'content/images/close-small-hover.png'); + } + ); + delete_icon.unbind('mouseout').bind('mouseout', + function(){ + $(this).attr('src',$.i18n._('/') + 'content/images/close-small.png'); + } + ); + } + ); + }); }, show: function(id) { var jDiv = jDivInit(id); getComments(id, jDiv); - renderForm(id, jDiv); + renderForm(id); jDiv.show(); - if (canPostComments(id, jDiv)) jDiv.find("textarea").get(0).focus(); - jDiv.siblings("a").unbind("click").click(function(){ - commentsFactory[objectType].hide(id); - }).text($.i18n._('hide comments')); + + var link = $('#comments-link-' + objectType + '-' + id); + if (canPostComments(id)) link.parent().find("textarea").get(0).focus(); + link.remove(); }, hide: function(id) { @@ -596,9 +652,9 @@ function createComments(type) { deleteComment: function(jImg, id, deleteUrl) { if (confirm($.i18n._('confirm delete comment'))) { jImg.hide(); - appendLoaderImg(id); $.post(deleteUrl, { dataNeeded: "forIIS7" }, function(json) { - showComments(id, json); + var par = jImg.parent(); + par.remove(); }, "json"); } }, diff --git a/templates/content/js/com.cnprog.utils.js b/templates/content/js/com.cnprog.utils.js index e271ed78..cf27c8a1 100644 --- a/templates/content/js/com.cnprog.utils.js +++ b/templates/content/js/com.cnprog.utils.js @@ -23,7 +23,8 @@ var notify = function() { }, close: function(doPostback) { if (doPostback) { - $.post("/messages/markread/", { formdata: "required" }); + $.post(scriptUrl + $.i18n._("messages/") + + $.i18n._("markread/"), { formdata: "required" }); } $(".notify").fadeOut("fast"); $("body").css("margin-top", "0"); @@ -35,7 +36,7 @@ var notify = function() { function appendLoader(containerSelector) { $(containerSelector).append('<img class="ajax-loader" ' - +'src="/content/images/indicator.gif" title="' + +'src="' + $.i18n._('/') + 'content/images/indicator.gif" title="' +$.i18n._('loading...') +'" alt="' +$.i18n._('loading...') @@ -103,7 +104,7 @@ var CPValidator = function(){ return { tags: { required: " " + $.i18n._('tags cannot be empty'), - maxlength: " " + $.i18n._('tablimits info'), + maxlength: " " + $.i18n._('tablimits info') }, text: { required: " " + $.i18n._('content cannot be empty'), diff --git a/templates/content/js/jquery.form.js b/templates/content/js/jquery.form.js new file mode 100644 index 00000000..443114fd --- /dev/null +++ b/templates/content/js/jquery.form.js @@ -0,0 +1,654 @@ +/* + * jQuery Form Plugin + * version: 2.33 (22-SEP-2009) + * @requires jQuery v1.2.6 or later + * + * Examples and documentation at: http://malsup.com/jquery/form/ + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ +;(function($) { + +/* + Usage Note: + ----------- + Do not use both ajaxSubmit and ajaxForm on the same form. These + functions are intended to be exclusive. Use ajaxSubmit if you want + to bind your own submit handler to the form. For example, + + $(document).ready(function() { + $('#myForm').bind('submit', function() { + $(this).ajaxSubmit({ + target: '#output' + }); + return false; // <-- important! + }); + }); + + Use ajaxForm when you want the plugin to manage all the event binding + for you. For example, + + $(document).ready(function() { + $('#myForm').ajaxForm({ + target: '#output' + }); + }); + + When using ajaxForm, the ajaxSubmit function will be invoked for you + at the appropriate time. +*/ + +/** + * ajaxSubmit() provides a mechanism for immediately submitting + * an HTML form using AJAX. + */ +$.fn.ajaxSubmit = function(options) { + // fast fail if nothing selected (http://dev.jquery.com/ticket/2752) + if (!this.length) { + log('ajaxSubmit: skipping submit process - no element selected'); + return this; + } + + if (typeof options == 'function') + options = { success: options }; + + var url = $.trim(this.attr('action')); + if (url) { + // clean url (don't include hash vaue) + url = (url.match(/^([^#]+)/)||[])[1]; + } + url = url || window.location.href || ''; + + options = $.extend({ + url: url, + type: this.attr('method') || 'GET' + }, options || {}); + + // hook for manipulating the form data before it is extracted; + // convenient for use with rich editors like tinyMCE or FCKEditor + var veto = {}; + this.trigger('form-pre-serialize', [this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-pre-serialize trigger'); + return this; + } + + // provide opportunity to alter form data before it is serialized + if (options.beforeSerialize && options.beforeSerialize(this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSerialize callback'); + return this; + } + + var a = this.formToArray(options.semantic); + if (options.data) { + options.extraData = options.data; + for (var n in options.data) { + if(options.data[n] instanceof Array) { + for (var k in options.data[n]) + a.push( { name: n, value: options.data[n][k] } ); + } + else + a.push( { name: n, value: options.data[n] } ); + } + } + + // give pre-submit callback an opportunity to abort the submit + if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSubmit callback'); + return this; + } + + // fire vetoable 'validate' event + this.trigger('form-submit-validate', [a, this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-submit-validate trigger'); + return this; + } + + var q = $.param(a); + + if (options.type.toUpperCase() == 'GET') { + options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q; + options.data = null; // data is null for 'get' + } + else + options.data = q; // data is the query string for 'post' + + var $form = this, callbacks = []; + if (options.resetForm) callbacks.push(function() { $form.resetForm(); }); + if (options.clearForm) callbacks.push(function() { $form.clearForm(); }); + + // perform a load on the target only if dataType is not provided + if (!options.dataType && options.target) { + var oldSuccess = options.success || function(){}; + callbacks.push(function(data) { + $(options.target).html(data).each(oldSuccess, arguments); + }); + } + else if (options.success) + callbacks.push(options.success); + + options.success = function(data, status) { + for (var i=0, max=callbacks.length; i < max; i++) + callbacks[i].apply(options, [data, status, $form]); + }; + + // are there files to upload? + var files = $('input:file', this).fieldValue(); + var found = false; + for (var j=0; j < files.length; j++) + if (files[j]) + found = true; + + var multipart = false; +// var mp = 'multipart/form-data'; +// multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp); + + // options.iframe allows user to force iframe mode + if (options.iframe || found || multipart) { + // hack to fix Safari hang (thanks to Tim Molendijk for this) + // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d + if (options.closeKeepAlive) + $.get(options.closeKeepAlive, fileUpload); + else + fileUpload(); + } + else{ + $.ajax(options); + } + + // fire 'notify' event + this.trigger('form-submit-notify', [this, options]); + return this; + + + // private function for handling file uploads (hat tip to YAHOO!) + function fileUpload() { + var form = $form[0]; + + if ($(':input[name=submit]', form).length) { + alert('Error: Form elements must not be named "submit".'); + return; + } + + var opts = $.extend({}, $.ajaxSettings, options); + var s = $.extend(true, {}, $.extend(true, {}, $.ajaxSettings), opts); + + var id = 'jqFormIO' + (new Date().getTime()); + var $io = $('<iframe id="' + id + '" name="' + id + '" src="about:blank" />'); + var io = $io[0]; + + $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' }); + + var xhr = { // mock object + aborted: 0, + responseText: null, + responseXML: null, + status: 0, + statusText: 'n/a', + getAllResponseHeaders: function() {}, + getResponseHeader: function() {}, + setRequestHeader: function() {}, + abort: function() { + this.aborted = 1; + $io.attr('src','about:blank'); // abort op in progress + } + }; + + var g = opts.global; + // trigger ajax global events so that activity/block indicators work like normal + if (g && ! $.active++) $.event.trigger("ajaxStart"); + if (g) $.event.trigger("ajaxSend", [xhr, opts]); + + if (s.beforeSend && s.beforeSend(xhr, s) === false) { + s.global && $.active--; + return; + } + if (xhr.aborted) + return; + + var cbInvoked = 0; + var timedOut = 0; + + // add submitting element to data if we know it + var sub = form.clk; + if (sub) { + var n = sub.name; + if (n && !sub.disabled) { + options.extraData = options.extraData || {}; + options.extraData[n] = sub.value; + if (sub.type == "image") { + options.extraData[name+'.x'] = form.clk_x; + options.extraData[name+'.y'] = form.clk_y; + } + } + } + + // take a breath so that pending repaints get some cpu time before the upload starts + setTimeout(function() { + // make sure form attrs are set + var t = $form.attr('target'), a = $form.attr('action'); + + // update form attrs in IE friendly way + form.setAttribute('target',id); + if (form.getAttribute('method') != 'POST') + form.setAttribute('method', 'POST'); + if (form.getAttribute('action') != opts.url) + form.setAttribute('action', opts.url); + + // ie borks in some cases when setting encoding + if (! options.skipEncodingOverride) { + $form.attr({ + encoding: 'multipart/form-data', + enctype: 'multipart/form-data' + }); + } + + // support timout + if (opts.timeout) + setTimeout(function() { timedOut = true; cb(); }, opts.timeout); + + // add "extra" data to form if provided in options + var extraInputs = []; + try { + if (options.extraData) + for (var n in options.extraData) + extraInputs.push( + $('<input type="hidden" name="'+n+'" value="'+options.extraData[n]+'" />') + .appendTo(form)[0]); + + // add iframe to doc and submit the form + $io.appendTo('body'); + io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false); + form.submit(); + } + finally { + // reset attrs and remove "extra" input elements + form.setAttribute('action',a); + t ? form.setAttribute('target', t) : $form.removeAttr('target'); + $(extraInputs).remove(); + } + }, 10); + + var domCheckCount = 50; + + function cb() { + if (cbInvoked++) return; + + io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false); + + var ok = true; + try { + if (timedOut) throw 'timeout'; + // extract the server response from the iframe + var data, doc; + + doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document; + + var isXml = opts.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc); + log('isXml='+isXml); + if (!isXml && (doc.body == null || doc.body.innerHTML == '')) { + if (--domCheckCount) { + // in some browsers (Opera) the iframe DOM is not always traversable when + // the onload callback fires, so we loop a bit to accommodate + cbInvoked = 0; + setTimeout(cb, 100); + return; + } + log('Could not access iframe DOM after 50 tries.'); + return; + } + + xhr.responseText = doc.body ? doc.body.innerHTML : null; + xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc; + xhr.getResponseHeader = function(header){ + var headers = {'content-type': opts.dataType}; + return headers[header]; + }; + + if (opts.dataType == 'json' || opts.dataType == 'script') { + // see if user embedded response in textarea + var ta = doc.getElementsByTagName('textarea')[0]; + if (ta) + xhr.responseText = ta.value; + else { + // account for browsers injecting pre around json response + var pre = doc.getElementsByTagName('pre')[0]; + if (pre) + xhr.responseText = pre.innerHTML; + } + } + else if (opts.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) { + xhr.responseXML = toXml(xhr.responseText); + } + data = $.httpData(xhr, opts.dataType); + } + catch(e){ + ok = false; + $.handleError(opts, xhr, 'error', e); + } + + // ordering of these callbacks/triggers is odd, but that's how $.ajax does it + if (ok) { + opts.success(data, 'success'); + if (g) $.event.trigger("ajaxSuccess", [xhr, opts]); + } + if (g) $.event.trigger("ajaxComplete", [xhr, opts]); + if (g && ! --$.active) $.event.trigger("ajaxStop"); + if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error'); + + // clean up + setTimeout(function() { + $io.remove(); + xhr.responseXML = null; + }, 100); + }; + + function toXml(s, doc) { + if (window.ActiveXObject) { + doc = new ActiveXObject('Microsoft.XMLDOM'); + doc.async = 'false'; + doc.loadXML(s); + } + else + doc = (new DOMParser()).parseFromString(s, 'text/xml'); + return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null; + }; + }; +}; + +/** + * ajaxForm() provides a mechanism for fully automating form submission. + * + * The advantages of using this method instead of ajaxSubmit() are: + * + * 1: This method will include coordinates for <input type="image" /> elements (if the element + * is used to submit the form). + * 2. This method will include the submit element's name/value data (for the element that was + * used to submit the form). + * 3. This method binds the submit() method to the form for you. + * + * The options argument for ajaxForm works exactly as it does for ajaxSubmit. ajaxForm merely + * passes the options argument along after properly binding events for submit elements and + * the form itself. + */ +$.fn.ajaxForm = function(options) { + return this.ajaxFormUnbind().bind('submit.form-plugin', function() { + $(this).ajaxSubmit(options); + return false; + }).bind('click.form-plugin', function(e) { + var $el = $(e.target); + if (!($el.is(":submit,input:image"))) { + return; + } + var form = this; + form.clk = e.target; + if (e.target.type == 'image') { + if (e.offsetX != undefined) { + form.clk_x = e.offsetX; + form.clk_y = e.offsetY; + } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin + var offset = $el.offset(); + form.clk_x = e.pageX - offset.left; + form.clk_y = e.pageY - offset.top; + } else { + form.clk_x = e.pageX - e.target.offsetLeft; + form.clk_y = e.pageY - e.target.offsetTop; + } + } + // clear form vars + setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 10); + }); +}; + +// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm +$.fn.ajaxFormUnbind = function() { + return this.unbind('submit.form-plugin click.form-plugin'); +}; + +/** + * formToArray() gathers form element data into an array of objects that can + * be passed to any of the following ajax functions: $.get, $.post, or load. + * Each object in the array has both a 'name' and 'value' property. An example of + * an array for a simple login form might be: + * + * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ] + * + * It is this array that is passed to pre-submit callback functions provided to the + * ajaxSubmit() and ajaxForm() methods. + */ +$.fn.formToArray = function(semantic) { + var a = []; + if (this.length == 0) return a; + + var form = this[0]; + var els = semantic ? form.getElementsByTagName('*') : form.elements; + if (!els) return a; + for(var i=0, max=els.length; i < max; i++) { + var el = els[i]; + var n = el.name; + if (!n) continue; + + if (semantic && form.clk && el.type == "image") { + // handle image inputs on the fly when semantic == true + if(!el.disabled && form.clk == el) { + a.push({name: n, value: $(el).val()}); + a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y}); + } + continue; + } + + var v = $.fieldValue(el, true); + if (v && v.constructor == Array) { + for(var j=0, jmax=v.length; j < jmax; j++) + a.push({name: n, value: v[j]}); + } + else if (v !== null && typeof v != 'undefined') + a.push({name: n, value: v}); + } + + if (!semantic && form.clk) { + // input type=='image' are not found in elements array! handle it here + var $input = $(form.clk), input = $input[0], n = input.name; + if (n && !input.disabled && input.type == 'image') { + a.push({name: n, value: $input.val()}); + a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y}); + } + } + return a; +}; + +/** + * Serializes form data into a 'submittable' string. This method will return a string + * in the format: name1=value1&name2=value2 + */ +$.fn.formSerialize = function(semantic) { + //hand off to jQuery.param for proper encoding + return $.param(this.formToArray(semantic)); +}; + +/** + * Serializes all field elements in the jQuery object into a query string. + * This method will return a string in the format: name1=value1&name2=value2 + */ +$.fn.fieldSerialize = function(successful) { + var a = []; + this.each(function() { + var n = this.name; + if (!n) return; + var v = $.fieldValue(this, successful); + if (v && v.constructor == Array) { + for (var i=0,max=v.length; i < max; i++) + a.push({name: n, value: v[i]}); + } + else if (v !== null && typeof v != 'undefined') + a.push({name: this.name, value: v}); + }); + //hand off to jQuery.param for proper encoding + return $.param(a); +}; + +/** + * Returns the value(s) of the element in the matched set. For example, consider the following form: + * + * <form><fieldset> + * <input name="A" type="text" /> + * <input name="A" type="text" /> + * <input name="B" type="checkbox" value="B1" /> + * <input name="B" type="checkbox" value="B2"/> + * <input name="C" type="radio" value="C1" /> + * <input name="C" type="radio" value="C2" /> + * </fieldset></form> + * + * var v = $(':text').fieldValue(); + * // if no values are entered into the text inputs + * v == ['',''] + * // if values entered into the text inputs are 'foo' and 'bar' + * v == ['foo','bar'] + * + * var v = $(':checkbox').fieldValue(); + * // if neither checkbox is checked + * v === undefined + * // if both checkboxes are checked + * v == ['B1', 'B2'] + * + * var v = $(':radio').fieldValue(); + * // if neither radio is checked + * v === undefined + * // if first radio is checked + * v == ['C1'] + * + * The successful argument controls whether or not the field element must be 'successful' + * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls). + * The default value of the successful argument is true. If this value is false the value(s) + * for each element is returned. + * + * Note: This method *always* returns an array. If no valid value can be determined the + * array will be empty, otherwise it will contain one or more values. + */ +$.fn.fieldValue = function(successful) { + for (var val=[], i=0, max=this.length; i < max; i++) { + var el = this[i]; + var v = $.fieldValue(el, successful); + if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) + continue; + v.constructor == Array ? $.merge(val, v) : val.push(v); + } + return val; +}; + +/** + * Returns the value of the field element. + */ +$.fieldValue = function(el, successful) { + var n = el.name, t = el.type, tag = el.tagName.toLowerCase(); + if (typeof successful == 'undefined') successful = true; + + if (successful && (!n || el.disabled || t == 'reset' || t == 'button' || + (t == 'checkbox' || t == 'radio') && !el.checked || + (t == 'submit' || t == 'image') && el.form && el.form.clk != el || + tag == 'select' && el.selectedIndex == -1)) + return null; + + if (tag == 'select') { + var index = el.selectedIndex; + if (index < 0) return null; + var a = [], ops = el.options; + var one = (t == 'select-one'); + var max = (one ? index+1 : ops.length); + for(var i=(one ? index : 0); i < max; i++) { + var op = ops[i]; + if (op.selected) { + var v = op.value; + if (!v) // extra pain for IE... + v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value; + if (one) return v; + a.push(v); + } + } + return a; + } + return el.value; +}; + +/** + * Clears the form data. Takes the following actions on the form's input fields: + * - input text fields will have their 'value' property set to the empty string + * - select elements will have their 'selectedIndex' property set to -1 + * - checkbox and radio inputs will have their 'checked' property set to false + * - inputs of type submit, button, reset, and hidden will *not* be effected + * - button elements will *not* be effected + */ +$.fn.clearForm = function() { + return this.each(function() { + $('input,select,textarea', this).clearFields(); + }); +}; + +/** + * Clears the selected form elements. + */ +$.fn.clearFields = $.fn.clearInputs = function() { + return this.each(function() { + var t = this.type, tag = this.tagName.toLowerCase(); + if (t == 'text' || t == 'password' || tag == 'textarea') + this.value = ''; + else if (t == 'checkbox' || t == 'radio') + this.checked = false; + else if (tag == 'select') + this.selectedIndex = -1; + }); +}; + +/** + * Resets the form data. Causes all form elements to be reset to their original value. + */ +$.fn.resetForm = function() { + return this.each(function() { + // guard against an input with the name of 'reset' + // note that IE reports the reset function as an 'object' + if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) + this.reset(); + }); +}; + +/** + * Enables or disables any matching elements. + */ +$.fn.enable = function(b) { + if (b == undefined) b = true; + return this.each(function() { + this.disabled = !b; + }); +}; + +/** + * Checks/unchecks any matching checkboxes or radio buttons and + * selects/deselects and matching option elements. + */ +$.fn.selected = function(select) { + if (select == undefined) select = true; + return this.each(function() { + var t = this.type; + if (t == 'checkbox' || t == 'radio') + this.checked = select; + else if (this.tagName.toLowerCase() == 'option') { + var $sel = $(this).parent('select'); + if (select && $sel[0] && $sel[0].type == 'select-one') { + // deselect all other options + $sel.find('option').selected(false); + } + this.selected = select; + } + }); +}; + +// helper fn for console logging +// set $.fn.ajaxSubmit.debug to true to enable debug logging +function log() { + if ($.fn.ajaxSubmit.debug && window.console && window.console.log) + window.console.log('[jquery.form] ' + Array.prototype.join.call(arguments,'')); +}; + +})(jQuery); diff --git a/templates/content/js/wmd/wmd.js b/templates/content/js/wmd/wmd.js index 7b611dba..e396d3cb 100644 --- a/templates/content/js/wmd/wmd.js +++ b/templates/content/js/wmd/wmd.js @@ -54,7 +54,7 @@ Attacklab.wmdBase = function(){ var uploadImageHTML ="<div>" + $.i18n._('upload image') + "</div>" + "<input type=\"file\" name=\"file-upload\" id=\"file-upload\" size=\"26\" "+ "onchange=\"return ajaxFileUpload($('#image-url'));\"/><br>" + - "<img id=\"loading\" src=\"/content/images/indicator.gif\" style=\"display:none;\"/>"; + "<img id=\"loading\" src=\"" + scriptUrl + "content/images/indicator.gif\" style=\"display:none;\"/>"; // The default text that appears in the dialog input box when entering // links. diff --git a/templates/content/style/default.css b/templates/content/style/default.css index 0221cc03..2bc185ad 100644 --- a/templates/content/style/default.css +++ b/templates/content/style/default.css @@ -7,9 +7,9 @@ Style sheet for cnprog.com All rights reserved. 2008 CNPROG.COM */ -@import url(/content/style/jquery.autocomplete.css); -@import url(/content/style/openid.css); -@import url(/content/style/prettify.css); +@import url(content/style/jquery.autocomplete.css); +@import url(content/style/openid.css); +@import url(content/style/prettify.css); html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, form, label, table, caption, tbody, tfoot, thead, tr, th, td { @@ -232,19 +232,19 @@ h4 {display:block;font-size:90%; font-family:Verdana;color:#ccc;} } #main-bar .golden{ - background:url(/content/images/bg_title_golden.gif) no-repeat; + background:url(../../images/bg_title_golden.gif) no-repeat; } #main-bar .pink{ - background:url(/content/images/bg_title_red.gif) no-repeat; + background:url(../../images/bg_title_red.gif) no-repeat; } #main-bar .orange{ - background:url(/content/images/bg_title_orange.gif) no-repeat; + background:url(../../images/bg_title_orange.gif) no-repeat; } #main-bar .green{ - background:url(/content/images/bg_title_green.gif) no-repeat; + background:url(../../images/bg_title_green.gif) no-repeat; } #tab{ @@ -906,7 +906,7 @@ h4 {display:block;font-size:90%; font-family:Verdana;color:#ccc;} /* 2 textarea resizer styles */ div.grippie { - background:#EEEEEE url(/content/images/grippie.png) no-repeat scroll center 2px; + background:#EEEEEE url(../../images/grippie.png) no-repeat scroll center 2px; border-color:#DDDDDD; border-style:solid; border-width:0pt 1px 1px; @@ -923,14 +923,14 @@ div.grippie { } .openid-input{ - background:url(/content/images/openid.gif) no-repeat; + background:url(../../images/openid.gif) no-repeat; padding-left:15px; cursor:pointer; } .openid-login-input{ background-position:center left; - background:url(/content/images/openid.gif) no-repeat 0% 50%; + background:url(../../images/openid.gif) no-repeat 0% 50%; padding:5px 5px 5px 15px; cursor:pointer; font-family:Trebuchet MS; @@ -941,7 +941,7 @@ div.grippie { .openid-login-submit{ padding:6px; - #padding:4px; + /*padding:4px;*/ cursor:pointer; font-weight:bold; font-size:120%; @@ -990,7 +990,6 @@ div.grippie { .item-right{ float:left; - } .vote-number{ @@ -1609,7 +1608,9 @@ div.comments { } div.post-comments{ - width:585px + width:585px; + clear:both; + float:left; } form.post-comments textarea { diff --git a/templates/content/style/jquery.autocomplete.css b/templates/content/style/jquery.autocomplete.css index 7c3127d1..3bf2c2d9 100644 --- a/templates/content/style/jquery.autocomplete.css +++ b/templates/content/style/jquery.autocomplete.css @@ -36,7 +36,7 @@ } .ac_loading { - background: white url('/content/images/indicator.gif') right center no-repeat; + background: white url(../../images/indicator.gif) right center no-repeat; } .ac_odd { diff --git a/templates/content/style/style.css b/templates/content/style/style.css index 7ccf1af3..4038e8a1 100644 --- a/templates/content/style/style.css +++ b/templates/content/style/style.css @@ -1,15 +1,16 @@ -@import url(/content/style/jquery.autocomplete.css); -@import url(/content/style/openid.css); -@import url(/content/style/prettify.css); +@import url(jquery.autocomplete.css); +@import url(openid.css); +@import url(prettify.css); /* 公用 */ body{background:#FFF; font-size:12px; line-height:150%; margin:0; padding:0; color:#000; font-family: sans-serif; } div{margin:0 auto; padding:0;} h1,h2,h3,h4,h5,h6,ul,li,dl,dt,dd,form,img,p{margin:0; padding:0; border:none; } -input, select {font-family:Trebuchet MS,"segoe ui",Helvetica,"Microsoft YaHei",宋体,Tahoma,Verdana,MingLiu,PMingLiu,Arial,sans-serif;} +label {vertical-align:middle;} +hr {border:none;border-top: 1px dashed #ccccce;} +input, select {vertical-align:middle;font-family:Trebuchet MS,"segoe ui",Helvetica,"Microsoft YaHei",宋体,Tahoma,Verdana,MingLiu,PMingLiu,Arial,sans-serif;} p{margin-bottom:13px; font-size:13px; line-height:140%;} a {color:#333333; text-decoration:none;} - .badges a {color:#763333;text-decoration:underline;} a:hover {text-decoration:underline;} .block{width:960px; height:auto;} @@ -49,6 +50,12 @@ ol margin-bottom: 1em; padding-left:0px; } +td ul { + vertical-align:middle; +} +li input { + margin: 3px 3px 4px 3px; +} pre { font-family: Consolas, Monaco, Liberation Mono, Lucida Console, Monospace; @@ -97,7 +104,6 @@ blockquote right:0px; height:20px; text-align:right; - color:black; padding:3px; background-color:#ffffff; width:500px; @@ -113,62 +119,115 @@ blockquote #navBar .nav {margin:20px 0px 0px 16px; /*letter-spacing:1px; */ } -#navBar .nav a {color:#333333; background-color:#F9F7ED; - border: 1px solid #aaaaaa; - border-bottom: none; +#navBar .nav a {color:#333333; background-color:#fff0e0; + /*border-left: 1px solid #eeeeec; + border-right: 1px solid #babdb6; + border-top: 1px solid #eeeeec;*/ + border: 1px solid #888888; + border-bottom: none; padding:0px 12px 3px 12px; height:25px; line-height:30px;margin-left:10px; font-size:14px; font-weight:400; text-decoration:none;display: block;float: left;} #navBar .nav a:hover {text-decoration:underline} -#navBar .nav a.on {height:24px;line-height:28px;border:1px solid #d64000; background:#B02B2C; color:#FFF; font-weight:600; text-decoration:none} -#navBar .nav a.special {font-size:15px; color:#B02B2C; font-weight:bold; text-decoration:none; } +#navBar .nav a.on {height:24px;line-height:28px; + border-bottom: 1px solid #a40000; + border-right:1px solid #820000; + border-top:1px solid #d40000; + border-left:1px solid #d40000; + /*background:#A31E39; */ + background:#a40000; + color:#FFF; font-weight:600; text-decoration:none} +#navBar .nav a.special {font-size:14px; color:#B02B2C; font-weight:bold; text-decoration:none; } #navBar .nav a.special:hover {text-decoration:underline;} #navBar .nav div.focus {float:right; padding-right:0px;} /*搜索栏*/ -#searchBar { - background-color:#9db2b1;/*#e9b96e;*/ - padding:5px 0 0 0;} /* #B02B2C */ +#searchBar {width:958px; + background-color:#888a85;/*#e9b96e;*/ + border: 1px solid #aaaaaa; + padding:4px 0 0 0;} /* #B02B2C */ #searchBar .content { } #searchBar .searchInput {font-size:13px; height:18px; width:400px;} #searchBar .searchBtn {font-size:14px; height:26px; width:80px;} -#searchBar .options {padding-top:5px; font-size:100%;color:#EEE; +#searchBar .options {padding:3px 0 3px 0;font-size:100%;color:#EEE; /*letter-spacing:1px;*/ } -#searchBar .options INPUT {margin-left:15px;} +#searchBar .options INPUT {margin:0 3px 0 15px;} #searchBar .options INPUT:hover {cursor:pointer} /*问题列表*/ #listA {float:left; background-color:#FFF;padding:0 0px 0 0px; width:100%;} -#listA .qstA {padding:3px 5px 0 5px; margin:0 0px 10px 0px; background:url(/content/images/quest-bg.gif) repeat-x top;} +#listA .qstA { + position:relative; + padding:3px 5px 5px 10px; + border-top:1px dashed #ccccce; + /*border-left:1px solid #ebebbe; + border-right:1px solid #b4b48e; + border-bottom:1px solid #b4b48e;*/ + background: white;/* #f9f7ed;*/ + margin:10px 0 10px 0; + /*background:url(../images/quest-bg.gif) repeat-x top;*/ +} #listA .qstA thumb {float:left; } -#listA .qstA H2 {font-size:15px; font-weight:800; margin:8px auto;padding:0px;} -#listA .qstA H2 a {color:#663333; } -#listA .qstA .stat {font-size:13px;letter-spacing:1px;float:right;} +#listA .qstA H2 {font-size:14px; font-weight:800; margin:8px auto;padding:0px;} +#listA .qstA H2 a {color:333333/*#2e3436*/;font-size:15px;} +#listA .qstA .stat { + position:absolute; + right:0px; + bottom:5px; + font-size:12px; + /*letter-spacing:1px;*/ + float:right; +} #listA .qstA .stat span {margin-right:5px;} #listA .qstA .stat td {min-width:40px;text-align:center;} -#listA .qstA .stat .num {font-family:arial;color:#905213; font-size:20px; font-weight:800;} -#listA .qstA .stat .unit {color:#777;} -#listA .qstA .from {margin-top:5px; font-size:13px;} -#listA .qstA .from .score {font-family:arial;} -#listA .qstA .date {margin-left:20px; color:#777;} -#listA .qstA .wiki {color:#663333;font-size:12px;} +#listA .qstA .stat .num { + font-family:sans-serif; + color:#a40000; + /*background:#eeeeec; + border: 1px solid #babdb6;*/ + margin:0px; + font-size:17px; + font-weight:800; +} +#listA .qstA table {border-spacing:0px;} +#listA .qstA table td {padding:0px;width:60px;text-align:center;} +#listA .qstA .stat .unit {color:#777777;margin:0px} +#listA .qstA .from {margin-top:5px; font-size:13px;color:#777777;} +#listA .qstA .from .score {font-family:sans-serif;color:#555555;} +#listA .qstA .date {margin-left:10px; color:#777777;} +#listA .qstA .wiki {color:#763333;font-size:12px;} #listA .qstA .from a {} #listA .qstA .from IMG {vertical-align:middle;} #listA .qstA .author {font-weight:400; } -#listA .qstA .author a{ } +#listA .qstA .author a{color:#444444; } #listA .qstA .summary{margin-right:5px;} - +#question-table { + margin-bottom:10px; + /*border-bottom:1px solid #888a85;*/ +} .evenMore {font-size:14px; font-weight:800;} .questions-count{font-size:32px;font-family:sans-serif;font-weight:600;padding:0 0 5px 7px;color:#a40000;} /*内容块*/ -.boxA {background:#777; padding:6px; margin-bottom:8px;} +.boxA {background:#888a85; padding:6px; margin-bottom:8px;border 1px solid #babdb6;} .boxA H3 {font-size:13px; font-weight:800; color:#FFF; margin:0; padding:0; margin-bottom:4px;} .boxA .body {border:1px solid #999; padding:8px; background:#FFF; font-size:13px;} .boxA .more {padding:2px; text-align:right; font-weight:800;} -.boxB {background:#F9F7CD; padding:6px; margin-bottom:8px;} -.boxB H3 {font-size:13px; font-weight:800; color:#000; margin:0; padding:0 0 0 15px; margin-bottom:4px; background:url(/content/images/dot-g.gif) no-repeat left center;} -.boxB .body {border:1px solid #FFFF88; padding:8px; background:#FFF; font-size:13px; line-height:160%;} +.boxB {background:#F9F7ED; padding:6px; margin-bottom:8px;border:solid 1px #aaaaaa;} +.boxB H3 {font-size:13px; font-weight:800; color:#000; margin:0; padding:0 0 0 15px; margin-bottom:4px; background:url(../images/dot-g.gif) no-repeat left center;} +.boxB .body {border:1px solid #aaaaaa; padding:8px; background:#FFF; font-size:13px; line-height:160%;} .boxB .more {padding:1px; text-align:right; font-weight:800;} -.boxC {background:#F5F5F5; padding:6px; margin-bottom:8px;} +.boxC { + background:#babdb6;/*f9f7ed;*/ + padding:10px; + margin-bottom:8px; + border-top:1px solid #eeeeec; + border-left:1px solid #eeeeec; + border-right:1px solid #a9aca5; + border-bottom:1px solid #babdb6; +} +.boxC p.info-box-follow-up-links { + text-align:right; + margin:0; +} /*分页*/ .pager {margin-top:10px; margin-bottom:16px; float:left;} .pagesize {margin-top:10px; margin-bottom:16px; float:right;} @@ -198,7 +257,7 @@ blockquote border:1px solid #fff; background-color:#fff; color:#777; - padding:.3em; + padding:2px 4px 3px 4px; font:bold 100% sans-serif; } @@ -257,29 +316,36 @@ blockquote .tag-number {font-weight:700;font-family:sans-serif;} /*奖牌*/ -a.medal { font-size:14px; line-height:250%; font-weight:800; color:#333; text-decoration:none; background:url(/content/images/medala.gif) no-repeat; border-left:1px solid #EEE; border-top:1px solid #EEE; border-bottom:1px solid #CCC; border-right:1px solid #CCC; padding:4px 12px 4px 6px;} -a:hover.medal {color:#333; text-decoration:none; background:url(/content/images/medala_on.gif) no-repeat; border-left:1px solid #E7E296; border-top:1px solid #E7E296; border-bottom:1px solid #D1CA3D; border-right:1px solid #D1CA3D;} +a.medal { font-size:14px; line-height:250%; font-weight:800; color:#333; text-decoration:none; background:url(../images/medala.gif) no-repeat; border-left:1px solid #EEE; border-top:1px solid #EEE; border-bottom:1px solid #CCC; border-right:1px solid #CCC; padding:4px 12px 4px 6px;} +a:hover.medal {color:#333; text-decoration:none; background:url(../images/medala_on.gif) no-repeat; border-left:1px solid #E7E296; border-top:1px solid #E7E296; border-bottom:1px solid #D1CA3D; border-right:1px solid #D1CA3D;} /*Tab栏*/ -.tabBar{background-color:#FFF;border-bottom: 1px solid #666;height: 30px; width: 100%;clear:both; margin-bottom:3px;} +.tabBar{background-color:#FFF;border-bottom: 1px solid white;height: 30px; width: 100%;clear:both; margin-bottom:3px;} .tabsA {background-color:#FFF;float:right;position:relative;display:block;font-weight:bold;height:20px;} .tabsB {background-color:#FFF;float:left;position:relative;display:block;font-weight:bold;height:20px;} -.tabsA a.on, .tabsA a.on:hover,.tabsB a.on, .tabsB a.on:hover {background: #fff; - color:#333; - border: 1px solid #777; - border-bottom:2px solid #FFF; - height: 25px; +.tabsA a.on, .tabsA a:hover,.tabsB a.on, .tabsB a:hover { + background: #fff; + color:#a40000; + border-top:1px solid #babdb6; + border-left:1px solid #babdb6; + border-right:1px solid #888a85; + border-bottom:1px solid #888a85; + height: 24px; line-height: 26px; margin-top: 3px; padding: 0px 11px 0px 11px;} -.tabsA a {background: #eee; - border: 1px solid #eee; - color: #777; +.tabsA a { + background: #f9f7eb; + border-top:1px solid #eeeeec; + border-left:1px solid #eeeeec; + border-right:1px solid #a9aca5; + border-bottom:1px solid #888a85; + color: #888a85; display: block; float: left; - height: 22px; - line-height: 28px; + height: 20px; + line-height: 22px; margin: 5px 4px 0 0; padding: 0 11px 0 11px; text-decoration: none; @@ -295,19 +361,28 @@ a:hover.medal {color:#333; text-decoration:none; background:url(/content/images padding: 0 11px 0 11px; text-decoration: none; } -.tabsA a:hover, .tabsB a:hover {background: #fff;border: 1px solid #777;border-bottom:3px solid #FFF;} +/*.tabsA a:hover, .tabsB a:hover {background: #fff;border: 1px solid #777;border-bottom:3px solid #FFF;}*/ .headlineA {font-size:13px; border-bottom:1px solid #777; padding-bottom:2px; font-weight:800; margin-bottom:12px; text-align:right; height:30px;} -.headQuestions {float:left; height:23px; line-height:23px; margin:5px 0 0 5px;padding:0px 6px 0px 15px; font-size:15px; font-weight:700; border-bottom:0px solid #777; border-left:0px solid #darkred; background-color:#FFF;background:url(/content/images/dot-list.gif) no-repeat left center;} -.headAnswers {float:left; padding:3px; font-size:18px; font-weight:800; background:url(/content/images/ico_answers.gif) left 2px no-repeat; padding-left:24px;} -.headTags {float:left; padding:3px; font-size:18px; font-weight:800; background:url(/content/images/ico_tags.gif) no-repeat; padding-left:24px;} -.headUsers {float:left; height:23px; line-height:23px; margin:5px 0 0 5px;padding:0px 6px 0px 15px; font-size:15px; font-weight:700; border-bottom:0px solid #777; border-left:0px solid #darkred; background-color:#FFF;background:url(/content/images/dot-list.gif) no-repeat left center;} -.headMedals {float:left; height:23px; line-height:23px; margin:5px 0 0 5px;padding:0px 6px 0px 15px; font-size:15px; font-weight:700; border-bottom:0px solid #777; border-left:0px solid #darkred; background-color:#FFF;background:url(/content/images/dot-list.gif) no-repeat left center;} -.headLogin {float:left; padding:3px; font-size:15px; font-weight:800; background:url(/content/images/ico_login.gif) no-repeat; padding-left:24px;} -.headNormal {text-align:left;padding:3px; font-size:15px; margin-bottom:12px; font-weight:800;border-bottom:1px solid #777;} -.headUser {text-align:left;padding:5px; font-size:20px; letter-spacing:1px;margin-bottom:12px; font-weight:800;border-bottom:1px solid #777;} +.headQuestions {float:left; height:23px; line-height:23px; margin:5px 0 0 5px;padding:0px 6px 0px 15px; font-size:15px; font-weight:700; border-bottom:0px solid #777; border-left:0px solid #darkred; background-color:#FFF;background:url(../images/dot-list.gif) no-repeat left center;} +.headAnswers {float:left; padding:3px; font-size:18px; font-weight:800; background:url(../images/ico_answers.gif) left 2px no-repeat; padding-left:24px;} +.headTags {float:left; padding:3px; font-size:18px; font-weight:800; background:url(../images/ico_tags.gif) no-repeat; padding-left:24px;} +.headUsers {float:left; height:23px; line-height:23px; margin:5px 0 0 5px;padding:0px 6px 0px 15px; font-size:15px; font-weight:700; border-bottom:0px solid #777; border-left:0px solid #darkred; background-color:#FFF;background:url(../images/dot-list.gif) no-repeat left center;} +.headMedals {float:left; height:23px; line-height:23px; margin:5px 0 0 5px;padding:0px 6px 0px 15px; font-size:15px; font-weight:700; border-bottom:0px solid #777; border-left:0px solid #darkred; background-color:#FFF;background:url(../images/dot-list.gif) no-repeat left center;} +.headLogin {float:left; padding:3px; font-size:15px; font-weight:800; background:url(../images/ico_login.gif) no-repeat; padding-left:24px;} +.headNormal { + text-align:left; + padding:3px; + font-size:15px; + margin-bottom:12px; + font-weight:bold; + border-bottom: 1px solid #777; +} +.headUser {text-align:left;padding:5px; font-size:20px; + /*letter-spacing:1px;*/ + margin-bottom:12px; font-weight:800;border-bottom:1px solid #777;} /*RSS订阅*/ #feeds {margin:10px 0; } -#feeds a {background:url(/content/images/feed-icon-small.png) no-repeat 0; padding-left:18px; font-weight:700; font-size:13px; } +#feeds a {background:url(../images/feed-icon-small.png) no-repeat 0; padding-left:18px; font-weight:700; font-size:13px; } /*问题*/ #question {margin-bottom:30px;} @@ -355,9 +430,9 @@ a:hover.medal {color:#333; text-decoration:none; background:url(/content/images font-weight:bold; color:#777; } -.question-img-upvote:hover{background:url(/content/images/vote-arrow-up-on.png)} -.question-img-downvote:hover{background:url(/content/images/vote-arrow-down-on.png)} -.question-img-favorite:hover{background:url(/content/images/vote-favorite-on.png)} +.question-img-upvote:hover{background:url(../images/vote-arrow-up-on.png)} +.question-img-downvote:hover{background:url(../images/vote-arrow-down-on.png)} +.question-img-favorite:hover{background:url(../images/vote-favorite-on.png)} .favorite-number{padding:0px;font-size:100%; font-family:Arial;font-weight:bold;color:#777;} .vote-notification { @@ -405,7 +480,7 @@ a:hover.medal {color:#333; text-decoration:none; background:url(/content/images cursor:pointer; } -.action-link a:hover{ +.action-link: a hover{ background-color:#777; text-decoration:none; color:#fff; @@ -425,8 +500,11 @@ div.comments { } div.post-comments{ + clear:both; + background: url(../images/gray-up-arrow-h18px.png) no-repeat; width:100%; - margin-bottom:10px; + padding-left: 12px; + margin:3px 0 10px 0; } form.post-comments textarea { @@ -442,6 +520,7 @@ form.post-comments input { } span.text-counter { margin-right:20px; + font-size:11px; } span.form-error { @@ -454,13 +533,7 @@ p.form-item { } div.comments-container, div.comments-container-accepted, div.comments-container-owner, div.comments-container-deleted { - display:none; - margin-top:-1px; - padding:0 5px 5px; -} - -div.comments-container, a.comments-link { - background-color:#EEEEEE; + padding:0; } .post-comments a { @@ -470,7 +543,9 @@ div.comments-container, a.comments-link { a.comments-link, a.comments-link-accepted, a.comments-link-owner, a.comments-link-deleted { color:black; - padding:2px; + font-size:11px; + background: #eeeeee; + padding:3px; cursor:pointer; } @@ -482,7 +557,7 @@ a.comments-link, a.comments-link-accepted, a.comments-link-owner, a.comments-lin a.comment-user, a.comment-user:hover { background-color:inherit; - color:#0077CC; + color:blue; padding:0; } @@ -494,6 +569,7 @@ a.comment-user:hover { .answer{ padding-top:10px; width: 100%; + border-bottom:1px solid #ccccce; } .answer-body{ min-height:80px; @@ -556,7 +632,7 @@ a.comment-user:hover { color: #E1E818; } -.answer-img-accept:hover{background:url(/content/images/vote-accepted-on.png)} +.answer-img-accept:hover{background:url(../images/vote-accepted-on.png)} .deleted{ background:#F4E7E7 none repeat scroll 0 0; @@ -575,21 +651,44 @@ a.comment-user:hover { .list-item LI{list-style-type:disc; font-size:13px; line-height:20px; margin-bottom:10px;} /* openid styles */ .form-row{line-height:25px;} +table.form-as-table { + margin-top:5px; +} +table.form-as-table ul { + list-style-type:none; + display: inline; +} +table.form-as-table li { + display: inline; +} +table.form-as-table td { + text-align:right; +} +table.form-as-table th { + text-align:left; + font-weight:normal; +} +/*.form-row li label { + display: inline +}*/ .submit-row{line-height:30px;padding-top:10px;} .errors{line-height:20px;color:red;} -.error{color:red;} +.error{ + color:darkred; + margin:0; + font-size: 10px; +} .error-list li{padding:5px;} -.login{margin-bottom:10px;} .fieldset{ /* border:solid 1px #777;*/ border: none; margin-top:10px; padding:10px; } -.openid-input{background:url(/content/images/openid.gif) no-repeat;padding-left:15px;cursor:pointer;} +.openid-input{background:url(../images/openid.gif) no-repeat;padding-left:15px;cursor:pointer;} .openid-login-input{ background-position:center left; - background:url(/content/images/openid.gif) no-repeat 0% 50%; + background:url(../images/openid.gif) no-repeat 0% 50%; padding:5px 5px 5px 15px; cursor:pointer; font-family:Trebuchet MS; @@ -627,7 +726,7 @@ span.form-error { margin-left:5px; } .title-desc{ - color:#999; + color:#666666; font-size:90%; } @@ -705,6 +804,8 @@ span.form-error { .revision .summary span{ background-color:yellow; + padding-left:3px; + padding-right:3px; display:inline; } .revision h1{ @@ -716,6 +817,7 @@ span.form-error { .revision-mark{ width:200px; text-align:left; + display:inline-block; font-size:90%; overflow:hidden; } @@ -751,7 +853,7 @@ background-color: #97ff97; } .user-details{font-size:13px;} .user-about{background-color:#EEEEEE;height:200px;line-height:20px; overflow:auto;padding:10px;width:90%;} -.user-edit-link {background:url(/content/images/edit.png) no-repeat; padding-left:20px; font-weight:600;} +.user-edit-link {background:url(../images/edit.png) no-repeat; padding-left:20px;} .favorites-count-off { color:#919191; float:left; @@ -815,7 +917,8 @@ width:950;margin-bottom:10px; } .narrow .summary { - width:620px; + width:600px; + display:inline-block; } .narrow .summary h3 { @@ -824,8 +927,8 @@ width:950;margin-bottom:10px; } .narrow .views { - float:left; height:42px; + float:left; margin:0 7px 0 0; /*padding:5px 0 5px 4px;*/ padding: 5px; @@ -851,11 +954,22 @@ width:950;margin-bottom:10px; .narrow .vote-count-post { font-weight:800; + display:block; margin:0; font-size: 190%; color:#555; line-height:20px; } -.narrow .answer-count-post{font-weight:800;margin:0; font-size: 190%; } -.narrow .views-count-post{font-weight:800;margin:0; font-size: 190%;} +.narrow .answer-count-post{ + font-weight:800; + display:block; + margin:0; + font-size: 190%; +} +.narrow .views-count-post{ + font-weight:800; + display:block; + margin:0; + font-size: 190%; +} div.started { color:#999999; float:right; @@ -886,6 +1000,7 @@ div.started .reputation-score { .narrow .tags{float:left;} .answer-summary { + display:block; clear:both; padding:3px; } @@ -1009,7 +1124,7 @@ div.started .reputation-score { a.comment {background:#EEE; color:#993300; padding:4px;} a.permLink {padding:2px;} a.offensive {color:#999;} -ul.bulleta li {background:url(/content/images/bullet_green.gif) no-repeat 0px 2px; padding-left:16px; margin-bottom:4px;} +ul.bulleta li {background:url(../images/bullet_green.gif) no-repeat 0px 2px; padding-left:16px; margin-bottom:4px;} .user {padding:5px; line-height:140%; width:170px;} .user ul {margin:0; list-style-type:none;} .user .thumb{clear:both;float:left; margin-right:4px; display:inline;} @@ -1028,6 +1143,9 @@ ul.bulleta li {background:url(/content/images/bullet_green.gif) no-repeat 0px 2p .message p { margin-bottom:0px; } +.message p.space-above { + margin-top:10px; +} .warning{color:red;} .darkred{color:darkred;} @@ -1036,13 +1154,15 @@ ul.bulleta li {background:url(/content/images/bullet_green.gif) no-repeat 0px 2p /*letter-spacing:1px;*/ background-color:#D4D0C8; height:40px; - border:1px solid #777; + border:1px solid #777777; /* width:100px; */ font-weight:bold; + padding-bottom:4px; font-size:120%;} .submit:hover{text-decoration:underline;} .ask-body{padding-right:10px;} .thousand{color:orange;} + .notify { position: fixed; @@ -1056,11 +1176,13 @@ ul.bulleta li {background:url(/content/images/bullet_green.gif) no-repeat 0px 2p color: #444; background-color: #F4A83D; } + .notify p { margin-top:5px; margin-bottom:5px; font-size:16px; } + #close-notify { position:absolute; @@ -1093,7 +1215,9 @@ ul.bulleta li {background:url(/content/images/bullet_green.gif) no-repeat 0px 2p color:#d64000; font-weight:bold; } - +.grey { + color:#808080; +} .about div { padding:10px 5px 10px 5px; border-top:1px dashed #aaaaaa; @@ -1115,3 +1239,186 @@ ul.bulleta li {background:url(/content/images/bullet_green.gif) no-repeat 0px 2p .highlight { background-color:#FFF8C6; } +.nomargin { + margin:0; +} +.margin-bottom { + margin-bottom: 10px; +} +.inline-block { + display:inline-block; +} +.action-status { + margin:0; + border:none; + text-align:center; + line-height:10px; + font-size:12px; + padding:0; +} +.action-status span { + padding:3px 5px 3px 5px; + background-color:#fff380;/* nice yellow */ + font-weight:normal; + -moz-border-radius: 5px; + -khtml-border-radius: 5px; + -webkit-border-radius: 5px; +} +.tight { + margin:0; + padding:0; +} + +.list-table td { + vertical-align:top; +} + +p.comment { + border-top: 1px dotted #ccccce; + margin:0; + font-size:11px; + color: #444444; + padding:5px 0 5px 0; +} + +.delete-icon { + vertical-align:middle; + padding-left:3px; +} +/* these need to go */ +table.form-as-table .errorlist { + display: block; + margin:0; + padding:0 0 0 5px; + text-align:left; + font-size:10px; + color:darkred; +} +table.form-as-table input { + display: inline; + margin-left: 4px; +} +table.form-as-table th { + vertical-align:bottom; + padding-bottom:4px; +} +.form-row-vertical { + margin-top: 8px; + display: block; +} +.form-row-vertical label { + margin-bottom:3px; + display:block; +} +/* above stuff needs to go */ +.text-align-right { + text-align: center; +} +ul.form-horizontal-rows { + list-style:none; + margin:0; +} +ul.form-horizontal-rows li { + position:relative; + height:40px; +} +ul.form-horizontal-rows label { + display:inline-block; +} +ul.form-horizontal-rows ul.errorlist { + list-style:none; + color:darkred; + font-size:10px; + line-height:10px; + position:absolute; + top:2px; + left:180px; + text-align:left; + margin:0; +} +ul.form-horizontal-rows ul.errorlist li { + height:10px; +} +ul.form-horizontal-rows label { + position:absolute; + left:0px; + bottom:6px; + margin:0px; + line-height: 12px; + font-size: 12px; +} +ul.form-horizontal-rows li input { + position:absolute; + bottom:0px; + left:180px; + margin:0px; +} +#emailpw-form li input { + left:170px; +} +#emailpw-form ul.errorlist { + left:170px; +} +#changepw-form li input { + left:150px; +} +#changepw-form ul.errorlist { + left:150px; +} +.narrow .summary { + float: left; +} +.narrow .summary .question-title { + font-weight: bold; + font-size: 120%; +} +.user-profile-tool-links { + padding-bottom:10px; + font-weight: bold; +} +.post-controls { + float:left; + font-size:11px; + line-height:12px; + min-width:200px; + margin-bottom:5px; +} +#question-controls .tags { + margin:0 0 3px 0; +} +.post-update-info-container { + float: right; + min-width:190px; +} +.post-update-info { + display:inline-block; + float:right; + width:190px; + margin-bottom:5px; +} +.post-update-info p { + font-size:11px; + line-height:15px; + margin:0 0 4px 0; + padding:0; +} +.post-update-info img { + float: left; + width: 32px; + margin: 4px 8px 0 0; +} +.comments-container { + clear:both; +} +.admin { + background-color:#fff380;/* nice yellow */ + border: 1px solid darkred; + padding: 0 5px 0 5px; +} +.admin p { + margin-bottom: 3px; +} +.admin #action_status { + text-align:center; + font-weight:bold; +} |