Initial add of defaria.com
[clearscm.git] / defaria.com / blogs / General / 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=1&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=1&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 = 'ec4b2e879b7165b8ecbb18356d31f9c7559711e3';
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     }
718 }
719
720 function mtUserOnLoad() {
721     var u = mtGetUser();
722
723     // if the user is authenticated, hide the 'anonymous' fields
724     // and any captcha input if already shown
725     if ( document.getElementById('comments-form')) {
726         if ( u && u.is_authenticated ) {
727             mtShow('comments-form');
728             mtHide('comments-open-data');
729             if (mtCaptchaVisible)
730                 mtHide('comments-open-captcha');
731         } else {
732
733         }
734         if ( u && u.is_banned )
735             mtHide('comments-form');
736
737         // if we're previewing a comment, make sure the captcha
738         // field is visible
739         if (is_preview)
740             mtShowCaptcha();
741         else
742             mtShowGreeting();
743
744         // populate anonymous comment fields if user is cookied as anonymous
745         var cf = document['comments_form'];
746         if (cf) {
747             if (u && u.is_anonymous) {
748                 if (u.email) cf.email.value = u.email;
749                 if (u.name) cf.author.value = u.name;
750                 if (u.url) cf.url.value = u.url;
751                 if (cf.bakecookie)
752                     cf.bakecookie.checked = u.name || u.email;
753             } else {
754                 if (u && u.sid && cf.sid)
755                     cf.sid.value = u.sid;
756             }
757             if (cf.post && cf.post.disabled)
758                 cf.post.disabled = false;
759             if (cf.preview_button && cf.preview_button.disabled)
760                 cf.preview_button.disabled = false;
761             mtRequestSubmitted = false;
762         }
763     }
764 }
765
766
767
768
769 function mtEntryOnLoad() {
770     var cf = document['comments_form'];
771     if (cf && cf.preview) cf.preview.value = '';
772     mtHide('trackbacks-info');
773     mtHide('comments-open');
774     mtFireEvent('usersignin');
775 }
776
777 function mtEntryOnUnload() {
778     if (mtRequestSubmitted) {
779         var cf = document['comments_form'];
780         if (cf) {
781             if (cf.post && cf.post.disabled)
782                 cf.post.disabled = false;
783             if (cf.preview_button && cf.preview_button.disabled)
784                 cf.preview_button.disabled = false;
785         }
786         mtRequestSubmitted = false;
787     }
788     return true;
789 }
790
791 mtAttachEvent('usersignin', mtUserOnLoad);
792
793
794
795 function mtSignIn() {
796     var doc_url = document.URL;
797     doc_url = doc_url.replace(/#.+/, '');
798     var url = 'http://defaria.com/mt/mt-comments.cgi?__mode=login&blog_id=1';
799     if (is_preview) {
800         if ( document['comments_form'] ) {
801             var entry_id = document['comments_form'].entry_id.value;
802             url += '&entry_id=' + entry_id;
803         } else {
804             url += '&return_url=http%3A%2F%2Fdefaria.com%2Fblogs%2FGeneral%2F';
805         }
806     } else {
807         url += '&return_url=' + encodeURIComponent(doc_url);
808     }
809     mtClearUser();
810     location.href = url;
811 }
812
813 function mtSignInOnClick(sign_in_element) {
814     var el;
815     if (sign_in_element) {
816         // display throbber
817         el = document.getElementById(sign_in_element);
818         if (!el)  // legacy MT 4.x element id
819             el = document.getElementById('comment-form-external-auth');
820     }
821     if (el)
822         el.innerHTML = 'Signing in... <span class="status-indicator">&nbsp;</span>';
823
824     mtClearUser(); // clear any 'anonymous' user cookie to allow sign in
825     mtSignIn();
826     return false;
827 }
828
829 function mtSetUserOrLogin(u) {
830     if (u && u.is_authenticated) {
831         mtSetUser(u);
832     } else {
833         // user really isn't logged in; so let's do this!
834         mtSignIn();
835     }
836 }
837
838
839 function mtSignOut(entry_id) {
840     mtClearUser();
841     var doc_url = document.URL;
842     doc_url = doc_url.replace(/#.+/, '');
843     var url = 'http://defaria.com/mt/mt-comments.cgi?__mode=handle_sign_in&static=0&logout=1&blog_id=1';
844     if (is_preview) {
845         if ( document['comments_form'] ) {
846             var entry_id = document['comments_form'].entry_id.value;
847             url += '&entry_id=' + entry_id;
848         } else {
849             url += '&return_url=http%3A%2F%2Fdefaria.com%2Fblogs%2FGeneral%2F';
850         }
851     } else {
852         url += '&return_url=' + encodeURIComponent(doc_url);
853     }
854     location.href = url;
855 }
856
857
858 function mtSignOutOnClick() {
859     mtSignOut();
860     return false;
861 }
862
863
864
865 function mtShowGreeting() {
866
867     mtShowCaptcha();
868
869 }
870
871
872
873 function mtReplyCommentOnClick(parent_id, author) {
874     mtShow('comment-form-reply');
875
876     var checkbox = document.getElementById('comment-reply');
877     var label = document.getElementById('comment-reply-label');
878     var text = document.getElementById('comment-text');
879
880     // Populate label with new values
881     var reply_text = 'Replying to \<a href=\"#comment-__PARENT__\" onclick=\"location.href=this.href; return false\"\>comment from __AUTHOR__\<\/a\>';
882     reply_text = reply_text.replace(/__PARENT__/, parent_id);
883     reply_text = reply_text.replace(/__AUTHOR__/, author);
884     label.innerHTML = reply_text;
885
886     checkbox.value = parent_id; 
887     checkbox.checked = true;
888     try {
889         // text field may be hidden
890         text.focus();
891     } catch(e) {
892     }
893
894     mtSetCommentParentID();
895 }
896
897
898 function mtSetCommentParentID() {
899     var checkbox = document.getElementById('comment-reply');
900     var parent_id_field = document.getElementById('comment-parent-id');
901     if (!checkbox || !parent_id_field) return;
902
903     var pid = 0;
904     if (checkbox.checked == true)
905         pid = checkbox.value;
906     parent_id_field.value = pid;
907 }
908
909
910 function mtSaveUser(f) {
911     // We can't reliably store the user cookie during a preview.
912     if (is_preview) return;
913
914     var u = mtGetUser();
915
916     if (f && (!u || u.is_anonymous)) {
917         if ( !u ) {
918             u = {};
919             u.is_authenticated = false;
920             u.can_comment = true;
921             u.is_author = false;
922             u.is_banned = false;
923             u.is_anonymous = true;
924             u.is_trusted = false;
925         }
926         if (f.author != undefined) u.name = f.author.value;
927         if (f.email != undefined) u.email = f.email.value;
928         if (f.url != undefined) u.url = f.url.value;
929     }
930
931     if (!u) return;
932
933     var cache_period = mtCookieTimeout * 1000;
934
935     // cache anonymous user info for a long period if the
936     // user has requested to be remembered
937     if (u.is_anonymous && f && f.bakecookie && f.bakecookie.checked)
938         cache_period = 365 * 24 * 60 * 60 * 1000;
939
940     var now = new Date();
941     mtFixDate(now);
942     now.setTime(now.getTime() + cache_period);
943
944     var cmtcookie = mtBakeUserCookie(u);
945     mtSetCookie(mtCookieName, cmtcookie, now, mtCookiePath, mtCookieDomain,
946         location.protocol == 'https:');
947 }
948
949
950 function mtClearUser() {
951     user = null;
952     mtDeleteCookie(mtCookieName, mtCookiePath, mtCookieDomain,
953         location.protocol == 'https:');
954 }
955
956
957 function mtSetCookie(name, value, expires, path, domain, secure) {
958     if (domain && ( domain.match(/^\.?localhost$/) || domain.match(/^[0-9\.]+$/) ))
959         domain = null;
960     var curCookie = name + "=" + encodeURIComponent(value) +
961         (expires ? "; expires=" + expires.toGMTString() : "") +
962         (path ? "; path=" + path : "") +
963         (domain ? "; domain=" + domain : "") +
964         (secure ? "; secure" : "");
965     document.cookie = curCookie;
966 }
967
968
969 function mtGetCookie(name) {
970     var prefix = name + '=';
971     var c = document.cookie;
972     var cookieStartIndex = c.indexOf(prefix);
973     if (cookieStartIndex == -1)
974         return '';
975     var cookieEndIndex = c.indexOf(";", cookieStartIndex + prefix.length);
976     if (cookieEndIndex == -1)
977         cookieEndIndex = c.length;
978     var this_cookie = c.substring(cookieStartIndex + prefix.length, cookieEndIndex);
979     if ( this_cookie.match(/\%u/i) ) {
980         return '';
981     }
982     return decodeURIComponent( this_cookie );
983 }
984
985
986 function mtDeleteCookie(name, path, domain, secure) {
987     if (mtGetCookie(name)) {
988         if (domain && domain.match(/^\.?localhost$/))
989             domain = null;
990         document.cookie = name + "=" +
991             (path ? "; path=" + path : "") +
992             (domain ? "; domain=" + domain : "") +
993             (secure ? "; secure" : "") +
994             "; expires=Thu, 01-Jan-70 00:00:01 GMT";
995     }
996 }
997
998 function mtFixDate(date) {
999     var skew = (new Date(0)).getTime();
1000     if (skew > 0)
1001         date.setTime(date.getTime() - skew);
1002 }
1003
1004
1005 function mtGetXmlHttp() {
1006     if ( !window.XMLHttpRequest ) {
1007         window.XMLHttpRequest = function() {
1008             var types = [
1009                 "Microsoft.XMLHTTP",
1010                 "MSXML2.XMLHTTP.5.0",
1011                 "MSXML2.XMLHTTP.4.0",
1012                 "MSXML2.XMLHTTP.3.0",
1013                 "MSXML2.XMLHTTP"
1014             ];
1015
1016             for ( var i = 0; i < types.length; i++ ) {
1017                 try {
1018                     return new ActiveXObject( types[ i ] );
1019                 } catch( e ) {}
1020             }
1021
1022             return undefined;
1023         };
1024     }
1025     if ( window.XMLHttpRequest )
1026         return new XMLHttpRequest();
1027 }
1028
1029 // BEGIN: fast browser onload init
1030 // Modifications by David Davis, DWD
1031 // Dean Edwards/Matthias Miller/John Resig
1032 // http://dean.edwards.name/weblog/2006/06/again/?full#comment5338
1033
1034 function mtInit() {
1035     // quit if this function has already been called
1036     if (arguments.callee.done) return;
1037
1038     // flag this function so we don't do the same thing twice
1039     arguments.callee.done = true;
1040
1041     // kill the timer
1042     // DWD - check against window
1043     if ( window._timer ) clearInterval(window._timer);
1044
1045     // DWD - fire the window onload now, and replace it
1046     if ( window.onload && ( window.onload !== window.mtInit ) ) {
1047         window.onload();
1048         window.onload = function() {};
1049     }
1050
1051
1052
1053 }
1054
1055 /* for Mozilla/Opera9 */
1056 if (document.addEventListener) {
1057     document.addEventListener("DOMContentLoaded", mtInit, false);
1058 }
1059
1060 /* for Internet Explorer */
1061 /*@cc_on @*/
1062 /*@if (@_win32)
1063 document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
1064 var script = document.getElementById("__ie_onload");
1065 script.onreadystatechange = function() {
1066     if (this.readyState == "complete") {
1067         mtInit(); // call the onload handler
1068     }
1069 };
1070 /*@end @*/
1071
1072 /* for Safari */
1073 if (/WebKit/i.test(navigator.userAgent)) { // sniff
1074     _timer = setInterval(function() {
1075         if (/loaded|complete/.test(document.readyState)) {
1076             mtInit(); // call the onload handler
1077         }
1078     }, 10);
1079 }
1080
1081 /* for other browsers */
1082 window.onload = mtInit;
1083
1084 // END: fast browser onload init
1085
1086
1087
1088