/**
 * @author setzer(mmx900@gmail.com)
 * @version 0.9.3, 06/20/08
 * index.html를 위한 자바스크립트 인터페이스.
 */
var JEnv = new function(){
	this.rootUri = "http://ms-server.portfolioad.com/korea/windowsvista/";
	this.browser = navigator.userAgent.indexOf("MSIE") != -1 ? 'IE' : 'ETC';
	this.browserVersion = this.browser=="IE" ? parseFloat(navigator.userAgent.substring(navigator.userAgent.indexOf("MSIE")+5)) : "unknown";
	this.isIE6 = (this.browser == "IE" && this.browserVersion == "6");
	//ie7 이하는 low performance.
	this.performance = this.browser == "IE" && this.browserVersion < 8 ? "low" : "high";
}

var JHistoryList = function(){
	this.items = new Array();
	this.length = 0;
	this.cursor = -1;
	this.locked = false;
	this.get = function(idx){
		return this.items[idx];
	}
	this.add = function(obj){
		if(!this.locked){
			//forward 가능한 상태에서 새 페이지를 열었을 경우 forward 히스토리를 비워버림
			if(this.cursor > 0) this.items = this.items.slice(0,this.cursor+1);
			this.items.push(obj);
			this.length = this.items.length;
			this.cursor = this.length-1;
		}
	}
	this.remove = function(obj){
		var tmpArr = new Array();
		for(i=0;i<this.items.length;i++){
			if(this.items[i] != obj){
				tmpArr.push(this.items[i]);
			}
		}
		this.items = tmpArr;
		this.length--;
	}
	this.getCurrent = function(){
		return this.cursor == -1 ? false : this.items[this.cursor];
	}
	this.goBack = function(){
		if(this.cursor > 0) this.cursor--;
		return this.getCurrent();
	}
	this.goForward = function(){
		if(this.cursor < this.length-1) this.cursor++;
		return this.getCurrent();
	}
	
}

var JWindow = function(){
	this.domObj = null;//DOM
	this.title = null;
	
	//size, position
	this.width = 0;
	this.height = 0;
	this.top = 0;
	this.left = 0;
	this.margin_x = 0;
	this.margin_y = 0;
	
	//status
	this.drag = false;
	this.resize_NW = false;
	this.resize_NE = false;
	this.resize_SW = false;
	this.resize_SE = false;
	this.maximized = false;
	
	//resize event listener
	this.resizeListener = null;
	
	//json metadata
	this.meta = null;

	this.init = function(obj){
		this.domObj = obj;
		this.update();
		
		return this;
	}
	
	//components(DOM)
	var contentFrame = null;//페이지가 열리는 object(iframe)
	var addressBar = null;//div.address_var
	
	this.getContentFrame = function(){
		if(!contentFrame){
			var c = getFirstElementByClassName(this.domObj, 'div', 'content');
			contentFrame = (JEnv.browser == "IE") ? c.getElementsByTagName('iframe')[0] : c.getElementsByTagName('object')[0];
		}
		return contentFrame;
	}
	
	this.getAddressBar = function(){
		if(!addressBar){
			addressBar = getFirstElementByClassName(this.domObj, 'div', 'address_bar')
		}
		return addressBar;
	}
	
	this.setTitle = function(titleStr, titleHTML){
		this.title = titleStr;
		this.getAddressBar().innerHTML = titleHTML;
	}
	
	this.update = function(){ 
		if(!this.maximized){//최대화 상태에서는 의미가 없으므로 조사하지 않음
			this.width = parseInt(this.domObj.offsetWidth);
			this.height = parseInt(this.domObj.offsetHeight);
			this.top = parseInt(this.domObj.offsetTop);
			this.left = parseInt(this.domObj.offsetLeft);
		}
	}
	
	this.hide = function(){
		this.domObj.style.visibility='hidden';
	}
	
	this.show = function(){
		this.domObj.style.visibility='visible';
	}
	
	//포커스를 얻음
	this.focus = function(){
		this.domObj.style.zIndex = 80000;
		if(JEnv.isIE6){
			this.domObj.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/bg_navy_trans_90p.png', sizingMethod=scale)"
		}else{
			this.domObj.style.background = "url(img/bg_navy_trans_90p.png)";
		}
	}
	 
	//포커스를 잃음
	this.blur = function(){
		this.domObj.style.zIndex = 75000;
		if(JEnv.isIE6){
			this.domObj.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/bg_navy_trans_70p.png', sizingMethod=scale)"
		}else{
			this.domObj.style.background = "url(img/bg_navy_trans_70p.png)";
		}
	}
	
	//포커스를 가지고 있는지 확인
	this.hasFocus = function(){
		return this.domObj.style.display != 'none' ? (this.domObj.style.zIndex == 80000 ? true : false) : false;
	}
	
	this.maximize = function(){
		if(JEnv.isIE6) this.hide(); //ie6에서 내부 iframe의 width가 윈도우 창(div id=window)을 클릭하기 전에는 자동으로 100%가 되지 않는 버그를 해결한다.
		if(!this.maximized){
			this.update();//현재의 창 크기와 위치 등을 기억
			this.domObj.style.width='100%';
			this.domObj.style.height='100%';
			this.domObj.style.top=0;
			this.domObj.style.left=0;
			this.maximized=true;
		}else{
			this.domObj.style.width = this.width + "px";
			this.domObj.style.height = this.height + "px";
			this.domObj.style.top=this.top + "px";
			this.domObj.style.left=this.left + "px";
			this.maximized=false;
		}
		//등록된 이벤트 리스너가 있을 경우 실행한다.
		if(this.resizeListener) this.resizeListener(this);
		if(JEnv.isIE6) this.show();
	}
	/*대상(domObj)에 padding,margin,border 등 설정되어 있을 경우 리사이징시 문제가 생김.*/
	this.resize_NW_handler = function(e_x, e_y){
		if(!this.maximized){
			//TODO 최소크기 설정할것
			this.domObj.style.top = e_y + "px";
			this.domObj.style.height = ((this.height + this.top) - e_y) + "px";
			this.domObj.style.left = e_x + "px";
			this.domObj.style.width = ((this.width + this.left) - e_x) + "px";
			this.update();
		}
		//등록된 이벤트 리스너가 있을 경우 실행한다.
		if(this.resizeListener) this.resizeListener(this);
	}
	
	this.resize_NE_handler = function(e_x, e_y){
		if(!this.maximized){
			this.domObj.style.top = e_y + "px";
			this.domObj.style.height = ((this.height + this.top) - e_y) + "px";
			this.domObj.style.width = (e_x - this.left) + "px";
			this.update();
		}
		if(this.resizeListener) this.resizeListener(this);
	}
	
	this.resize_SW_handler = function(e_x, e_y){
		if(!this.maximized){
			this.domObj.style.left = e_x + "px";
			this.domObj.style.width = ((this.width + this.left) - e_x) + "px";
			this.domObj.style.height = (e_y - this.top) + "px";
			this.update();
		}
		if(this.resizeListener) this.resizeListener(this);
	}
	
	this.resize_SE_handler = function(e_x, e_y){
		if(!this.maximized){
			this.domObj.style.width = (e_x - this.left) + "px";
			this.domObj.style.height = (e_y - this.top) + "px";
			this.update();
		}
		if(this.resizeListener) this.resizeListener(this);
	}
	
	this.mouseMoveHandler = function(e_x, e_y){ 
		e_y += JEnv.browser=="IE"?document.documentElement.scrollTop:window.pageYOffset;//바탕화면에서 스크롤바 내렸을 시 오동작을 해결.
		//DOM compliant: document.body.scrollTop
		if(this.drag){
			this.domObj.style.top = (e_y - this.margin_y) + "px";
			this.domObj.style.left = (e_x - this.margin_x) + "px";
			this.domObj.style.cursor = "move";
		}else if(this.resize_NW){
			this.resize_NW_handler(e_x, e_y);
			this.domObj.style.cursor = "NW-resize";
		}else if(this.resize_NE){
			this.resize_NE_handler(e_x, e_y);
			this.domObj.style.cursor = "NE-resize";
		}else if(this.resize_SW){
			this.resize_SW_handler(e_x, e_y);
			this.domObj.style.cursor = "SW-resize";
		}else if(this.resize_SE){
			this.resize_SE_handler(e_x, e_y);
			this.domObj.style.cursor = "SE-resize";
		}else if(!this.drag){
			this.margin_y = e_y - this.top;
			this.margin_x = e_x - this.left;
			this.domObj.style.cursor = "auto";
		}
		//start debug
		/*
		document.getElementById("sidebar").innerHTML = 
			"drag : " + this.drag +  
			"<br />e_x : " + e_x +  
			"<br />e_y : " + e_y + 
			"<br />this.top : " + this.top +  
			"<br />this.left : " + this.left + 
			"<br />this.width : " + this.width +  
			"<br />this.height : " + this.height + 
			"<br />this.domObj.style.top : " + this.domObj.style.top +  
			"<br />this.domObj.style.left : " + this.domObj.style.left + 
			"<br />this.domObj.style.width : " + this.domObj.style.width +  
			"<br />this.domObj.style.height : " + this.domObj.style.height + 
			"<br />this.domObj.offsetWidth : " + this.domObj.offsetWidth +  
			"<br />this.domObj.offsetHeight : " + this.domObj.offsetHeight + 
			"<br />this.margin_x : " + this.margin_x + 
			"<br />this.margin_y : " + this.margin_y +
			"<br />this.maximized : " + this.maximized;
		document.getElementById("sidebar").style.color = 'white';
		//end debug*/
	}
	
	this.dragModeToggle = function(){
		if(!this.maximized){
			if (this.drag){
				this.dragModeOff();
			}else{
				this.dragModeOn();
			}
		}
	}
	
	this.dragModeOn = function(){
		if(!this.maximized) this.drag = true;
	}
	
	this.dragModeOff = function(){
		this.drag = false;
		this.update();
	}
	
	this.getObj = function(){return domObj;}
}

//HTML UL Element 기반으로 현재 떠 있는 윈도우를 관리하는 Taskbar.
var JTaskBar = function(){
	this.domObj = null;//<HTML UL Element>
	this.jDnd = null;//<JWindow>
	
	this.init = function(html_ul_ele, jDnd){
		this.jDnd = jDnd;
		this.domObj = html_ul_ele;
	}
	
	//items의 변경사항을 domObj에 반영 (HTML LI Element의 추가 혹은 제거)
	this.sync = function(){
		var html = "";
		var items = this.jDnd.items;
		for(i=0;i<items.length;i++){
			html += "<li><a onmouseover=\"taskbar_show_preview(" + (140 + (110 * (i+1)))+ ")\" onmouseout=\"taskbar_hide_preview(this)\"";
			html += "onclick=\"taskbar_win_clicked('" + items[i].domObj.id+ "');\" href=\"javascript:void(0)\" class=\"btn_win";
			if(items[i].hasFocus()) html += "_active";//TODO 타이틀 추가
			html += "\" title=\"" + items[i].title + "\"><img src=\"img/icons/folder_16.gif\" />" + items[i].title + "</a></li>";
		}
		this.domObj.innerHTML = html;
	}
}

var JDnd = function(){
	this.e = 0;
	this.items = new Array();//<JWindow> 
	
	this.add = function(item){
		var num = this.items.length;
		this.items[num] = (new JWindow()).init(item);
		return num;
	}
	
	this.removeItem = function(obj){
		//domObj만 인자로 받아 조회 후 삭제한다.
		//string 혹은 jwindow 객체를 받을 일이 없어 기타 방식을 지원하는 코드는 성능상 제거한다. (getItem 메서드 참고)
		var tmpArr = new Array();
		for(i=0;i<this.items.length;i++){
			if(this.items[i].domObj != obj){
				tmpArr.push(this.items[i]);
			}
		}
		this.items = tmpArr;
	}
	
	this.getItem = function(obj){
		//JWindow 객체가 아니면 DOM 객체로 파악한다.
		if(obj instanceof JWindow){
			for(i=0;i<this.items.length;i++){
				if(this.items[i] == obj) return this.items[i];
			}
		}else if(obj instanceof String || typeof obj == "string"){
			for(i=0;i<this.items.length;i++){
				if(this.items[i].domObj.id == obj) return this.items[i];
			}
		}else{
			for(i=0;i<this.items.length;i++){
				if(this.items[i].domObj == obj) return this.items[i];
			}
		}
		return false;
	}
	
	this.mouseMoveHandler = function(event){
		var event = event || window.event; //for IE
		var e_x = event.clientX;
		var e_y = event.clientY;
		for(i=0;this.items[i];i++){
			this.items[i].mouseMoveHandler(e_x, e_y);
		}
	}
}