Initial add of defaria.com
[clearscm.git] / defaria.com / blogs / mt.js
1 // The cookie name to use for storing the blog-side comment session cookie.
2 var mtCookieName = "mt_blog_user";
3 var mtCookieDomain = ".defaria.com";
4 var mtCookiePath = "/";
5 var mtCookieTimeout = 14400;
6
7
8 function mtHide(id) {
9     var el = (typeof id == "string") ? document.getElementById(id) : id;
10     if (el) el.style.display = 'none';
11 }
12
13
14 function mtShow(id) {
15     var el = (typeof id == "string") ? document.getElementById(id) : id;
16     if (el) el.style.display = 'block';
17 }
18
19
20 function mtAttachEvent(eventName,func) {
21     var onEventName = 'on' + eventName;
22     var old = window[onEventName];
23     if( typeof old != 'function' )
24         window[onEventName] = func;
25     else {
26         window[onEventName] = function( evt ) {
27             old( evt );
28             return func( evt );
29         };
30     }
31 }
32
33
34 function mtFireEvent(eventName,param) {
35     var fn = window['on' + eventName];
36     if (typeof fn == 'function') return fn(param);
37     return;
38 }
39
40 if(!this.JSON){JSON={};}(function(){function f(n){return n<10?'0'+n:n;}if(typeof Date.prototype.toJSON!=='function'){Date.prototype.toJSON=function(key){return this.getUTCFullYear()+'-'+f(this.getUTCMonth()+1)+'-'+f(this.getUTCDate())+'T'+f(this.getUTCHours())+':'+f(this.getUTCMinutes())+':'+f(this.getUTCSeconds())+'Z';};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf();};}var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==='string'?c:'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);})+'"':'"'+string+'"';}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==='object'&&typeof value.toJSON==='function'){value=value.toJSON(key);}if(typeof rep==='function'){value=rep.call(holder,key,value);}switch(typeof value){case'string':return quote(value);case'number':return isFinite(value)?String(value):'null';case'boolean':case'null':return String(value);case'object':if(!value){return'null';}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==='[object Array]'){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||'null';}v=partial.length===0?'[]':gap?'[\n'+gap+partial.join(',\n'+gap)+'\n'+mind+']':'['+partial.join(',')+']';gap=mind;return v;}if(rep&&typeof rep==='object'){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k==='string'){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}v=partial.length===0?'{}':gap?'{\n'+gap+partial.join(',\n'+gap)+'\n'+mind+'}':'{'+partial.join(',')+'}';gap=mind;return v;}}if(typeof JSON.stringify!=='function'){JSON.stringify=function(value,replacer,space){var i;gap='';indent='';if(typeof space==='number'){for(i=0;i<space;i+=1){indent+=' ';}}else if(typeof space==='string'){indent=space;}rep=replacer;if(replacer&&typeof replacer!=='function'&&(typeof replacer!=='object'||typeof replacer.length!=='number')){throw new Error('JSON.stringify');}return str('',{'':value});};}if(typeof JSON.parse!=='function'){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==='object'){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v;}else{delete value[k];}}}}return reviver.call(holder,key,value);}cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);});}if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+text+')');return typeof reviver==='function'?walk({'':j},''):j;}throw new SyntaxError('JSON.parse');};}}());
41
42 var MT = window.MT || {};
43
44 MT.cons = function () {
45   return {
46     LOG : 'log',
47     WARN : 'warn',
48     DEBUG : 'debug',
49     INFO : 'info',
50     ERR : 'error',
51     JSON : 'json'
52   };
53 }();
54
55
56 MT.core = function (o) {
57   var _debug = false;
58   
59   return {
60     
61     connect : function (url,respType,respHandler) {
62       var xh = mtGetXmlHttp();
63       if (!xh) return false;
64       
65       xh.onreadystatechange = function() {
66         if ( xh.readyState == 4 ) {
67           if ( xh.status && ( xh.status != 200 ) ) {
68             // error - ignore
69           } else {
70             switch (respType) {
71               case 'json':
72                 respHandler(JSON.parse(xh.responseText));
73                 break;
74                 
75               case 'xml':
76                 break;
77                 
78               case 'text':
79                 break;
80             }
81           }
82         }
83       };
84       
85       xh.open('GET',url);
86       xh.send(null);
87     },
88     
89     getEl : function (el) {
90       return MT.util.checkNodeType(el)==='element' ? id : (document.getElementById(el) || false);
91     },
92     
93     addEvent : function (el,type,func,obj) {
94       if(!obj && document.addEventListener) {
95         el.addEventListener(type,func,false);
96       } else if(obj && document.addEventListener) {
97         el.addEventListener(type,function () {
98           func.call(obj,event);
99         },false);
100       } else {
101         if(obj) {
102           el.attachEvent('on' + type,function () {
103             func.call(obj,event);
104           });
105         } else {
106           el.attachEvent('on' + type,function () {          
107             func.call(el,event);
108           });
109         }
110       }
111     },
112     
113     
114     log : function (level,msg) {
115       if(_debug && window.console) {
116         switch(level) {
117           case 'warn':
118           case 'debug':
119           case 'info':
120           case 'error':
121           case 'log':
122             console[level](msg);
123             break;
124             
125           default:
126             return false; 
127         }
128       } else {
129         return false;
130       }
131     }
132   }
133 }();
134
135
136 MT.util = function () {
137   return {
138     toggleVisibility : {
139       show : function () {
140         var i = arguments.length;
141         
142         while(i--) {
143           if(MT.util.checkNodeType(arguments[i])==='element') {
144             arguments[i].style.visibility = 'visible';
145           } else {
146             MT.core.getEl(arguments[i]).style.visibility = 'visible';
147           }
148         }
149       },
150       
151       hide : function () {
152         var i = arguments.length;
153         while(i--) {
154           if(MT.util.checkNodeType(arguments[i])==='element') {
155             arguments[i].style.visibility = 'hidden';
156           } else {
157             MT.core.getEl(arguments[i]).style.visibility = 'hidden';
158           }
159         }
160       }
161     },
162     
163     toggleDisplay : {
164       show : function () {
165         var i = arguments.length;
166         while(i--) {
167           if(MT.util.checkNodeType(arguments[i])==='element') {
168             arguments[i].style.display = '';
169           } else {
170             MT.core.getEl(arguments[i]).style.display = '';
171           }
172         }
173       },
174       
175       hide : function () {
176         var i = arguments.length;
177         while(i--) {
178           if(MT.util.checkNodeType(arguments[i])==='element') {
179             arguments[i].style.display = 'none';
180           } else {
181             MT.core.getEl(arguments[i]).style.display = 'none';
182           }
183         }
184       }
185     },
186     
187     
188     findDefiningParent : function (origin) {
189       if(MT.util.checkNodeType(origin)==='element') {
190         for(var node=origin.parentNode;node.parentNode;node=node.parentNode) {
191           if((node.hasAttribute && node.hasAttribute('id')) || node.getAttribute('id')) {
192             return node;
193           }
194         }
195       }
196       return false;
197     },
198     
199     
200     checkNodeType : function (obj) {
201       if (obj && obj.nodeName){
202         switch (obj.nodeType) {
203           case 1: return 'element';
204           case 3: return (/\S/).test(obj.nodeValue) ? 'textnode' : 'whitespace';
205         }
206       }
207     }
208   }
209 }();
210
211
212 (function () {
213   var M = MT.core,
214       c = MT.cons,
215       u = MT.util,
216       cache,
217       isLoading,
218       direction,
219       currentComments,
220       commentAnchor,
221       commentArrId,
222       commentsPerPage,
223       commentsTotalPages,
224       loadingIcon,
225       pageNum,
226       commentsOffset,
227       totalComments,
228       entryID,
229       commentContentDiv,
230       topNav,
231       nav,
232       currentCommentsSpan,
233       topCurrentCommentsSpan;
234             
235   M.addEvent(window,'load',_init);
236   
237   /**
238    * Initializes the class
239    * 
240    * @return void
241    */
242   function _init () {
243     if(!MT.entryCommentCount) {
244       return;
245     }
246     
247     _initializeVariables();
248     _setCommentOffset(false);
249     _checkForAnchor();
250                 _setCurrentComments();
251     _toggleNavLinks();
252     _initializeEvents();
253   }
254   
255   
256   function _initializeVariables() {
257     cache = {};
258     isLoading = false;
259     commentAnchor = '';
260     commentArrId = '';
261     commentsPerPage = MT.commentsPerPage || 50;
262     currentComments = '';
263     direction = 'ascend';
264     entryID = MT.entryID;
265     totalComments = MT.entryCommentCount;
266     commentsTotalPages = Math.ceil(totalComments / commentsPerPage);
267     pageNum = 1;
268     
269     loadingIcon = "<img title='Loading...' src='http://defaria.com/mt/mt-static/images/indicator.white.gif' alt='Loading' />";
270     
271     commentContentDiv = M.getEl("comments-content");
272     topNav = M.getEl("top-comment-nav");
273     nav = M.getEl("comment-nav");
274     
275     currentCommentsSpan = M.getEl("current-comments");
276     topCurrentCommentsSpan = M.getEl("top-current-comments");
277   }
278   
279   function _initializeEvents() {
280     if (commentsPerPage < totalComments) {
281       M.addEvent(nav,'click',_handleEvents);
282       M.addEvent(topNav,'click',_handleEvents);
283     }
284   }
285   
286   
287   function _checkForAnchor() {
288     var found = String(window.location.hash).match( /comment-(\d{1,6})/ );
289                 
290                 if (found) {
291                   M.log(c.DEBUG,found);
292                         if (!Object.prototype.hasOwnProperty.call(M.getEl(found[0]), 'className')) {
293                                 if (_findIdMatch(found[1])) {
294                         pageNum = Math.floor(commentArrId / commentsPerPage) + 1;
295                         M.log(c.DEBUG,'Comment Array Id: ' + commentArrId);
296                         M.log(c.DEBUG,'Comments Per Page: ' + commentsPerPage);
297                         M.log(c.DEBUG,'Page Number: ' + pageNum);
298                         M.log(c.DEBUG,'Comment Offset: ' + _getCommentOffset());
299                         _updateComments();
300                 }
301                         }
302                 }
303   }
304   
305   
306   function _setCommentOffset() {
307     commentsOffset = commentsPerPage * (pageNum-1);
308   }
309   
310   
311   function _getCommentOffset() {
312     return commentsOffset;
313   }
314   
315   
316   function _handleEvents (e) {
317     var origin = e.target || e.srcElement,
318         parentId;
319         
320     // stupid IE
321     origin = origin.id && M.getEl(origin.id) || false;
322
323     if(origin) {
324       parentId = u.checkNodeType(origin.parentNode)==='element' && origin.parentNode.getAttribute('id') && origin.parentNode.id;
325     } else {
326       return false;
327     }
328     
329     switch(origin.nodeName) {
330       case 'A':
331         switch (parentId) {
332           case 'prev-comments':
333           case 'top-prev-comments':
334             if(e.preventDefault) {
335               e.preventDefault();
336             } else {
337               e.returnValue =   false;
338             }
339             if(!isLoading) {
340               _previousPage();
341             }
342             break;
343           case 'next-comments':
344           case 'top-next-comments':
345             if(e.preventDefault) {
346               e.preventDefault();
347             } else {
348               e.returnValue =   false;
349             }
350             if(!isLoading) {
351               _nextPage();
352             }
353             break;
354         }
355         break;
356     }
357   }
358   
359   
360   function _toggleNavLinks () {
361     M.log(c.DEBUG,M.getEl('top-prev-comments'));
362     if(pageNum <= commentsTotalPages && pageNum !== 1) {
363       u.toggleVisibility.show('prev-comments');
364       u.toggleVisibility.show('top-prev-comments');
365     }
366     
367     if(pageNum >= 1 && pageNum !== commentsTotalPages) {
368       u.toggleVisibility.show('next-comments');
369       u.toggleVisibility.show('top-next-comments');
370     }
371     
372     if(pageNum===1 || nav.style.visibility==='hidden') {
373       u.toggleVisibility.hide('prev-comments');
374       u.toggleVisibility.hide('top-prev-comments');
375     }
376     
377     if(pageNum===commentsTotalPages || nav.style.visibility==='hidden') {
378       u.toggleVisibility.hide('next-comments');
379       u.toggleVisibility.hide('top-next-comments');
380     }
381   }
382   
383   
384   function _nextPage () {
385     if(pageNum < commentsTotalPages) {
386       pageNum++;
387       _updateComments();
388     }
389   }
390   
391   
392   function _previousPage() {
393     if(pageNum > 1) {
394       pageNum--;
395       _updateComments();
396     }
397   }
398   
399   
400   function _findIdMatch (id) {
401     var len = MT.commentIds.length;
402     
403         while (len--) {
404                 if (MT.commentIds[len] == id) {
405                         commentAnchor = "comment-" + id;
406                         commentArrId = len;
407                         return true;
408                 }
409         }
410         
411         return false;
412   }
413   
414   
415   function _setCurrentComments() {
416     var commentsOnPage = pageNum != commentsTotalPages ? commentsOffset + commentsPerPage : totalComments;
417     
418     _setCurrentCommentsContent([commentsOffset+1," - ",commentsOnPage].join(''));
419   }
420   
421   
422   function _setCurrentCommentsContent(currentCommentsHTML) {
423     currentCommentsSpan.innerHTML = currentCommentsHTML;
424     topCurrentCommentsSpan.innerHTML = currentCommentsHTML;
425   }
426   
427   
428   function _setCommentContent(commentHTML) {
429     commentContentDiv.innerHTML = commentHTML;
430   }
431   
432   
433   function _updateComments() {
434     var comments, jsonUrl, cacheKey, offset;
435     isLoading = true;
436     _setCurrentCommentsContent(loadingIcon);
437     _setCommentOffset();
438
439     offset   = _getCommentOffset();
440     cacheKey = [direction, entryID, commentsPerPage, offset]
441         .join('-')
442         .replace(/[^a-zA-Z0-9-]/g, '');
443     jsonUrl  = [
444         "http://defaria.com/mt/mt-comments.cgi?__mode=comment_listing&direction=",
445         direction,
446         "&entry_id=",
447         entryID,
448         "&limit=",
449         commentsPerPage,
450         "&offset=",
451         offset,
452         "&cacheKey=",
453         cacheKey,
454         "&jsonp=mtUpdateCommentsCallback",
455         "&ts=",
456         new Date().getTime()
457       ].join('');
458         
459         if (!commentAnchor) {
460       commentAnchor = "comments-content";
461     }
462
463     if(cache.hasOwnProperty(cacheKey)) {
464       _refreshComments(cache[cacheKey]);
465       isLoading = false;
466     } else {
467       var script = document.createElement('script');
468       script.src = jsonUrl;
469       (document.getElementsByTagName('head'))[0].appendChild(script);
470     }
471   }
472
473   window['mtUpdateCommentsCallback'] = function(json) {
474     cache[json.cacheKey] = json.comments;
475     _refreshComments(json.comments);
476     isLoading = false;
477   }
478   
479   
480   function _refreshComments(commentData) {
481     _setCommentContent(commentData);
482     _setCurrentComments();
483     window.location.hash = 'reset';
484     window.location.hash = commentAnchor;
485     _toggleNavLinks();
486   }
487 })();
488
489
490 function mtRelativeDate(ts, fds) {
491     var now = new Date();
492     var ref = ts;
493     var delta = Math.floor((now.getTime() - ref.getTime()) / 1000);
494
495     var str;
496     if (delta < 60) {
497         str = 'moments ago';
498     } else if (delta <= 86400) {
499         // less than 1 day
500         var hours = Math.floor(delta / 3600);
501         var min = Math.floor((delta % 3600) / 60);
502         if (hours == 1)
503             str = '1 hour ago';
504         else if (hours > 1)
505             str = '2 hours ago'.replace(/2/, hours);
506         else if (min == 1)
507             str = '1 minute ago';
508         else
509             str = '2 minutes ago'.replace(/2/, min);
510     } else if (delta <= 604800) {
511         // less than 1 week
512         var days = Math.floor(delta / 86400);
513         var hours = Math.floor((delta % 86400) / 3600);
514         if (days == 1)
515             str = '1 day ago';
516         else if (days > 1)
517             str = '2 days ago'.replace(/2/, days);
518         else if (hours == 1)
519             str = '1 hour ago';
520         else
521             str = '2 hours ago'.replace(/2/, hours);
522     }
523     return str ? str : fds;
524 }
525
526
527 function mtEditLink(entry_id, author_id) {
528     
529     
530 }
531
532
533 function mtCommentFormOnFocus() {
534     // if CAPTCHA is enabled, this causes the captcha image to be
535     // displayed if it hasn't been already.
536     mtShowCaptcha();
537 }
538
539
540 var mtCaptchaVisible = false;
541 function mtShowCaptcha() {
542     var u = mtGetUser();
543     if ( u && u.is_authenticated ) return;
544     if (mtCaptchaVisible) return;
545     var div = document.getElementById('comments-open-captcha');
546     if (div) {
547         div.innerHTML = '';
548         mtCaptchaVisible = true;
549     }
550 }
551
552
553
554 var is_preview;
555 var user;
556
557 function mtSetUser(u) {
558     if (u) {
559         // persist this
560         user = u;
561         mtSaveUser();
562         // sync up user greeting
563         mtFireEvent('usersignin');
564     }
565 }
566
567
568 function mtEscapeJS(s) {
569     s = s.replace(/'/g, "&apos;");
570     return s;
571 }
572
573
574 function mtUnescapeJS(s) {
575     s = s.replace(/&apos;/g, "'");
576     return s;
577 }
578
579
580 function mtBakeUserCookie(u) {
581     var str = "";
582     if (u.name) str += "name:'" + mtEscapeJS(u.name) + "';";
583     if (u.url) str += "url:'" + mtEscapeJS(u.url) + "';";
584     if (u.email) str += "email:'" + mtEscapeJS(u.email) + "';";
585     if (u.is_authenticated) str += "is_authenticated:'1';";
586     if (u.profile) str += "profile:'" + mtEscapeJS(u.profile) + "';";
587     if (u.userpic) str += "userpic:'" + mtEscapeJS(u.userpic) + "';";
588     if (u.sid) str += "sid:'" + mtEscapeJS(u.sid) + "';";
589     str += "is_trusted:'" + (u.is_trusted ? "1" : "0") + "';";
590     str += "is_author:'" + (u.is_author ? "1" : "0") + "';";
591     str += "is_banned:'" + (u.is_banned ? "1" : "0") + "';";
592     str += "can_post:'" + (u.can_post ? "1" : "0") + "';";
593     str += "can_comment:'" + (u.can_comment ? "1" : "0") + "';";
594     str = str.replace(/;$/, '');
595     return str;
596 }
597
598
599 function mtUnbakeUserCookie(s) {
600     if (!s) return;
601
602     var u = {};
603     var m;
604     while (m = s.match(/^((name|url|email|is_authenticated|profile|userpic|sid|is_trusted|is_author|is_banned|can_post|can_comment):'([^']+?)';?)/)) {
605         s = s.substring(m[1].length);
606         if (m[2].match(/^(is|can)_/)) // boolean fields
607             u[m[2]] = m[3] == '1' ? true : false;
608         else
609             u[m[2]] = mtUnescapeJS(m[3]);
610     }
611     if (u.is_authenticated) {
612         u.is_anonymous = false;
613     } else {
614         u.is_anonymous = true;
615         u.can_post = false;
616         u.is_author = false;
617         u.is_banned = false;
618         u.is_trusted = false;
619     }
620     return u;
621 }
622
623
624 function mtGetUser() {
625     if (!user) {
626         var cookie = mtGetCookie(mtCookieName);
627         if (!cookie) return;
628         user = mtUnbakeUserCookie(cookie);
629         if (! user) {
630             user = {};
631             user.is_anonymous = true;
632             user.can_post = false;
633             user.is_author = false;
634             user.is_banned = false;
635             user.is_trusted = false;
636         }
637     }
638     return user;
639 }
640
641
642 var mtFetchedUser = false;
643
644 function mtFetchUser(cb) {
645     if (!cb) cb = 'mtSetUser';
646     if ( ( cb == 'mtSetUser' ) && mtGetUser() ) {
647         var url = document.URL;
648         url = url.replace(/#.+$/, '');
649         url += '#comments-open';
650         location.href = url;
651     } else {
652         // we aren't using AJAX for this, since we may have to request
653         // from a different domain. JSONP to the rescue.
654         mtFetchedUser = true;
655         var u = mtGetUser();
656         var script = document.createElement('script');
657         var ts = new Date().getTime();
658         script.src = 'http://defaria.com/mt/mt-comments.cgi?__mode=userinfo&blog_id=6&jsonp=' + cb + '&ts=' + ts + '&sid=' + u.sid;
659         (document.getElementsByTagName('head'))[0].appendChild(script);
660     }
661 }
662
663 function mtVerifySession(cb) {
664     if (!cb) return;
665     var script = document.createElement('script');
666     var ts = new Date().getTime();
667     var u = mtGetUser();
668     script.src = 'http://defaria.com/mt/mt-comments.cgi?__mode=verify_session&blog_id=6&jsonp=' + cb + '&ts=' + ts + '&sid=' + u.sid;
669     (document.getElementsByTagName('head'))[0].appendChild(script);
670 }
671
672
673
674 function mtRememberMeOnClick(b) {
675     if (!b.checked)
676         mtClearUser(b.form);
677     return true;
678 }
679
680
681
682 var mtRequestSubmitted = false;
683 function mtCommentOnSubmit(f) {
684     if (!mtRequestSubmitted) {
685         mtRequestSubmitted = true;
686
687         if (f.armor)
688             f.armor.value = '5666f8744488c17a9eca805ca93b7efb61ef9891';
689         if (f.bakecookie && f.bakecookie.checked)
690             mtSaveUser(f);
691
692         // disable submit buttons
693         if (f.preview_button) f.preview_button.disabled = true;
694         if (f.post) f.post.disabled = true;
695
696         var u = mtGetUser();
697         if ( !is_preview && ( u && u.is_authenticated ) ) {
698             // validate session; then submit
699             mtVerifySession('mtCommentSessionVerify');
700             return false;
701         }
702
703         return true;
704     }
705     return false;
706 }
707
708 function mtCommentSessionVerify(app_user) {
709     var f = document['comments_form'];
710     if ( app_user && app_user.verified ) {
711         f.submit();
712     } else {
713         alert('Your session has expired. Please sign in again to comment.');
714         mtClearUser();
715         mtFireEvent('usersignin');
716
717         mtShow('comments-form');
718         mtHide('comments-open-footer');
719
720     }
721 }
722
723 function mtUserOnLoad() {
724     var u = mtGetUser();
725
726     // if the user is authenticated, hide the 'anonymous' fields
727     // and any captcha input if already shown
728     if ( document.getElementById('comments-form')) {
729         if ( u && u.is_authenticated ) {
730             mtShow('comments-form');
731             mtHide('comments-open-data');
732             if (mtCaptchaVisible)
733                 mtHide('comments-open-captcha');
734         } else {
735
736             mtHide('comments-form');
737
738         }
739         if ( u && u.is_banned )
740             mtHide('comments-form');
741
742         // if we're previewing a comment, make sure the captcha
743         // field is visible
744         if (is_preview)
745             mtShowCaptcha();
746         else
747             mtShowGreeting();
748
749         // populate anonymous comment fields if user is cookied as anonymous
750         var cf = document['comments_form'];
751         if (cf) {
752             if (u && u.is_anonymous) {
753                 if (u.email) cf.email.value = u.email;
754                 if (u.name) cf.author.value = u.name;
755                 if (u.url) cf.url.value = u.url;
756                 if (cf.bakecookie)
757                     cf.bakecookie.checked = u.name || u.email;
758             } else {
759                 if (u && u.sid && cf.sid)
760                     cf.sid.value = u.sid;
761             }
762             if (cf.post && cf.post.disabled)
763                 cf.post.disabled = false;
764             if (cf.preview_button && cf.preview_button.disabled)
765                 cf.preview_button.disabled = false;
766             mtRequestSubmitted = false;
767         }
768     }
769 }
770
771
772
773
774 function mtEntryOnLoad() {
775     var cf = document['comments_form'];
776     if (cf && cf.preview) cf.preview.value = '';
777     
778     mtHide('comments-open');
779     mtFireEvent('usersignin');
780 }
781
782 function mtEntryOnUnload() {
783     if (mtRequestSubmitted) {
784         var cf = document['comments_form'];
785         if (cf) {
786             if (cf.post && cf.post.disabled)
787                 cf.post.disabled = false;
788             if (cf.preview_button && cf.preview_button.disabled)
789                 cf.preview_button.disabled = false;
790         }
791         mtRequestSubmitted = false;
792     }
793     return true;
794 }
795
796 mtAttachEvent('usersignin', mtUserOnLoad);
797
798
799
800 function mtSignIn() {
801     var doc_url = document.URL;
802     doc_url = doc_url.replace(/#.+/, '');
803     var url = 'http://defaria.com/mt/mt-comments.cgi?__mode=login&blog_id=6';
804     if (is_preview) {
805         if ( document['comments_form'] ) {
806             var entry_id = document['comments_form'].entry_id.value;
807             url += '&entry_id=' + entry_id;
808         } else {
809             url += '&return_url=http%3A%2F%2Fdefaria.com%2F';
810         }
811     } else {
812         url += '&return_url=' + encodeURIComponent(doc_url);
813     }
814     mtClearUser();
815     location.href = url;
816 }
817
818 function mtSignInOnClick(sign_in_element) {
819     var el;
820     if (sign_in_element) {
821         // display throbber
822         el = document.getElementById(sign_in_element);
823         if (!el)  // legacy MT 4.x element id
824             el = document.getElementById('comment-form-external-auth');
825     }
826     if (el)
827         el.innerHTML = 'Signing in... <span class="status-indicator">&nbsp;</span>';
828
829     mtClearUser(); // clear any 'anonymous' user cookie to allow sign in
830     mtSignIn();
831     return false;
832 }
833
834 function mtSetUserOrLogin(u) {
835     if (u && u.is_authenticated) {
836         mtSetUser(u);
837     } else {
838         // user really isn't logged in; so let's do this!
839         mtSignIn();
840     }
841 }
842
843
844 function mtSignOut(entry_id) {
845     mtClearUser();
846     var doc_url = document.URL;
847     doc_url = doc_url.replace(/#.+/, '');
848     var url = 'http://defaria.com/mt/mt-comments.cgi?__mode=handle_sign_in&static=0&logout=1&blog_id=6';
849     if (is_preview) {
850         if ( document['comments_form'] ) {
851             var entry_id = document['comments_form'].entry_id.value;
852             url += '&entry_id=' + entry_id;
853         } else {
854             url += '&return_url=http%3A%2F%2Fdefaria.com%2F';
855         }
856     } else {
857         url += '&return_url=' + encodeURIComponent(doc_url);
858     }
859     location.href = url;
860 }
861
862
863 function mtSignOutOnClick() {
864     mtSignOut();
865     return false;
866 }
867
868
869
870 function mtShowGreeting() {
871
872     var reg_reqd = true;
873
874     var cf = document['comments_form'];
875     if (!cf) return;
876
877     var el = document.getElementById('comment-greeting');
878     if (!el)  // legacy MT 4.x element id
879         el = document.getElementById('comment-form-external-auth');
880     if (!el) return;
881
882     var eid = cf.entry_id;
883     var entry_id;
884     if (eid) entry_id = eid.value;
885
886     var phrase;
887     var u = mtGetUser();
888
889     if ( u && u.is_authenticated ) {
890         if ( u.is_banned ) {
891             phrase = 'You do not have permission to comment on this blog. (\<a href=\"javas\cript:void(0);\" onclick=\"return mtSignOutOnClick();\"\>sign out\<\/a\>)';
892         } else {
893             var user_link;
894             if ( u.is_author ) {
895                 user_link = '<a href="http://defaria.com/mt/mt-comments.cgi?__mode=edit_profile&blog_id=6&return_url=' + encodeURIComponent( location.href );
896                 user_link += '">' + u.name + '</a>';
897             } else {
898                 // registered user, but not a user with posting rights
899                 if (u.url)
900                     user_link = '<a href="' + u.url + '">' + u.name + '</a>';
901                 else
902                     user_link = u.name;
903             }
904             // TBD: supplement phrase with userpic if one is available.
905             phrase = 'Thanks for signing in, __NAME__. (\<a href=\"javas\cript:void(0)\" onclick=\"return mtSignOutOnClick();\"\>sign out\<\/a\>)';
906             phrase = phrase.replace(/__NAME__/, user_link);
907         }
908     } else {
909         if (reg_reqd) {
910             phrase = '\<a href=\"javas\cript:void(0)\" onclick=\"return mtSignInOnClick(\'comment-greeting\')\"\>Sign in\<\/a\> to comment.';
911         } else {
912             phrase = '\<a href=\"javas\cript:void(0)\" onclick=\"return mtSignInOnClick(\'comment-greeting\')\"\>Sign in\<\/a\> to comment, or comment anonymously.';
913         }
914     }
915     el.innerHTML = phrase;
916
917 }
918
919
920
921 function mtReplyCommentOnClick(parent_id, author) {
922     mtShow('comment-form-reply');
923
924     var checkbox = document.getElementById('comment-reply');
925     var label = document.getElementById('comment-reply-label');
926     var text = document.getElementById('comment-text');
927
928     // Populate label with new values
929     var reply_text = 'Replying to \<a href=\"#comment-__PARENT__\" onclick=\"location.href=this.href; return false\"\>comment from __AUTHOR__\<\/a\>';
930     reply_text = reply_text.replace(/__PARENT__/, parent_id);
931     reply_text = reply_text.replace(/__AUTHOR__/, author);
932     label.innerHTML = reply_text;
933
934     checkbox.value = parent_id; 
935     checkbox.checked = true;
936     try {
937         // text field may be hidden
938         text.focus();
939     } catch(e) {
940     }
941
942     mtSetCommentParentID();
943 }
944
945
946 function mtSetCommentParentID() {
947     var checkbox = document.getElementById('comment-reply');
948     var parent_id_field = document.getElementById('comment-parent-id');
949     if (!checkbox || !parent_id_field) return;
950
951     var pid = 0;
952     if (checkbox.checked == true)
953         pid = checkbox.value;
954     parent_id_field.value = pid;
955 }
956
957
958 function mtSaveUser(f) {
959     // We can't reliably store the user cookie during a preview.
960     if (is_preview) return;
961
962     var u = mtGetUser();
963
964     if (f && (!u || u.is_anonymous)) {
965         if ( !u ) {
966             u = {};
967             u.is_authenticated = false;
968             u.can_comment = true;
969             u.is_author = false;
970             u.is_banned = false;
971             u.is_anonymous = true;
972             u.is_trusted = false;
973         }
974         if (f.author != undefined) u.name = f.author.value;
975         if (f.email != undefined) u.email = f.email.value;
976         if (f.url != undefined) u.url = f.url.value;
977     }
978
979     if (!u) return;
980
981     var cache_period = mtCookieTimeout * 1000;
982
983     // cache anonymous user info for a long period if the
984     // user has requested to be remembered
985     if (u.is_anonymous && f && f.bakecookie && f.bakecookie.checked)
986         cache_period = 365 * 24 * 60 * 60 * 1000;
987
988     var now = new Date();
989     mtFixDate(now);
990     now.setTime(now.getTime() + cache_period);
991
992     var cmtcookie = mtBakeUserCookie(u);
993     mtSetCookie(mtCookieName, cmtcookie, now, mtCookiePath, mtCookieDomain,
994         location.protocol == 'https:');
995 }
996
997
998 function mtClearUser() {
999     user = null;
1000     mtDeleteCookie(mtCookieName, mtCookiePath, mtCookieDomain,
1001         location.protocol == 'https:');
1002 }
1003
1004
1005 function mtSetCookie(name, value, expires, path, domain, secure) {
1006     if (domain && ( domain.match(/^\.?localhost$/) || domain.match(/^[0-9\.]+$/) ))
1007         domain = null;
1008     var curCookie = name + "=" + encodeURIComponent(value) +
1009         (expires ? "; expires=" + expires.toGMTString() : "") +
1010         (path ? "; path=" + path : "") +
1011         (domain ? "; domain=" + domain : "") +
1012         (secure ? "; secure" : "");
1013     document.cookie = curCookie;
1014 }
1015
1016
1017 function mtGetCookie(name) {
1018     var prefix = name + '=';
1019     var c = document.cookie;
1020     var cookieStartIndex = c.indexOf(prefix);
1021     if (cookieStartIndex == -1)
1022         return '';
1023     var cookieEndIndex = c.indexOf(";", cookieStartIndex + prefix.length);
1024     if (cookieEndIndex == -1)
1025         cookieEndIndex = c.length;
1026     var this_cookie = c.substring(cookieStartIndex + prefix.length, cookieEndIndex);
1027     if ( this_cookie.match(/\%u/i) ) {
1028         return '';
1029     }
1030     return decodeURIComponent( this_cookie );
1031 }
1032
1033
1034 function mtDeleteCookie(name, path, domain, secure) {
1035     if (mtGetCookie(name)) {
1036         if (domain && domain.match(/^\.?localhost$/))
1037             domain = null;
1038         document.cookie = name + "=" +
1039             (path ? "; path=" + path : "") +
1040             (domain ? "; domain=" + domain : "") +
1041             (secure ? "; secure" : "") +
1042             "; expires=Thu, 01-Jan-70 00:00:01 GMT";
1043     }
1044 }
1045
1046 function mtFixDate(date) {
1047     var skew = (new Date(0)).getTime();
1048     if (skew > 0)
1049         date.setTime(date.getTime() - skew);
1050 }
1051
1052
1053 function mtGetXmlHttp() {
1054     if ( !window.XMLHttpRequest ) {
1055         window.XMLHttpRequest = function() {
1056             var types = [
1057                 "Microsoft.XMLHTTP",
1058                 "MSXML2.XMLHTTP.5.0",
1059                 "MSXML2.XMLHTTP.4.0",
1060                 "MSXML2.XMLHTTP.3.0",
1061                 "MSXML2.XMLHTTP"
1062             ];
1063
1064             for ( var i = 0; i < types.length; i++ ) {
1065                 try {
1066                     return new ActiveXObject( types[ i ] );
1067                 } catch( e ) {}
1068             }
1069
1070             return undefined;
1071         };
1072     }
1073     if ( window.XMLHttpRequest )
1074         return new XMLHttpRequest();
1075 }
1076
1077 // BEGIN: fast browser onload init
1078 // Modifications by David Davis, DWD
1079 // Dean Edwards/Matthias Miller/John Resig
1080 // http://dean.edwards.name/weblog/2006/06/again/?full#comment5338
1081
1082 function mtInit() {
1083     // quit if this function has already been called
1084     if (arguments.callee.done) return;
1085
1086     // flag this function so we don't do the same thing twice
1087     arguments.callee.done = true;
1088
1089     // kill the timer
1090     // DWD - check against window
1091     if ( window._timer ) clearInterval(window._timer);
1092
1093     // DWD - fire the window onload now, and replace it
1094     if ( window.onload && ( window.onload !== window.mtInit ) ) {
1095         window.onload();
1096         window.onload = function() {};
1097     }
1098
1099
1100     mtInitCommenter();
1101
1102
1103 }
1104
1105 /* for Mozilla/Opera9 */
1106 if (document.addEventListener) {
1107     document.addEventListener("DOMContentLoaded", mtInit, false);
1108 }
1109
1110 /* for Internet Explorer */
1111 /*@cc_on @*/
1112 /*@if (@_win32)
1113 document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
1114 var script = document.getElementById("__ie_onload");
1115 script.onreadystatechange = function() {
1116     if (this.readyState == "complete") {
1117         mtInit(); // call the onload handler
1118     }
1119 };
1120 /*@end @*/
1121
1122 /* for Safari */
1123 if (/WebKit/i.test(navigator.userAgent)) { // sniff
1124     _timer = setInterval(function() {
1125         if (/loaded|complete/.test(document.readyState)) {
1126             mtInit(); // call the onload handler
1127         }
1128     }, 10);
1129 }
1130
1131 /* for other browsers */
1132 window.onload = mtInit;
1133
1134 // END: fast browser onload init
1135
1136
1137
1138
1139 function mtLoggedIn(ott) {
1140     var script = document.createElement('script');
1141     var ts = new Date().getTime();
1142     script.src = 'http://defaria.com/mt/mt-comments.cgi?__mode=userinfo&jsonp=mtSaveUserInfo&ott=' + ott;
1143     (document.getElementsByTagName('head'))[0].appendChild(script);
1144 }
1145
1146 function mtRefreshUserInfo(sid) {
1147     var script = document.createElement('script');
1148     var ts = new Date().getTime();
1149     script.src = 'http://defaria.com/mt/mt-comments.cgi?__mode=userinfo&jsonp=mtSaveUserInfo&sid=' + sid;
1150     (document.getElementsByTagName('head'))[0].appendChild(script);
1151 }
1152
1153 function mtSaveUserInfo (u) {
1154     if ( u.error ) {
1155         if ( !user ) {
1156             alert('The sign-in attempt was not successful; Please try again.');
1157         }
1158         return;
1159     }
1160     user = null;
1161     var cmtcookie = mtBakeUserCookie(u);
1162     var now = new Date();
1163     var cache_period = mtCookieTimeout * 1000;
1164
1165     // cache anonymous user info for a long period if the
1166     // user has requested to be remembered
1167     mtFixDate(now);
1168     now.setTime(now.getTime() + cache_period);
1169     mtSetCookie(mtCookieName, cmtcookie, now, mtCookiePath, mtCookieDomain,
1170         location.protocol == 'https:');
1171     mtFireEvent('usersignin');
1172 }
1173
1174 function mtInitCommenter () {
1175     /***
1176      * If request contains a '#_login' or '#_logout' hash, use this to
1177      * also delete the blog-side user cookie, since we're coming back from
1178      * a login, logout or edit profile operation.
1179      */
1180
1181     var hash = ( window.location.hash );
1182     hash.match( /^#_(.*)$/ );
1183     var command = RegExp.$1 || '';
1184     if ( command === 'refresh' ) {
1185         // Back from profile edit screen.
1186         // Reload userinfo with current session ID.
1187         var u = mtGetUser();
1188         user  = null;
1189         mtRefreshUserInfo(u.sid);
1190     }
1191     else if ( command === 'logout' ) {
1192         // clear any logged in state
1193         mtClearUser();
1194         mtFireEvent('usersignin');
1195     }
1196     else if ( command.match( /^login_(.*)$/ ) ) {
1197         var sid = RegExp.$1;
1198         mtLoggedIn(sid);
1199     }
1200     else {
1201         mtFireEvent('usersignin');
1202     }
1203 }
1204
1205