if (!Prototype.Browser.IE) { document.observe('dom:loaded', initBlog); }
else { Event.observe(window, 'load', initBlog); }

function setJsFlag()
{
	$(document.body).addClassName('script');
	$(document.body).removeClassName('noScript');
}

function initBlog()
{
	//time = new Date();
	
	body = $(doc.body);
	
	if (Prototype.Browser.IE) { setJsFlag(); }
	
	mokono.linkHeaderImage();
	
	$$('form.postTagForm').each(function(form) { mokono.postTags.createAddCancel(form); }) // ff: 4ms / ie7: 5ms / ie6: 7.5ms (memory leak!)
	
	//trackbackFormObj = new mokono.TrackbackForm();
	
	commentsObj = new mokono.Comments();
	
	recommend = new mokono.Recommend();
	
	//if (body.hasClassName('loggedin')) { initMsgLayer.defer(); }
	
	function initMsgLayer ()
	{
		var d = new Date();
		var blogurl = (mokono && mokono.vars && mokono.vars.msgNotifyUrl) || '/';
		var url = blogurl + '?AjaxRequest=true&date=';
		notify = new mokono.Notify('messageLayer');
		
		/* onload */
		new Ajax.Request(url+d.getTime(),
		{
			method: 'get',
			onSuccess: function(transport)
			{
				var json = transport.responseText.evalJSON(true);
				if ( json != 0 ) {
                    notify.show(json['css_class'], json['string']);
                }                
			}
		});
		
		/* every 30 seconds */
		setInterval(function ()
		{
			var d = new Date();
			new Ajax.Request(url+d.getTime(),
			{
				method: 'get',
				onSuccess: function(transport)
				{					
                    var json = transport.responseText.evalJSON(true);
                    if ( json != 0 ) {
                        notify.show(json['css_class'], json['string']);
                    } else {
                        notify.safehide();
                    }
				}
			})
		}, 30000);
	}
	
	// console.log(new Date()-time);
}

// Variables

var doc = document,
	body,
	
	mokono =
	{
		// 
		client :
		{
			ie6 : !!($('IE6')),
			ie7 : !!($('IE7')),
			ie6_7 : !!($('IE6_7')),
			gecko : !!document.getBoxObjectFor,
			opera : !!window.opera,
			safari : !!(/WebKit/i.test(navigator.userAgent))
		},
		
		// makes header-image clickable like blog title
		linkHeaderImage : function ()
		{
			var image = $('header-image');
			
			if (image)
			{
				image.observe('click', function () { location.href = mokono.vars.blogUrl; });
				image.title = mokono.vars.homeTitle;
			}
		},
		
		// only for dw designs!
		Comments : function ()
		{
			this.toogleLink = $('showHideSubCommentsLink');
			
			this.hideOtherThreads = function (elem)
			{
				if (elem)
				{
					elem.siblings().invoke('remove');
					commentsObj.hideOtherThreads(elem.up('li.comment'));
				}
			};
			
			this.toggleSubcomments = function ()
			{
				// toggle all sub comments
				this.innerHTML = body.hasClassName('hiddenSubComments')? mokono.text.hideSubComments : mokono.text.showSubComments;
				body.toggleClassName('hiddenSubComments');
				return false;
			}.bind(this.toogleLink);
			
			this.showThread = function (e)
			{
				var trigger = Event.element(e);
				
				function findRoot (elem)
				{
					var parent = elem.up('li.comment');
					if (parent) { return findRoot(parent); }
					else {return elem;}
				}
				
				if (trigger.up().hasClassName('subcomments'))
				{
					this.onclick = function ()
					{
						location.href = mokono.vars.fullCommentsURL;
						location.reload();
						return false;
					}
					// show comment thread
					var newRoot = trigger.up('li.comment'),
						root = findRoot(newRoot);
					
					body.removeClassName('hiddenSubComments');
					commentsObj.hideOtherThreads(newRoot);
					root.up().replaceChild(newRoot, root);
					this.innerHTML = mokono.text.showSubComments;
					this.scrollIntoView();
					e.stop();
				}
			}.bindAsEventListener(this.toogleLink);
			
			// CONSTRUCTOR
			
			if (this.toogleLink && location.href.search(/comment_ID=|nosubc=1/) == -1) { this.toogleLink.onclick = this.toggleSubcomments; }
			
			if ($('comments')) { $('comments').observe('click', this.showThread); }
		},
		
		// hides TrackbackForm & shows 
		TrackbackForm : function ()
		{
			var FORM_ID = 'trackbackForm',
				title, titleContent;
			
			this.show = function ()
			{
				title.up('p').next().show();
				title.innerHTML = titleContent;
			}
			
			// CONSTRUCTOR
			if ($$('form#' + FORM_ID).first() && window.location.hash.replace(/#/,'') != FORM_ID)
			{
				title = $(FORM_ID).down('strong');
				// backup title content
				titleContent = title.innerHTML;
				// insert link
				title.innerHTML = '<a href="#" id="showTrackbackForm" onclick="trackbackFormObj.show(); return false;">' + $('trackbackForm_submit').value + '</a>';
				// hide form content
				title.up('p').next().hide();
			}
		},
		
		postTags :
		{
			// creates "Add tags" link & cancel button
			createAddCancel : function (el_form)
			{
				var paragraph = el_form.down('p'),
					label = paragraph.down('span');
				
				// replace label with link
				label.replace(new Element('a', {href:'#'}).update(label.innerHTML).observe('click', this.showForm));
				
				// append cancel button
				paragraph.insert(new Element('input', {type:'button', value:mokono.text.cancel, 'class':'button'}).observe('click', this.hideForm));
			},
			// shows postTag form
			showForm : function (e) { this.up('li').addClassName('active'); if (e) { e.stop(); } },
			// hides postTag form
			hideForm : function (e) { this.up('li').removeClassName('active'); }
		},
		
		Notify : function (str_id)
		{
			var layer,
				content;
			
			this.show = function (str_class, str_content)
			{
				if (str_content != 'undefined')
				{
					content.innerHTML = str_content;
					layer.className = str_class;
					if (mokono.client.ie6) {layer.down('iframe').style.height = layer.getHeight() + 'px';}
	/*				layer.setStyle({
						top: (mokono.client.ie6? (doc.documentElement.scrollTop - 10) + 'px' : '0px')
					});*/
					layer.show();
				}
			};
			
			this.clean = function ()
			{
				var d = new Date();
				var blogurl = (mokono && mokono.vars && mokono.vars.msgNotifyUrl) || '/';
				var url = blogurl +'?AjaxRequest=true&clean=true&time='+d.geTime();
				new Ajax.Request(url, {
					method: 'get',
					onSuccess: function() {$('notifyForm').submit();}
				});
			};
			
			this.hide = function ()
			{
				layer.hide();
				var d = new Date();
				var blogurl = (mokono && mokono.vars && mokono.vars.msgNotifyUrl) || '/';
				new Ajax.Request(blogurl + '?AjaxRequest=true&clean=true&time='+d.getTime(), {method: 'get'});
				
				// avoid mem leak
				if (mokono.client.ie6_7) $A(layer.getElementsByTagName('a')).each(function(elem) { elem.onmousedown = null; });
			};
			
			this.safehide  = function ()
			{
				layer.hide();
				
				// avoid mem leak
				if (mokono.client.ie6_7) $A(layer.getElementsByTagName('a')).each(function(elem) { elem.onmousedown = null; });
			}
			
			body.insert({ bottom: '<div id="' + str_id + '" style="display:none;"><div class="content"></div>'+(mokono.client.ie6? '<iframe style="filter:mask();"></iframe>' : '')+'</div>' });
			
			finishInit.defer(); // give IE time for dom update
			
			function finishInit()
			{
				layer = $(str_id);
				content = layer.down('.content');
				if (!mokono.client.ie6) { layer.insert({ bottom: '<span class="bTL"></span><span class="bTR"></span><span class="bT"></span><span class="bL"></span><span class="bR"></span><span class="bBL"></span><span class="bBR"></span><span class="bB"></span>' }); }
			}
		},
		
		Recommend : function ()
		{
			var vars = MOKONO.vars;
			
			if (vars.recommendLayer)
			{
				var layer,
					bookmarksContainer,
					bookmarksContent,
					tabs,
					targets = [];
				
				
				this.show = function (elem, str_id)
				{
					// lazy layer init
					if (!layer)
					{
						// add layer to dom
						var temp = document.createElement('div');
						
						temp.innerHTML = vars.recommendLayer;
						layer = $(temp.firstChild);
						document.body.appendChild(layer);
						
						// get bookmark list pattern (not taken from dom, because placeholder not urlencoded)
						bookmarksContent = vars.recommendLayer.match(/<div id="rL_bookmarks">(.*?)<\/div>/)[1];
						
						bookmarksContainer = $('rL_bookmarks');
						tabs = $$('#rL_tabs a');
						
						// find tabs targets
						for (var i = 0; i < tabs.length; ++i)
						{
							var anchor = tabs[i].href.match(/#([^#]*)$/);
							
							if (anchor && anchor[1] && $(anchor[1]))
							{
								targets.push($(anchor[1]));
							}
							tabs[i].onclick = function ()
							{
								self.recommend.setTab(this);
								return false;
							};
						}
						// activate bookmark tab
						this.setTab(tabs[0]);
					}
					
					var postData = vars.postData[str_id];
					
					if (postData)
					{
						// fill placeholder in bookmark list pattern & insert to dom
						bookmarksContainer.innerHTML = bookmarksContent.replace(/{URL}/g, postData.url).replace(/{TITLE}/g, postData.title);
						
						// add form postid
						$('rL_send_postId').value=str_id;
						
						// todo: remove this line if prototype fixed clonePosition:
						try {layer.clonePosition(elem, {setWidth:false, setHeight:false, offsetLeft:-6, offsetTop:-6});} catch (e) {}
						// position
						layer.clonePosition(elem, {setWidth:false, setHeight:false, offsetLeft:-6, offsetTop:-6});
						
						// close
						$('rL_close').onclick = this.hide;
						$('rL_send_cancel').onclick = this.hide;
						
						layer.style.display = 'block';
					}
				}
				
				this.hide = function ()
				{
					layer.style.display = 'none';
					return false;
				}
				
				this.setTab = function (elem)
				{
					for (var i = 0; i < tabs.length; ++i)
					{
						if (tabs[i] == elem)
						{
							$(tabs[i].parentNode).addClassName('active');
							targets[i].style.display = 'block';
						}
						else
						{
							$(tabs[i].parentNode).removeClassName('active');
							targets[i].style.display = 'none';
						}
					}
				}
				
				// CONSTRUCTOR
				
				$$('#main ul.optionList li.recommend a').each(function(elem)
				{
					elem.observe('click', function(e)
					{
						recommend.show(this, $(this).up('li.post').id.slice(1));
						e.stop();
					});
				})
			}
		},
		
		centerLayer : function (elem, int_height)
		{
			elem.addClassName('centerLayer');
			if (mokono.client.ie6)
			{
				// IE6
				elem.setStyle({top: (document.documentElement.scrollTop+(document.documentElement.clientHeight-int_height)/2) + 'px'});
			}
			else
			{
				elem.setStyle({marginTop: -int_height/2 + 'px'});
			}
		}
	};
	
// Classes