// JavaScript Document

//ドキュメント読み込み完了後に、rssAppMaker関数を実行する。
if(window.addEventListener){
	window.addEventListener('load',rssAppMaker,false);
}else if(window.attachEvent){
	window.attachEvent('onload',rssAppMaker);
}else{
	window.onload = rssAppMaker;
}

function rssAppMaker(){
	//お勧めＲＳＳ配列
	var recommendRSS = [
		//オプショングループ配列　先頭にラベルを格納する。
		[
			'報道',
			{name:'アサヒ・コム速報ニュース',url:'http://rss.asahi.com/rss/asahi/newsheadlines.rdf'},
			{name:'毎日・ニュース速報（総合）',url:'http://rss.rssad.jp/rss/mainichi/flash.rss'},
			{name:'MNS産経・［注目］ニュース',url:'http://sankei.jp.msn.com/rss/news/points.xml'}
		],
		[
			'有名人',
			{name:'MNS産経・［エンタメ］ニュース',url:'http://sankei.jp.msn.com/rss/news/entertainments.xml'},
			{name:'長谷部 誠',url:'http://feedblog.ameba.jp/rss/ameblo/makoto-hasebe17/rss20.xml'},
			{name:'佐々木 希',url:'http://feedblog.ameba.jp/rss/ameblo/sasaki-nozomi'},
			{name:'向井 理',url:'http://feedblog.ameba.jp/rss/ameblo/osamu-labo/rss20.xml'},
			{name:'瀧本 美織',url:'http://feedblog.ameba.jp/rss/ameblo/takimotomiori/rss20.xml'}
		],
		[
			'ツイッター',
			{name:'宇多田 ヒカル',url:'http://twitter.com/statuses/user_timeline/174511656.rss'},
			{name:'谷川 俊太郎',url:'http://twitter.com/statuses/user_timeline/155488129.rss'},
			{name:'孫 正義',url:'http://twitter.com/statuses/user_timeline/99008565.rss'},
			{name:'Barack Obama',url:'http://twitter.com/statuses/user_timeline/813286.rss'},
			{name:'ビートたけし',url:'http://twitter.com/statuses/user_timeline/122984251.rss'},
			{name:'せば太 ダイエット',url:'http://twitter.com/statuses/user_timeline/356135684.rss'}
		]
	];
	
	//RSSアプリ取得フォーム
	var form = document.rssapp;
	
	//お勧めＲＳＳをselect要素にセットする。
	var selectElement = form.recommendRSS;
	setRecommendOnSelect();
	function setRecommendOnSelect(){
		var optgroup;
		var option;
		for(var i=0;i<recommendRSS.length;i++){
			for(var j=0;j<recommendRSS[i].length;j++){
				if(j==0){	//optgroupを作成
					optgroup = document.createElement('optgroup');
					optgroup.label = recommendRSS[i][0];
					selectElement.appendChild(optgroup);
				}else{	//optionを作成
					option = new Option(recommendRSS[i][j].name,recommendRSS[i][j].url,false,false);
					option.innerHTML = recommendRSS[i][j].name;
					optgroup.appendChild(option);
				}
			}
		}
	}
	
	//フォームがサブミットされた時に、makeButtonオブジェクトのofferFromプロパティを設定した後、makeメソッドを実行する。
	if(form.addEventListener){
			form.addEventListener('submit',function(ev){
			makeButton.offerFrom = 'submit';
			makeButton.make();
			ev.preventDefault();
		},false);	
	}else if(form.attachEvent){
			form.attachEvent('onsubmit',function(ev){
			makeButton.offerFrom = 'submit';	
			makeButton.make();
			ev.returnValue = false;
		});	
	}else{
		form.onsubmit = function(){
			makeButton.offerFrom = 'submit';	
			makeButton.make();
			return false;
		};	
	}
	
	//セレクトが変更された時に、makeButtonオブジェクトのofferFromプロパティを設定した後、makeメソッドを実行する。
	if(selectElement.addEventListener){
			selectElement.addEventListener('change',function(ev){
			makeButton.offerFrom = 'select';
			makeButton.make();
		},false);	
	}else if(selectElement.attachEvent){
			selectElement.attachEvent('onchange',function(ev){
			makeButton.offerFrom = 'select';	
			makeButton.make();
		});	
	}else{
		selectElement.onchange = function(){
			makeButton.offerFrom = 'select';	
			makeButton.make();
		};	
	}
	
	var makeButton = {
		/*
		 * offerFrom　起動元
		 * submit: フォームのサブミットから起動
		 * select: セレクトフォームのonchangeイベントから起動
		 * 
		 */
		offerFrom:null,
		/*
		 * displayBox　表示ボックスの状態
		 * 0: 何も表示されていない。初期状態
		 * 1: 取得用リンクとリンクタグが表示されている。
		 * 2: 取得用リンクのみが表示されている。
		 * 3: エラーメッセージが表示されている。
		 * 4: 処理中イメージが表示されている。
		 * 注意：rssAppLinkBoxは非表示の場合、1の状態に戻されている。
		 * 
		 */
		displayBox:0,
		
		//内部的なメンバ
		url:null,
		title:null,
		scriptUrl:null,
		linkTag:null,
		timerId:null,
		
		//DOM要素へのリンク
		form:form,
		selectElement:selectElement,
		registerURL:form.registerURL,
		registerName:form.registerName,
			//表示ボックス
		rssAppLinkBoxMessage:document.getElementById('rssAppLinkBoxMessage'),
		rssAppLinkBoxWaitingImg:document.getElementById('rssAppLinkBoxWaitingImg'),
		rssAppLinkBox:document.getElementById('rssAppLinkBox'),
			//表示ボックス内要素
		rssAppLink:document.getElementById('rssAppLink'),
		rssAppLinkTag:document.getElementById('rssAppLinkTag'),
		
		//メソッド
		make:make,
		getData:null,
		getDataFuncs:[fromForm,fromRecommend],
		makeLinkTag:makeLinkTag,
		display:display,
		erase:erase
	};
	
	//makeButtonオブジェクトのメソッド
	function make(){
		if(this.offerFrom == 'submit'){
			this.getData = this.getDataFuncs[0];
		}else if(this.offerFrom == 'select'){
			this.getData = this.getDataFuncs[1];
		}else{
			return;	
		}
		if(this.getData()){
			this.makeLinkTag();
			this.display();
		}
	}
	function fromForm(){
		if(this.registerURL.value && this.registerURL.value.indexOf('http://') != -1){
			this.url = this.registerURL.value;
			if(this.registerName.value){
				this.title = this.registerName.value;
			}else{
				this.title = 'タイトルなし';
			}
			return true;
		}else{
			/*
			 * エラーのために途中終了
			 * displayBoxが0→エラーメッセージを出す。
			 * displayBoxが1→ボックスを閉じる。→エラーメッセージを出す。
			 * displayBoxが2→ボックスを閉じる。→エラーメッセージを出す。
			 * displayBoxが3→何もしない。
			 * displayBoxが4→処理中イメージを消し、timerを切る。→エラーメッセージを出す。
			 */
			if(this.displayBox == 1 || this.displayBox == 2 || this.displayBox == 4)
				this.erase();
			if(this.displayBox != 3){
				this.rssAppLinkBoxMessage.style.display = 'block';
				this.displayBox = 3;
			}
			return false;
		}
	}
	function fromRecommend(){
		var option = this.selectElement.options[this.selectElement.selectedIndex];
		this.url = this.registerURL.value = option.value;
		this.title = this.registerName.value = option.text;
		return true;
	}
	function makeLinkTag(){
		this.scriptUrl = "javascript:(function(){var%20tag=document.createElement('script');tag.className='lttScriptTagForRss';tag.src='http://www.linktracktool.com/javascript/lttforrss2.0.js?"+this.url+"';tag.type='text/javascript';document.body.appendChild(tag);void%200;})();";
		this.linkTag = '<a href="'+this.scriptUrl+'">'+this.title+'</a>&nbsp;<span style="font-size:75%">(<a href="http://www.linktracktool.com/">WEBアプリ</a>)</span>';
	}
	function display(){
		/*
		 * displayBoxが0→プロセス→消して→出す
		 * displayBoxが1→消して→プロセス→消して→出す
		 * displayBoxが2→消して→プロセス→消して→出す
		 * displayBoxが3→消して→プロセス→消して→出す
		 * displayBoxが4→消して→プロセス→消して→出す
		 * offerFromがsubmit→displayBoxを1に
		 * offerFromがselect→displayBoxを2に
		 */
		if(this.displayBox != 0)
			this.erase();
		this.rssAppLinkBoxWaitingImg.style.display = 'block';
		this.displayBox = 4;
		var itself = this;
		this.timerId = setTimeout(function(){
			itself.erase();
			if(itself.offerFrom == 'submit'){
				itself.rssAppLink.href = itself.scriptUrl;
				itself.rssAppLink.innerHTML = itself.title;
				itself.rssAppLinkTag.value = itself.linkTag;
				itself.rssAppLinkBox.style.display = 'block';
				itself.displayBox = 1;
			}else if(itself.offerFrom == 'select'){
				itself.rssAppLink.href = itself.scriptUrl;
				itself.rssAppLink.innerHTML = itself.title;
				itself.rssAppLinkTag.style.display ='none';
				itself.rssAppLinkBox.style.display = 'block';
				itself.displayBox = 2;
			}
		},1000);
	}
	function erase(){
		if(this.displayBox == 1){
			this.rssAppLinkBox.style.display = 'none';
			this.displayBox = 0;
		}else if(this.displayBox == 2){
			this.rssAppLinkTag.style.display ='inline';
			this.rssAppLinkBox.style.display = 'none';
			this.displayBox = 0;
		}else if(this.displayBox == 3){
			this.rssAppLinkBoxMessage.style.display = 'none';
			this.displayBox = 0;
		}else if(this.displayBox == 4){
			clearTimeout(this.timerId);
			this.rssAppLinkBoxWaitingImg.style.display = 'none';
			this.displayBox = 0;
		}
	}
	
	//フォームがリセットされた時に、作成されたリンクなどを消去する
	if(form.addEventListener){
		form.addEventListener('reset',function(){makeButton.erase();},false);	
	}else if(form.attachEvent){
		form.attachEvent('onreset',function(){makeButton.erase();});	
	}else{
		form.onreset = function(){makeButton.erase();};	
	}
}
