(function(){
/// Define ////////////////////////////////
var IS_DEBUG = true;
// ブログパーツ
var BLOGPARTS = {
	url: "http://www.hagaren.jp/app/bp/hagaren_bp02.swf",
	width: 160,
	height: 290
};
// キーワードを受け取って動くフルスクリーンFlash
var FULLSWF = {
	url: "http://www.hagaren.jp/app/bp/full.swf"
};
// Flashバージョン
var SWF_VERSION = "9";
// Express Install SWFのURL
var EXPRESSINSTALL_URL = null;
// 検索するキーワード
var TARGET_WORDS = [
	"鋼", "錬金術","アニメ","ｱﾆﾒ","新章","ハガレン","ﾊｶﾞﾚﾝ","エド","ｴﾄﾞ","アル","ｱﾙ","ウィンリィ","ｳｨﾝﾘｨ","ブログパーツ","ﾌﾞﾛｸﾞﾊﾟｰﾂ","錬成陣","FULLMETAL","ALCHEMIST","公式","MBS","TBS","ダーク","ﾀﾞｰｸ","ファンタジー","ﾌｧﾝﾀｼﾞｰ","ホムンクルス","ﾎﾑﾝｸﾙｽ","大佐","5時","５時"
];
// 依存する外部スクリプト
var REQUIRES = [
	"http://ajax.googleapis.com/ajax/libs/swfobject/2.1/swfobject.js",// swfobject 2.1
	"http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js",// jQuery1.2.6 with jquery.dimensions
	"http://www.hagaren.jp/app/bp/jquery.color.utils-0.1.0.js"
];
// 名前の重複防止(グローバルに入る要素の名前の先頭につく)
var PRODUCT_PREFIX = "hagaren_bp02_";
var BLOG_PARTS_ID = PRODUCT_PREFIX + "external";
/// Common /////////////////////////////////
var _c = window.console;
//debug出力
var trace = function(msg){
	if(!IS_DEBUG) return;
	if(!_c) return;
	_c.log(msg);
};
//スクリプトを動的にロードする
var load_script = function(src, on_load){
	if(navigator.userAgent.indexOf("MSIE") != -1){
		var node = document.getElementsByTagName('script');
	    for( var i=0 ; i < node.length; i++){
			if( node[i].src == src)return;
		}
	}
	var js = document.createElement('script');
	js.src = src;
	var done = false;
	js.onload = js.onreadystatechange = function(){
		if ( !done && (!this.readyState || 
						this.readyState == "loaded" || this.readyState == "complete") ) {
			done = true;
			on_load();
		}
	};
	var head = document.getElementsByTagName("head")[0] || document.documentElement;
	head.appendChild(js);
};
var is_ready = false;
var wait_ready_function = null;
//依存するスクリプトファイルをダウンロードする
var load_requires = function(){
	is_ready = false;
	var count = REQUIRES.length;
	var loaded = 0;
	var f;
	f = function(){
		load_script(REQUIRES.shift(), function(){
			if(REQUIRES.length == 0){
				is_ready = true;
				if(!wait_ready_function) return;
				wait_ready_function();
				wait_ready_function = null;
			}else{
				f();
			}
		});
	};
	f();
};
/**
* 含まれるノードを再帰的に取得する
* var itr = create_node_iterator(document.body);
* var node;
* while(node = itr.next()){
*
* }
*/
var create_node_iterator = function(root){
	var result = {};
	var node_stack = [{node: root, index: 0}];
	result.next = function(){
		while(0 != node_stack.length){
			var current_node = node_stack[node_stack.length - 1];
			var children = current_node.node.childNodes;
			if(children.length > current_node.index){
				var next_node = children[current_node.index];
				if(1 == next_node.nodeType){//ELEMENT_NODE
					node_stack.push({node: next_node, index: 0});
				}
				current_node.index++;
				return next_node;
			}else{
				node_stack.pop();
			}
		}
		return null;
	};
	return result;
};
/**
* 関数を非同期で実行する
* async(function{ alert("hello"); });
*/
var async = function(f){
	var iid = setInterval(function(){
		clearInterval(iid);
		f();
	}, 1);
};
//////////////////////////////////////
var word_class_name = PRODUCT_PREFIX +  "word";

var get_id_suffix = function(){
	if(!window[PRODUCT_PREFIX + "id_seed"]){
		window[PRODUCT_PREFIX + "id_seed"] = 0;
	}else{
		window[PRODUCT_PREFIX + "id_seed"] = window[PRODUCT_PREFIX + "id_seed"] + 1;
	}
	return window[PRODUCT_PREFIX + "id_seed"];
};
var mark_keywords = function(){
	var itr = create_node_iterator(document.body);
	var node;
	var re = new RegExp(TARGET_WORDS.join("|"), "ig");
	var is_skip = false;
	while(node = itr.next()){
		if(1 == node.nodeType){//ELEMENT_NODE
			is_skip = word_class_name == node.className;
		}
		if(3 != node.nodeType) continue;//TEXT_NODE
		if(is_skip) continue;
		var txt = node.nodeValue.replace(re, function(word){
			return "<span class='" + word_class_name +  "'>" + word + "</span>";
		});
		$(node).replaceWith(txt);
	}
};
var get_blogparts_class = function(){
	return PRODUCT_PREFIX + "blogparts";
};
var blogparts_1st_id = null;
var close = function(){
	$("span." + word_class_name).css("visibility", "visible");
	var full_id = PRODUCT_PREFIX + "fullexternal_" + get_id_suffix();
	swfobject.removeSWF(full_id);
	/*
	async(function(){
		var full_id = PRODUCT_PREFIX + "fullexternal_" + get_id_suffix();
		swfobject.removeSWF(full_id);
	});
	*/
}
var show_complete = function(){
	$("span." + word_class_name).css("visibility", "hidden");
}
var show = function(){
	mark_keywords(TARGET_WORDS);
	var wnd = $(window);
	var doc = $(document);
	var parts = $("#" + BLOG_PARTS_ID);
	var words = $("span." + word_class_name);
	var vars = {};

	
	
	vars["scroll_x"] = doc.scrollLeft();
	vars["scroll_y"] = doc.scrollTop();
	vars["parts_w"] = parts.width();
	vars["parts_h"] = parts.height();
	vars["parts_x"] = parts.offset().left;
	vars["parts_y"] = parts.offset().top;
	vars["parts_id"] = PRODUCT_PREFIX;
	var wordCnt = 0;
	var indexCnt = 0;
	
	words.each(function(i){
		var word = $(this);
		if( word.offset().left != 0 && word.offset().top != 0 ){
			vars["word_text" + wordCnt] = word.text();
			vars["word_x" + wordCnt] = word.offset().left;
			vars["word_y" + wordCnt] = word.offset().top;
			//vars["word_px" + i] = word.height();
			//vars["word_px" + wordCnt] = parseInt(word.css("font-size"));
			vars["word_px" + wordCnt] = word.height();
			vars["word_color" + wordCnt] = $.fmtColor(word.css("color"),'hexadecimal').replace(/#/,"0x");
			wordCnt++;
		}
	});
	vars["word_count"] = wordCnt;

	trace(vars);

	var full_id = PRODUCT_PREFIX + "fullexternal_" + get_id_suffix();
	$("<div id='" + full_id + "'></div>").appendTo("body"); 
	var attrs = {
	};
	var params = {
		wmode: "transparent",
		allowScriptAccess: "always"
	};
	if($.browser.msie){

		$('object').each(function(){
			if("Transparent" == this.wMode) return;
			$(this).attr('wmode', 'transparent');
			$(this).replaceWith(this.outerHTML);
		});
	}else{
		$('object').attr('wmode', 'transparent').hide().show();
	}
	/*$("object").append("<param name='wmode' value='transparent' />").hide().show();*/
	$('embed').attr('wmode', 'transparent').hide().show();

	swfobject.embedSWF(FULLSWF.url, full_id, wnd.width(), wnd.height(), SWF_VERSION, EXPRESSINSTALL_URL, vars, params, attrs);
	var full = $("#" + full_id);
	
	if($.browser.msie){
		full.css("position", "absolute").css("z-index", "10000");
	}else{
		full.css("position", "fixed").css("z-index", "10000");
	}
	
	var func = function(){
		var top = doc.scrollTop();
		var left = doc.scrollLeft();
		
		if($.browser.msie){
		}else{
			top = 0;
			left = 0;
		}
		
		full.css("left", left + "px")
			.css("top", top + "px")
			.css("width", wnd.width() + "px")
			.css("height", wnd.height() + "px");
	};

	wnd.resize(func);
	if($.browser.msie){
		wnd.scroll(func);
	}
	func();
};
var init = function(){
	var f = function(){
		$("div." + get_blogparts_class()).each(function(){
			var blogparts = $(this);
			if(!blogparts_1st_id){
				//blogparts_1st_id = blogparts.attr("id");
				blogparts_1st_id = BLOG_PARTS_ID;
			}
			var attrs = {
				"class" : blogparts.attr("className")
			};
			var params = {
				wmode: "transparent",
				allowScriptAccess: "always"
			};
			if($.blowser == "msie"){
			}else{
				swfobject.embedSWF(BLOGPARTS.url, BLOG_PARTS_ID, BLOGPARTS.width, BLOGPARTS.height, SWF_VERSION, EXPRESSINSTALL_URL, null, params, attrs);
			}
		});
	};
	if(is_ready){
		f();
	}else{
		wait_ready_function = f;
	}
};
/// Global /////////////////////////////////
// フルスクリーンFlashを表示する(Blogpartsから呼び出す想定)
window[PRODUCT_PREFIX + "show"] = function(){
	show();
};
// フルスクリーンFlashが起動したら呼ぶ(フルスクリーンFlashから呼び出す想定)
window[PRODUCT_PREFIX + "show_complete"] = function(){
	show_complete();
};
// フルスクリーンFlashを閉じる(フルスクリーンFlashから呼び出す想定)
window[PRODUCT_PREFIX + "close"] = function(){
	close();
};

// ブログパーツ解析
var img = new Image();
img.src = 'http://logbp.samuraicenter.jp/nt.js?t=ab&wid=fma_01&rand=' + Math.random();
img.onload = function(){};
img.onerror = function(){};

var img2 = new Image();
img2.src = 'http://logbp.samuraicenter.jp/nt.js?t=ab&wid=fma_03&rand=' + Math.random();
img2.onload = function(){};
img2.onerror = function(){};

/// Bootstrap /////////////////////////////////

if(window["ActiveXObject"]){
	load_requires();
	init();
	document.write(
		'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0"  width="' + BLOGPARTS.width + 'px" height="' + BLOGPARTS.height + 'px" id="' + BLOG_PARTS_ID + '" >' + 
		'<param name="src" value="' + BLOGPARTS.url + '"/>' + 
		'<param NAME="wmode" value="Transparent">' + 
		'<param NAME="allowScriptAccess" value="always">' + 
		
		'</object>'
	);
}else{
	load_requires();
	init();
	document.write("<div id='" + BLOG_PARTS_ID + "' class='" + get_blogparts_class() + "'></div>");
}

})();
