kr.co.uhsoft.framework.Util.defineClass("kr.co.uhsoft.LinkManager",function(){
	var EMPTY="I_GREENEE_EMPTY_I";
	var CACHE_ID="I_CACHE_NODE_I";
	var rootPathMark="RootPath";
	this.rootPath="";
	this.dummy="dmy";
	
	this.getRootPathMark=function(){
		return rootPathMark;	
	}
	
	this.getEmpty=function(){
		return EMPTY;	
	}
	
	this.getCacheId=function(){
		return  CACHE_ID;	
	}
});	

kr.co.uhsoft.LinkManager.prototype.isEmpty=function(id){
	var elem=document.getElementById(id);
	var empty=this.getEmpty();
	if(elem.getAttribute("name")==null || elem.getAttribute("name")==empty){
		return true;
	}else{
		return false;
	}	
};

kr.co.uhsoft.LinkManager.prototype.isExist=function(id){
	var elem=document.getElementById(id);
	if(elem){
		return true;
	}else{
		return false;
	}
};

kr.co.uhsoft.LinkManager.prototype.getCacheContainer=function(cacheId){
	if(!cacheId){
		cacheId=this.getCacheId();
	}
	
	var cacheContainer=document.getElementById(cacheId);
	if(!cacheContainer){
		var bodyElem=document.getElementsByTagName("body").item(0);
		var newDiv=document.createElement("div");
		newDiv.setAttribute("id",cacheId);
		bodyElem.appendChild(newDiv);
		newDiv.style.display="none";
		cacheContainer=document.getElementById(cacheId);
	}
	
	return cacheContainer;
		
};

kr.co.uhsoft.LinkManager.prototype.createTextarea=function(id,parentId){
	if(this.isExist(id)){
		var elem=document.getElementById(id);
		var parent=elem.parentNode;
		parent.removeChild(elem);	
	}
	
	var textarea=document.createElement("textarea");
	textarea.setAttribute("id",id);
	textarea.style.display="none";
	
	if( !parentId || !document.getElementById(parentId)){
		var parent=this.getCacheContainer();
		parent.appendChild(textarea);
	}else{
		document.getElementById(parentId).appendChild(textarea);
	}
	
	return textarea;
};

kr.co.uhsoft.LinkManager.prototype.createDiv=function(id,parentId){
	var div=document.createElement("div");
	div.setAttribute("id",id);
	div.style.display="none";
	if(parentId && document.getElementById(parentId)){
		document.getElementById(parentId).appendChild(div);
	}
		
	return div;
};

kr.co.uhsoft.LinkManager.prototype.process=function(param){
	if(param.url==null ){
		render(param);
		return;
	}
	
	var url=param.url;
		
	if(url.indexOf("?")>0){
		url=url+"&dmy="+new Date().getTime();
	}else{
		url=url+"?dmy="+new Date().getTime();
	}
	
	if(param["target"] && "form"==param["target"].nodeName.toLowerCase()){
		 var paramArray = $(param["target"]).formToArray();
		 param.formData={};
		 for(var i=0;i<paramArray.length;i++){
		 	if( 'noEncode' == $(param.target[paramArray[i].name]).attr('class')  ){
		 		param.formData[paramArray[i].name]=paramArray[i].value;
			}else{
		 		param.formData[paramArray[i].name]=encodeURIComponent(paramArray[i].value);
			}
		 }
		 $.post( url, param.formData, processRequestChange );
	}else{
		
		$.get( url, processRequestChange );
	}
		
	function processRequestChange(dom) {	
		try{
			
			if(!dom || !dom.documentElement){
				return;
			}		
			var root=dom.documentElement;
			var state=root.getAttribute("status");
				
			if(state=="error"){
				var errorId=root.getAttribute("errorId");
				var message=root.getElementsByTagName("errorMsg").item(0).firstChild.nodeValue;
				throw new kr.co.uhsoft.BasicException(message,errorId);
			}else if(state=="empty"){
				return ;
			}
			
			if(root.getElementsByTagName("result").item(0)){
    			var resultData=root.getElementsByTagName("result").item(0).firstChild.nodeValue;
			
				param.result= eval("("+resultData+")");
			
				if(param.result["template"] ){
					param["manager"].setTemplate(param.result["template"]);
				}
				
				if(!param["viewId"] && param.result["viewId"]){
					param["viewId"]=param.result["viewId"];	
				}
				
				if(param.result["theme"] && param.result["theme"].cache  ){
					cacheHolder.add( param.result["theme"].name, param.result["theme"].id);
				}
				
				if( param.result["theme"] ){
					if( param.result["theme"].jst ){
						param["manager"].setTemplate(param.result["theme"]);	
					}
					param.result.templateId=param.result["theme"].id;
					param["viewId"]=param.result["theme"].viewId;
					param.result.cache=param.result["theme"].cache;
				}
				
			}			
			
			
			param["manager"].render(param);
			
		}catch(e){
			$('#LoadingWindowContent').hide();
			if(e.getMessage){
				alert(e.getMessage());
			}else if( e.description ){
				alert(e.description);
			}else{
				alert("에러 발생 관리자에게 문의해 주세요");
			}
			
		}finally{
			
		}
		
	}
	
};


kr.co.uhsoft.LinkManager.prototype.loadTemplate=function(param){
		
	var url=param.jstUrl;	

	if(url.indexOf("?")>0){
		url=url+"&dmy="+new Date().getTime();
	}else{
		url=url+"?dmy="+new Date().getTime();
	}
	
	$.get( url, processRequestChange );
	
	function processRequestChange(data) {
    	try{
			param.result["template"].jst=data;
			param["manager"].setTemplate(param.result["template"]);
       		
			
			if(param.afterProcess){
				param.afterProcess(param);
			}
			
    	}catch(e){
			
			alert(" loadTemplate Error:\n" + e);
		}
	}
		
};

kr.co.uhsoft.LinkManager.prototype.setTemplate=function(template){
	if(template && template["id"] && template["jst"] ){
		var textarea=this.createTextarea(template["id"],template["parentId"]);
		textarea.value=template["jst"];
	}
};

kr.co.uhsoft.LinkManager.prototype.removeTemplate=function(id){
	if(this.isExist(id)){
		var elem=document.getElementById(id);
		var parent=elem.parentNode;
		parent.removeChild(elem);	
	}
};


kr.co.uhsoft.LinkManager.prototype.getResultHtml=function(jstId,data){
	if(jstId==null){
		return data;
	}else{
		return TrimPath.processDOMTemplate(jstId, data);
	}
};	

kr.co.uhsoft.LinkManager.prototype.getResultStringHtml=function(jstString,data){
	if(jstString==null){
		return data;
	}else{
		var myTemplateObj = TrimPath.parseTemplate(jstString);
    	var result  = myTemplateObj.process(data);
		return result;
	}
};


kr.co.uhsoft.LinkManager.prototype.render=function(param){
	param["message"]=messageHolder;
	
	/*
	if(!param.viewId){
		return;
	}
	*/
	
	var viewId=param.viewId;
	var templateId=param.result.templateId;
	
	var result=null;
	if(templateId){
		try{
		
		result = this.getResultHtml(templateId,param);	
		result = result.replaceAll(this.getRootPathMark(),this.rootPath);
		}catch(e){
			if(e.description){
				alert(e.description);
			}else{
				alert("render error");
			}
		}
		if(param.result["theme"] && !param.result.cache){
			this.removeTemplate(templateId);
		}
		
		$("#htmldebug").val(result );
		
	}
	
	if(viewId && result!=null){	
		var views=viewId.split(":");
		
		if(views.length<2){
			var viewContainer=document.getElementById(views[0]);
			if(viewContainer){
				viewContainer.innerHTML=result;
				this.processSource(viewContainer);
			}
		}else{ 
			 
			var viewContainer=document.getElementById(views[0]);
			var dir=views[1];
			if("first"==dir){
				if(viewContainer.firstChild){
					$(viewContainer.firstChild).before(result);
				}else{
					viewContainer.innerHTML=result;
				}
				this.processSource(viewContainer.firstChild);
				
			}else if("next"==dir){
				if(viewContainer.nextSibling){
					$(viewContainer.nextSibling).before(result);
				}else{
					$(viewContainer.parentNode).append(result);
				}
				this.processSource(viewContainer.nextSibling);
				
			}else if("append"==dir){
				$(viewContainer).append(result);
				this.processSource(viewContainer.lastChild);
				
			}
			
		}
	}
	
	
	//TB_remove();
	if(param.result && param.result.afterProcess){
		param.result.afterProcess(param);
	}
};

kr.co.uhsoft.LinkManager.prototype.processSource=function(elem){
	this.registerLink(elem);
	$('.popUpWindowOpen', elem).bind('click',popUpWindowOpenBind);
	
	$(".isFlash",elem ).each(function(i){
   			var src = $(this).text();
   			$(this).empty();
   			var width=$(this).attr('width');
   			var height=$(this).attr('height');
   			$(this).flash({ 
				src: src,
				width: width,
				height: height,
				wmode:"transparent"
				},
				{ expressInstall: true }
			);
 	});
}

kr.co.uhsoft.LinkManager.prototype.queryParsing=function(query){
	
	if(query.indexOf('?') == 0){
		query=query.substring(1);
	}
	
	var delim="&";
	if(query.indexOf("&")>-1){
		query=query.replaceAll("&amp;","&");
	}
	 
	var tempValues=query.split(delim);
    var params={};
    for(i=0;i<tempValues.length;i++){
    	var temp=tempValues[i].split("=");
    	if(temp.length>1){
    		params[temp[0]]=temp[1];
    	}
    }
    return params;
};

kr.co.uhsoft.LinkManager.prototype.addEventHandler = function (oTarget, sEventType, fnHandler) {
    if (oTarget.addEventListener) { //for DOM-compliant browsers
        oTarget.addEventListener(sEventType, fnHandler, false);
    }else if (oTarget.attachEvent) { //for IE
        oTarget.attachEvent("on" + sEventType, fnHandler);
    }else { //for all others
        oTarget["on" + sEventType] = fnHandler;
    }
};

kr.co.uhsoft.LinkManager.prototype.removeEventListener = function (oTarget, sEventType, fnHandler) {
    if (oTarget.removeEventListener) { //for DOM-compliant browsers
        oTarget.removeEventListener(sEventType, fnHandler, false);
    }else if (oTarget.detachEvent) { //for IE
        oTarget.detachEvent("on" + sEventType, fnHandler);
    }else { //for all others
        oTarget["on" + sEventType] = null;
    }
};

kr.co.uhsoft.LinkManager.prototype.setRootPath=function(elem){
	
	if(elem==null){
		elem=document;
	}
	
	var rootPathMark=this.getRootPathMark();
	var rootPath=this.rootPath;
	var imgList=elem.getElementsByTagName("img");
    for(var i=0;i<imgList.length;i++){
    	var src=$(imgList[i]).attr("src");
    	var index=src.indexOf(rootPathMark);
    	if(index>-1){
    		src=src.substring(index+rootPathMark.length+1);
    		src=rootPath+src;
    		$(imgList[i]).attr("src",src);
    	}			
    }
    	
	var linkList=elem.getElementsByTagName("a");
    for(var i=0;i<linkList.length;i++){
		if(!$(linkList[i]).attr("href")){
			continue;
		}
		
    	var href=$(linkList[i]).attr("href");
    	var index=href.indexOf(rootPathMark);
    	if(index>-1){
    		href=href.substring(index+rootPathMark.length+1);
    		href=rootPath+src;
    		$(linkList[i]).attr("href",src);
    	}
    }	
};


kr.co.uhsoft.LinkManager.prototype.register=function(elem){
	
	
	
	if( elem.getAttribute("href") ){
    	var hrefStr=elem.getAttribute("href");
		
		var index = hrefStr.indexOf("ajax");
    	if(index>0){
			this.addEventHandler(elem,"click",this.execute);
    	}
	}
	/*
	else if ("form"==elem.nodeName.toLowerCase()){
    	var hrefStr=elem.getAttribute("action");
		var index = hrefStr.indexOf("ajax");
    	if(index>0){
			this.addEventHandler(elem,"submit",this.execute);
    	}
		
	}
	*/
};

kr.co.uhsoft.LinkManager.prototype.registerLink=function(elem){
	this.setRootPath(elem);
	if(elem==null){
		elem=document;
	}else if("a"==elem.nodeName.toLowerCase() || "form"==elem.nodeName.toLowerCase()){
		this.register(elem);
		return;
	}
	
	var linkList=elem.getElementsByTagName("a");
    for(var i=0;i<linkList.length;i++){
    	var src=linkList[i];
    	this.register(src);
    }
	
	var ereaList=elem.getElementsByTagName("area");
    for(var i=0;i<ereaList.length;i++){
    	var src=ereaList[i];
    	this.register(src);
    }
	/*
	linkList=elem.getElementsByTagName("form");
    for(var i=0;i<linkList.length;i++){
    	var src=linkList[i];
    	this.register(src);
    }
	*/
};

kr.co.uhsoft.LinkManager.prototype.executeForm=function(form){
    //$('#LoadingPageContainer').jqmShow();
	//TB_show("loading","#TB_inline?height=100&width=150&inlineId=OnLoadingPageContent", false);
	
	var target = form;
    var hrefStr=target.getAttribute("action");
	try{ 
    	var index = hrefStr.indexOf("?");
    	
    	if(index<0){
    		throw "link";
    	}
    	var jsParam= linkManager.getJSParam(hrefStr);
		jsParam.target=target;
		linkManager.process(jsParam);
		
	}catch(error){
		//$('#LoadingPageContainer').jqmHide();
		//TB_remove();
		form.submit();
	}
	
};

kr.co.uhsoft.LinkManager.prototype.getJSParam=function(hrefStr){
	
		var index = hrefStr.indexOf("?");
    	
    	if(index<0){
    		throw "link";
    	}
    	
    	var params=this.queryParsing(hrefStr.substr(index+1));
    	
		var jsParam= new kr.co.uhsoft.JSParam();
		jsParam["manager"]=linkManager;
		jsParam.query=params;
		
		hrefStr="";
		for(var name in params){
			if(name != this.dummy){
				hrefStr+=name+"="+encodeURIComponent(params[name])+"&"
			}
		}
		
		/*
		if(!jsParam.query["tplid"] || !document.getElementById(jsParam.query["tplid"])){
			hrefStr+="tpl=true";	
		}
		*/
		if( !jsParam.query["_jst"] && this.needTemplate( jsParam.query["command"] ) ){
			hrefStr+="_jst=true&tpl=true";
		}
		
		delete jsParam.query["tplid"];
		jsParam.url=this.rootPath+"/controller/Controller.jsp?"+hrefStr;
		jsParam.viewId=jsParam.query["viewId"];
		return jsParam;
	
}

kr.co.uhsoft.LinkManager.prototype.needTemplate=function(name){
	if(cacheHolder.isExist(name)){
		var templateId=cacheHolder.get(name);
		if( document.getElementById(templateId) ){
			return false;
		}else{
			return true;
		}
	}else{
		return true;
	}
}

kr.co.uhsoft.LinkManager.prototype.execute=function(event){
	try{ 
		//$('#LoadingPageContainer').jqmShow();
		//TB_show("loading","#TB_inline?height=100&width=150&inlineId=OnLoadingPageContent", false);
		if (!event) event = window.event;
    	var target = event.target || event.srcElement;
	
		if(window.event){
    		window.event.returnValue = false;
   		}else{
			//event.stopPropagation(); 
       		event.preventDefault();
   		}
		
		var hrefStr;
		
		if("a" == target.nodeName.toLowerCase() || "area" == target.nodeName.toLowerCase() ){
			hrefStr=target.getAttribute("href");
		}else{
			var parent=$(target).parent();
			while(!parent.is("a")){
				parent=parent.parent();
			}
			hrefStr = parent.attr("href");
		}
		
    	if(!hrefStr){
			throw "error";
		}
		
		dhtmlHistory.add(new Date().getTime(), hrefStr);
		
    	var jsParam=linkManager.getJSParam(hrefStr);
		jsParam.urlHistory=hrefStr;
		jsParam.target=target;
		
		linkManager.process(jsParam);
		
		
	}catch(error){
		//$('#LoadingPageContainer').jqmHide();
		//TB_remove();
		document.location.href=hrefStr;
	}
	
};

kr.co.uhsoft.LinkManager.prototype.executeHistroy=function(url){
	try{ 
		if(!url){
			return;
		}
		
		//$('#LoadingPageContainer').jqmShow();
    	var hrefStr=url;
    	
		var jsParam= linkManager.getJSParam(hrefStr);
		
		linkManager.process(jsParam);
		
	}catch(error){
		alert(error);
		//$('#LoadingPageContainer').jqmHide();
	}
	
};


kr.co.uhsoft.framework.Util.defineClass("kr.co.uhsoft.JSParam",function(){
	this.jstUrl=null;
	this.jstId=null;
	this.url=null;
	this.direction=null;
	this.result=null;
	this.viewId=null;
	this.newId=null;
	this.isCache=true;
	this.formId=null;
	this.error=null;
});// end of class JSParam

//Singleton Method
function getLinkManager(){
	if(!window.linkManager){
		window.linkManager=new kr.co.uhsoft.LinkManager();
	}
	
	return window.linkManager;
}

//create commandFactory
getLinkManager();

/* PopUpWindow Start  */

function setPositionCenter(id){
	//$('#id').width() ie6에서 화면 지움 
	
	var width=parseInt($('#'+id).css("width"));
	var height=parseInt($('#'+id).css("height"));
	
	//var width=parseInt($('#'+id).width());
	//var height=parseInt($('#'+id).height());
	
	if (isNaN(width)){
		width=300;
	}
	
	if (isNaN(height) || height < 200 ){
		height=200;
	}
	
	var scrollLeft= $(window).scrollLeft() ;
	var scrollTop= $(window).scrollTop() ;
	//alert("scrollLeft:"+scrollLeft +" scrollTop:"+scrollTop);
	//alert("screen.availWidth:"+screen.availWidth +" screen.availHeight:"+screen.availHeight);
	var left= Math.floor( ( screen.availWidth -  width ) /2 ) + scrollLeft ;
	var top=  Math.floor( ( screen.availHeight - height ) /2 )+ scrollTop ;
	
	//alert("left:"+left +" top:"+top);
	if(left < 1) left= scrollLeft +10 ;
	if(top < 1 ) top= scrollTop + 10 ;
	
	$('#'+id).css("top", top); 
	$('#'+id).css("left", left);
	
}


function setPopUpWindowInfo(){
	var id=$("#PopUpWindowOpenId").val();
	var info; 
	if( document.getElementById(id) ){
		info= eval("("+$('#'+id).attr("rel")+")");
	}
	var cWidth=400;
	var cHeight=300;
	
	var title="PopUp Window";
	if(info && info.width && info.height && info.width > 100 && info.height > 50 ){
		if(info.width < 100){
		 	cWidth=100;
		}else{
			cWidth=info.width;
		}
		
		if(info.height < 50){
		 	cHeight=50;
		}else{
			cHeight=info.height; 
		}
		
	}
	var width=cWidth+2 ;
	var height=cHeight + 25 + 2;
	
	if(info && info.title){
		title=info.title;
	}
	
	$('#PopUpWindowTopContent').html(title);
	
	$('#PopUpWindow').css("width",width );
	$('#PopUpWindow').css("height",height );
	$('#PopUpWindowContent').css("width",cWidth );
	$('#PopUpWindowContent').css("height",cHeight);
	
	var scrollLeft= $(window).scrollLeft() ;
	var scrollTop= $(window).scrollTop() ;
	
	var left= Math.floor( ( screen.availWidth -  width ) /2  + scrollLeft );
	var top=  Math.floor( ( screen.availHeight - height ) /2 + scrollTop );
		
	if(left < 1) left= scrollLeft +10 ;
	if(top < 1 ) top= scrollTop + 10 ;
	
	$('#PopUpWindow').css("top", top); 
	$('#PopUpWindow').css("left", left);
	
}

openPopUpWindow=function(id,flag){
	if(flag){
		$('#PopUpWindowContent').empty();
		$('#PopUpWindowContent').append($('#OnLoadingPageContent').clone());
	}
	
	$("#PopUpWindowOpenId").val(id);
	setPopUpWindowInfo();
		
	if($('#PopUpWindow').css('display') == 'none') {
		$('#PopUpWindow').show();
	}
};

closePopUpWindow=function(){
	return popUpWindowCloseBind();
}

popUpWindowOpenBind=function(id){
	
	$('#PopUpWindowContent').empty();
	$('#PopUpWindowContent').append($('#OnLoadingPageContent').clone());
	
	if($('#PopUpWindow').css('display') != 'none') {
		closePopUpWindow();
	}
	
	$("#PopUpWindowOpenId").val( $(this).attr("id") );
	setPopUpWindowInfo();
	if($('#PopUpWindow').css('display') == 'none') {
		$('#PopUpWindow').show();
	}
	this.blur();
	return false;
};

popUpWindowCloseBind=function(){
	if($('#PopUpWindow').css('display') != 'none'){
		$('#PopUpWindow').TransferTo(
			{
				to:$("#PopUpWindowOpenId").val(),
				className:'transferer2', 
				duration: 400
			}
		).hide();
	}
	return false;
};
/* PopUpWindow End  */
