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