//Date관련 함수 정의
var jsDate={

	ymd : function(y ,m ,d)	{
		return new Date(y, m - 1, d);	
	},
	//이전일 
	prev : function(date,day)	{	
		if(typeof(day) == 'undefiend') day = 1;
		return new Date(date.getFullYear() ,date.getMonth(), date.getDate() - day);	
	},
	//다음일
	next : function(date,day)	{
		if(typeof(day) == 'undefiend') day = 1;
		return new Date(date.getFullYear() ,date.getMonth(), date.getDate() + day);
	}
};
Date.prototype.getYMD=function(){
	return this.getFullYear() +"." + (this.getMonth()+1) +"."+ this.getDate();
};

//xml처리
var XParse = Class.create({ 
	initialize: function(xml) { 
		this.xml = xml;
	},
	node : function (node_name , index){
		if(typeof(index)=='undefined') index=0;
		var node = this.xml.getElementsByTagName(node_name)[index].firstChild;
		if(node) return this.xml.getElementsByTagName(node_name)[index].firstChild.nodeValue;
		else return '';
	},
	attr : function(node_name , index,  attr_name){		
		var node = this.xml.getElementsByTagName(node_name)[index];
		if(node) return this.xml.getElementsByTagName(node_name)[index].getAttribute(attr_name);
		else return '';
	}
});


//설정
var Config={
	resize_margin : 80, //세로
	item_width : 170 + 3, //3은 마진값
	left_margin : 12,
	right_maring : 12 //left,right마진 
	
};



//TimeLine
var TimeLine = Class.create({ 
	initialize: function(y,m,d,data_url) {    
		
		this.today_ymd = jsDate.ymd(y, m , d),
		this.abs_ymd = jsDate.ymd(y, m , d),
			
		this.data_url = (data_url) ? data_url : './proxy.php';
		this.data_size = 10;	//한번에 가져올


		this.slide = $$('#timeline .slide')[0];
		this.news = $$('#timeline .news')[0];
		this.news_box = $$('#timeline .news_box')[0];
		this.btn_prev = $('btn_prev');
		this.btn_next = $('btn_next');

		this.s_date = null; //start date (현재 타임라인상에 포함된)
		this.e_date = this.abs_ymd; //end date
		
		//
		this.now_call_num = 0; //현재 데이터를 호출한 횟수 (전체 로딩이미지표시때문에)


		//슬라이드
		this.slide_move_el = false; //
		this.slide_mouse_x = 0;
		this.slide_mouse_y = 0;
		this.slide.observe('mousedown', this.startSlide.bind(this));
		document.observe('mouseup', this.stopSlide.bind(this));
		this.slide.observe('mousemove', this.moveSlide.bind(this));

		//뉴스슬라이드
		this.news.observe('mousedown', this.startSlide.bind(this));
		this.news.observe('mousemove', this.moveSlide.bind(this));

		//기본 item표시
		this.initPrintItem();

		//resize
		this.resize();
		Event.observe(window,'resize', this.resize.bind(this));
		

		//이전,다음 버튼
		this.btn_prev.observe("mousedown", this.prevSlide.bind(this));
		this.btn_next.observe("mousedown", this.nextSlide.bind(this));	

		//select안되게
		if(Prototype.Browser.IE) $('timeline').observe('selectstart', function(evt){ evt.stop(); });
		else $('timeline').setStyle({ MozUserSelect:'none', KhtmlUserSelect:'none' })

	},
	//슬라이드 
	startSlide  :function(event){
		
		//item인지 news인지 넣기
		if(event.target.id.indexOf("item") > -1 ) this.slide_move_el='item';
		else this.slide_move_el='news';
		

		this.slide_mouse_x = event.clientX;
		this.slide_mouse_y = event.clientY;
		

		Event.stop(event);
		//console.debug(event.target.indexOf(news)
	},
	stopSlide  :function(event){
		this.slide_move_el=0;
		//console.debug('stop' + this.slide_move_el)
		Event.stop(event);
	},
	//drag move
	moveSlide : function(event){

		if(!this.slide_move_el) return;

		//console.debug(this.slide_move_el);

		var move_x = event.clientX - this.slide_mouse_x;//이전위치와 비교해서 움직일위치구하고
		
		//슬라이드 이동
		this.setSlideX(move_x);


		//위치에 따라 필요한 item넣어주기
		this.checkSlideX();

		//
		if(this.slide_move_el=='news') this.setNewsY(event.clientY);

		this.slide_mouse_x = event.clientX;//현재위치 저장		
		
	},
	//슬라이드위치변경
	setSlideX : function(move_x){

		var left = parseInt(this.slide.getStyle('left'));//현재슬라이드 위치를 가져온다음
		this.slide.setStyle({left:(left+move_x) + 'px'}); //움직일위치 더해주기		

		this.setNewsX();
	},
	//뉴스위치변경
	setNewsX : function(){
		
		this.news.setStyle({left:this.slide.getStyle('left')});
	},
	setNewsY : function(clientY){
		//ie6 에서 우글거림;
		var move_y = clientY - this.slide_mouse_y;
		this.news_box.scrollTop -= move_y;	
		this.slide_mouse_y = clientY;
	},
	//슬라이드위치체크하여
	checkSlideX : function(event){
		
		//뉴스위치변경 (버튼때문에 한번더 넣어주고;)
		this.setNewsX();

		//가장 처음에 있는 아이템이 위치가 0보다 커지면
		if(this.slide.down(0).cumulativeOffset()[0] > 0+Config.left_margin)
		{
			this.s_date=jsDate.prev(this.s_date, 1);
			this.insertItem('top', this.s_date.getYMD() );

			//이전버튼 에서는 동작금지
			if(!event) this.setSlideX(-Config.item_width); //넣어준만큼 이동
		}		

		//가장 끝에 있는 item이 다 보이면 (resize시에 많은 item이 들어가야할경우도 있으므로 while)
		while(this.slide.down(this.slide.getElementsByTagName('div').length - 1).cumulativeOffset()[0] + Config.item_width < document.viewport.getWidth() )
		{
			this.e_date=jsDate.next(this.e_date, 1);
			this.insertItem('bottom', this.e_date.getYMD() );			
		}	

	},
	//다음버튼
	nextSlide : function(){
		var num = this.getItemNum()-1;
		var move_x = parseInt(this.slide.getStyle('left'))  - (num * Config.item_width);
		new Effect.Move(this.slide, { x: move_x, mode: 'absolute',duration:0.8,afterUpdate:this.checkSlideX.bind(this) });
	},
	//이전버튼
	prevSlide : function(){
		var num = this.getItemNum()-1;
	
		for(var i=0; i<num; i++) //일단넣어주고
		{
			this.s_date=jsDate.prev(this.s_date, 1);
			this.insertItem('top', this.s_date.getYMD() );
		}
		
		this.setSlideX(num * Config.item_width * -1);
		
		var move_x = parseInt(this.slide.getStyle('left'))  + (num * Config.item_width);
		new Effect.Move(this.slide, { x: move_x, mode: 'absolute',duration:0.8, afterUpdate:this.setNewsX.bind(this) });

	},
	// 현재화면에서 보여질수 있는 item갯수 가져오기
	getItemNum : function(){
		var num = Math.ceil(document.viewport.getWidth() / Config.item_width);
		return num;
	},	
	// 처음 item 넣기
	initPrintItem  :function(){		
		var num = this.getItemNum();
		var item = null;


		for(var i=0; i<num; i++)
		{			
			this.s_date=jsDate.prev(this.abs_ymd, i);
			this.insertItem('top', this.s_date.getYMD() ,true);
		}
	},
	//item넣어주기
	insertItem : function(position, str , init){

		var arr = str.split(".");
		if(arr[1].length==1) arr[1] = '0'+arr[1];
		if(arr[2].length==1) arr[2] = '0'+arr[2];		
		var date_str = arr[0] + arr[1]  + arr[2];

		//슬라이드 item
		var obj1={};
		obj1[position] = new Element("div",{id:"item_"+date_str,"class":"loading"}).update( str );
		this.slide.insert( obj1 );
			
		//뉴스
		var obj2={};
		obj2[position] = new Element("div",{id:"news_"+date_str,"class":"line"}).update("");
		this.news.insert( obj2 );
		
		if(init) this.callData(date_str);		
		else setTimeout(function(){ this.callData(date_str) }.bind(this), 1000);//슬라이드가 버벅거려서리~
	},

	callData : function(date_str){
		
		this.now_call_num++;

		$('logo').addClassName('loading');

		new Ajax.Request(this.data_url, {
			method: 'get',
			parameters: {

				reg_date : date_str,
				page_size : this.data_size
			},
			onSuccess: this.callBackData.bind(this)
		});

	},
	callBackData  :function(res){
		
		//모든 콜이 종료되면 로딩이미지 지우기
		this.now_call_num--;
		if(this.now_call_num==0)
		{
			$('logo').removeClassName('loading');
			this.setNewsHeight();
		}

		this.parseData(res);
	},
	//서비스마다 자식클래스에서 재정의 구현 필요
	parseData : function(res){	

	},
	//parseData()에서 호출
	insertArticle : function(date_str, html){

		var d = new Element('div',{'class':'article'}).update(html);	
		
		$('news_'+date_str).insert({'bottom':d});
	},
	//window.resize
	resize : function(event){
		
		this.checkSlideX(); //슬라이드 체크해서 비면 item넣어주고

		//news div맞춰주기 위해서
		this.setNewsHeight();

	},
	setNewsHeight : function(){

		// document.viewport.getHeight() 오페라에선 이상;

		var h = (document.viewport.getHeight() - Config.resize_margin);		
		this.news_box.setStyle({height:h  + 'px'});

		
		var news_height = parseInt(this.news.getStyle('height'));

		/*
		min_height도 구해야할까?
		*/
		//console.debug(h +":"+ news_height);
		//console.debug(this.news_box.scrollHeight);

		if(h > news_height) 
		{

			this.news.setStyle({height: h + 'px'});
			
		}
		else 
		{
			//this.news.setStyle({height: h + 'px'});
			this.news.setStyle({height: this.news_box.scrollHeight+'px'});
		}
	}
});

var TimelineAgora =  Class.create(TimeLine,{ 
	initialize: function($super,y,m,d) {
		$super(y,m,d,'./proxy_agora.php');
	},
	parseData : function(res) {

		var data = res.responseText.evalJSON();
		var list = data.list;
		var reg_date = data.reg_date;
		var len = list.length;
		var str = '';

		$('item_'+reg_date).removeClassName('loading');

		//데이타있는지 체크
		if(len==0 )
		{
			$('item_'+reg_date).addClassName('no');
			return;
		}


		for(var i=0; i< len; i++)
		{
			str = '<div>';
			if(list[i].img) str +='<p class="img"><img src="'+list[i].img+'" alt="" /></p>';
			str +='<span class="title">'+list[i].title+'</span>'+list[i].nick+'<a href="'+list[i].link+'&timeline=1" target="_blank">자세히</a></div>';	
		

			this.insertArticle(reg_date, str);
		}		
	}
});

var TimelineMovie =  Class.create(TimeLine,{ 
	initialize: function($super,y,m,d) {
		$super(y,m,d,'./proxy_movie.php');
	},
	parseData : function(res) {

		var data = res.responseText.evalJSON();
		var list = data.list;
		var reg_date = data.reg_date;
		var len = list.length;
		var str = '';

		$('item_'+reg_date).removeClassName('loading');

		//데이타있는지 체크
		if(len==0 )
		{
			$('item_'+reg_date).addClassName('no');
			return;
		}


		for(var i=0; i< len; i++)
		{
			str = '<div style="position:relative;height:120px;margin-top:-5px">';
			if(list[i].img) str +='<div style="position:absolute;top:0;left:0"><img src="'+list[i].img+'" height="110" alt="" /></div>';
			str +='<div style="position:absolute;left:80px;"><span class="title">'+list[i].title+'</span><br /><br /><a href="'+list[i].link+'&timeline=1" target="_blank">자세히</a><br /><a href="'+list[i].photo_url+'&timeline=1" target="_blank">이미지</a><br /><a href="'+list[i].video_url+'&timeline=1" target="_blank">예고편</a></div></div>';	
		
			this.insertArticle(reg_date, str);
		}		
	}
});
