var PlaceMap = function(node, placeMapData){
	
	this.INIT_MAP_LEVEL = 4;
	this.placeMapData_ = placeMapData; 
	if(!this.placeMapData_.center){
		this.placeMapData_.center = new daum.maps.Coords(501186, 1121603);
	}
	this.centerForView_ = this.placeMapData_.center; //navigation bar 등 요소들을 고려해 화면상 보여지는 중심점.
	this.mapObj_ = new daum.maps.Map(node, this.placeMapData_);
	this.windows_ = [];
	this.markers_ = [];

	this.mapObj_.setLevel(this.INIT_MAP_LEVEL);
	
};
PlaceMap.Icons = {
//	"PLACE_CENTER" : new daum.maps.MarkerImage("http://i1.daumcdn.net/localimg/life/images/detail/ico_life_tm2.png", new daum.maps.Size(41, 57), new daum.maps.Point(-20, -57)),
	"PLACE_FOOD" : new daum.maps.MarkerImage("http://i1.daumcdn.net/localimg/life/images/detail/ico_tm1_off.png", new daum.maps.Size(33, 45), new daum.maps.Point(16, 45)),
	"PLACE_FOOD_ON" : new daum.maps.MarkerImage("http://i1.daumcdn.net/localimg/life/images/detail/ico_tm1_on.png", new daum.maps.Size(33, 45), new daum.maps.Point(16, 45)),
	"PLACE_GOOD" : new daum.maps.MarkerImage("http://i1.daumcdn.net/localimg/life/images/detail/ico_tm2_off.png", new daum.maps.Size(33, 45), new daum.maps.Point(16, 45)),
	"PLACE_GOOD_ON" : new daum.maps.MarkerImage("http://i1.daumcdn.net/localimg/life/images/detail/ico_tm2_on.png", new daum.maps.Size(33, 45), new daum.maps.Point(16, 45)),
	"PLACE_PUBLIC" : new daum.maps.MarkerImage("http://i1.daumcdn.net/localimg/life/images/detail/ico_tm3_off.png", new daum.maps.Size(33, 45), new daum.maps.Point(16, 45)),
	"PLACE_PUBLIC_ON" : new daum.maps.MarkerImage("http://i1.daumcdn.net/localimg/life/images/detail/ico_tm3_on.png", new daum.maps.Size(33, 45), new daum.maps.Point(16, 45)),
	"PLACE_NUMBER" : Life.Templates.placeNumberIcon,
	"PLACE_NUMBER_ON" : Life.Templates.placeNumberIconOn,
//	"PLACE_SMALL" : new daum.maps.MarkerImage("http://i1.daumcdn.net/localimg/life/images/top/ico_t_mappoint.png", new daum.maps.Size(21, 21), new daum.maps.Point(10, 10)),	
	"PLACE_WINDOW" : Life.Templates.placeWindow,
	"PLACE_WINDOW_PHOTO" : Life.Templates.placeWindowPhoto,
	"PLACE_WINDOW_DETAIL" : Life.Templates.placeWindowDetail,
	"PLACE_WINDOW_DETAIL_NOCOMMENT" : Life.Templates.placeWindowDetailNoComment,
	"PLACE_CENTER_MARK" : Life.Templates.placeCenterMark
};
PlaceMap.prototype = {
		setCenter : function(center){
			this.mapObj_.setCenter(center);
		},
		getCurrentCenter : function(){
			return this.mapObj_.getCenter();
		},
		getPlaceCenter : function(){
			return this.placeMapData_.center;
		},
		getCenterForView : function(){
			return this.centerForView_;
		},
		setLevel : function(lv){
			this.mapObj_.setLevel(lv);
		},
		getLevel : function(){
			return this.mapObj_.getLevel();
		},
		panTo : function(position){
			this.mapObj_.panTo(position);
		},
		setCenterForView : function(){
			var navBarHeight = $('placeMapNavigation').offsetHeight;
			var placeCenter = this.placeMapData_.center;
			var projection = this.mapObj_.getProjection();
			
			var gapY = projection.coordsFromContainerPoint(new daum.maps.Point(0, 0)).getY()
						- projection.coordsFromContainerPoint(new daum.maps.Point(0, navBarHeight)).getY();
			
			this.centerForView_ = new daum.maps.Coords(placeCenter.getX(), placeCenter.getY() + gapY);
			this.setCenter(this.centerForView_);
		},
		getMapObj : function(){
			return this.mapObj_;
		},
		pushMarker : function(marker){
			this.markers_.push(marker);
		},
		pushWindow : function(window){
			this.windows_.push(window);
		},
		removeMarkers : function(){
			for(var i = this.markers_.length; i--; ){
				this.markers_[i].remove();
			}
		},
		removeWindows : function(){
			for(var i = this.windows_.length; i--; ){
				this.windows_[i].close();
			}
		},
		removeAllOverlays : function(){
			this.removeMarkers();
			this.removeWindows();
		},
		reset : function(){
			this.removeAllOverlays();
			this.setLevel(this.INIT_MAP_LEVEL);
			this.panTo(this.getCenterForView());
		},
		setMapTypeId : function(mapTypeId){
			this.mapObj_.setMapTypeId(mapTypeId);
		}
};


/**
 * PlaceMarker
 * @param data
 * @returns
 */
var PlaceMarker = function(data){
	/*
	 * data
	 * {
	 * image
	 * position
	 * }
	 */
	 this.data_ = data;
	 this.markerObj_ = new daum.maps.Marker(data);
	 this.placeMap_;
	 
};
PlaceMarker.prototype = {
		remove : function(){
			this.markerObj_.setMap(null);
		},
		setMap : function(map){
			this.markerObj_.setMap(map.getMapObj());
			map.pushMarker(this);
			
			this.placeMap_ = map;
			
		},
		getPlaceMap : function(){
			return this.placeMap_;
		},
		setPosition : function(position){
			this.markerObj_.setPosition(position);
		},
		getPosition : function(){
			return this.markerObj_.getPosition();
		},
		setVisible : function(bool){
			this.markerObj_.setVisible(bool);
		},
		getVisible :function(){
			return this.markerObj_.getVisible();
		},
		addEvent : function(type, fn){
			//마커에 이벤트 할당.
			daum.maps.event.addListener(this.markerObj_, type, fn);
		}
};

/**
 * PlaceWindow
 * @param data
 * @returns
 */
var PlaceWindow = function(data){
	/*
	 * position
	 * content
	 */
	this.data_ = data;
	this.window_;
	this.mapObj_;
	this.placeMap_;
};
PlaceWindow.prototype = {
		open : function(map, marker){
			if(!!marker){
				this.data_.position = marker.getPosition();
			}
			//placeMap의 reference
			this.placeMap_ = map;
			
			//daum map object의 reference
			this.mapObj_ = map.getMapObj();
			this.window_ = new daum.maps.Billboard(this.data_);
			this.window_.setMap(this.mapObj_);
			
			map.pushWindow(this);
		},
		close : function(){
			this.window_.setMap(null);
		},
		/**
		 * PlaceMap 객체를 반환한다.
		 * @returns PlaceMap
		 */
		getMap : function(){
			return this.placeMap_;
		},
		setPosition : function(position){
			this.window_.setPosition(position);
			this.data_.position = position;
		},
		getPosition : function(){
			return this.data_.position;
		},
		setContent : function(content){
			this.window_.setContent(content);
			this.data_.content = content;
		},
		getContent : function(){
			return this.data_.content;
		},
		setVisible : function(bool){
			this.window_.setVisible(bool);
		},
		getVisible : function(){
			return this.window_.getVisible();
		}
};
/**
 * 일반 상세 라디오버튼 마커와 연동되는 윈도우.
 */
var PlaceDetailRadioWindow = function(templateData){
	this.$super({yAnchor: 1});
	
	this.data_.content = TrimPath.parseTemplate(PlaceMap.Icons['PLACE_WINDOW']).process(templateData);
};
daum.Function.inherit(PlaceDetailRadioWindow, PlaceWindow);
PlaceDetailRadioWindow.prototype.cOpen = function(map, marker){
	this.open(map, marker);
	$$('.placeWindow .close')[0].onclick = this.close.bind(this);
};


/**
 * PlaceController.
 * Object option = {
 * 		roadview : true,
		storeview: true,
		placeMap : placeMap,
		panoid: $!{Roadview.panoid},
		caption: ${placename},
		storeId: $!{BASICINFO.storeviewid}
 * }
 */
var PlaceTypeController = function(option){
	
	//PlaceMap의 객체를 담을 변수.
	this.placeMap;
	
	//버튼 인덱스.
	this.NORMAL_MAP_INDEX = 3;
	this.SKYVIEW_INDEX = 2;
	this.ROADVIEW_INDEX = 1;
	this.STOREVIEW_INDEX = 0;
	this.NONE = -1;
	
	//스토어뷰/로드뷰 패널의 visible 체크
	this.isStoreviewPanelVisible = false;
	
	//플래시 컨트롤러!
	this.flashController;
	
	//마지막으로 보고있던 패널...
	this.lastMode = this.NONE;
	
	//마지막 플래시 모드.
	this.lastFlashMode = this.NONE;
	
	//버튼 엘리먼트들을 가져오긔.
	this.typeControllerNodes = $$('#typeController div');
	this.normalMapNode = this.typeControllerNodes[this.NORMAL_MAP_INDEX];
	this.skyviewNode = this.typeControllerNodes[this.SKYVIEW_INDEX];
	this.roadviewNode = this.typeControllerNodes[this.ROADVIEW_INDEX];
	this.storeviewNode = this.typeControllerNodes[this.STOREVIEW_INDEX];
	
	
	//조건에 따라 로드뷰, 스토어뷰버튼을 가렸다가 보였다가...
	var daum_ = daum;
	if(/*!option.roadview && */!option.storeview){ //스토어뷰가 없으면 로드뷰도 노출시키지 않는다.
		daum_.hide(this.roadviewNode);
		daum_.hide(this.storeviewNode);
		daum.addClassName(this.skyviewNode, 'without_both');
	}else{
		if(!option.roadview){
			daum_.hide(this.roadviewNode);
			//daum_.addClassName(this.storeviewNode, 'without_roadview');
		}
		if(!option.storeview){
			daum_.hide(this.storeviewNode);
			daum_.addClassName(this.roadviewNode, 'without_storeview');
		}
	}
	
	//IE6일 때 setButtonOn, resetButtons 메소드 바꿈.
	if(daum_.Browser.ie6){
		this.setButtonOn = this.setButtonOnForIE6;
		this.resetButtons = this.resetButtonsForIE6;
	}
	
	//버튼들에 이벤트 할당.
	this.placeMap = option.placeMap;
	this.normalMapNode.onclick = this.onNormalMapNodeClick.bindAsEventListener(this);
	this.skyviewNode.onclick = this.onSkyviewNodeClick.bindAsEventListener(this);
	this.roadviewNode.onclick = this.onRoadviewNodeClick.bindAsEventListener(this);
	this.storeviewNode.onclick = this.onStoreviewNodeClick.bindAsEventListener(this);
	
	//버튼 더블클릭시 브라우저의 블록화 현상을 막기 위해 mousedown 이벤트에서 기본 동작을 막아준다. 
	
	this.normalMapNode.onmousedown = 
	this.skyviewNode.onmousedown = 
	this.roadviewNode.onmousedown = 
	this.storeviewNode.onmousedown = daum_.Event.stopEvent;
	
	//로드뷰/스토어뷰 플래시가 보여지는 레이어 노드.
	this.storeviewPanel = $('storeviewPanel');
	
	//option 저장하긔.
	this.option = option;
	
	flashCallBack.onMoveCompleted = this.showStoreviewPanel.bind(this);
	
	//스토어뷰가 있으면 스토어뷰 노출. 없으면 지도 노출.
	if(option.storeview){
		this.BUTTON_HOLD = true; // 플래시 호출이 완료될때까지 버튼 동작을 막아줄 flag
		this.storeviewNode.onclick();
		//this.showStoreviewPanel();
	}else{
		this.hideStoreviewPanel();
		this.normalMapNode.onclick();
	}
	
	//ui 작업이 끝나면 컨트롤러 전체를 보여줌.
	daum_.show($('typeController'), 'block');
};

PlaceTypeController.prototype = {
	onNormalMapNodeClick : function(){
		if(this.BUTTON_HOLD) return false;
		switch(this.lastMode){
		case this.STOREVIEW_INDEX:
			this.placeMap.setMapTypeId(daum.maps.MapTypeId.ROADMAP);
			this.hideStoreviewPanel();
			break;
		case this.ROADVIEW_INDEX:
			this.placeMap.setMapTypeId(daum.maps.MapTypeId.ROADMAP);
			this.hideStoreviewPanel();
			break;
		case this.SKYVIEW_INDEX:
			this.placeMap.setMapTypeId(daum.maps.MapTypeId.ROADMAP);
			break;
		case this.NORMAL_MAP_INDEX:
			return false;
		}
		this.setButtonOn(this.normalMapNode);
		this.lastMode = this.NORMAL_MAP_INDEX;
		
	},
	onSkyviewNodeClick : function(){
		if(this.BUTTON_HOLD) return false;
		switch(this.lastMode){
		case this.STOREVIEW_INDEX:
			this.placeMap.setMapTypeId(daum.maps.MapTypeId.HYBRID);
			this.hideStoreviewPanel();
			break;
		case this.ROADVIEW_INDEX:
			this.placeMap.setMapTypeId(daum.maps.MapTypeId.HYBRID);
			this.hideStoreviewPanel();
			break;
		case this.NORMAL_MAP_INDEX:
			this.placeMap.setMapTypeId(daum.maps.MapTypeId.HYBRID);
			break;
		case this.SKYVIEW_INDEX:
			return false;
		}
		this.setButtonOn(this.skyviewNode);
		this.lastMode = this.SKYVIEW_INDEX;
		
	},
	onRoadviewNodeClick : function(){
		if(this.BUTTON_HOLD) return false;
		switch(this.lastMode){
		case this.NONE:
			this.appendFlashtoPanel(false);
			break;
		case this.NORMAL_MAP_INDEX:
			switch(this.lastFlashMode){
			case this.STOREVIEW_INDEX:
				this.flashController.toggleRoadviewStoreview();
				break;
			case this.NONE:
				this.appendFlashtoPanel(false);
				break;
			default:
				this.showStoreviewPanel();
			}
			break;
		case this.SKYVIEW_INDEX:
			switch(this.lastFlashMode){
			case this.STOREVIEW_INDEX:
				this.flashController.toggleRoadviewStoreview();
				break;
			case this.NONE:
				this.appendFlashtoPanel(false);
				break;
			default:
				this.showStoreviewPanel();
			}
			break;
		case this.STOREVIEW_INDEX:
			this.flashController.toggleRoadviewStoreview();
			break;
		}
		this.setButtonOn(this.roadviewNode);
		this.lastFlashMode = this.ROADVIEW_INDEX;
		this.lastMode = this.ROADVIEW_INDEX;
	},
	onStoreviewNodeClick : function(){
		switch(this.lastMode){
		case this.NONE:
			this.appendFlashtoPanel(true);
			break;
		case this.NORMAL_MAP_INDEX:
			switch(this.lastFlashMode){
			case this.ROADVIEW_INDEX:
				this.flashController.toggleRoadviewStoreview();
				break;
			case this.NONE:
				this.appendFlashtoPanel(true);
				break;
			default:
				this.showStoreviewPanel();
			}
			break;
		case this.SKYVIEW_INDEX:
			switch(this.lastFlashMode){
			case this.ROADVIEW_INDEX:
				this.flashController.toggleRoadviewStoreview();
				break;
			case this.NONE:
				this.appendFlashtoPanel(true);
				break;
			default:
				this.showStoreviewPanel();
			}
			break;
		case this.ROADVIEW_INDEX:
			this.flashController.toggleRoadviewStoreview();
			break;
		default:
			return false;
		}
		this.setButtonOn(this.storeviewNode);
		this.lastFlashMode = this.STOREVIEW_INDEX;
		this.lastMode = this.STOREVIEW_INDEX;
	},
	resetButtons : function(){
		var daum_ = daum;
		for(var i = this.typeControllerNodes.length; i--; ){
			daum_.removeClassName(this.typeControllerNodes[i], 'on');
		}
	},
	resetButtonsForIE6 : function(){
		var daum_ = daum;
		for(var i = this.typeControllerNodes.length; i--; ){
			daum_.removeClassName(this.typeControllerNodes[i], 'on_for_ie6');
		}
	},
	setButtonOn : function(button){
		this.resetButtons();
		daum.addClassName(button, 'on');
	},
	setButtonOnForIE6 : function(button){
		this.resetButtons();
		daum.addClassName(button, 'on_for_ie6');
	},
	showStoreviewPanel : function(){
		if(this.isStoreviewPanelVisible) return false;
		
		daum.replaceClassName(this.storeviewPanel, 'panel_hide', 'panel_show');
		
		this.isStoreviewPanelVisible = true; // 패널 visible 상태를 뜨루로 바꿔줌.
		
		this.BUTTON_HOLD = false;
	},
	hideStoreviewPanel : function(){
		daum.replaceClassName(this.storeviewPanel, 'panel_show', 'panel_hide');
		this.isStoreviewPanelVisible = false;
	},
	appendFlashtoPanel : function(isThisStoreview){
		var option = this.option.flashvars;
		var storeId = (isThisStoreview)? option.storeId : '';
		this.flashController = daum.showFlash('http://dmaps.daum.net/apis/roadview2.0/RoadviewLite_233.swf' ,678 , 337 , 'storeviewPanel',{
			flashvars : 'v='+ +new Date() +'&serviceName=roadviewLite&serviceNameSub=daumPlaceDefault&useType=lion&panoid=' + option.panoid
						+ '&width=678&height=337&pan='+option.pan+'&tilt='+option.tilt+'&panoX='+option.panoX+'&panoY='+option.panoY+'&storeId=' + storeId + '&jsNamespace=flashCallBack',
	        allowScriptAccess : 'always',
	        allowFullScreen : 'false',
	        wmode : 'opaque',
	        bgcolor : '#FFFFFF'
	    });
		this.flashController.id = 'daum:roadview:1';
	}
};

var PlaceZoomController = function(placeMap){
	var daum_ = daum;
	this.placeMap = placeMap;
	
	var zoomControllerNodes = this.zoomControllerNodes = $$('#zoomController div');
	this.zoomUpNode = zoomControllerNodes[0];
	this.zoomDownNode = zoomControllerNodes[1];
	this.resetNode = zoomControllerNodes[2];
	
	this.zoomUpNode.onclick = this.onZoomUpNodeClick.bindAsEventListener(this);
	this.zoomDownNode.onclick = this.onZoomDownNodeClick.bindAsEventListener(this);
	this.resetNode.onclick = this.onResetNodeClick.bindAsEventListener(this);
	
	//내래 기본이벤트를 막아버리갔어!
	this.zoomUpNode.onmousedown = 
	this.zoomDownNode.onmousedown = 
	this.resetNode.onmousedown = daum_.Event.stopEvent;
	
	//ie6일때 setButtonOn과 resetButtons 재정의
	if(daum_.Browser.ie6){
		this.setButtonOn = this.setButtonOnForIE6;
		this.resetButtons = this.resetButtonsForIE6;
	}
	
	//over시에 이미지 췌인지.
	this.zoomUpNode.onmouseover = 
	this.zoomDownNode.onmouseover = 
	this.resetNode.onmouseover = this.onMouseover.bindAsEventListener(this);
	
	//out 되면 원상복구.
	this.zoomUpNode.onmouseout = 
	this.zoomDownNode.onmouseout = 
	this.resetNode.onmouseout = this.resetButtons.bindAsEventListener(this);
};
PlaceZoomController.prototype = {
	onZoomUpNodeClick : function(e){
		var map = this.placeMap;
		map.setLevel(map.getLevel() - 1);
	},
	onZoomDownNodeClick : function(){
		var map = this.placeMap;
		map.setLevel(map.getLevel() + 1);
	},
	onResetNodeClick : function(){
		//이거슨 외부에서 작성해줌. 이를테면.. bottom_js.vm?
	},
	setButtonOn : function(button){
		this.resetButtons();
		daum.addClassName(button, 'on');
	},
	setButtonOnForIE6 : function(button){
		this.resetButtons();
		daum.addClassName(button, 'on_for_ie6');
	},
	onMouseover: function(e){
		var target = e.target || e.srcElement;
		this.setButtonOn(target);
	},
	resetButtons : function(){
		var daum_ = daum;
		for(var i = this.zoomControllerNodes.length; i--; ){
			daum_.removeClassName(this.zoomControllerNodes[i], 'on');
		}
	},
	resetButtonsForIE6 : function(){
		var daum_ = daum;
		for(var i = this.zoomControllerNodes.length; i--; ){
			daum_.removeClassName(this.zoomControllerNodes[i], 'on_for_ie6');
		}
	}
};
