// Arekore-Trick-Old-UserAgent-Trouble. last-update: 2005.01.06.
	// (c) snow-materia "http://sm.useyan.com/"
		// This tricks Browser(*chiefly IE) into pretending to the standard, a little.


//	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	setting
var _ie = {
	// enabled for IE (Opera) ? [0:false, 1:true]
	listener  : 1,	// enabled `addEventListener` to elements ?
	setclass  : 1,	// enabled `obj.setAttribute('class', '*')` ? (*IE)
	namespace : 1,	// enabled `document.getElementsByTagNameNS('NameSpace', '*')` ?
	abbr    : 1,	// enabled `<abbr>` elements ? (*IE)
	iframe  : 1,	// convert `<object>` elements into `<iframe>` elements. (*IE)
	wait    : 150,	// waiting-time until working the scripts after document-onload.

	// add mark-text to these elements specified for here. (*IE)
		// { 'element' : ['before', 'after'](['both']) }
		// [q, #id, .class, #id.class, .class#id, q#id, q.class, q#id.class, q.class#id]
	mark : {
//		'Q' : ['"'],	// `<Q>`
		'EM.comp' : ['(', ')'],	// `<em class="comp">`
		'.memo' : []	// `<* class="memo">`
	},

	// position-fixed [px] (*IE)
		//  'id' : {top:'20px', bottom:'auto', left:'10px', right:'auto'}
	fixed : {
		'' : {}
	}
};




//	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	script




//	-	-	-	-	-	-	-	-	-	-	-	addEventListener, removeEventListener
// addEventList(event, function, boolean, object);
	// 1: `window.onload = func;` -> `addEventList('load', func, false, window);`
	// 2: `obj.addEventListener('load', func, false);` ->
	//    -> `obj.honya = addEventList;  obj.honya('load', func, false);`
function addEventList(type, func, capt, obj) {
	if (!func || !type || typeof(capt) != 'boolean') return;
	if (!obj || typeof(obj) != 'object') obj = this;
	type = type.toLowerCase();

	// DOM2 HTMLEvents OK?
	var di = document.implementation;
	if (di && di.hasFeature('HTMLEvents', '2.0') && !obj._ie1 && obj.addEventListener)
		obj.addEventListener(type, func, capt);
	// Opera
	else if (window.opera && obj.attachEvent)
		obj.attachEvent('on'+type, func);
	// IE
	else if (obj.attachEvent) {
		if (!obj._ie_add_func) obj._ie_add_func = new Object();
		var _ief = obj._ie_add_func;
		if (!_ief[type]) {
			_ief[type] = new Array();
			obj.attachEvent('on'+type, loadEventList);
		}
		_ief[type][ _ief[type].length ] = func;
	}
	// Other
	else {
		var prev = obj['on'+type];
		obj['on'+type] = (prev) ? function (e) { prev(e); func(e); } : func;
	}
}
// load event-function (forIE)
function loadEventList(e) {
	var obj = this;
	if (!e || typeof(e) != 'object') e = window.event || null;
	if (!e || !e.type) return;
	var type = e.type.toLowerCase();
	// case element
	if (!obj.nodeType && e.srcElement) {
		var o = e.srcElement;
		while (o && o.nodeType) {
			if (o._ie_add_func && o._ie_add_func[type]) { obj = o;  break; }
			o = o.parentNode;
		}
		e.target = obj;	// target-object
		e.cancelBubble = true;	// not double
	}
	if (!obj || !obj._ie_add_func) return;
	// functions
	var _ie_funcs = obj._ie_add_func[type];
	if (!_ie_funcs || !_ie_funcs.length) return;
	// action
	for (var i = 0; i < _ie_funcs.length; i++) {
		var func = _ie_funcs[i];
		if (func && typeof(func) == 'function') func(e);
	}
}


// removeEventList(event, function, boolean, object);
	// `obj.removeEventListener('load', func, false);` ->
	//    -> `obj.rehonya = removeEventList;  obj.rehonya('load', func, false);`
function removeEventList(type, func, capt, obj) {
	if (!func || !type || typeof(capt) != 'boolean') return;
	if (!obj || typeof(obj) != 'object') obj = this;
	type = type.toLowerCase();

	// DOM2 HTMLEvents OK?
	var di = document.implementation;
	if (di && di.hasFeature('HTMLEvents', '2.0') && !obj._ie1 && obj.removeEventListener)
		obj.removeEventListener(type, func, capt);
	// Opera, IE
	else if (obj.detachEvent) {
		obj.detachEvent('on'+type, func);
		// IE
		if (!window.opera && obj._ie_add_func) {
			var _ie_funcs = _ie_add_func[type];
			if (!_ie_funcs || !_ie_funcs.length) return;
			for (var i = 0; i < _ie_funcs.length; i++)
				if (_ie_funcs[i] == func) _ie_funcs[i] = null;
		}
	}
	// Other
	else obj['on'+type] = new Function();
}




//	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	Element-Method
// get Attribute (for IE)
function _ie_getAttribute(attr) {
	return (attr && attr.toLowerCase() == 'class') ? this.className : this[attr];
}
// set Attribute (for IE)
function _ie_setAttribute(attr, value) {
	if (attr && attr.toLowerCase() == 'class') this.className = value;
	else this[attr] = value;
}
// add Element-Method
function addElementMethod(obj) {
	if (!obj || obj.nodeType != 1 || 
		 obj.nodeName == 'OBJECT' || obj.nodeName == 'EMBED') return false;

	// IE-className
	if (_ie['setclass']) {
		obj.getAttribute = _ie_getAttribute;
		obj.setAttribute = _ie_setAttribute;
	}
	// make obj.addEventListener and obj.removeEventListener (for IE)
	if (_ie['listener'] && !obj.addEventListener) {
		obj._ie1 = true;
		obj.addEventListener = addEventList;
		obj.removeEventListener = removeEventList;
	}
}


// make window.addEventListener and window.removeEventListener (for IE and Opera)
if (_ie['listener'] && !window.addEventListener) {
	window._ie1 = true;
	window.addEventListener = addEventList;
	window.removeEventListener = removeEventList;
}
// make document.addEventListener and document.removeEventListener (for IE and Opera)
if (_ie['listener'] && !document.addEventListener) {
	document._ie1 = true;
	document.addEventListener = addEventList;
	document.removeEventListener = removeEventList;
}




//	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	NS
// public function CreateDocumentFragment() : XmlDocumentFragment;
// enabled `document.getElementsByTagNameNS('*')` and ...
if (_ie['namespace']) {
//	alert(document.documentElement.namespaceURI)
	var d = document;

	// make document.getElementById
	if (!d.getElementById && d.all)
		d.getElementById = function (id) { return document.all(id); }

	// make document.getElementsByTagNameNS
	if (!d.getElementsByTagNameNS && d.getElementsByTagName)
		d.getElementsByTagNameNS = function (ns, tag) {
			return document.getElementsByTagName(tag);
		}
	// make document.createElementNS
	if (!d.createElementNS && d.createElement)
		d.createElementNS = function (ns, tag) {
			return document.createElement(tag);
		}
	// make document.createAttributeNS
	if (!d.createAttributeNS && d.createAttribute)
		d.createAttributeNS = function (ns, attr) {
			return document.createAttribute(attr);
		}
}




//	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	HTML-TIPS
// re-create-abbr-elements
function _ie_abbr() {
	var d = document;
	var abbr = d.getElementsByTagName('ABBR');
	if (!abbr || !abbr.length || !d.getElementsByTagName('/ABBR').length) return;
	var imax = abbr.length;
	// copy-attributes
	var copy_attr = new Array('title', 'id', 'class', 'lang', 'dir', 'style');
	// for abbr-elements
	for (var i = 0; i < imax; i++) {
		var before = abbr[i];
		var after;
		var par = before.parentNode;
		// create
		var obj = d.createElement('ABBR');
		par.insertBefore(obj, before);
		// copy-attributes
		for (var j = 0; j < copy_attr.length; j++) {
			var val = before.getAttribute(copy_attr[j]);
			if (val) obj.setAttribute(copy_attr[j], val);
		}
		if (before.className) obj.className = before.className;
		// move
		var j = 0;
		var jmax = par.childNodes.length;
		while (before.nextSibling && before.nextSibling.nodeName) {
			var next = before.nextSibling;
			if (next.nodeName == '/ABBR' || ++j >= jmax) { after = next;  break; }
			obj.appendChild(next);
		}
		// remove
		if (after) par.removeChild(after);
		par.removeChild(before);
	}
}
// add mark-texts before and after elements.
function _ie_mark() {
	var d = document;
	var mark_obj = _ie['mark'];
	for (var k in mark_obj) {
		// mark
		var marks = mark_obj[k];
		if (typeof(marks) == 'string') marks = [marks, marks];
		if (typeof(marks) != 'object' || (!marks[0] && !marks[1])) continue;
		if (typeof(marks[1]) != 'string') marks[1] = marks[0];
		// elements
		var els = _ie_get_elements_by_selecter(k);
		if (!els || !els.length) continue;
		// add text-marks
		for (var i = 0; i < els.length; i++) {
			var el = els[i];
			// before-mark-text
			var before = d.createElement('SPAN');
			el.insertBefore(before, el.firstChild);
			before.className = 'mark';
			before.appendChild( d.createTextNode( marks[0] ) );
			// after-mark-text
			var after = d.createElement('SPAN');
			el.appendChild(after);
			after.className = 'mark';
			after.appendChild( d.createTextNode( marks[1] ) );
		}
	}
}


// get element-objects by css-selecter ( q, #id, .class, q.class, ...)
function _ie_get_elements_by_selecter(string) {
	var d = document;

	// simple
	if (string.indexOf(' ') < 0 && string.indexOf('#') < 0 &&
		string.indexOf('.') < 0 && string.indexOf('[') < 0)
		return d.getElementsByTagName(string);

	// multi
	var elems = [d];
	var space = [string];
	if (string.indexOf(' ') >= 0) space = string.split(/\s+/);	// slash-space
	for (var s = 0; s < space.length; s++) {
		if (!space[s]) continue;
		var str = space[s];
		var tag = null;
		var ids = null;
		var cls = null;
		var ats = null;
		var ath = {};
		var old = elems;
		elems = [];
		// attr
		if (str.indexOf('[') == 0) break;	// incorrect
		if (str.indexOf('[') > 0) {
			ats = ( str.match(/\[[^\]]*\]/g) );
			str = str.replace(/\[[^\]]*\]/g, '');
		}
		// id
		if (str.indexOf('#') >= 0) {
			if (str.indexOf('#') == 0) tag = '*';
			ids = ( str.match(/\#[-\w]+/g) );
			str = str.replace(/\#[-\w]+/g, '');
		}
		// class
		if (str.indexOf('.') >= 0) {
			if (str.indexOf('.') == 0) tag = '*';
			cls = ( str.match(/\.[-\w]+/g) );
			str = str.replace(/\.[-\w]+/g, '');
		}
		// tag
		tag = str || '*';
		// id-check
		var ido;
		if (ids) {
			for (var i = 0; i < ids.length; i++) {
				var id = ids[i].replace(/^#/, '');
				var now = d.getElementById(id);
				if (i == 0) ido = now;
				if (!now || ido != now) { ido = null;  break; }
			}
			if (!ido || (cls && !ido.className)) break;	// class and !class-name
			elems = [ido];
			if (!cls && !ats) continue;	// !class && !attr
		}
		// class
		var clsreg = [];
		if (cls) {
			var idc = (ido) ? ido.className : null;	// id
			for (var i = 0; i < cls.length; i++) {
				var cl = cls[i].replace(/^\./, '');
				if (!cl) continue;
				creg = RegExp('(^|\\s)' + cl + '(\\s|$)');
				if (idc && !idc.match(creg)) { idc = null;  break; }	// id
				clsreg[ clsreg.length ] = creg;
			}
			if (ido && idc) continue; else if (ido) break;	// id
		}
		// attr
		if (ats) {
			var ida = (ido) ? 1 : 0;	// id
			// hash
			for (var i = 0; i < ats.length; i++) {
				var sli = ats[i].replace(/[\[\]\'\"]+/g, '');
				var slm = sli.match(/^(.+)\=(.*)$/);
				// [target]
				if (!slm[1]) {
					if (ida && !ido.getAttribute(ath[sli])) { ida = 0; break; }	// id
					ath[sli] = null;
				}
				// [target="_blank"]
				else {
					if (ida) {	// id
						var attr = ido.getAttribute(slm[1]) || '';
						if (attr != slm[2]) { ida = 0; break; }
					}
					ath[ slm[1] ] = slm[2] || '';
				}
			}
			if (ido && ida) continue; else if (ido) break;	// id
		}
		// elements in objects
		for (var i = 0; i < old.length; i++) {
			var any = old[i].getElementsByTagName(tag);
			for (var j = 0; j < any.length; j++) {
				var o = any[j];
				// no-class and no-attr
				if (!cls && !ats) {
					elems[ elems.length ] = o;
					continue;
				}
				// class-check
				if (cls) {
					var jc = o.className;
					if (!jc) continue;
					for (var l = 0; l < clsreg.length; l++) {
						if (!jc.match(clsreg[l])) { jc = null;  break; }
					}
					if (!jc) continue;
				}
				// attr
				if (ats) {
					var ok = 1;
					for (var at in ath) {
						var attr = o.getAttribute(at) || '';
						if (ath[at] == null) {
							if (!attr) { ok = 0;  break; }
						}
						else if (ath[at] != attr) { ok = 0;  break; }
					}
					if (!ok) continue;
				}
				elems[ elems.length ] = o;
			}
		}
	}
	return elems;
}




// position-fixed
function _ie_position_fixed() {
	var fix_obj = _ie['fixed'];
	var ch = 0;
	var posi = new Array('top', 'bottom', 'left', 'right');	// position
	for (var k in fix_obj) {
		var fix = fix_obj[k];
		if (!k || !fix || typeof(fix) != 'object') { delete fix_obj[k]; continue; }
		for (var i = 0; i < 4; i++) {
			var p = posi[i];
			if (fix[p] == null || typeof(fix[p]) != 'number') fix[p] = null;
		}
		ch++;
	}
	// add-event
	if (ch) window.addEventListener('scroll', _ie_position_fixing, false);
	_ie_position_fixing();
}
// position-fixed-keep
function _ie_position_fixing() {
	// scroll-position
	var scroll_x = window.pageXOffset
		 || d.documentElement.scrollLeft
		 || (d.body ? d.body.scrollLeft : 0);
	var scroll_y = window.pageYOffset
		 || d.documentElement.scrollTop
		 || (d.body ? d.body.scrollTop : 0);
	// style-change
	var fix_obj = _ie['fixed'];
	for (var k in fix_obj) {
		var fix = fix_obj[k];
		var obj = fix.object || _ie_position_fix_obj(fix_obj, k);
		if (!obj) continue;
		var sty = obj.style;
		sty['visibility'] = 'hidden';
		if (fix['top']    != null) { sty['top']    = (fix['top']  + scroll_y) + 'px'; }
		if (fix['left']   != null) { sty['left']   = (fix['left'] + scroll_x) + 'px'; }
		if (fix['bottom'] != null) { sty['bottom'] =  fix['bottom'] + 'px'; }
		if (fix['right']  != null) { sty['right']  =  fix['right']  + 'px'; }
		sty['visibility'] = 'visible';
	}
}
// position-fixed-object-get
function _ie_position_fix_obj(fix_obj, k) {
	var obj = document.getElementById(k);
	if (!obj) return null;
	if (!obj.style) { delete fix_obj[k]; return null; }
	fix_obj[k].object = obj;
	sty = obj.style;
	sty['position'] = 'absolute';
	sty['top'] = sty['bottom'] = sty['left'] = sty['right'] = 'auto';
	return obj;
}




// object[type="text/html"] -> iframe
function _ie_iframe() {
	var attrs = ['id', 'name', 'title', 'width', 'height'];
	var objects = document.getElementsByTagName('OBJECT');
	if (!objects || !objects.length) return;
	for (var i = 0; i < objects.length; i++) {
		var obj = objects[i];
		var mime = obj.type;
		if (mime && mime != 'text/html' && mime != 'application/xhtml+xml' &&
			mime != 'application/xml' && mime != 'text/xml') continue;
		var iname = obj.getAttribute('name');
		// no name ?
		if (!iname) {
			var par = obj.parentNode;
			var ifr = document.createElement('IFRAME');
			ifr.setAttribute('src', obj.getAttribute('data'));
			ifr.setAttribute('frameBorder', 0);
			ifr.setAttribute('allowTransparency', true);
			if (obj.className) ifr.className = obj.className;
			for (var j = 0; j < attrs.length; j++) {
				ifr.setAttribute(attrs[j], obj.getAttribute(attrs[j]));
			}
			par.insertBefore(ifr, obj);
			par.removeChild(obj);
			continue;
		}
		// name
		else {
			var str = obj.outerHTML;
			var attr = 'frameBorder="0" allowTransparency="true"';
			str = str.replace(/(<\/?)object/ig, '$1iframe');
			str = str.replace(/(<iframe[^>]+)data=/ig, '$1src=');
			str = str.replace(/(<iframe[^>]+)>/ig, '$1 ' + attr + '>');
			obj.outerHTML = str;
			continue;
		}
	}
}




//	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	begin
// begin or wait
function _ie_wait() {
	// object[type="text/html"] -> iframe
	if (_ie['iframe']) _ie_iframe();

	// wait ?
	_ie['wait'] -= 0;
	if (!_ie['wait']) _ie_init();
	else _ie['wait_id'] = setTimeout('_ie_init()', _ie['wait']);

	// Element-Method
	if ( _ie['setclass'] || _ie['listener']) {
		var els = document.getElementsByTagName('*');
		var max = els.length;
		for (var i = 0; i < max; i++) addElementMethod( els[i] );
	}
}
// initialize
function _ie_init() {
	// <abbr>
	if (_ie['abbr']) _ie_abbr();
	// mark-text
	if (_ie['mark']  && typeof(_ie['mark'])  == 'object') _ie_mark();
	// position-fixed
	if (_ie['fixed'] && typeof(_ie['fixed']) == 'object') _ie_position_fixed();
}




//	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	check
var d = document;
// not IE ?
if (window.opera || !d.all) {
	_ie['setclass'] = 0;
	_ie['abbr'] = 0;
	_ie['mark'] = 0;
	_ie['fixed'] = 0;
	_ie['iframe'] = 0;
	if (!d._ie1 || !window._ie1) _ie['listener'] = 0;
}
// Node is un-correspond
if (!d.nodeType || !d.nodeName || !d.getElementById || !d.getElementsByTagName) {
	_ie = null;
}
// onload
if (_ie && (d.all || _ie['listener'])) {
	window.addEventListener('load', _ie_wait, false);
}
