var common = {};

/* -----------------------------
 SwapImage
----------------------------- */
if (!common.SwapImage) common.SwapImage = function(){};
common.SwapImage.prototype = {
	init : function(){
		var conf = 
		{
			className: 'rollover',
			postfix : '_ov'
		};
		var imgNodeList = $('.rollover');
		var node;
		var len = imgNodeList.length;
		for(var i = 0; i < len; i++)
		{
			node = imgNodeList[i];
			node.originalSrc = node.src;
			if(node.originalSrc.indexOf('_ov.') != -1){
				continue;
			}
			node.rolloverSrc = node.originalSrc.replace(/(\.gif|\.jpg|\.png)/, conf.postfix + "$1");
			$(node)
			.unbind('mouseover')
			.unbind('mouseout')
			.mouseover(function(){
				this.src = this.rolloverSrc;
			})
			.mouseout(function(){
				this.src = this.originalSrc;
			});
			this.preload(node.rolloverSrc);
		}
	},
	preload : function(url){
		var len = this.images.length;
		this.images[len] = new Image();
		this.images[len].src = url;
	},
	images: new Array()
}

/* -----------------------------
 linked site menu
----------------------------- */
if (!common.LinkedSiteMenu) common.LinkedSiteMenu = function(){};
common.LinkedSiteMenu.prototype = {
	layers: null,
	layerCover: null,
	currentLayer: null,
	layerWrapper: null,
	isLayerShow: false,
	layerCloseBtn: null,
	layerPaddingHeight: 30,
	layerPaddingWidth: 20,
	layerWidth: 840,
	isMotioning: false,
	init: function(){
		this.initLayer();
		this.registerEvent();
	},
	registerEvent: function(){
		var i;
		var menu;
		var layer;
		var self = this;
		var num;
		for(i = 0; i < 6; i++){
			menu = $('#linked_site_menu' + (i + 1));
			num = i.toString();
			menu
			.bind('click', {no:num}, function(e){
				self.setLayerVisible(e.data.no, true);
			});
		};
		this.layerCover
		.bind('mousedown', {}, function(){
			self.setLayerVisible(null, false)
		});
		this.layerCloseBtn
		.bind('click', {}, function(){
			self.setLayerVisible(null, false)
		})
		.mouseover(function(){
			$(this).attr('class','over');
		})
		.mouseout(function(){
			$(this).attr('class', '');
		});
	},
	initLayer: function(){
		var self = this;
		var appendHTML = "";
		appendHTML += '<div id="linked_site_layer_cover"></div>';
		appendHTML += '<div id="liked_site_layer_wrapper"><div id="linked_site_layer_close" title="閉じる"></div></div>'
		$('body').append(appendHTML);
		
		this.layerWrapper = $('#liked_site_layer_wrapper').hide();
		this.layerCloseBtn = $('#linked_site_layer_close');
		
		this.layerCover = $('#linked_site_layer_cover');
		this.layerCover
		.css({
			 width:$('body').width() + 'px',
			 height:$('body').height() + 'px'
		})
		.hide();
		
		$(window).resize(function(){						
			if(self.currentLayer != null && self.isLayerShow == true){
				self.setLayerPosition();
			}
		});
		//scrollでも動かす場合
		/*
		$(window).scroll(function(){
			if(self.currentLayer != null && self.isLayerShow == true){
				self.setLayerPosition();
			}
		});
		*/
		
		var i;
		var layer;
		var num;

		this.layers = new Array();
		for(i = 0; i < 6; i++){
			layer = $('#linked_site_layer' + (i + 1));
			this.layers.push(layer);
			num = i.toString();
			layer.remove();
			$('#liked_site_layer_wrapper').append(layer);
			layer
			.css({
				width:this.layerWidth + 'px'
			})
			.hide()
		}
		
		//JSオフのユーザーのため
		$('.linked_site_layer_column1').css('width', '410px');
		$('.linked_site_layer_column2').css('width', '410px');
	},
	setLayerVisible: function(no, isVisible){
		if(this.isMotioning){
			return;
		}
		
		var self = this;
		this.isMotioning = true;
		this.currentLayer = isVisible == true ? this.layers[no] : this.currentLayer;
		
		if(isVisible){
			this.isLayerShow = true;
			this.currentLayer.show();
			this.layerCover.show();
			this.layerWrapper.show();
			this.setLayerPosition();
			
			var newH = this.layerCloseBtn.height() + this.currentLayer.height() + this.layerPaddingHeight;
			this.layerWrapper
			.stop()
			.css({
				 width: '0px', 
				 height:newH
			})
			.animate({
					 width: this.layerWidth  + this.layerPaddingWidth + 'px'
			}, 0.4 * 1000, "swing", function(){
				self.isMotioning = false;
				self.setListMarker(true);
			});
			this.currentLayer
			.stop()
			.css({
				 marginLeft: -1 * this.layerWidth + 'px'
			})
			.animate({marginLeft:'0px'}, 0.4 * 1000, "swing")
		}else{
			this.setListMarker(false);
			this.layerWrapper
			.stop()
			.animate({
				left:this.layerWidth + this.layerPaddingWidth + 20 + 'px',
				width:'0px'
			}, 0.3 * 1000, "swing", function(){
				self.layerWrapper.hide();
				self.currentLayer.hide();
				self.layerCover.hide();
				self.isLayerShow = false;
				self.isMotioning = false;
			});
		}
	},
	setLayerPosition: function(){
		this.layerCover
		.css({
			 width:$('body').width() + 'px',
			 height:$('body').height() + 'px'
		});
		var posx = (this.getBrowserWidth() - this.currentLayer.width()) / 2 - this.layerPaddingWidth;
		var posy = (this.getBrowserHeight() - this.currentLayer.height()) / 2 + this.getOffsetY() - this.layerCloseBtn.height();
		if(posx < 10){
			posx = 10;
		}

		$('#liked_site_layer_wrapper')
		.css({
			'left': posx + 'px',
			'top': posy + 'px'
		});
		
		this.layerCloseBtn
		.css({
			 'left': this.currentLayer.width() - this.layerCloseBtn.width() + this.layerPaddingWidth +'px',
			 'top': this.currentLayer.height() + this.layerPaddingHeight + 'px'
		});
	},
	getOffsetY: function(){
		if(document.documentElement.scrollTop){
			return document.documentElement.scrollTop;
		}else if(document.body.scrollTop){
			return document.body.scrollTop;
		}else{
			return 0;
		}
	},
	getBrowserWidth: function() {
		if ( window.innerWidth ) {
				return window.innerWidth;
		}
		else if ( document.documentElement && document.documentElement.clientWidth != 0 ) {
				return document.documentElement.clientWidth;
		}
		else if ( document.body ) {
				return document.body.clientWidth;
		}
		return 0;
	},
	getBrowserHeight: function () {
		if ( window.innerHeight ) {
				return window.innerHeight;
		}
		else if ( document.documentElement && document.documentElement.clientHeight != 0 ) {
				return document.documentElement.clientHeight;
		}
		else if ( document.body ) {
				return document.body.clientHeight;
		}
		return 0;
	},
	setListMarker: function(isSet){
		if(isSet){
			this.currentLayer.children('ul')
			.addClass('marker');
		}else{
			this.currentLayer.children('ul')
			 .removeClass('marker');
		}
	}
};

/* -----------------------------
 PageChanger
----------------------------- */
if (!common.PageChanger) common.PageChanger = function(isColumn){
	this.isColumn = isColumn;
	this.numOfPageList = 20;
	this.pageList;
	this.maxPage;
	this.currentPage = 1;
};
common.PageChanger.prototype = {
	init: function(){
		var liList = this.isColumn ? $('ul.backnumber li') : $('#topics_index_area li');
		this.maxPage = Math.ceil(liList.length / this.numOfPageList);
		//1ページの場合は何もしない
		if(this.maxPage == 1){
			return;
		}
		this.currentPage = this.getPageQuery();
		this.pageList = new Array(this.maxPage);
		var i; var j; var li; var index;
		for(i = 0; i < this.maxPage; i++){
			this.pageList[i] = new Array();
			for(j = 0; j < this.numOfPageList; j++){
				index = i * this.numOfPageList + j;
				if(index >= liList.length){
					break;
				}
				li = liList[index];
				this.pageList[i].push($(li));
				$(li).hide();
			}
		}
		this.setPageNaviMenu();
		this.changePage(this.currentPage);
		this.registerEvent();
	},
	setPageNaviMenu: function(){
		var addHTML = '';
		addHTML += '<span id="page_navi_menu_prev">←前へ</span> [';
		var i;
		for(i = 0; i < this.maxPage; i++){
			if(i > 0){
				addHTML += '／';
			}
			var currentPageNo = (i + 1).toString();
			addHTML += '<span id="page_navi_menu_page'+ currentPageNo + '">' + currentPageNo + '</span>';
		}
		addHTML += '] <span id="page_navi_menu_next">次へ→</span>';
		$('#page_navi_menu').html(addHTML);
	},
	changePage: function(newPageNo){
		this.setPageVisible(false, this.currentPage);
		$('#page_navi_menu_page' + this.currentPage).removeClass();
		this.setPageVisible(true, newPageNo);
		$('#page_navi_menu_page' + newPageNo).attr('class', 'crrent_page');
		this.currentPage = newPageNo;
		this.setPrevNextVisible();
	},
	setPageVisible: function(isVisible, pageNo){
		var i; var li;
		var targetPage = this.pageList[pageNo - 1];
		for(i = 0; i < targetPage.length; i ++){
			li = targetPage[i];
			if(isVisible == true){
				li.show();
			}else{
				li.hide();
			}
		}
	},
	registerEvent: function(){
		var self = this;
		$('#page_navi_menu_prev').click(function(){
			self.setPageQuery(self.currentPage - 1);
		});
		$('#page_navi_menu_next').click(function(){
			self.setPageQuery(self.currentPage + 1);
		});
		var menu_page;
		var i;
		for(i = 0; i < this.maxPage; i++){
			menu_page = $('#page_navi_menu_page' + (i + 1));
			menu_page
				.bind('click', {num:i + 1}, function(e){
					self.setPageQuery(e.data.num);
				})
		}
	},
	setPrevNextVisible: function(){
		var prev = $('#page_navi_menu_prev');
		var next = $('#page_navi_menu_next');
		if(this.currentPage == 1){
			prev.hide();
			next.show();
		}else if(this.currentPage == this.maxPage){
			prev.show();
			next.hide();
		}else if(this.currentPage > 1 && this.currentPage < this.maxPage){
			prev.show();
			next.show();
		}
	},
	getPageQuery: function(){
		var query = location.search;
		var pageNo = parseInt(query.substr(1).split('=')[1]);
		if(isNaN(pageNo)){
			pageNo = 1;
		}else if(pageNo < 1 || pageNo > this.maxPage){
			pageNo = 1;
		}
		return pageNo;
	},
	setPageQuery: function(pageNo){
		location.search = 'page=' + pageNo;
	}
};

/* -----------------------------
 column PageChanger
----------------------------- */
if (!common.ColumnPageChanger) common.ColumnPageChanger = function(){
	this.pageList;
	this.maxPage;
	this.currentPage = 1;
};
common.ColumnPageChanger.prototype = {
	init: function(){
		var i; var divID;
		var divs = $('#column div');
		var myDiv;
		this.pageList = new Array();
		for(i = 0; i < divs.length; i++){
			myDiv = $(divs[i]);
			if(myDiv.attr('id').indexOf('page_data') != -1){
				this.pageList.push(myDiv);
				myDiv.hide();
			}
		}
		this.maxPage = this.pageList.length;
		//1Pの場合は1Pのみ表示
		if(this.maxPage == 1){
			this.pageList[0].show();
			return;
		}
		this.currentPage = this.getPageQuery();
		this.setPageNaviMenu();
		this.changePage(this.currentPage);
		this.registerEvent();
	},
	setPageNaviMenu: function(){
		var addHTML = '';
		addHTML += '<span id="page_navi_menu_prev">←前へ</span> [';
		var i;
		for(i = 0; i < this.maxPage; i++){
			if(i > 0){
				addHTML += '／';
			}
			var currentPageNo = (i + 1).toString();
			addHTML += '<span id="page_navi_menu_page'+ currentPageNo + '">' + currentPageNo + '</span>';
		}
		addHTML += '] <span id="page_navi_menu_next">次へ→</span>';
		$('#page_navi_menu').html(addHTML);
	},
	changePage: function(newPageNo){
		this.setPageVisible(false, this.currentPage);
		$('#page_navi_menu_page' + this.currentPage).removeClass();
		this.setPageVisible(true, newPageNo);
		$('#page_navi_menu_page' + newPageNo).attr('class', 'crrent_page');
		this.currentPage = newPageNo;
		this.setPrevNextVisible();
		this.scrollPage();
	},
	setPageVisible: function(isVisible, pageNo){
		if(isVisible == true){
			this.pageList[pageNo - 1].show();
		}else{
			this.pageList[pageNo - 1].hide();
		}
	},
	registerEvent: function(){
		var self = this;
		$('#page_navi_menu_prev').click(function(){
			self.setPageQuery(self.currentPage - 1);
		});
		$('#page_navi_menu_next').click(function(){
			self.setPageQuery(self.currentPage + 1);
		});
		var menu_page;
		var i;
		for(i = 0; i < this.maxPage; i++){
			menu_page = $('#page_navi_menu_page' + (i + 1));
			menu_page
				.bind('click', {num:i + 1}, function(e){
					self.setPageQuery(e.data.num);
				})
		}
	},
	setPrevNextVisible: function(){
		var prev = $('#page_navi_menu_prev');
		var next = $('#page_navi_menu_next');
		if(this.currentPage == 1){
			prev.hide();
			next.show();
		}else if(this.currentPage == this.maxPage){
			prev.show();
			next.hide();
		}else if(this.currentPage > 1 && this.currentPage < this.maxPage){
			prev.show();
			next.show();
		}
	},
	getPageQuery: function(){
		var query = location.search;
		var pageNo = parseInt(query.substr(1).split('=')[1]);
		if(isNaN(pageNo)){
			pageNo = 1;
		}else if(pageNo < 1 || pageNo > this.maxPage){
			pageNo = 1;
		}
		return pageNo;
	},
	setPageQuery: function(pageNo){
		location.search = 'page=' + pageNo;
	},
	scrollPage: function(){
		var posY = $('#wrapper').offset().top;
		$('html,body').animate({
			scrollTop: 0
		}, 0 * 1000, 'swing');
		return false;
	}
};

/* -----------------------------
 pageScroll
----------------------------- */
common.PageScroll = function(){
	$('a[href="#top"]').click(function(e){
		var posY = $('#top').offset().top;
		$('html,body').animate({
			scrollTop: posY
		}, 0.4 * 1000, 'swing');
		return false;
	});
};

/* -----------------------------
 document
----------------------------- */
$(function(){
	var swapImage = new common.SwapImage();
	swapImage.init();
	var linkedSiteMenu = new common.LinkedSiteMenu();
	linkedSiteMenu.init();
	var pageScroll = new common.PageScroll();
	
	var path = location.pathname;
	if(path == '/topics/index.html'|| path == '/topics/'){
		var pageChanger = new common.PageChanger(false);
		pageChanger.init();
	}else if(path.match(/\/column\/\w+\/article\/\w+\.html/gi)){
		var column = new common.ColumnPageChanger();
		column.init();
	}else if(path.match(/\/column\/\w+\/index.html/gi) ||
	   path.match(/\/column\/\w+\//gi)){
		var pageChanger = new common.PageChanger(true);
		pageChanger.init();
	}
});


/* -----------------------------
 utility
----------------------------- */
function trace(s){
	var logstr = '';
	if(typeof(s) == 'object'){
		for(var i in s){
			logstr += i + ' : ' + s[i] + '\r\n';
		}
	}else{
		logstr = s;
	}
	console.log(logstr);
};
