/*_____________________________________________________________

   Materialize tab pane style interfaces (rev003_JAL_BRANCH_7)
_______________________________________________________________*/

// require common.js

/* --- Tab pane interface common API --- */

function JLJS_TabPanes_System (labelNodes, contentNodes) {
	if (typeof JLJS != 'object' || !JLJS.env.DOMok) return null;

	this.labelNodes       = labelNodes;       // tab panes tab nodes              [object Array]
	this.contentNodes     = contentNodes;     // tab panes container nodes        [object Array]
	this.curPaneClassName = 'pseudo-current'; // pseudo-className of current pane [string]
	this.paneNumAttrName  = 'JLJSTabPaneNum'; // prefix of attr name for pane num [string]
	this.init();
}

JLJS_TabPanes_System.prototype = {
	init : function () {
		if (!this.labelNodes || !this.contentNodes || this.labelNodes.length != this.contentNodes.length) return;
		this.panes = [];
		for (var i = 0; i < this.labelNodes.length; i++) {

			this.panes[i] = new JLJS_TabPanes_Pane(i, this.labelNodes[i], this.contentNodes[i], this.curPaneClassName);

			if (this.panes[i].node && this.panes[i].node.label) {
				JLJS.setAttr(this.panes[i].node.label, JLJS.prfx.jalattrs + this.paneNumAttrName, i);
			}
			if (this.panes[i].labelImg && this.panes[i].labelImg.node) {
				JLJS.setAttr(this.panes[i].labelImg.node, JLJS.prfx.jalattrs + this.paneNumAttrName, i);
			}
			if (this.panes[i].checkCurrent()) {
				this.defaultPaneNum = this.currentPaneNum = i;
			}
		}
	},

	toggleCurrentPane : function (paneNum) {
		for (var i = 0; i < this.panes.length; i++) {
			var pane = this.panes[i];
			if (pane.number == paneNum) {
				pane.setCurrent();
			} else {
				pane.unsetCurrent();
			}
		}
	},
	
	revertToDefaultPane : function(delay) {
		if (typeof delay != 'number' || delay < 1) {
			delay = 0;
		}
		if (!window._JLJSTabPanes_) {
			window._JLJSTabPanes_ = [];
		}
		if (!this.tabpaneId) {
			this.tabPaneId = 'JLJSTabPanesId' + window._JLJSTabPanes_.length;
		}
		if (!window._JLJSTabPanes_[this.tabPaneId]) {
			window._JLJSTabPanes_[this.tabPaneId] = this;
		}
		this.revertTimer = setTimeout('_JLJSTabPanes_.' + this.tabPaneId + '.revertToDefaultPane_()', delay);
	},

	revertToDefaultPane_ : function () {
		this.toggleCurrentPane(this.defaultPaneNum);
	},
	
	cancelRevertToDefaultPane : function () {
		if (this.tabPaneId && window._JLJSTabPanes_[this.tabPaneId].revertTimer) {
			clearTimeout(window._JLJSTabPanes_[this.tabPaneId].revertTimer);
		}
	}
};

function JLJS_TabPanes_Pane (num, labelNode, contentNode, currentClassName) {
	this.currentClassName = currentClassName;
	this.setNumber(num);
	this.setNode(labelNode, contentNode);
}

JLJS_TabPanes_Pane.prototype = {
	setNumber : function (num) {
		if (typeof num != 'number') return;
		this.number = num;
	},

	setNode : function (labelNode, contentNode) {
		if (!labelNode || !labelNode.nodeName || !contentNode || !contentNode.nodeName) return;
		this.node = { label : labelNode, content : contentNode };
		var img   = JLJS.getElementsByTagName('img', this.node.label)[0];
		if (img) {
			this.labelImg = new JLJS_TabPanes_LabelImage(img);
		}
	},

	checkCurrent : function () {
		return Boolean(JLJS.classAttr.check(this.node.label, this.currentClassName));
	},

	setCurrent : function () {
		for (var i in this.node) {
			JLJS.classAttr.add(this.node[i], this.currentClassName);
		}
		if (this.labelImg) {
			this.labelImg.setStatus('current');
		}
	},

	unsetCurrent : function () {
		for (var i in this.node) {
			JLJS.classAttr.remove(this.node[i], this.currentClassName);
		}
		if (this.labelImg) {
			this.labelImg.setStatus('normal');
		}
	}
};



function JLJS_TabPanes_LabelImage (imgNode) {
	this.fileSuffixPtn   = /\.(jpe?g|gif|png)$/i;
	this.statusSuffixPtn = /_[nso]$/;
	this.statusSuffix    = {
		normal  : '_n',
		current : '_s',
		hover   : '_o'
	};
	this.setNode(imgNode);
}

JLJS_TabPanes_LabelImage.prototype = {
	setNode : function (imgNode) {
		if (!imgNode || !imgNode.nodeName.match(/^img$/i)) return;

		var src     = JLJS.getAttr(imgNode, 'src');
		var fSuffix = (src)     ? src.match(this.fileSuffixPtn)[0]                                      : null;
		var fStatus = (fSuffix) ? src.replace(this.fileSuffixPtn, '').match(this.statusSuffixPtn)       : null;
		var fRemain = (fStatus) ? src.replace(this.fileSuffixPtn, '').replace(this.statusSuffixPtn, '') : null;

		if (fRemain && fStatus && fSuffix) {
			this.statusSuffix['default'] = fStatus;
			this.src = {};
			for (var i in this.statusSuffix) {
				this.src[i] = fRemain + this.statusSuffix[i] + fSuffix;
			}
			this.node = imgNode;
			this.preloadImage();
		}
	},
	
	preloadImage : function() {
		if (!this.node) return;
		for (var i in this.src) {
			if (this.src[i]) {
				JLJS.preloadImage(this.src[i]);
			}
		}
	},

	setStatus : function (status) {
		if (!this.node || typeof status != 'string' || !this.statusSuffix[status]) return;
		JLJS.setAttr(this.node, 'src', this.src[status]);
		this.status = status;
	}
};




/* --- Setup global navigation --- */

function JLJS_GlobalNavi_init () {
	var toggleDelay   = 500;
	var containerNode = document.getElementById('globalHeaderA01');
	var tabParentNode = JLJS.getElementsByTagName('dl', containerNode)[0];
	var labelNodes    = JLJS.getElementsByTagName('dt', tabParentNode);
	var contentNodes  = JLJS.getElementsByTagName('dd', tabParentNode);

	JLJS.normalizeEmptyTextNode(containerNode);

	if (typeof JLJS_GLOBALNAVI_DISABLE_TABSWITCH != 'undefined') return;

	JLJSGlobalNavi = new JLJS_TabPanes_System(labelNodes, contentNodes);

	JLJS.addEvent(containerNode, 'mouseout', function (e) {
		e.preventDefault();
		JLJSGlobalNavi.revertToDefaultPane(1000);
	});

	JLJS.addEvent(containerNode, 'mouseover', function (e) {
		e.preventDefault();
		JLJSGlobalNavi.cancelRevertToDefaultPane();
	});


	for (var i = 0; i < JLJSGlobalNavi.panes.length; i++) {
		JLJS.addEvent(JLJSGlobalNavi.panes[i].node.label, 'mouseover', function (e) {
			e.preventDefault();
			JLJSGlobalNavi.currentPaneNum  = JLJS.getAttr(e.currentTarget, JLJS.prfx.jalattrs + JLJSGlobalNavi.paneNumAttrName);
			JLJSGlobalNavi.togglePaneTimer = setTimeout('JLJS_GlobalNavi_ToggleCurrentPane()', toggleDelay);
		});

		JLJS.addEvent(JLJSGlobalNavi.panes[i].node.label, 'mouseout', function (e) {
			e.preventDefault();
			clearTimeout(JLJSGlobalNavi.togglePaneTimer);
		});

		var labelImg = JLJSGlobalNavi.panes[i].labelImg;
		if (labelImg && labelImg.node && labelImg.node.parentNode.nodeName.match(/^a$/i)) {
			JLJS.addEvent(labelImg.node, 'mouseover', function (e) {
				e.preventDefault();
				if (JLJSGlobalNavi.currentPaneNum && e.currentTarget == JLJSGlobalNavi.panes[JLJSGlobalNavi.currentPaneNum].labelImg.node) {
					JLJS_GlobalNavi_ToggleCurrentPane();
				}
			});

			JLJS.addEvent(labelImg.node, 'mouseout', function (e) {
				e.preventDefault();
				var img = JLJSGlobalNavi.panes[JLJSGlobalNavi.currentPaneNum].labelImg;
				if (img.status == 'hover') {
					img.setStatus('current');
				}
			});
		}
	}
}

function JLJS_GlobalNavi_ToggleCurrentPane () {
	JLJSGlobalNavi.toggleCurrentPane(JLJSGlobalNavi.currentPaneNum);
	var labelImg = JLJSGlobalNavi.panes[JLJSGlobalNavi.currentPaneNum].labelImg;
	if (labelImg && labelImg.node && labelImg.node.parentNode.nodeName.match(/^a$/i) && labelImg.status == 'current') {
		labelImg.setStatus('hover');
	}
}


/* --- Setup reserve tab panes --- */

function JLJS_ReserveTabPanes_init () {
	var containerNode = document.getElementById('sidePaneA01');
	var tocListNode   = (containerNode) ? JLJS.getElementsByClassName('toc', 'ul', containerNode)[0] : null;
	var labelNodes    = (tocListNode)   ? JLJS.getElementsByTagName('li', tocListNode)               : []  ;
	var contentNodes  = [];

	JLJS.normalizeEmptyTextNode(tocListNode);

	for (var i = 0; i < labelNodes.length; i++) {
		var anchor = JLJS.getElementsByTagName('a', labelNodes[i])[0];
		var href   = (anchor) ? JLJS.getAttr(anchor, 'href') : null;
		var id     = (href)   ? href.split('#')[1]           : null;
		var node   = (id)     ? document.getElementById(id)  : null;
		if (node) {
			contentNodes[contentNodes.length] = node;
			if (JLJS.env.isSafari) {
				JLJS.setAttr(anchor, 'href', '#');
			}
		}
	}
	
	if(contentNodes.length > 0) {
		JLJSReserveTabPanes = new JLJS_TabPanes_System(labelNodes, contentNodes);
		for (var i = 0; i < JLJSReserveTabPanes.panes.length; i++) {
			var label  = JLJSReserveTabPanes.panes[i].node.label;
			var anchor = JLJS.getElementsByTagName('a', label)[0];
			JLJS.addEvent(anchor, 'click', function (e) {
				e.preventDefault();
				e.currentTarget.blur();
			});
			JLJS.addEvent(label, 'click', function (e) {
				e.stopPropagation();
				e.preventDefault();
				var num = JLJS.getAttr(e.currentTarget, JLJS.prfx.jalattrs + JLJSReserveTabPanes.paneNumAttrName);
				JLJSReserveTabPanes.toggleCurrentPane(num);
			});
		}
	}

	/* --- for world map of /int/city_info --- */
	if (typeof JLJSReserveTabPanes == 'object') {
		var areaNodes = (containerNode) ? JLJS.getElementsByTagName('area', containerNode) : [];
		for (var i = 0; i < areaNodes.length; i++) {
			var href = JLJS.getAttr(areaNodes[i], 'href');
			var id   = (href) ? href.split('#')[1]          : null;
			var node = (id)   ? document.getElementById(id) : null;
			for (var j = 0; j < JLJSReserveTabPanes.panes.length; j++) {
				if (JLJSReserveTabPanes.panes[j].node.content == node) {
					var num = JLJS.getAttr(JLJSReserveTabPanes.panes[j].node.label, JLJS.prfx.jalattrs + JLJSReserveTabPanes.paneNumAttrName);
					JLJS.setAttr(areaNodes[i], JLJS.prfx.jalattrs + JLJSReserveTabPanes.paneNumAttrName, num);
					JLJS.addEvent(areaNodes[i], 'click', function (e) {
						e.preventDefault();
						JLJSReserveTabPanes.toggleCurrentPane(JLJS.getAttr(e.currentTarget, JLJS.prfx.jalattrs + JLJSReserveTabPanes.paneNumAttrName));
					});
					if (JLJS.env.isSafari) {
						JLJS.setAttr(areaNodes[i], 'href', '#');
					}
					break;
				}
			}
		}
	}
}




/* --- register start up methods --- */

if (typeof JLJS == 'object' && JLJS.env.DOMok) {
	JLJS.addOnload(JLJS_GlobalNavi_init);
	JLJS.addOnload(JLJS_ReserveTabPanes_init);
}