/**
*@ Happyfri.com skin.JS	|  BaseLib : AshAPI
 Author : 			An.sehan (www.happyfri.com / plandas@naver.com)
 Last Modified : 	2009.01.31
*/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

var G = new Ash(); /**@ Global Object **/

function loadDataAsCalendar(value) {
	G.main.loadData( { registerDate:value }, bu.postRead+'?mode=archive' );
}
function loadDataAsCategory(o) {
	G.main.loadData( { depth:o.depth, itemType:o.itemType }, bu.postRead+'?mode=category' );
}
function loadDataAsTag(tagName) {
	G.main.loadData( { tagName:tagName }, bu.postRead+'?mode=tag' );
}
function loadDataAsSearch(keyword) {
	G.main.loadData( { keyword:keyword }, bu.postRead+'?mode=search' );
}
function loadDataAsRecent(post_idx) {
	G.main.loadData( { post_idx:post_idx} );
}

G.config = function()
{
	if(arguments.callee.initialized) return; arguments.callee.initialized = true;

	/**
	*@ Set the Major Elements.*/
	this.Top				= O('Top');
	this.Middle			= O('Middle');
		this.Left			= O('Left');
		this.Center		= O('Center');
			this.Main	= O('Main');
			this.Below	= O('Below');	
		this.Right		= O('Right');
	this.Bottom			= O('Bottom');


	this.setBlogHome = function(onlyData) 
	{
		if(onlyData)
			this.main.loadData();
		else window.location.href = bu.home;
	}


	/**@ Main Cover **/
	this.mcover = new AshAgent(null, function()
	{
		var own = this;
		this.owner = ( function() {
			var ele = Do.createElement('div');
			ele.style.display = 'none';
			ele.style.position = 'absolute';
			ele.style.zIndex = 31;
			ele.style.border = '0px solid #000000';
			ele.style.backgroundColor = '#ffffff';
			ele.style.textAlign = 'center';
			AshUtil.resize(ele, 0,0);
			return Do.body.appendChild(ele);
		})();

		this.apply = function(callback) {
			this._process(true, callback);
		}
		this.clear = function(callback) {
			this._process(false, callback);
		}
		this._process = function(type, callback) 
		{
			var gp = AshUtil.globalCoordinates(G.Center);
			var x = gp.x, y = gp.y;
			var w = G.Center.offsetWidth, h = 900;

			this.setStyle('display', 'block');
			this.rebound( x,y,w,h);
			if(type) {
				this.setOpacity(1);
				own.setHTML("<img src='"+imagesdir+"/loading.gif' style='margin-top:30px;'><br>Now loading...");
				if(callback) callback();
			}
			else {
				this.setHTML("reset");
				this.alpha(0,700,'in', function(e) {
					if(e.type == AshTween.FINISH) {
						own.setStyle('display', 'none');
						if(callback) callback();
					}
				});
			}
		}
	});


	/**@ QuickMenu **/
	this.qm = new AshAgent(D('Left.quickMenu'), function()
	{
		var own = this;
		this.isALH = false;
		AshLocationHistory.contentURL = bu.f+'/history.html';
		this.addHistory = function(url, variables) 
		{
			if(this.isALH || !url || !variables) return;
			var data = {url:url, variables:C(variables) };

			//AshLocationHistory.setHistory({exec:"G.main.loadData( "+AshUtil.toJSON(variables)+" )"}); // 이 한줄이 더 간단한 방법이다. 하지만  응용처리를 위한 방법(RECALL 이벤트로처리) 을 위해 일부러 아래방법을 택함.
			AshLocationHistory.setHistory( {data:data} );
			this.isALH = false;
		}

		/**@ 등록된 History에서 Recall이 일어날때 loadContent를 수행 */
		AshLocationHistory.addEventListener(AshLocationHistory.RECALL, function(e) {
			var data = e.parameters.data;
			own.isALH = true;
			if(data) data.variables.type == 'content'? G.main.loadContent(data.url): G.main.loadData(data.variables, data.url);
		});
	});



	/**@ Page Buttons **/
	this.pb = new AshAgent(D('Below.pageButtons'), function() 
	{
		this.UPDATE = 'update';
		this.btnElement = ( function() {
			var ele = Do.createElement('div');
			ele.innerHTML = "<a onclick=\"G.main.loadDataAsPage( this._pageIndex ); return false;\" ></a>";
			return ele.firstChild;
		} )();

		this.selectedIndex = 1;
		this.previousable  = false;
		this.nextable		 = false;

		this.previous = function() { /**@ previous page */
			if(this.previousable) G.main.loadDataAsPage( this.selectedIndex - 1 );
		}
		this.next = function() {  /**@ next page */
			if(this.nextable) G.main.loadDataAsPage( this.selectedIndex + 1 );
		}
		this.update = function(data)
		{
			this.setHTML('reset');
			var pbPrev, pbNext, pbtn, last = 0, selectedIndex = 1;
			if(data)
			{
				if(data.prevButton.visible) {
					pbPrev = this.addChild(this.btnElement.cloneNode(true));
					pbPrev.href = bu.home+'pageIndex/'+data.prevButton.pageIndex;
					pbPrev.innerHTML = 'PREVIOUS |';
					pbPrev._pageIndex = data.prevButton.pageIndex;
				}
				for(var l = data.pageButton.length, p, i = 0; i < l; i++) {
					p = data.pageButton[i];
					if(p.visible)
					{
						pbtn = this.addChild(this.btnElement.cloneNode(true));
						pbtn.href = bu.home+'pageIndex/'+p.pageIndex;
						pbtn.innerHTML = p.pageIndex;
						pbtn._pageIndex = p.pageIndex;
						if(p.selected) {
							pbtn.onclick = function() { return false; };
							pbtn.style.color = '#ffffff';
							pbtn.style.backgroundColor = '#000000';
							pbtn.style.cursor = 'default';
							this.selectedIndex = p.pageIndex;
						}
						this.addChild( Do.createTextNode('/  ') );
						last = i;
					}
				}
				if(data.nextButton.visible) {
					pbNext = this.addChild(this.btnElement.cloneNode(true));
					pbNext.href = bu.home+'pageIndex/'+data.nextButton.pageIndex;
					pbNext.innerHTML = '| NEXT';
					pbNext._pageIndex = data.nextButton.pageIndex;
				}

				this.previousable = !data.pageButton[0].selected || data.prevButton.visible? true: false;
				this.nextable		= !data.pageButton[last].selected || data.nextButton.visible? true: false;
			}
			this.dispatchEvent(new AshEvent(this.UPDATE), {data:data, previousable:this.previousable, nextable:this.nextable} );
		}
	});



	/**@ The Main **/
	this.main = new AshAgent(this.Main, function() 
	{
		var own = this;
		this.DATA_LOADED		= 'dataLoaded';
		this.CONTENT_LOADED	= 'contentLoaded';
		this.defaultVariables = { post_idx:0, pageIndex:1 };
		this.defaultURL = bu.postRead;
		this.postLimitCount = 2;
		this.pageLimitCount = 5;
		this.currentLDSet = { variables:C(this.defaultVariables), url:this.defaultURL };
		this.iframe = null;
		this.iframeUrl = '';
		this.iframeCallback = null;
		this.iframeAgent = null;
		this.iframeInitHeight = 0;
		
		this.loadData = function(variables, url, callback) /**@optional : url, callback **/
		{
			variables = variables || this.defaultVariables;
			variables.postLimitCount = this.postLimitCount;
			variables.pageLimitCount = this.pageLimitCount;
			url = url || this.defaultURL;

			window.scroll(0,0);

			G.mcover.apply( function() 
			{
				var sajax = AshAJAX.send(function(e) 
				{
					var text = this.responseText, data = null;
					try {
						switch(text) {
							case 'fail': alert('System or Network error!'); break;
							default:
								G.qm.addHistory(url, variables);
								own.currentLDSet.variables = C(variables);
								own.currentLDSet.url = url;
								if(text) {
									post_idx = 0;
									/**@ JSON value일경우 **/
									try {
										data = AshUtil.jsonToValue(text);
										G.pb.update(data? data.PB: null); /**@- JSON에서 PB 속성정의는 약속이다. PB값이 정의되어 있으면 pageButtons 처리데이터로 사용된다. */
										own.poster.createPost(data);
									} 
									/**@ 일반 text일경우 by pass **/
									catch(error) {
										own.iframe = null;
										own.setHTML(text);
										G.pb.update(null);
									}
									own.dispatchEvent(new AshEvent(own.DATA_LOADED), {data:data});
									if(callback != null) callback.call(own, data);
								}
								break;
						}
						G.mcover.clear();
					}
					catch(error){ };
				}, variables, 'post', url);

				sajax.addEventListener(AshAJAX.LOAD_ERROR, function(e) {
					alert('sorry, data failed to load. please try again later.');
				});
			});
		}
		this.loadDataAsPage = function( pageIndex ) {
			this.currentLDSet.variables.post_idx = 0;
			this.currentLDSet.variables.pageIndex = pageIndex;
			this.loadData( this.currentLDSet.variables, this.currentLDSet.url );
		}
		this.reloadData = function() {
			this.loadData( this.currentLDSet.variables, this.currentLDSet.url );
		}
		this.loadContent = function(url, callback)  /**@ use the iframe at content load-type. optional:callback. **/
		{
			this.iframeUrl = url;
			this.iframeCallback = callback;
			if(!this.iframe) {
				this.setHTML( "<iframe frameborder='0' width='100%' height='0' scrolling='no' ALLOWTRANSPARENCY='true' ></iframe>" );
				this.iframe = this.getChildAt(0);
				this.iframeAgent = new AshEventDispatcher(this.iframe);
				this.iframeAgent.addEventListener('load',  function(e) {
					G.qm.addHistory( own.iframeUrl, {type:'content'} );
					own.updateIframeHeight( );
					own.dispatchEvent(new AshEvent(own.CONTENT_LOADED), {event:e});
					if(own.iframeCallback != null) own.iframeCallback.call(own.iframe, e);
				});
			}
			this.iframe.setAttribute('src', url);
			G.pb.update(null);
			window.scroll(0,0);
		}
		this.updateIframeHeight = function() {
			if(this.iframe) {
				this.iframeInitHeight = this.iframe.contentWindow.document.documentElement.scrollHeight;
				this.iframe.style.height = this.iframeInitHeight+'px';
			}
		}
	});


	this.main.poster = new AshAgent(null, function()
	{
		var own = this;
		this.owner = (function() {
			var ele = Do.createElement('div');
			ele.innerHTML = "\
			<div name='postList' class='BoxStyleDefault' style='margin-bottom:30px;'>\
				<div class='Top'><div class='Left'></div><div class='Center'></div><div class='Right'></div></div>\
				<div class='Middle'>\
					<div class='PostListHead' >\
						<div class='Paging'>\
							<span class='image' name='prevp' onclick='G.pb.previous();' title='Previous Page'><img src='"+skinImagesdir+"/btn_prevp1.gif' ><img class='over' src='"+skinImagesdir+"/btn_prevp2.gif' ></span>\
							<span class='image' name='prev' onclick='' title='Previous'><img src='"+skinImagesdir+"/btn_prev1.gif' ><img class='over' src='"+skinImagesdir+"/btn_prev2.gif' ></span>\
							<span class='image' name='next' onclick='' title='Next'><img src='"+skinImagesdir+"/btn_next1.gif' ><img class='over' src='"+skinImagesdir+"/btn_next2.gif' ></span>\
							<span class='image' name='nextp' onclick='G.pb.next();' title='Next Page'><img src='"+skinImagesdir+"/btn_nextp1.gif' ><img class='over' src='"+skinImagesdir+"/btn_nextp2.gif' ></span>\
						</div>\
						<div name='naming' class='Naming' \
							onclick='G.main.poster.showHidePostList(parentNode.parentNode);'><span></span><span style='display:none; font-size:9px;'><img src='"+imagesdir+"/arrow_w_u.gif' >CLOSE LIST</span></div>\
					</div>\
					<div name='main' class='PostListMain Accordion' style='display:none;'>\
						<div class='Inner'>\
							<div class='Left'></div>\
							<div class='Center'>\
								<table>\
									<tr><td align='left' >TITLE</td><td width='60'>COMMENT</td><td width='70'>TRACKBACK</td><td width='90' align='right'>LAST.UPDATE</td></tr>\
								</table>\
							</div>\
							<div class='Right'></div>\
						</div>\
						<div name='lists'></div>\
					</div>\
				</div>\
				<div class='Bottom'><div class='Left'></div><div class='Center'></div><div class='Right'></div></div>\
			</div>\
			\
			<div name='signinBox' class='SignInBox'>\
				<form onsubmit='return G.main.poster.onSubmitCmtSignIn(this);' >\
				<span class='Close' title='Close' onclick='G.main.poster.hideCmtSignIn();'><img src='"+imagesdir+"/close.gif'' /></span>\
				<div class='IText' >\
					<img src='"+imagesdir+"/arrow_d.gif'> SIGN IN\
				</div>\
				<span>Enter the Password.</span>\
				<div><input type='password' name='password'  /></div>\
				</form>\
			</div>\
			\
			<div name='postBody' class='PostBody'>\
				<div class='Head'>\
					<div>\
						<span name='catname' class='CatName'></span>\
						<span name='date' class='Date'></span>\
						<span name='address' class='Address'></span>\
					</div>\
					<div name='title' class='Title'></div>\
				</div>\
				<div class='PostTitleHline'></div>\
				<div name='content' class='Content'></div>\
				<div name='trackbackUrl' class='TrackbackUrl'>\
					<div class='Underline' style='height:1px;'></div>\
					<div name='body' style='float:right;'></div>\
				</div>\
				<div class='TagContainer'>\
					<div class='Left'></div>\
					<div class='Center'>\
						<span name='tags'></span>\
					</div>\
					<div class='Right'></div>\
				</div>\
				<div class='AdditionsInfo' >\
					<div name='additionsInfo' class='L'></div>\
					<div class='R'>\
						<span onclick='G.main.poster.editPost(this);'>EDIT</span> | \
						<span onclick='G.main.poster.deletePost(this);'>DELETE</span>\
					</div>\
				</div>\
				<div name='additionsTrb' class='Additions'>\
					<div name='regTrbUrl' class='RegTrbUrl'></div>\
				</div>\
				<div name='additionsCmt' class='Additions'></div>\
				<div style='clear:left;' >\
					<div name='btn' class='MenuBasic2' onclick='G.main.commentWriter.show(parentNode.parentNode.data);'><span>Leave Comment</span></div>\
				</div>\
			</div>\
			\
			<div name='trackback' class='Trackback'>\
				<li name='title' class='Title'></li>\
				<div class='Head'>\
					<span name='name' class='Name'></span> <span name='date' class='Date'></span>\
					<span class='Button' onclick='G.main.poster.deleteTrackback(parentNode.parentNode.data);' title='Delete Trackback'><img src='"+skinImagesdir+"/cmt_del.gif'></span>\
				</div>\
				<div name='excerpt' class='Excerpt'></div>\
				<div class='Separate'></div>\
			</div>\
			\
			<div name='comment' class='Comment'>\
				<div class='Head'>\
					<span name='replyd' ></span>\
					<span name='name' class='Name'></span> <span name='date' class='Date'></span>\
					<span class='Button' onclick=\"G.main.poster.showCmtSignIn(parentNode.parentNode, 'signin');\" title='Edit Comment'><img src='"+skinImagesdir+"/cmt_edit.gif'></span>\
					<span class='Button' onclick=\"G.main.poster.showCmtSignIn(parentNode.parentNode, 'delete');\" title='Delete Comment'><img src='"+skinImagesdir+"/cmt_del.gif'></span>\
				</div>\
				<div name='content' class='Content'></div>\
				<div>\
					<span name='addCmtSpan' class='Button' onclick='G.main.commentWriter.show(parentNode.parentNode.data);' title='Comment on it.' ><img src='"+skinImagesdir+"/cmt_add.gif'></span>\
				</div>\
				<div class='Separate'></div>\
			</div>\
			\
			<div name='closedtrb' class='ClosedTrb'>\
				sorry, trackback of this post was closed by the <a href='mailto:plandas@naver.com' >administrator.</a>\
			</div>\
			\
			<div name='closedcmt' class='ClosedCmt'>\
				sorry, comments of this post was closed by the <a href='mailto:plandas@naver.com' >administrator.</a>\
			</div>\
			\
			<div name='nodata' class='BoxStyleDefault' style='margin-bottom:30px;'>\
				<div class='Top'><div class='Left'></div><div class='Center'></div><div class='Right'></div></div>\
				<div class='Middle'>\
					<div class='NoData'>\
						<div name='message' style='text-align:center;'></div>\
					</div>\
				</div>\
				<div class='Bottom'><div class='Left'></div><div class='Center'></div><div class='Right'></div></div>\
			</div>";
			return ele;
		})();

		this.postList		= this.getChildByName('postList');
		this.signinBox	= this.getChildByName('signinBox');
		this.postBody	= this.getChildByName('postBody');
		this.trackback	= this.getChildByName('trackback');
		this.comment	= this.getChildByName('comment');
		this.closedtrb	= this.getChildByName('closedtrb');
		this.closedcmt	= this.getChildByName('closedcmt');
		this.nodata		= this.getChildByName('nodata');
		this.total			= 0;
		this.listtable		= null;

		this.createPost = function(data) 
		{
			G.main.iframe = null;
			G.main.setHTML('reset');
			if(data) {
				if(data.total) this.total = data.total;
				if(data.post_idx) post_idx = data.post_idx;
				if(data.list) this.createPostList(data.list);
				if(data.post && data.post.length>0) {
					for(var l = data.post.length, i = 0; i < l; i++) this.createPostBody( data.post[i], i );
					this.setImageOnclickEvent();
					this.evalCodeInContent();
				}
				else {
					var n = G.main.addChild(this.nodata.cloneNode(true));
					N(n, 'message').innerHTML = "Sorry, The requested post does not exist or has been closed.<br /><span onclick='G.setBlogHome(true);'>OK</span>";
				}
			}
			else {
				var n = G.main.addChild(this.nodata.cloneNode(true));
				N(n, 'message').innerHTML = "There is no data.<br /><span onclick='G.setBlogHome(true);'>OK</span>";
			}
		}
		this.createPostList = function(data) {
			var pl = G.main.addChild(this.postList.cloneNode(true)), htmlText = '';
			htmlText += "<table name='listtable' border='0' >";
			for(var l = data.length, d, indexing, onclick, cls, selectedIndex = 0, i = 0; i < l; i++) {
				d = data[i];
				if(d.idx == post_idx) selectedIndex = i;
				indexing = d.idx == post_idx? "<img src='"+skinImagesdir+"/v_checker.gif' >": d.index_number;
				onclick = d.idx != post_idx? " G.main.poster.loadDataByList("+i+", "+d.idx+", "+d.index_number+"); ": '';
				cls = d.idx != post_idx? 'Data': 'Selected';
				htmlText += "<tr class='"+cls+"' onclick='"+onclick+"' >";
				htmlText += "<td width='12'>"+indexing+"</td><td class='Title'>"+d.title+"</td><td width='60' class='Count'>"+d.cmtCount+
					"</td><td width='60' class='Count'>"+d.trbCount+"</td><td width='100' class='Date' align='right'>"+d.registerDate+"</td>";
				htmlText += "</tr>";
			}
			htmlText += "</table>";
			N(pl, 'lists').innerHTML = htmlText;
			N(pl, 'naming').firstChild.innerHTML = '<img src="'+imagesdir+'/arrow_w_d.gif" > Results <span class="T">'+(selectedIndex+1)+' / '+l+'</span> of about <span class="R">'+this.total+'</span> POSTS';
			this.updateStatusPostList(pl);
			
			var prevp = N(pl, 'prevp'), nextp = N(pl, 'nextp'), prev = N(pl, 'prev'), next = N(pl, 'next');
			if(!G.pb.previousable) {
				prevp.className='imagedisable';
				prevp.onclick=null;
				prevp.title='';
				AshUtil.filter.opacity(prevp.firstChild, 0.4);
			}
			if(!G.pb.nextable) {
				nextp.className='imagedisable';
				nextp.onclick=null;
				nextp.title='';
				AshUtil.filter.opacity(nextp.firstChild, 0.4);
			}

			this.listtable = N(pl, 'listtable');
			prev.onclick = function() {
				selectedIndex --;
				if(selectedIndex < 0) selectedIndex = 0;
				if(own.listtable.rows[selectedIndex] ) own.listtable.rows[selectedIndex].onclick();
			}
			next.onclick = function() {
				selectedIndex ++;
				if(selectedIndex > own.listtable.rows.length-1) selectedIndex = own.listtable.rows.length-1;
				if(own.listtable.rows[selectedIndex] ) own.listtable.rows[selectedIndex].onclick();
			}
			if(selectedIndex == 0) {
				prev.className='imagedisable';
				prev.onclick=null;
				prev.title='';
				AshUtil.filter.opacity(prev.firstChild, 0.4);
			}
			if(selectedIndex == own.listtable.rows.length-1) {
				next.className='imagedisable';
				next.onclick=null;
				next.title='';
				AshUtil.filter.opacity(next.firstChild, 0.4);
			}
		}
		this.loadDataByList = function(i, idx, index_number) {
			var variables = C(G.main.currentLDSet.variables);
			variables.post_idx = idx;
			variables.index_number = index_number;
			G.main.loadData( variables, G.main.currentLDSet.url);
		}
		this.showHidePostList = function(o) {
			this.showHidePostList.display = this.showHidePostList.display == 'none'? 'block': 'none';
			this.updateStatusPostList(o, true);
		}; this.showHidePostList.display = 'none';

		this.updateStatusPostList = function(o, accordionMode) {
			var main = N(o, 'main'), naming = N(o, 'naming');
			if(accordionMode) AshAccordion.apply(o, this.showHidePostList.display == 'block'? 'open': 'close');
			else main.style.display = this.showHidePostList.display;
			naming.firstChild.style.display = this.showHidePostList.display == 'none'? 'inline': 'none';
			naming.lastChild.style.display = this.showHidePostList.display == 'none'? 'none': 'inline';
		}

		/**
		*@ [2009.05.23. 추가]
			- 일반적인 방식은 AJAX를 검색로봇이 검색결과반영을 하지 못하는이유로 이것을 회피하기 위한 방법으로 추가된 메소드이다.
			즉 주소창에 직접 http://www.happyfri.com/blog/123 처럼 포스트 주소가 입력되었을때 이때는 content부부만 미리 출력되게 하고
			나머지 부분은 ajax데이터로 동적으로 추가되도록 분리한것이다.
			이렇게 되면 크롤러가 사이트에서 내용을 읽어갈때 content부분을 가져가는게 가능하고 이것은 검색사이트에서 관려내용이 표시될것이다.
			AJAX사용시 검색로봇 방식의 적용에 대한 자세한 설명은 main_no_ajax.php를 참고하고 이 메소드는 main_no_ajax.php에서만 호출하여 사용한다.

			※bodyNode부분은 main_no_ajax.php에서 이미 생성되어 있고 content의  innerHTML내용도 채워져 있다.
		*/
		this.createPostBodyNoAJAX = function(bodyNode, data, index) {
			this._createPostBody(bodyNode, data, index);
		}

		/**@ [2009.05.23 ] createPostBodyNoAJAX때문에 _createPostBody로 일부내용을 분리함 */
		this.createPostBody = function(data, index) {
			var b = G.main.addChild(this.postBody.cloneNode(true));
			N(b, 'content').innerHTML = data.content;
			N(b, 'address').innerHTML = 
				/*@ 제목을 플래시로 했기때문에 크롤러가 title로 인식하여 검색시 결과페이지 에서 제목으로 좀더 잘 반영할 수 있도록 title속성에 제목을 추가한다. */
				"<img src='"+imagesdir+"/arrow_r.gif'><a href='"+bu.home+data.idx+"' title='"+data.title+"' class='Addr'>"+bu.home+data.idx+"</a>";
			this._createPostBody(b, data, index);
		}

		this._createPostBody = function(b, data, index) {
			var ainfos;
			N(b, 'catname').innerHTML = this.getCategoryName(data);
			N(b, 'date').innerHTML = data.registerDate+'&nbsp;&nbsp;/';
			N(b, 'title').innerHTML = 
				"<embed src=\""+blogTitleSWF+"\" flashvars=\"titleText="+encodeURIComponent(data.title)+"&usemotion="+(index? 'none': 'ok')+"&\" width='100%' height='100%' "+
				"wmode='transparent' bgcolor='#ffffff' allowScriptAccess='always' type='application/x-shockwave-flash' pluginspage='http://www.adobe.com/go/getflashplayer' /></embed>";

			if(data.trackbackUrl) {
				var trbContainer = N(b, 'trackbackUrl');
				trbContainer.style.display = 'block';
				N(trbContainer, 'body').innerHTML = "<img src='"+skinImagesdir+"/trb_to.gif'>"+data.trackbackUrl;
			}

			var tags = data.tags.split(','), tagHtml = 'TAGS | &nbsp; ';
			for(var l = tags.length, i = 0; i < l; i++) tagHtml += "<a href='javascript:;' onclick=\"G.main.loadData( { tagName:this.innerHTML }, '"+bu.postRead+"?mode=tag');\" >"+tags[i]+"</a> &nbsp; ";
			N(b, 'tags').innerHTML = tagHtml;

			ainfos = N(b, 'additionsInfo');
			ainfos.targetTrb = N(b, 'additionsTrb');
			ainfos.targetCmt = N(b, 'additionsCmt');
			ainfos.innerHTML = '<span onclick="G.main.poster.showHideAdditions(parentNode.targetTrb, this);"><img src=\''+imagesdir+'/arrow_d.gif\' /> TRACKBACK:<strong>'+data.trackbackCount+'</strong></span> / '+
				'<span onclick="G.main.poster.showHideAdditions(parentNode.targetCmt, this);"><img src=\''+imagesdir+'/arrow_d.gif\' /> COMMENT:<strong>'+data.commentCount+'</strong></span>';

			if(data.trackbackStatus == 'open') {
				var urlText = bu.trbRegister+'/'+data.idx;
				N(ainfos.targetTrb, 'regTrbUrl').innerHTML = '<span>'+urlText+'</span>'+
				"<embed src='"+bu.f+"/ccopy.swf'  flashvars='urlText="+urlText+"&'  width='36' height='20' "+
				"wmode='transparent' allowScriptAccess='always' type='application/x-shockwave-flash' pluginspage='http://www.adobe.com/go/getflashplayer' /></embed>";
				
				if(data.trackback) {
					for(var l = data.trackback.length, i = 0; i < l; i++) this.createTrackback( ainfos.targetTrb, data.trackback[i] );
				}
			}
			else {
				ainfos.targetTrb.appendChild( this.closedtrb.cloneNode(true) );
			}

			if(data.commentStatus == 'allowed') {
				if(data.comment) {
					for(var l = data.comment.length, i = 0; i < l; i++) this.createComment( ainfos.targetCmt, data.comment[i] );
				}
			}
			else {
				ainfos.targetCmt.appendChild( this.closedcmt.cloneNode(true) );
			}
			b.data =  data;
		}
		this.createTrackback = function(container, data) {
			var c = container.appendChild( this.trackback.cloneNode(true) );
			N(c, 'title').innerHTML = "<a href='"+data.url+"' target='_blank'>"+data.title+"</a>";
			N(c, 'name').innerHTML = data.blog_name;
			N(c, 'excerpt').innerHTML = data.excerpt;
			N(c, 'date').innerHTML = data.registerDate;
			c.data = data;
		}
		this.createComment = function(container, data) {
			var c = container.appendChild( this.comment.cloneNode(true) );
			var rdl = data.replyDepth.split('|').length;
			if(rdl > 2) {
				c.style.marginLeft = ((rdl - 2)*20)+'px';
				N(c, 'replyd').innerHTML = "<img src='"+skinImagesdir+"/reply_d.gif'>&nbsp;&nbsp;";
			}

			// Hide the addCmtSpan
			if(rdl>10) N(c, 'addCmtSpan').style.display = 'none';

			if(data.viewType=='public' || data.loginAdmin) 
			{
				N(c, 'name').innerHTML = data.homepage || data.email? "<a href='"+this._buildURL(data)+"' target='_blank'>"+data.name+"</a>":	data.name;
				N(c, 'content').innerHTML = getConvertEngHtml(data.content, 'Eng');
			}
			else
			{
				N(c, 'name').innerHTML = "<span class='Button' onclick=' G.main.poster.showCmtSignIn(parentNode.parentNode.parentNode);' title='View Comment' ><img src='"+skinImagesdir+"/cmt_priv.gif'></span>";
				N(c, 'content').innerHTML = "<span class='Button' onclick=' G.main.poster.showCmtSignIn(parentNode.parentNode);' title='View Comment' style='color:#FFFFFF; background-color:#FF5501; letter-spacing:0px;'>This comment is private.</span>";
			}
			if(data.byAdmin == 'yes') N(c, 'name').innerHTML = "<img src='"+imagesdir+"/birdhoney.gif'>";
			N(c, 'date').innerHTML = data.registerDate;
			c.data = data;
		}

		this.editPost = function(obj) {
			G.main.loadContent(bu.post+'?mode=modify&post_idx='+obj.parentNode.parentNode.parentNode.data.idx);
		}
		this.deletePost = function(obj)
		{
			if(!confirm('Would you like to delete the post really?')) return;
			var url = bu.post+'?mode=delete&post_idx='+obj.parentNode.parentNode.parentNode.data.idx;
			var sajax = AshAJAX.send(function(event) {
				var rv = this.responseText;
				if(rv == 'NoLoginAdmin') {
					showLogin('G.main.reloadData();');
				}
				else if(rv == 'ok') {
					alert('the post has been removed.');
					G.setBlogHome(true);
				}
				else if(rv == 'fail') alert('working failed!');
				else alert(rv);
			}, null,'get', url);
		}
		this.deleteTrackback = function(data) 
		{
			if(!confirm('Would you like to delete the selected trackback really?')) return;
			var url = bu.trackback+'?mode=delete';
			var sendData = { idx:data.idx };
			var sajax = AshAJAX.send(function(event) {
				var rv = this.responseText;
				if(rv == 'NoLoginAdmin') {
					showLogin('G.main.reloadData();');
				}
				else if(rv == 'ok') {
					alert('trackback has been removed.');
					G.main.reloadData();
				}
				else if(rv == 'fail') alert('working failed!');
				else alert(rv);
			}, sendData,'post', url);
		}

		this.showHideAdditions = function(aobj, obj) {
			aobj.style.display = aobj.style.display == 'block'? 'none': 'block';
			var img = obj.getElementsByTagName('img')[0];
			if(img) img.src = aobj.style.display == 'block'? imagesdir+'/arrow_u.gif': imagesdir+'/arrow_d.gif';
		}

		this.showCmtSignIn = function(node, mode) {
			this.showCmtSignIn.node = node;
			this.showCmtSignIn.mode = mode;
			var cloner = AshPopup.manager.create(this.signinBox, null, false, null, false);
			N(cloner, 'password').focus();
		}
		this.hideCmtSignIn = function() {
			AshPopup.manager.clear();
		}
		this.onSubmitCmtSignIn = function(form) 
		{
			var node = this.showCmtSignIn.node, data = node.data;
			var mode = (this.showCmtSignIn.mode != 'delete' && data.viewType == 'private' && !data.loginAdmin)? 'unprotectprivate': this.showCmtSignIn.mode;
			var url =  bu.comment	+'?mode='+mode;
			var senddata = { idx:data.idx, pw:form.password.value };
			var sajax = AshAJAX.send(function(event) 
			{
				var rv = this.responseText;
				if(rv == 'ok') {
					if(mode == 'signin') G.main.commentWriter.show(data, true);
					else if(mode == 'delete') {
						alert('Comment has been removed.');
						G.main.reloadData();
					}
				}
				else if(rv == 'fail') alert('password mismatch.');
				else {
					if(mode == 'unprotectprivate') {
						var gdata = AshUtil.jsonToValue(rv);
						if(own.showCmtSignIn.mode == 'signin') G.main.commentWriter.show(gdata, true); // 비공개 해제 코멘트내용 수정.
						else // 비공개 해제 글 보기
						{
							if(gdata.byAdmin != 'yes') N(node, 'name').innerHTML = gdata.homepage || gdata.email? "<a href='"+own._buildURL(gdata)+"' target='_blank'>"+gdata.name+"</a>":	gdata.name;
							N(node, 'content').innerHTML = gdata.content;
						}
					}
					else alert(rv);
				}
			}, senddata, 'post', url);
			AshPopup.manager.clear();
			return false;
		}

		this._buildURL = function(data) {
			if(data.homepage) return data.homepage.search(/http:\/\//i) == -1? 'http://'+data.homepage: data.homepage;
			return data.email.search(/mailto:/i) == -1? 'mailto:'+data.email: data.email;
		}

		/**
		*@ Get Category Name.| with anchor tag.
		* description |
			- categoryData // index.php에 정의되어 있다.
		*/
		this.getCategoryName = function(data) 
		{
			var createAnchorTag = function(d) {
				return "<a href='javascript:;' onclick=\"G.main.loadData( { depth:'"+d.depth+"', itemType:'"+d.itemType+"' }, '"+bu.postRead+"?mode=category' ); return false;\">"+d.name+"</a>";
			}
			if(data.category_name) {
				var catFrom = function(n) {
					for(var i in categoryData.category) 
						if(categoryData.category[i].depth == n) return createAnchorTag(categoryData.category[i]);
					return '';
				}
				var deps = data.category_depth.split('|'), fstr = '';
				for(var l = deps.length, sd='', i=0; i < l-1; i++) {
					sd += i==0? deps[i]: '|'+deps[i];
					fstr += catFrom(sd) +" / ";
				}
				return fstr + createAnchorTag( {depth:data.category_depth, name:data.category_name, itemType:'item' } );
			}
			return createAnchorTag({ depth:'nocategory', name:'No Category', itemType:'item' });
		}

		/**
		*@ Create the onclick event for default to the img elements that contains the Main elements.
		*/
		this.setImageOnclickEvent = function() {
			var imgs = G.Main.getElementsByTagName('img');
			for(var l = imgs.length, o, i = 0; i<l; i++) {
				o = imgs[i];
				if( o.className != '_NP' && o.src.indexOf('blog/images') == -1 && o.src.indexOf('blog/skin') == -1 && o.src.indexOf('AshHtmlEditor') == -1 ) 
				{
					if( o.parentNode.nodeName.toUpperCase() != 'A') {
						o.style.cursor = 'pointer';
						o.onclick = function() {
							GIVS(this.src);
						}
					}

					/** for only ie.*/
					o.onmouseover = function() {
						this.style.filter = "progid:DXImageTransform.Microsoft.BasicImage(grayScale=1)";
					}
					o.onmouseout = function() {
						this.style.filter = '';
					}
				}
			}
		}

		/**
		*@ If the elements that has a specified cname's attribue does exist in the Main, execute a eval function  as js code to the elements' innerText.
		*/
		this.evalCodeInContent = function() {
			var elements = CN(G.Main, 'code');
			for(var l = elements.length, i = 0; i<l; i++) eval(AshUtil.getInnerText(elements[i]));
		}
	});


	this.main.commentWriter =  new AshAgent(null, function()
	{
		var own = this;
		this.owner = (function() {
			var ele = Do.createElement('div');
			ele.setAttribute('id', 'CmtWriter');
			ele.innerHTML = "\
			<div class='Main'>\
				<span class='Close' title='Close' onclick='G.main.commentWriter.hide();'><img src='"+imagesdir+"/close.gif'' /></span>\
				<div class='IText' ashdrag='true' ashdragtarget='parent.parent' ondragstart='return false;' onselectstart='return false;'>\
					<img src='"+imagesdir+"/arrow_d.gif'> LEAVE A COMMENT.\
				</div>\
				<div class='Division'>\
					<div class='L'>NAME |</div><div class='R'><input type='text' name='name'  /></div> <div> &nbsp; &nbsp; PASSWORD <input type='password' name='password' style='width:70px;' /></div>\
				</div>\
				<div class='Division'>\
					<div class='L'>EMAIL |</div><div class='R'><input type='text' name='email'  /></div>\
				</div>\
				<div class='Division'>\
					<div class='L'>HOMEPAGE |</div><div class='R'><input type='text' name='homepage' value='http://' /></div>\
				</div>\
				<div class='ExeEditor'>\
					<label title='HTML태그 사용' ><input type='checkbox' name='chkboxHtml' onfocus='blur();' onclick='G.main.commentWriter.execeditorShowHide();' >HTML</label>\
					<span name='execeditor' onclick='G.main.commentWriter.execEditor();' title='에디터실행'><img src='"+imagesdir+"/arrow_r.gif'> EDITOR</span>\
					<label  title='비공개' ><input type='checkbox' name='chkboxViewType' onfocus='blur();' >PRIVATE</label>\
				</div>\
				<div class='Cform' >\
					<textarea name='content' ></textarea><div name='dummydiv'></div>\
				</div>\
				<div class='MenuWrapper' >\
					<div class='MenuBasic2' onclick='G.main.commentWriter.submit();' title='전송'><span>Submit</span></div>\
					<div class='MenuBasic2' onclick='G.main.commentWriter.hide();' title='취소'><span>Cancel</span></div>\
				</div>\
			</div>";
			return Do.body.appendChild(ele);
		})();

		this.saveMode = 'write';
		this.name			= this.getChildByName('name');
		this.pw				= this.getChildByName('password');
		this.email			= this.getChildByName('email');
		this.homepage		= this.getChildByName('homepage');
		this.content			= this.getChildByName('content');
		this._chkboxHtml		= this.getChildByName('chkboxHtml');
		this._chkboxViewType = this.getChildByName('chkboxViewType');
		this._execeditor		= this.getChildByName('execeditor');
		this._div				= this.getChildByName('dummydiv');
		this._div.onEditorPanelCallback = function(eventType) {
			if(eventType == AshEditorPanel.OK) {
				own.content.value = own._div.innerHTML;
				own._chkboxHtml.checked = true;
				own.execeditorShowHide();
			}
		}

		this.dimLayer = new AshDimLayer(this.owner);
		this.dimLayer.onApply = function(e)
		{
			var d = Do.documentElement;
			var s = AshUtil.document.scrollInfo(), w = own.getWidth(), h = own.getHeight(), dw = d.clientWidth, dh = d.clientHeight;
			var x = s.left + (dw/2 - w/2), y = s.top + (dh/2 - h/2);
			own.move(x, y);
		}
		this.dimLayer.onClear = function(e) {};

		this.execeditorShowHide = function() {
			this._execeditor.style.display = this._chkboxHtml.checked? 'inline': 'none';
		}
		this.show = function(data, editmode) 
		{
			window.createEditorPanel();
			this.dimLayer.apply(0.1);
			this.saveMode = 'write';
			this._chkboxHtml.checked = this._chkboxViewType.checked =  false;
			
			this.idx = data.replyDepth? data.idx: 'isPost' // comment table 일때만 적용하기 위해.
			this.post_idx = data.post_idx != null? data.post_idx: data.idx;
			this.replyCount = data.replyCount;
			this.replyDepth = data.replyDepth || '0';
			this.replyViewType = data.viewType;

			if(editmode) {
				this.saveMode = 'modify';
				this.name.value = data.name;
				this.email.value = data.email;
				this.homepage.value = data.homepage;
				this.content.value = data.content;
				if(data.html == 'yes' ) this._chkboxHtml.checked = true;
				if(data.viewType == 'private' ) this._chkboxViewType.checked = true;
			}
			else this.name.value = this.pw.value = this.email.value = this.homepage.value = this.content.value = '';
			this.name.focus();
			this.execeditorShowHide();
		}
		this.hide = function() {
			this.dimLayer.clear();
		}
		this.execEditor = function() {
			this._div.innerHTML = this.content.value;
			window.editPanel.show(this._div, 500, 350);
		}
		this.submit = function() 
		{
			if(this.name.value.length < 1) {
				alert('please input your name.');
				this.name.focus();
				return;
			}
			if(this.pw.value.length < 1) {
				alert('please input your password.');
				this.pw.focus();
				return;
			}
			if(this.content.value.length < 1) {
				alert('please type a comment.');
				this.content.focus();
				return;
			}
			var url =  bu.comment	+'?mode='+this.saveMode;
			var data = { idx:this.idx, post_idx:this.post_idx, replyCount:this.replyCount, replyDepth:this.replyDepth, replyViewType:this.replyViewType,
				name:this.name.value, pw:this.pw.value, email:this.email.value, homepage:this.homepage.value, content:this.content.value,  
				html:this._chkboxHtml.checked? 'yes': 'no', viewType:this._chkboxViewType.checked? 'private': 'public' };
			var sajax = AshAJAX.send(function(event) {
				var rv = decodeURIComponent( this.responseText );
				if(rv == 'ok') {
					G.main.reloadData();
				}
				else if(rv == 'fail') alert('working failed!');
				else alert(rv);
			}, data,'post', url);
			this.hide();
		}
	});
}

wEvent.addEventListener('load', function(e) {
	//Do.documentElement.style.overflowY = 'auto';
	//Do.documentElement.style.overflowX = 'hidden';

	/**@ window.blogMainWindow ==> iframe에서도 blog.js를 사용하는데 iframe쪽에서는 MainWindow가 아니므로 실행되지 않게 하기위한 조치.*/
	if(window.blogMainWindow != null && AshUtil.browser.ie6) ie6PNG( CN(O('top'), 'logo')[0], skinImagesdir+'/logo.png'); 
});