﻿/********************************************
//　Script:		minipedia ver 0.0.1β
//	FileName:	minipedia.js
//	Browser:	Safari, Opera, IE, Firefox
//	Author:		Issei.M (Netsket Inc.)
/*******************************************/

/********************************************
//　関数の宣言
/*******************************************/
//ブラウザ自動判別用の関数
function getBrowserType() {

/****

一応Safari、Opera、IE、Firefox(Gecko)別に判別しているが、
暫定ではIEかどうかだけ分かればおｋ。

****/
	
	//Safari
	if (navigator.userAgent.indexOf('Safari') != -1) {
		return 'SF';
	}

	//Opera
	if (window.opera) {
		return 'OP';
	}
	
	//Internet Explorer
	if (document.all) {
		return 'IE';
	}
	
	//Gecko (Firefox等)
	if (document.getElementById) {
		return 'GC';
	}
	
	//その他
	return "OT";
}

//イベント追加関数
function addFuncToEvent(_elem, _event, _func) {

	if (_elem.addEventListener) {
		_elem.addEventListener(_event, _func, false);
	}

	else if (_elem.attachEvent) {
		_elem.attachEvent('on'+_event, _func);
	}

	else {
		return false;
	}
}

//選択範囲の文字列取得
function getSelectedText(nBrwType) {

	var selStr;

	switch (nBrwType) {
		//MSIE
		case 'IE':
			selStr = document.selection.createRange().text;
		break;

		//それ以外全て
		default:
			selStr = window.getSelection();
		break;
	}

	return selStr;
}


/********************************************
//miniPediaオブジェクト（JSON）
/*******************************************/
miniPedia = {

//***
//************************
	//パラメータ
//************************
	//とりあえずプロパティを宣言
	brwType:	null,	//ブラウザの種類

	pediaBase:	null,	//pediaベース
	pediaHead:	null,	//pedia閉じるボタン
	pediaLoad:	null,	//pediaロード画像
	pediaBody:	null,	//pedia本文欄
	pediaFoot:	null,	//pediaトップリンク
	pediaElem:	null,	//pediaElemエレメント
	
	winPosX:	0,		//マウスの水平座標
	winPosY:	0,		//マウスの垂直座標
	schText:	'',		//選択範囲のテキスト
	enbFlag:	true,	//minipediaが有効かどうか
	onMouse:	false,	//マウスが上にあるかどうか
	onFlag:		false,	//接続中かどうか
	
	paramPedia: {
		//初期値を与えておくプロパティ
		_width:		'260px',	//pedia窓の最大幅
		_padding:	'2px',		//pedia窓の内側余白
		_bgColor: 	'#99f',		//pedia窓の背景色
		_bgAlpha:	 70,		//pedia窓の背景透過度（0～100)
		_fColor: 	'#eee',		//pedia窓の文字色
		_fSize:		'11px',		//pedia窓の文字サイズ
		_fFamily: 	'Tahoma'	//pedia窓のフォント
	},

//***
//************************
	//開始メソッド
//************************
	startPedia: function () {

		//ブラウザ判別
		miniPedia.brwType = getBrowserType();
		// alert(miniPedia.brwType);

/*****************************
//　ベースの作成
/****************************/
		//エレメント作成＋パラメータ追加
		miniPedia.pediaBase = document.createElement('div');
		miniPedia.pediaBase.setAttribute('id', 'pediaBASE');
		
		//CSS適用
		with (miniPedia.pediaBase.style) {
			position	= 'absolute';
			display		= 'block';
			visibility	= 'hidden';
			float		= 'none';
			padding		= miniPedia.paramPedia._padding;
			margin		= '0';
			width		= miniPedia.paramPedia._width;
			height		= 'auto';

			border		= 'none';
			background	= miniPedia.paramPedia._bgColor;

			filter		= 'alpha(opacity='+miniPedia.paramPedia._bgAlpha+')';
			opacity		= miniPedia.paramPedia._bgAlpha/100;
			mozOpacity	= miniPedia.paramPedia._bgAlpha/100;

			textAlign		= 'left';
			verticalAlign	= 'top';

			top		= '0';
			left	= '0';
		}
		
		//マウスが上にあるかどうかのフラグ（有る時）
		miniPedia.pediaBase.onmousemove = function () {
			miniPedia.onMouse = true;
		}
		
		//マウスが上にあるかどうかのフラグ（無い時）
		miniPedia.pediaBase.onmouseout = function () {
			miniPedia.onMouse = false;
		}

		//ページに挿入
		document.body.appendChild(miniPedia.pediaBase);

/*****************************
//　ヘッダ(終了ﾎﾞﾀﾝ）の作成
/****************************/
		//エレメント作成＋パラメータ追加＋CSS適用＋ベースに挿入
		miniPedia.pediaHead = document.createElement('div');
		miniPedia.pediaHead.setAttribute('id', 'pediaHEAD');
		with (miniPedia.pediaHead.style) {
			position	= 'static';
			display		= 'block';
			float		= 'none';
			padding		= '0 0 2px';
			margin		= '0';
			width		= 'auto';
			height		= 'auto';

			border		= 'none';
			background	= 'none';

			textAlign	= 'right';
		}
		miniPedia.pediaHead.innerHTML = '<a href="#" onClick="miniPedia.hidePedia(); return false;" style="'+miniPedia.createCSSRule(1)+'">X</a>';
		miniPedia.pediaBase.appendChild(miniPedia.pediaHead);

/*****************************
//　ロード画像の作成
/****************************/	
		//エレメント作成＋パラメータ追加＋CSS適用＋ベースに挿入
		miniPedia.pediaLoad = document.createElement('img');
		miniPedia.pediaLoad.setAttribute('id',	'pediaLOAD');
		miniPedia.pediaLoad.setAttribute('src',	'http://ruby.netsket.net/murasawa/minipedia/program/load.gif');
		with (miniPedia.pediaLoad.style) {
			border	= 'medium none';
			width	= '0';
			height	= '0';
		}
		miniPedia.pediaBase.appendChild(miniPedia.pediaLoad);

/*****************************
//　本文表示欄の作成
/****************************/	
		//エレメント作成＋パラメータ追加＋CSS適用＋ベースに挿入
		miniPedia.pediaBody = document.createElement('div');
		miniPedia.pediaBody.setAttribute('id', 'pediaBODY');
		with (miniPedia.pediaBody.style) {
			position	= 'static';
			display		= 'inline';
			float		= 'none';
			padding		= '0';
			margin		= '0';
			width		= 'auto';
			height		= 'auto';

			border		= 'none';
			background	= 'none';

			color			= miniPedia.paramPedia._fColor;
			font			= 'normal normal normal '+miniPedia.paramPedia._fSize+'/normal '+miniPedia.paramPedia._fFamily;
			textDecoration	= 'none';

			textAlign		= 'left';
			verticalAlign	= 'top';
			lineHeight		= '1.5em';
		}
		miniPedia.pediaBase.appendChild(miniPedia.pediaBody);

/*****************************
//　フッタ(minipediaトップ）の作成
/****************************/
		//エレメント作成＋パラメータ追加＋CSS適用＋ベースに挿入
		miniPedia.pediaFoot = document.createElement('div');
		miniPedia.pediaFoot.setAttribute('id', 'pediaFOOT');
		with (miniPedia.pediaFoot.style) {
			position	= 'static';
			display		= 'block';
			float		= 'none';
			padding		= '5px 0 0';
			margin		= '0';
			width		= 'auto';
			height		= 'auto';

			border		= 'none';
			background	= 'none';

			textAlign	= 'center';
		}
		miniPedia.pediaFoot.innerHTML = '<a href="http://ruby.netsket.net/murasawa/minipedia/" target="_blank" style="'+miniPedia.createCSSRule(4)+'">Presented by minipedia</a>.';
		miniPedia.pediaBase.appendChild(miniPedia.pediaFoot);

//**
		
		//マウスの左ボタン離した時
		addFuncToEvent(document, 'mouseup', function (e) {
			
			var _X, _Y;

			//minipedia無効フラグが立っていなく、
			//リクエストフラグが立っていなく、
			//マウスがpedia窓に乗っていない時に処理ｗ
			if (miniPedia.enbFlag && !miniPedia.onMouse && !miniPedia.conFlag) {
			
				//IE用
				switch (miniPedia.brwType) {

					case 'IE':
						_X = event.clientX+(document.body.scrollLeft || document.documentElement.scrollLeft);
						_Y = event.clientY+(document.body.scrollTop || document.documentElement.scrollTop);
					break;

					//それ以外のブラウザ全て
					default:
						_X = e.pageX;
						_Y = e.pageY;
					break;
				}

				//座標設定
				miniPedia.winPosX = _X+8;
				miniPedia.winPosY = _Y+8;
				miniPedia.loadWikipedia();
			}
		});

	},

//***
//************************
	//部分CSS作成
//************************
	createCSSRule: function (_type) {

		with (miniPedia.paramPedia) {

			var nCSS;

			nCSS = 'color: '+_fColor+' !important; font: normal normal bold '+((_type != 3)? '12px' : _fSize)+'/normal '+_fFamily+' !important; text-decoration: '+((_type != 2)? 'none' : 'underline')+' !important;';
		}

		return nCSS;
	},

//***
//************************
	//minipedia表示
//************************
	showPedia: function (_New, _Body) {
	
		var nInt;

		//初期表示の場合
		if (_New) {

			//pedia窓に反映
			miniPedia.pediaLoad.style.width			= '16px';					//ロード画像表示（幅初期化）
			miniPedia.pediaLoad.style.height		= '16px';					//ロード画像表示（高さ初期化）
			miniPedia.pediaBody.innerHTML			= '&nbsp;&nbsp;'+_Body;		//本文セット
			miniPedia.pediaBase.style.left			= miniPedia.winPosX+'px';	//X座標リセット
			miniPedia.pediaBase.style.top			= miniPedia.winPosY+'px';	//Y座標リセット
			miniPedia.pediaBase.style.visibility	= 'visible';				//pedia窓表示			
		}
		
		//レス表示の場合
		else {

			miniPedia.pediaLoad.style.width		= '0';		//ロード画像非表示（幅初期化）
			miniPedia.pediaLoad.style.height	= '0';		//ロード画像非表示（高さ初期化）
			miniPedia.pediaBody.innerHTML		= _Body;	//本文表示
		}
	},

//***
//************************
	//minipedia非表示
//************************
	hidePedia: function() {

		//強制終了
		miniPedia.exitPedia(miniPedia.pediaElem);

		//pedia窓を隠す
		with (miniPedia.pediaBase.style) {
			visibility	= 'hidden';
			top			= '0';
			left		= '0';
		}
	},

//***
//************************
	//minipedia強制終了
//************************
	exitPedia: function (_elemID) {

		//1000ﾐﾘ秒後に破棄する（ちょっと間隔空けないとIEで落ちる＾＾；
		if (_elemID != null) {
			setTimeout(
				function () {
					try {
						document.body.removeChild(_elemID);
						_elemID = null;
					}
					catch(e) {
					}
				}, 1000);
		}

		miniPedia.conFlag = false;
	},


//***
//************************
	//Wikiオブジェクトをパース
	//(conpedia.phpからコールバックされる関数)
//************************
	parsePedia: function (_jsonPedia) {
		
		//JSONが無効、IDがnullの場合はエラーを吐く。
		if (!_jsonPedia || _jsonPedia.id == 'null') {
			miniPedia.showPedia(false, '<b style="'+miniPedia.createCSSRule(3)+'">'+miniPedia.schText+'</b> is nothing...');
		}
		
		//違えば表示
		else {
			miniPedia.showPedia(false, '<a href="'+_jsonPedia.url+'" target="_blank" style="'+miniPedia.createCSSRule(2)+'">'+_jsonPedia.title+'</a>:<br />'+_jsonPedia.body);
		}

		//SCRIPTエレメントを破棄
		miniPedia.exitPedia(miniPedia.pediaElem);
	},

//***
//************************
	//読み込み
//************************
	loadWikipedia: function () {

		//選択範囲のテキスト初期化
		miniPedia.schText = getSelectedText(miniPedia.brwType);

		//選択範囲に文字が無い時、pedia窓を閉じて関数から抜ける
		if (miniPedia.schText == "") {
			miniPedia.hidePedia();

			return;
		}

		//SCRIPTのエレメントがあれば破棄
		miniPedia.exitPedia(miniPedia.pediaElem);
		
		//フラグを立てて
		miniPedia.conFlag = true;

		//pedia窓新規表示
		miniPedia.showPedia(true, 'Now Searching of <b style="'+miniPedia.createCSSRule(3)+'">'+miniPedia.schText+'</b>');

		//エレメント作成
		miniPedia.pediaElem = document.createElement("script");
		miniPedia.pediaElem.setAttribute('type', 	'text/javascript');
		miniPedia.pediaElem.setAttribute('charset',	'UTF-8');
		miniPedia.pediaElem.setAttribute('src', 	'http://ruby.netsket.net/murasawa/minipedia/program/conwiki.php?kw='+encodeURIComponent(miniPedia.schText));

		//エレメント挿入
		document.body.appendChild(miniPedia.pediaElem);
	},

//***
//************************
	//ステッカー内のアクション
//************************
	stickerAction: function (_type) {

		switch (_type) {
			case 1:
				alert('minipediaが有効の時にページ内のテキストをドラッグ(反転)すると、反転した語句をWikipediaで検索し、結果をポップアップ表示します！\nページ内のどこを反転しても検索が始まりますので、是非お試しあれ！');
			break;

			case 2:
				miniPedia.enbFlag = !miniPedia.enbFlag;

				document.getElementById('pediaENABLE').innerHTML = '※minipediaは'+((miniPedia.enbFlag)? '有効' : '無効')+'です！';

				arguments[1].innerHTML = (!miniPedia.enbFlag)? '有効' : '無効';

				alert('minipediaを'+((miniPedia.enbFlag)? '有効' : '無効')+'にしました！'); return false;
			break;

			case 3:
				with (document.getElementById('pediaSOURCE')) {
					value			= '<!-- minipedia. //-->\n<script type="text/javascript" src="http://ruby.netsket.net/murasawa/minipedia/minipedia.js"></script>\n<script type="text/javascript">\n<!--\n\nwith (miniPedia.paramPedia) {\n\n	//set parameter.\n	_width   = "'+miniPedia.paramPedia._width+'";\n	_padding = "'+miniPedia.paramPedia._padding+'";\n	_bgColor = "'+miniPedia.paramPedia._bgColor+'";\n	_bgAlpha = '+miniPedia.paramPedia._bgAlpha+';\n	_fColor  = "'+miniPedia.paramPedia._fColor+'";\n	_fSize   = "'+miniPedia.paramPedia._fSize+'";\n	_fFamily = "'+miniPedia.paramPedia._fFamily+'";\n}\n\n//-->\n</script>\n<!-- /minipedia. //-->';
					style.display	= 'block';
				}

				alert('ソースを生成しました！\n※貼り付け方が分からない方はminipediaのTOPへ');
			break;
		}
	}
}

/********************************************
//　ステッカー作成
/*******************************************/
document.open();
document.write("<div style=\"margin: 0; padding: 0; border: 1px solid #000; width: 160px; height: auto;\"><div style=\"margin: 0; padding: 3px; background-color: #333; text-align: center;\"><a href=\"http://ruby.netsket.net/murasawa/minipedia/\" target=\"_blank\" style=\"text-decoration: none; color: #fff; font: normal normal bold 11px/normal Tahoma;\">minipedia</a></div><div style=\"margin: 0; padding: 5px; background-color: #fff;\"><p id=\"pediaENABLE\" style=\"margin: 8px 0 8px; padding: 0; color: #f33; font: normal normal bold 11px/normal Tahoma; text-align: center;\">※minipediaは有効です！</p><hr style=\"margin: 0; padding: 0; border-color: #aaa; border-style: dashed none none none; height: 1px;\" /><p style=\"margin: 8px 0 8px; padding: 0; color: #333; font: normal normal normal 11px/normal Tahoma; text-align: left;\"><a href=\"#\" onClick=\"miniPedia.stickerAction(1); return false;\" style=\"text-decoration: underline; color: #333; font: normal normal normal 11px/normal Tahoma;\">minipedia</a>とは？<br /><br /><a href=\"#\" onClick=\"miniPedia.stickerAction(2, this); return false;\" style=\"text-decoration: underline; color: #333; font: normal normal normal 11px/normal Tahoma;\">無効</a>にする<br /><br /><a href=\"#\" onClick=\"miniPedia.stickerAction(3); return false;\" style=\"text-decoration: underline; color: #333; font: normal normal normal 11px/normal Tahoma;\">貼り付けソース</a>を入手<br /></p><span style=\"display: block; margin: 0; padding: 0; text-align: center;\"><textarea id=\"pediaSOURCE\" onclick=\"this.focus(); this.select();\" wrap=\"off\" style=\"display: none; border: 1px solid #000; width: 145px; height: 100px; font: normal normal normal 10px/normal 'ＭＳ ゴシック';\"></textarea></span></div><div style=\"margin: 0; padding: 3px; background: none; background-color: #333;\"><p style=\"margin: 0; padding: 0; color: #fff; font: normal normal normal 9px/normal Tahoma;\"><a href=\"http://blogparts.netsket.com/\" target=\"_blank\" style=\"text-decoration: underline; color: #fff; font: normal normal normal 9px/normal Tahoma;\">ブログパーツ</a>探すならブログパーツ助っ人</p></div></div>");
document.close();

/********************************************
//　minipedia有効化
/*******************************************/
addFuncToEvent(window, 'load', miniPedia.startPedia);