
/*********************************************************************

Objectタグを使用で読み込んだHTMLファイルのリンクがIEでは
親ページで開くことができない対処用JavaScript

【処理の流れ】

1.ブラウザ判別後、
2.XMLHttpRequest が使えるIEなら 外部ファイルを読み込み、
正規表現でbodyタグ間を切り出して、.innerHTMLで書き出す。
4 IE以外のブラウザはObjectタグ
5.それ以外は外部ファイルへのリンクだけを出力。
6.あとはjs OFF環境のためにnoscriptタグで外部ファイルへのリンクを書く。

(注1)XMLHttpRequestにはWinIE4から対応しているものの、
try～catch構文使用可なのはWinIE5upからで、WinIE4は使えない。
WinIE4は、自前エラー処理で、XMLHttpRequestを試みることにする。
↑いまどきそんな需要はないと思うけど;
(注2)JavascriptOFF機　はnoscriptタグで別途対応

(注3)全サイトのサイドメニューなどにObjectを使用しているような場合、
この方法だとページ遷移の都度同じファイルにXMLHttpRequestを送って
処理することに資源の浪費感が・・

***********************************************************************/
//設定

var filename="./read.html";//読み込ませる外部ファイルのパス
var wide="150"; //Objectタグで書き出す際の幅
var high="200"; //同 高さ
var filetype="text/html"; //読み込むファイルタイプ　HTMLファイルはこのまま
var linkTxt="外部ファイルへのリンク" //代替用のリンクテキスト
var divID="objdiv";//出力するブロックタグ（div)のID
var bodyflg=1; //読み込むファイルのボディタグ間を抽出する　Yes:1 No:0

/*(注)HTMLのbody内部だけを抽出しなくても表示はできます。
***********************************************************************/

//XmlHttpRequestできないIE用の出力
var AltHTML="<div><a href=\""+filename+"\">"+linkTxt+"</a></div>";

//IE以外のブラウザへの出力
var ObjectTagHTML="<object data=\""+filename+"\" type=\""+filetype+"\"width=\""+wide+"\" height=\""+high+"\"><a href=\""+filename+"\">"+linkTxt+"</a></object>";

//ブラウザの判別

var isIE=/*@cc_on!@*/false;
var WinIE5up=(isIE && document.getElementById  && window.ActiveXObject);
var WinIE4=(isIE && !document.getElementById  && window.ActiveXObject);
var nonTargetIE=(isIE && !window.ActiveXObject);

/**************処理確認用アラート 要コメントアウトOR削除*****************/

if(WinIE5up||WinIE4)alert("あなたのブラウザはWinIE4以上です。XMLHttpRequestを試みます。\n成功すれば、受信結果を、失敗の場合は外部ファイルへのリンクを出力します");
else if(!isIE)alert("あなたのブラウザはIEではありません。Objectタグを出力します");
else if(nonTargetIE)alert("あなたのブラウザはWinIE4未満かMacIEです。外部ファイルへのリンクだけ出力します");

/***********************************************************************/
//XMLHttpRequest

function requestFile(fileName,callback){
	var request = false, i;
	if(WinIE5up){//winie5upなら
		var factories = [
    			//function () {return new XMLHttpRequest()},//ie7以上が対応。
    			function () {return new ActiveXObject("Msxml2.XMLHTTP")},
   		 	function () {return new ActiveXObject("Msxml3.XMLHTTP")},
    			function () {return new ActiveXObject("Microsoft.XMLHTTP")}//古いので要らないかも
  		];
 
  		for ( i = 0;i < factories.length; i++ )
  			{
    				try { request = factories[i](); }
    				catch (e) { continue; }
    				break;
  			}
	}
	if(WinIE4){
		onerror=function(){
			shori_nonTargetIE();
			return true;
		}
		request=new ActiveXObject("Microsoft.XMLHTTP");
		
	}
    //open メソッド
   	request.open("GET" , fileName , true);
    
    //受信時に起動するイベント
    request.onreadystatechange = function()
    { 
      	//readyState値は4で受信完了 
	//ローカルマシンの場合はstatus:0が返る
	if(request.readyState==4)
      	{ 
        	//コールバック
		//if(request.status==0) shori_TargetIE(request);/*ローカルマシンでのテスト用*/
		if(request.status==200)shori_TargetIE(request);
		else shori_nonTargetBrowser();
      	}
	
    }
    
    //send メソッド
    request.send(null);

}
//対象のWinIEの処理
function shori_TargetIE(obj)
  {
	//レスポンスを取得
	res  = obj.responseText;
	if(WinIE5up)var elm = document.getElementById(divID);
	else var elm = document.all(divID);
		elm.style.width=wide;
		elm.style.height=high;
		//正規表現でbodyタグ間を抽出
		if(bodyflg)res=(res.match(/<body[\s\S]+<\/body>/g)+"").replace(/<\/*body?>/g,"");
  		elm.innerHTML=res;
  }
//対象IE以外の処理
function shori_nonTargetBrowser(){
	if(!isIE){
		document.write(ObjectTagHTML);
	}
	else{
		document.write(AltHTML);
	}
}
//実行用関数
function Alt_Objecttag(){
	if(WinIE5up||WinIE4){
		requestFile(filename,shori_TargetIE);
	}
	else{
		 shori_nonTargetBrowser();	
	}
}
Alt_Objecttag();
