src/cm/media/js/site/c_text_view_comments.js
changeset 0 40c8f766c9b8
child 8 1a495fcc40f9
--- /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();
+};
+