diff -r 000000000000 -r 40c8f766c9b8 src/cm/media/js/site/c_text_view_comments.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cm/media/js/site/c_text_view_comments.js Mon Nov 23 15:14:29 2009 +0100 @@ -0,0 +1,297 @@ +CY = null; +gPrefs = null; +gLayout = null; +gDb = null; +gIComments = null; +gSync = null; +gGETValues = null; + +gConf = {'iCommentLeftPadding':4, + 'defaultCommentFormat':'markdown', + 'sliderFixedMin':.9, + 'sliderFixedMax':.1, + 'iCommentsInitAlloc':2, + 'defaultPrefs':{'text':{'style':'text-modern-style'}, 'user' : {'name' : '','email' : ''},'general': {'animduration' : '0.4'},'comments': {'threadpad' : '1'},'layout': {'comments_col_width' : '25' /* out of 100 */}} +}; + +//available text styles in c-text-styles.css +//classname(key) : will be added to #textcontainer, name(value) : the name to display in style dropdown choice" +gTextStyles = {'text-modern-style':gettext('modern'), 'text-classic-style':gettext('classic'), 'text-code-style':gettext('code')}; + +YUI( { + base :sv_media_url + "/js/lib/yui/" + c_yui_base + "/build/", + // filter: '{% if CLIENT_DEBUG %}debug{% else %}raw{% endif %}', + // filter :'raw', + timeout :10000 +}).use( + "text-modern-style", + "cookie", + "json", + "overlay", + "io-form", + "async-queue", + "event-mouseenter", + "anim", + "collection", + function(Y) { + CY = Y; + + gPrefs = new Preferences() ; + gPrefs.init() ; + + gLayout = new Layout() ; + gLayout.init() ; + + if (sv_withComments) { + gDb = new Db() ; + gDb.init() ; + + gIComments = new IComments() ; + gIComments.init() ; + } + + gSync = new Sync() ; + gSync.init() ; + + CY.on("domready", onDomReady, this); + + }); + +_reinit = function(filterRes) { + gIComments.hide(); + gDb.initComments(filterRes['commentIds']); + + unpaintAllComments(); + renderCommentScopes(); + + updateFilterResultsCount(filterRes['nbDiscussions'], filterRes['nbComments'], filterRes['nbReplies']); +}; + +reinit = function(filterGETValues) { + var filterRes = gDb.computeFilterResults(filterGETValues); + _reinit(filterRes); +}; + +hideAll = function() { + _reinit({'commentIds':[],'nbDiscussions':0, 'nbComments':0, 'nbReplies':0}); +}; + +updateFilterResultsCount = function(nbDiscussions, nbComments, nbReplies) { + var r = gDb.getCommentsAndRepliesCounts(true); + var nbAllComments = r[0], nbAllReplies = r[1]; + var detailedResults = (nbComments != 0 || nbReplies != 0) && (nbAllComments != nbComments || nbAllReplies != nbReplies) ; + if (gLayout.isInFrame()) { + parent.f_updateFilterCountDetailed(detailedResults) ; + parent.f_updateFilterCountResult(nbDiscussions, nbComments, nbReplies, nbAllComments, nbAllReplies); + } +}; + +updateResetFilterResultsCount = function() { + var counts = gDb.getCommentsAndRepliesCounts(false) + var nbComments = counts[0], nbReplies = counts[1]; + + var nbDiscussions = nbComments; + updateFilterResultsCount(nbDiscussions, nbComments, nbReplies); +}; + +// TODO MOVE +renderCommentScopes = function() { + for (var i = 0 ; i < gDb.comments.length ; i++) { + var comment = gDb.comments[i] ; + paintCommentScope(comment) ; + } +} ; + +onTextMouseUp = function(e) { + if (readyForAction()) { + var selection = getSelectionInfo() ; + if (selection != null) { + updateICommentFormSelection(selection) ; + if (gEditICommentHost != null) { + var modifyScope = CY.get("#"+gEdit['ids']['changeScopeInputId']+" input").get('checked') ; + if (modifyScope) { + gEditICommentHost.scrollIntoView() ; + } + } + } + else { + var node = e.target ; + if (node.hasClass('c-c')) { + var elt = CY.Node.getDOMNode(node) ; + var commentIds = getCommentIdsFromClasses(elt) ; + if (commentIds.length > 0) { + checkForOpenedDialog(null, function() { // will only check for reply + gSync.showComments(commentIds, [e.pageX, e.pageY], false) ; + }) ; + } + } + } +//// FIRST UPDATE SELECTION IF ANY AND SCROLL TO EDITION IF ANY +// if (isICommentFormVisible() || gEditICommentHost != null) { +// CY.log(selection) ; +// updateICommentFormSelection(selection) ; +// +// if (gEditICommentHost != null) { +// var modifyScope = CY.get("#"+gEdit['ids']['changeScopeInputId']+" input").get('checked') ; +// if (modifyScope) { +// gEditICommentHost.scrollIntoView() ; +// didSomething = true ; +// } +// } +// if (isICommentFormVisible()) +// didSomething = true ; +// } +// else { +// checkForOpenedDialog(null, function() { // will only check for reply +// var node = e.target ; +// if (node.hasClass('c-c')) { +// var elt = CY.Node.getDOMNode(node) ; +// var commentIds = getCommentIdsFromClasses(elt) ; +// if (commentIds.length > 0) { +// //hideOverlay(gICommentForm) ; +// // gIComments.hide() ;20080814 moved it to gSync._showComments +// gSync.showComments(commentIds, [e.pageX, e.pageY]) ; +// } +// } +// }) ; +// } + } +} ; + +gLastScrollTime = null ; +checkForAlignement = function () { + var now = (new Date()).getTime() ; + if ((gLastScrollTime != null) && (now - gLastScrollTime) > 200) { + positionICommentForm() ; + gLastScrollTime = null ; + } +}; + +onFrameScroll = function () { + gLastScrollTime = (new Date()).getTime() ; +}; + +browse = function(order, whereto) { + gSync.browse(order, whereto) ; +}; + +initialConnect = function() { + CY.on("mouseup", onTextMouseUp, "#textcontainer"); + gTimer = CY.Lang.later(200, this, checkForAlignement, [], true) ; + CY.on('scroll', onFrameScroll, window, this, true); + CY.on('resize', onFrameScroll, window, this, true); +}; + +// serious tests were made : various browsers + comments on a link. +preventLinksInText = function() { + var interceptLink = function(e) { + e.preventDefault(); + + var a = e.target; + while (a != null && a.get("href") == null) { + a = a.get('parentNode'); + } + + if (a != null && a.get("href") != null) { + window.open(a.get("href")); + } + + } ; + + CY.all("#textcontainer a").on("click", interceptLink); +}; + +onDomReady = function(arg1) { + preventLinksInText(); + var q1 = new CY.AsyncQueue(); // + // doesn't behave like the doc says : + // no timeout -> seems in blocking mode + q1.add( { + fn : function() { + + if (gLayout.isInComentSite()) { + top.v_toInitialSize(); + } + if (sv_withComments) { + instanciateICommentForm(); + } + }, + timeout :5 + }, { + fn : function() { + + gGETValues = CY.JSON.parse(sv_get_params); + + CY.get('#maincontainer').setStyle('display', 'block'); + CY.get('#textcontainer').setStyle('display', 'block'); + + var val = (sv_withComments) ? gPrefs.get('layout','comments_col_width') : 0 ; + var colWidth = sliderValToPx(val) ; + gLayout.setLeftColumnWidth(colWidth) ; + + if (gLayout.isInFrame()) { + parent.f_initFrame(); + parent.f_layoutFrames(); + + if (sv_withComments) { + parent.f_fillTopToolbar() ; + if (hasPerm("can_create_comment"))  + parent.$("#add_comment_btn").removeClass('initially_hidden'); + //parent.enqueueLoadingMsg(); // no more loading message ? TODO + + parent.f_fillFilterTab() ; + parent.f_fillPreferencesTab() ; + +// parent.f_fillBrowseSection() ; + + var firstTimeFilterData = CY.JSON.parse(sv_filter_data); + parent.f_updateFilterData(firstTimeFilterData); + + parent.f_setFilterValue(gGETValues) ; + } + parent.f_fillTextPreferencesTab() ; + } + + if (gLayout.isInComentSite()) + parent.$("#c_fullscreen_btn").show(); + else { + parent.$("#c_fullscreen_btn").hide(); + } + + }, + timeout :5 + }, { + fn : function() { + if (sv_withComments) { + + reinit(gGETValues); + initialConnect(); + } + }, + timeout :5 + }, { + fn : function() { + if (gLayout.isInFrame()) { + parent.f_interfaceUnfreeze() ; + parent.f_removeLoadingMsg(); + } + + // if there is a comment id in the url display it + if ("comment_key" in gGETValues) { + var key = gGETValues["comment_key"] ; + var comment = gDb.getCommentByKey(key) ; + if (comment != null) { + var path = gDb.getPath(comment) ; + var topParentComment = path[path.length - 1] ; + gSync.showSingleComment(topParentComment) ; + } + } + // else show all + else { + gSync.showAllComments() ; + } + } + }); + q1.run(); +}; +