// Admin

$(function(){
	
	Rollover.initrolloverimages();
	
	// {$ROOT}にあたるパスを取得
	$(':hidden[name=root]').each(function(){
		Ut.ROOT = $(this).val();
	});
	
	// グローバルメニューの選択状態
	$('div#globalmenu li a').each(function(){
		if (document.location.href.indexOf(this.href)!=-1) {
			$('img', this).unbind('mouseover');
			var source = $('img', this).attr('src');
			source = source.split('.png').join('_selected.png');
			$('img', this).attr('src', source);
		}
	});
	
	// ローカルメニューを選択状態に
	var thisurl = document.location.href.split('index.html').join('');
	$('div.menu a').each(function(){
		var myanchor = this.href.split('index.html').join('');
		if (thisurl==myanchor) {
			if ($(this).parent().parent().parent().attr('nodeName')=='LI') {
				$(this).parent().parent().parent().addClass('opened');
			}
			$(this).parent().addClass('opened');
		}
	});

	// ログイン認証に失敗した場合
	if ($(':hidden[name=login_failure]').val()==1) {
		alert('ログイン認証に失敗しました。正しい会員ID、パスワードを入力してください。');
	}

	// ログイン中の表示
	if ($(':hidden[name=loggedin]').val()==1) {
		$('form.login').hide();
	} else {
		$('div.logout').hide();
		$('div.back_to_members_top').hide();
	}

	// ポップアップ
	$('a.popup').click(function(){
		var pop = new PopupWindow(this.href);
		pop.open({width:800,height:600});
		return false;
	});


	// ページの先頭へ
	$('#pagetop').click(function(){
		$('#header').scrollTo(500);
		return false;
	});

	// last-childを再現
	$(':last-child').addClass('last-child');
	
});


jQuery.fn.extend({
  scrollTo : function(speed, easing) {
    var to = this;
    return this.each(function() {
      var targetOffset = $(to).offset().top;
      $('html,body').animate({scrollTop: targetOffset}, speed, easing);
    });
  }
});


/**
 * ポップアップウィンドウクラス
 * 
 * 使用例 (1)<br />
 * var pop1 = new PopupWindow('popup.html');
 * pop1.open({width:500,height:400});
 *
 * 使用例 (2)<br />
 * <a href="popup.html?phpMyAdmin=647dc4b9b2c2et3c61ec81r7979" onclick="(new PopupWindow(this.href)).open({width:200,height:'max'});">open</a>
 * 
 */
var PopupWindow = function(url) {
	if (url)
		this.url = url;
	this.popupwindow = null;
	this.scrollbars = 'yes';
	this.resizable = 'yes';
	this.copyhistory = 'yes';
	this.width = null;
	this.height = null;
	this.left = 'center';
	this.top = 'center';
};

PopupWindow.prototype.open = function(argv) {
	
	var option = {};
	
	if (!argv)
		argv = {};
	
	var lurl = (argv.url) ? argv.url : this.url;
	
	option.width = (argv.width) ? argv.width : this.width;
	option.height = (argv.height) ? argv.height : this.height;
	
	if (option.width && option.width == 'max') 
		option.width = screen.width;
	if (option.height && option.height == 'max') 
		option.height = screen.height;
	
	option.scrollbars = (argv.scrollbars) ? argv.scrollbars : this.scrollbars;
	option.resizable = (argv.resizable) ? argv.resizable : this.resizable;
	option.copyhistory = (argv.copyhistory) ? argv.copyhistory : this.copyhistory;
	
	option.left = (argv.left!=undefined) ? argv.left : this.left;
	if (option.left == 'center')
		option.left = (!isNaN(option.width)) ? (screen.width - option.width) / 2 : null;
		
	option.top = (argv.top!=undefined) ? argv.top : this.top;
	if (option.top == 'center')
		option.top = (!isNaN(option.height)) ? (screen.height - option.height) / 2 : null;
	
	if (option.left)
		option.screenX = option.left;
	if (option.top)
		option.screenY = option.top;
	
	if (this.popupwindow && !this.popupwindow.closed) {
		this.popupwindow.close();
	}
	
	var optionStr = '';
	for (var key in option) {
		if (option[key]!=null)
			optionStr += key+'='+option[key]+',';
	}
	
	// Output to console
	if (window.console) {
		window.console.log(optionStr);
		window.console.log('popup::'+lurl);
	}
	
	this.popupwindow = window.open(lurl, PopupWindow.getNewWindowName(), optionStr);
	return this.popupwindow;
	
};

PopupWindow.sequence = 0;
PopupWindow.getNewWindowName = function(){
	return 'win'+(PopupWindow.sequence++);
};


/**
 * ロールオーバー
 *
 * img要素のclass属性に「rollover」を指定すると、指定されたファイル名に「_over」の接尾語をつけたファイル名がロールオーバーで入れ替わる
 * 
 * 使用例
 * <img src="images/image.jpg" alt="" class="rollover" />
 *
 */
var Rollover = function () {};

Rollover.suffix = '_over';
Rollover.preloadimages = [];
Rollover.overflag = [];

Rollover.overimage = function (obj) {
	if (obj.src && obj.src.indexOf('.') != -1) {
		obj.src = Rollover.getrolloverimagefile(obj.src);
		this.overflag.push(obj);
	}
}
	
Rollover.normalimage = function (obj) {
	var flag = false;
	for (var i in this.overflag) {
		if (this.overflag[i] == obj) {
			flag = true;
			this.overflag[i] = null;
			break;
		}
	}
	if (flag && obj.src && obj.src.indexOf('.') != -1) {
		obj.src = Rollover.getoriginalimagefile(obj.src);
	}
}
	
Rollover.getrolloverimagefile = function (path) {
	var filename = path.substring(0, path.lastIndexOf('.'));
	var extention = path.substring(path.lastIndexOf('.'), path.length);
	return filename + Rollover.suffix + extention;
}
	
Rollover.getoriginalimagefile = function (path) {
	var filename = path.substring(0, path.lastIndexOf('.')-Rollover.suffix.length);
	var extention = path.substring(path.lastIndexOf('.'), path.length);
	return filename + extention;
}

Rollover.initrolloverimages = function() {
	var images = document.getElementsByTagName('img');
	for (var i=0; i<images.length; i++) {
		var classValue = null;
		if (images[i].getAttribute('className'))
			classValue = images[i].getAttribute('className');
		else if (images[i].getAttribute('class'))
			classValue = images[i].getAttribute('class');
		if (classValue != null && classValue.indexOf('rollover') != -1 && images[i].src) {
			$(images[i]).mouseover(function() {
				Rollover.overimage(this);
			})
			.mouseout(function() {
				Rollover.normalimage(this);
			});
			Rollover.preloadimages[i] = new Image();
			Rollover.preloadimages[i].src = Rollover.getrolloverimagefile(images[i].src);
		}
	}
};




/**
 * Utilities
 */
var Ut = function(){};

Ut.KEY_ESC = 27;
Ut.ROOT = null;


/**
 * 要素を取得
 * @param string elementname 要素名
 * @param Object 属性
 * @return Object
 */
Ut.getElement = function(elementname, attrs){
	var element = $(document.createElement(elementname));
	for (var label in attrs) {
		if (label=='class')
			element.addClass(attrs[label]);
		else if (label=='text')
			element.text(attrs[label]);
		else
			element.attr(label, attrs[label]);
	}
	return element;
};


/**
 * DateTimePicker
 */
var DateTimePicker = function(target, datetime){
	var owner = this;
	
	this.input = $(target);
	this.datetime = datetime;
	
	// date, hours, minutes はオブジェクトに保存しておく
	this.date = DateTimePicker.getDate(DateTimePicker.NOW);
	if (this.input.val()!='') {
		this.date = DateTimePicker.getDate(this.input.val());
	}
	if (datetime) {
		this.hours = '00';
		this.minutes = '00';
		if (this.input.val()!='') {
			this.hours = DateTimePicker.getHours(this.input.val());
			this.minutes = DateTimePicker.getMinutes(this.input.val());
		}
	}
	
	// UIを載せるdiv要素, table要素などの設定
	this.container = Ut.getElement('div', {'class':'datepickercontainer'});
	var table = '';
	if (datetime) {
		table = $('<table><tr><td class="date"><div></div></td><td class="time"><h4 class="hours"></h4><div class="hours"></div><div class="clear"></div><h4 class="minutes"></h4><div class="minutes"></div><div class="help">※上記以外の数字は、直接入力してください。</div></td></tr></table>');
	} else {
		table = $('<table><tr><td class="date"><div></div></td></tr></table>');
	}
	this.container.append(table);
	
	// body要素上にappend
	$(document.body).append(this.container);
	var offset = $(this.input).offset();
	var top = offset.top+$(this.input).height()+12;
	
	var scrolltop = 0;
	if (document.documentElement && document.documentElement.scrollTop) {
		scrolltop = document.documentElement.scrollTop;
	} else {
		scrolltop = $('body').scrollTop();
	}
	
	var windowheight = 0;
	if (document.documentElement && document.documentElement.clientHeight) {
		windowheight = document.documentElement.clientHeight;
	} else if (window.innerHeight) {
		windowheight = window.innerHeight;
	}
	
	// ウィンドウ下に隠れる場合、テキストフィールドの上に配置
	if (top+this.container.height()+10 > scrolltop+windowheight) {
		top = offset.top - this.container.height()-10;
	}
	
	this.container.css('top', top);
	this.container.css('left', offset.left);
	
	this.container.show();
	
	
	// Safariの場合はヘルプ無し
	if ($.browser.safari) {
		$('div.help', this.container).css('display', 'none');
	}
	
	// datetime のとき、閉じるボタン
	if (datetime) {
		var normal = Ut.ROOT+'images/admin/delete.png';
		var hover = Ut.ROOT+'images/admin/delete_over.png';
		var close = Ut.getElement('img', {src:normal,'class':'close'});
		(new Image()).src = hover;
		close.hover(
			function(){
				$(this).attr('src', hover);
			},
			function(){
				$(this).attr('src', normal);
			}
		);
		close.click(function(){
			owner.remove();
		});
		this.container.append(close);
	}
	
	// datepicker
	this.datepicker = $('td.date div', this.container);
	this.datepicker.datepicker({
		changeMonth: true,
		changeYear: true,
		'onSelect':function(selecteddate){
			owner.date = selecteddate;
			owner.update();
			if (!owner.datetime) {
				owner.remove();
			}
		}
	})
	.datepicker('setDate', DateTimePicker.between(this.date));
	
	if (datetime) {
		// ボタンul要素
		var houtslist = this.getHoursButton();
		var minuteslist = this.getMinutesButton();
		
		$('td.time div.hours', this.container).append(houtslist);
		$('td.time div.minutes', this.container).append(minuteslist);
		
		$('ul.hours a', owner.container).click(function(){
			owner.setHours($(this).text());
			owner.update();
			$('ul.hours a', owner.container).removeClass('selected');
			$(this).addClass('selected');
		});
		
		$('ul.minutes a', owner.container).click(function(){
			owner.setMinutes($(this).text());
			owner.update();
			$('ul.minutes a', owner.container).removeClass('selected');
			$(this).addClass('selected');
		});
	}
	
	// 背景クリックでコンテナを削除
	this.mat = Ut.getElement('div', {'class':'datepickercontainer-mat'});
	$(document.body).append(this.mat);
	this.mat.width($(window.document).width());
	this.mat.height($(window.document).height());
	this.mat.one('click', function(){
		owner.remove();
	});
	
	if (this.datetime && !$.browser.msie) {
		this.container.draggable();
		this.container.addClass('draggable');
	}
};
