/**
 *
 * @param options	container: jQuery Object
 * 					buttonTop: jQuery Object
 * 					buttonForm: jQuery Object
 * 					buttonSetting: jQuery Object
 * 					buttonLicense: jQuery Object
 * @returns
 */
var MainContainerSelect = function(options){
	this.init(options);
};
MainContainerSelect.prototype = {
	init: function(options){
		this.options = $.extend({}, {
			container: $("#mainContainer"),
			buttonTop: $("#buttonTop"),
			buttonForm: $("#buttonForm"),
			buttonSetting: $("#buttonSetting"),
			buttonLicense: $("#buttonLicense")
		}, options);
		this.change($.cookie("containerSelect"));
		this.options.buttonTop.click(this.change.scope(this, "top"));
		this.options.buttonForm.click(this.change.scope(this, "form"));
		this.options.buttonSetting.click(this.change.scope(this, "setting"));
		this.options.buttonLicense.click(this.change.scope(this, "license"));
	},
	change: function(type){
		this.options.container.children("div").hide();
		this.buttonAllRemoveOpened();
		if(type == "top"){
			this.options.container.find("#mainTop").show();
			this.options.buttonTop.addClass("opened");
		}else if(type == "form"){
			this.options.container.find("#mainForm").show();
			this.options.buttonForm.addClass("opened");
		}else if(type == "setting"){
			this.options.container.find("#mainSetting").show();
			this.options.buttonSetting.addClass("opened");
		}else if(type == "license"){
			this.options.container.find("#mainLicense").show();
			this.options.buttonLicense.addClass("opened");
		}else{
			//Default
			this.options.container.find("#mainTop").show();
			this.options.buttonTop.addClass("opened");
			type = "top";
		}
		$.cookie("containerSelect", type, this.options.cookieOption);
	},
	buttonAllRemoveOpened: function(){
		this.options.buttonTop.removeClass("opened");
		this.options.buttonForm.removeClass("opened");
		this.options.buttonSetting.removeClass("opened");
		this.options.buttonLicense.removeClass("opened");
	}
};
var BaseNormalTemplate = {};
/**-----------------------------------
 * 一覧表示のメンバー(Inline型)
 --------------------------------------*/
BaseNormalTemplate.listMember = {
	createMemberNode: function(options){
		var member = options.member;
		var node = $("<li>").addClass("member");
		var openid = member.getOpenId();
		node.get(0).id = "member_"+openid;


		var name = $("<span>").addClass("name");
		var trip = $("<span>").addClass("trip");
		node.append(name).append(trip);

		if(!this.getBaseSetting().isTripEnabled()){
			trip.hide();
		}

		this.updateMemberNode({
			member: member,
			node: node
		});
		node.click(function(){
			this.showMemberInfo(openid);
		}.scope(this));

		return node;
	},
	/**
	 *
	 * @param options	member: KaniMember
	 * 					node:	Updateするnode
	 */
	updateMemberNode: function(options){
		var node = options.node;
		var member = options.member;
		var iconUtil = new IconUtil(member);

		node.find(".name").text(member.getName());
		node.find(".trip").text(member.getTrip() ? "◆"+member.getTrip() : "");

		if(iconUtil.isSetIcon()){
			node.addClass("iconEnabled");
		}else{
			node.css("background-image", "none");
			node.removeClass("iconEnabled");
		}
		iconUtil.loadMini({
			success: function(img){
				node.css("background-image", "url("+img.getUrl()+")");
			},
			failure: function(){
				node.css("background-image", "none");
				node.removeClass("iconEnabled");
			}
		});


	}
};

BaseNormalTemplate.lineMember = {
	createMemberNode: function(options){
		var member = options.member;
		var node = $("<li>").addClass("member");
		var openid = member.getOpenId();
		node.get(0).id = "member_"+openid;

		/*
		 *
			<li class="member">
				<span class="separator">、</span><span class="icon"/><span class="name">なまえ</span><span class="trip">◆A1b2C3dEf</span>
			</li>
		 */
		var separator = $("<span>").addClass("separator").text("、");
		var icon = $("<span>").addClass("icon");
		var name = $("<span>").addClass("name");
		var trip = $("<span>").addClass("trip");
		node.append(separator).append(icon).append(name).append(trip);

		if(!this.getBaseSetting().isTripEnabled()){
			trip.hide();
		}

		this.updateMemberNode({
			member: member,
			node: node
		});
		node.click(function(){
			this.showMemberInfo(openid);
		}.scope(this));

		return node;
	},
	/**
	 *
	 * @param options	member: KaniMember
	 * 					node:	Updateするnode
	 */
	updateMemberNode: function(options){
		var node = options.node;
		var member = options.member;
		var iconUtil = new IconUtil(member);

		node.find(".name").text(member.getName());
		node.find(".trip").text(member.getTrip() ? "◆"+member.getTrip() : "");

		iconUtil.loadMini({
			success: function(img){
				node.find(".icon").empty().append(img.getNode());
			},
			failure: function(){
			}
		});


	},
	showMemberSize: function(all, enter){
		if(enter == 0){
			$("#memberContainer .comment").text("入室者はいません");
			$("#memberContainer .showOrHide, #memberShowOrHide").hide();
		}else{
			$("#memberContainer .comment").text("入室者: ");
			$("#memberContainer .showOrHide, #memberShowOrHide").show();
		}
		this._super_showMemberSize(all, enter);
	},
	_super_showMemberSize: BaseNormal.prototype.showMemberSize,
	hideMemberSize: function(){
		$("#memberContainer .comment").text("接続していません");
		$("#memberContainer .showOrHide, #memberShowOrHide").hide();
		this._super_hideMemberSize();
	},
	_super_hideMemberSize: BaseNormal.prototype.hideMemberSize
};

/**------------------------------
 * 最新ログが一番上
 ------------------------------*/
BaseNormalTemplate.latestChatlogTop = {
	addLogContainer: function(node){
		$("#logContainer").prepend(node);
	},
	logContainerAutoRemove: function(){
		var maxLines = this.getBaseSetting().getLogLines();
		if(maxLines != null){
			var allLog = $("#logContainer > *");
			var length = allLog.length + 1;
			if(length > maxLines){
				//最大表示行数を超えているので削除
				var removeLines = length - maxLines + 1;
				for(var i=0; i<removeLines; i++){
					$(allLog.get(length-i-1)).remove();
				}
			}
		}
	}
};

/**---------------------------------
 * チャットログ表示タイプがLine型
 *--------------------------------------*/
BaseNormalTemplate.lineChatlog = {
	createChatlogNode: function(options){
		/*
		 * 通常チャットログ
		 * <div class="chatlog (even|odd)">
		 * 	<div class="icon">
		 * 	</div>
		 * 	<div class="base">
		 * 		<span class="name"/>
		 * 		<span class="separator"/>
		 * 		<span class="message"/>
		 * 		<span class="trip"/>
		 * 		<span class="addr"/>
		 * 		<span class="date"/>
		 * 	</div>
		 * </div>
		 */
		var log = options.log;
		var logUtil = new ChatlogUtil(log);
		var node = $("<div>").addClass("chatlog");
		var servOptions = log.getServOptions();
		var date = $("<span>").addClass("date");
		date.text(this.customDateFormat.format(log.getDate()));

		if(options.mine){
			node.addClass("mine");
		}
		node.addClass(options.odd ? "odd" : "even");

		if(log.isUser()){
			//通常のチャットログ

			var icon = $("<div>").addClass("icon");
			logUtil.getIconUtil().load({
				type: "normal",
				success: function(img){
					icon.append(img.getNode());
				},
				failure: function(){
					node.removeClass("iconEnabled");
					icon.hide();
				}
			});

			var base = $("<div>").addClass("base");

			//アップロードの場合の処理
			if(log.isUpload() && this.getBaseSetting().isUploadViewEnabled()){
				var url = log.getUpload().getDirectUrl();
				//画像の場合キャッシュする&表示する
				if(url.match(/\.(gif|jpe?g|png)$/)){
					var cache = $("<img>").get(0);
					cache.src = log.getUpload().getDownUrl();

					var maxwidth = 100;
					var maxheight = 50;
					var sample = $("<span>").addClass("uploadSample");

					var imageUtil = new ImageUtil(url);
					imageUtil.setOnLoad(function(){
						imageUtil.setMaxHeightResize(maxheight);
						imageUtil.setMaxWidthResize(maxwidth);
						node.prepend(sample);
						sample.append(imageUtil.getNode());
						sample.css({
							"width": "auto",
							"height": "auto"
						});
						node.css({
							"min-height": imageUtil.getHeight()
						});
					});
					imageUtil.setOnError(function(){
					});
					imageUtil.load();
				}
			}

			var name = $("<span>").addClass("name").text(log.getName()).click(this.showLogInfo.scope(this, log));
			var separator = $("<span>").addClass("separator").text(" : ");
			var message = logUtil.createMessageNode().addClass("message");
			if(log.getAddr()){
				var idStar = new IdentifyStar();
				idStar.setAddr(log.getAddr());
				var starNode = idStar.getNode();
				name.append(starNode);
				if(this.getBaseSetting().isIdentifyStarEnabled()){
					starNode.show();
				}else{
					starNode.hide();
				}
			}
			var addr = $("<span>").addClass("addr").text(log.getAddr());
			var trip = $("<span>").addClass("trip");
			if(log.getTrip()){
				trip.text("◆"+log.getTrip());
			}
			if(!this.getBaseSetting().isTripEnabled()){
				trip.hide();
			}


			base.append(name).append(separator).append(message).append(" ").append(trip).append(" ").append(addr).append(" ").append(date);
			node.append(icon).append(base);
		}else if(log.isNotify()){
			//入退室メッセージ
			node.click(function(){
				this.showLogInfo(log);
			}.scope(this));
			node.addClass("notify");
			var nodeMessage = $("<span>").addClass("message");
			var notify = log.getNotify();
			var name = notify.getUserName();
			var message;
			if(notify.isEnter()){
				message = this.settingCustom.noticeEnter || "%name%さんが入室しました。";
			}else if(notify.isExit()){
				message = this.settingCustom.noticeExit || "%name%さんが退室しました。";
			}else if(notify.isExitPerhaps()){
				message = this.settingCustom.noticeExit_p || "%name%さんが退室されたようです。";
			}else if(notify.isExitElapsed()){
				message = this.settingCustom.noticeExit_e || "%name%さんの発言がしばらくなかったため、退室させられました。";
			}else if(notify.isKick()){
				message = this.settingCustom.noticeKick || "%name%さんが追放されました。";
			}else{
				message = "%name%さん"+notify.getMode()+"(未定義)";
			}
			node.append(nodeMessage.text(message.replace(/%name%/g,name))).append(" ").append(date);
		}else if(log.isOwner()){
			node.addClass("owner");
			var message = $("<span>").addClass("message");
			node.append(message.text(log.getMessage())).append(date);
		}else if(log.isKanichat()){
			node.addClass("kanichat");
			var title = $("<span>").addClass("title").text(log.getName() || "かにチャットからのお知らせ");
			var message = $("<span>").addClass("message").text(log.getMessage());
			var addr = $("<span>").addClass("addr").text("（かにチャット運営からのお知らせ）");
			node.append(title).append(message).append(addr).append(date);
		}
		return node;
	}
};
