var LAYER_MESSAGES = {
	"charge" : I18n.t("layer.charge"), 
	"category" : I18n.t("layer.category"), 
	"modify" : "변경", 
	"spelling": I18n.t("layer.letter order"), 
	"charge grade": I18n.t("layer.registration order"),
	"category grade" : I18n.t("layer.category order"),  
	"addition": I18n.t("layer.addition"),
	"confirm": I18n.t("layer.confirm"), 
	"cancel": I18n.t("layer.cancel"), 
	"already registered tag" : "이미 등록된 분류입니다.",	// not used
	"period" : I18n.t("layer.period set"),
	"due" : I18n.t("layer.end day"),
	"start" : I18n.t("layer.start day"),
	"me" : I18n.t("layer.me"), 
	"total" : I18n.t("layer.all"), 
	"start date > term date" : "시작일이 기한일보다 늦을 수 없습니다"
}

$.fn.charge_layer = function(opts){
	/**
	 * 멤버선택레이어 OR 업무분류 레이어
	 * IN
	 *     kind : 레이어 종류(charge(D), category)
	 *     title : 상위에 나타나는 title
	 *     key :
	 *     left : show 되었을때의 left
	 *     top : show 되었을때의 top
	 *     selected_member_ids : 이미 선택되어 있는 것들 ["1", "2"]
	 *     disabled_member_ids : disabled되어 있는 것들 ["1", "2"]
	 *     enabled_member_ids : enabled되어 선택되어 있는 것들 ["1", "2"], disabled_member_ids보다 우선순위가 높다
	 *     hidden_member_ids : 레이어 상에서 checkbox와 li가 안보이는 것들 ["1", "2"] check가 되어도 return은 안됨
	 *     visible_member_ids : 레이어 상에서 checkbox와 li가 보이는 것들. 전체는 항상 보여지며 hidden_member_ids보다 우선순위가 높다
	 *     add_members: 기존 member에 추가되는 member
	 *     datas: defaults를 사용 안 하는 members
	 *     select_type : checkbox(D), radio
	 *     start : 레이어 생성 후 실행되는 function
	 * OUT
	 *     members : 선택된 항목에 대한 data
	 */
	var layer_id = "charge_option";
	var $charge_option = $('#'+layer_id);
	var $this = $(this);
	
	var defaults = {
		kind: 'charge', 
		key: '', 
		left: $this.offset().left - $('body').offset().left, 
		top: $this.offset().top + $this.height(), 
		selected_member_ids: [], 
		disabled_member_ids: [], 
		enabled_member_ids: [], 
		visible_member_ids: [], 
		hidden_member_ids: [], 
		add_members: [], 
		datas: [], 
		select_type: 'checkbox', 
		start: function(){
				return true;
			}, 
		parent: [], 
		total: true
	};
	
	var options = $.extend({}, defaults, opts);
	options.title = options.title || LAYER_MESSAGES[options.kind.split('_').pop()];
	options.data_id = ( options.kind == "charge" ) ? "members" : (options.kind.split('_').shift()+"_categories");
	
	if( $charge_option.length && $charge_option.is(':visible') && $charge_option.data('id') == options.key ){
		$.toast.pop_layer.hide(layer_id);
	}
	else{
		if( $charge_option.length ){
			$charge_option.remove();
			$charge_option = [];
		}
		var contents = [];
		if( $charge_option.length ){
			$charge_option.remove();
			$charge_option = [];
		}
			
		if( !$charge_option.length ){
			if( options.kind == 'charge' ){
				var members = [];
				if( options.datas.length ){
					members = options.datas;
				}
				else{
					members = $('body').data(options.data_id);
				}
				var camp_member = $('body').data('member')
				
				if ( members == null || typeof members == 'undefined' ){
					alert(MESSAGES['500']);
					return;
				}
				
				if( options.total && options.select_type == "checkbox" ){
					contents.push({ content: "<li><label><input type=\"checkbox\" value=\"all\" /></label><span><strong>"+LAYER_MESSAGES['total']+"</strong></span></li>", grade: -1, name_positon: "a", me: -1 });
				}
				
				if( options.add_members.length ){
					members.concat(options.add_members);
				}

				for( var i = 0 ; i < members.length ; i++ ){
					var member = members[i];
					if( member.status == '1' ){
						var name_position = $.trim(member['name']);
						if (member.id == camp_member.id) {
							name_position = LAYER_MESSAGES["me"]+"("+name_position+")";
						}
						else 
						if (member['position'] !== null) {
							name_position += " " + $.trim(member['position']);
						}
						
						//name_position 옆에  메세지가 필요한 경우 
						if (member['msg'] !== null) {
							name_position += " " + $.trim(member['msg']);
						}
						
						var content = "<li>" +
											"<label><input type=\""+options.select_type+"\" value=\""+member['id']+"\" name=\"charge_layer\" /></label>" +
											"<span>"+name_position.toHtml()+"</span>" +
										"</li>";
						
						contents.push({
							content: content,
							grade: member['grade'],
							name_position: name_position, 
							me: ( camp_member.id == member.id ) ? 0 : 1
						});
					}
				}
				contents = array_sort(contents, {
					key: 'grade'
				});
				contents = array_sort(contents, {
					key: 'me'
				});
			}
			else
			if ( options.kind.split('_').pop() == 'category' ) {
				var categories = $('body').data(options.data_id);
				
				if ( categories == null || typeof categories == 'undefined' ){
					alert(MESSAGES['500']);
					return;
				}
				
				for( var i = 0 ; i < categories.length; i++ ){
					var category = categories[i];
					if( category.id != 0 && (category.grade == 'A' || category.grade == 'B' || $.inArray(category.tag, options.selected_member_ids) > -1 )){
						var content = "<li>" +
											"<label><input type=\""+options.select_type+"\" value=\""+category.tag+"\" name=\"select_item\" /></label>" +
											"<span>"+category.tag.toHtml()+"</span>" +
										"</li>";
						contents.push({ id: category.tag, content: content, tag: category.tag, count: category.count, idx: category.idx });
					}
				}
				
//				for (var i = 0; i < options.selected_member_ids.length; i++) {
//					var selected_member_id = options.selected_member_ids[i];
//					
//					if ( $.inArray(selected_member_id, $.map(contents, function(content, idx){ return content.id; })) < 0 ) {
//						var content = "<li>" +
//											"<label><input type=\""+options.select_type+"\" value=\""+selected_member_id+"\" name=\"select_item\" /></label>" +
//											"<span>"+selected_member_id.toHtml()+"</span>" +
//										"</li>";
//						contents.push({ id: selected_member_id, content: content, tag: selected_member_id, count: 0, idx: contents.length });
//					}
//				}
				contents = array_sort(contents, {
					key: 'idx'
				});
			}
			$.toast.pop_layer.add_layer({ "charge_option" :
				{
					class_name: "layer_sub_tab", 
					boxtop_title: "<h4 class=\"layer_title\">"+options.title+ "</h4>" + 
										"<ul class=\"tab_option\">" + 
											"<li><a class=\"on\"><span>" + LAYER_MESSAGES[options.kind.split('_').pop()+" grade"]+ "</span></a></li>" +
											"<li><a ><span>" + LAYER_MESSAGES["spelling"]+ "</span></a></li>" +
										"</ul>",
					boxbody_content: "<ul class=\"group_list\">" + 
											$.map(contents, function(content, idx){ return content['content']; }).join("")+ 
										"</ul>" +
										((options.kind.split('_').pop() == 'category' ) ? "<form id=\"add_item_frm\"><p class=\"group_add_item\"><input type=\"text\" class=\"text2\" toast=\"required:true\" /><a class=\"btn_normal_s\"><span>"+LAYER_MESSAGES['addition']+"</span></a></p></form>" : ""),
					boxbottom_footer: "<a class=\"btn_layer_m\"><span>"+LAYER_MESSAGES['confirm']+"</span></a>" +
										"<a class=\"btn_layer\"><span>"+LAYER_MESSAGES['cancel']+"</span></a>",
					boxbottom_right: "", 
					version: 2, 
					draggable: true, 
					parent: options.parent
				} 
			});
			$charge_option = $('#'+layer_id);

			$('form#add_item_frm', $charge_option).submit(function(){
				var $form = $(this);
				var form_id = $form.attr('id');
				if( !toast_validate_form(form_id) ) return false;
				var tag = $.trim($('input:text', $form).val());
				var categories = $('body').data(options.data_id);
				var $checkbox = null;
				var eq = $.inArray(tag.toLowerCase(), $.map($('input:checkbox', $form.prev('ul.group_list')), function(category, row){ return category.value.toLowerCase(); }));
				if( eq < 0 ){
					var idx = ( -1*(categories.length+1));
					var content = "<li>" + 
											"<label><input type=\""+options.select_type+"\" value=\""+tag+"\" /></label>" +
											"<span>"+tag.toHtml()+"</span>" +
										"</li>";
					contents.push({ id: idx, content: content, tag:tag, count: 0, idx: (contents.length+1) });
					if ($.inArray(tag, $.map(categories, function(category, idx){ return $.trim(category.tag); })) < 0) {
						categories.push({ id: idx, tag: tag, count: 0, p_count: 0, f_count: 0, idx: (categories.length + 1), master: false, insert: true, grade: "B" });
					}
					$('ul.group_list', $charge_option).append(content);
					$checkbox = $('ul.group_list>li:last>label>input:checkbox', $charge_option);
				}
				else{
//					alert(LAYER_MESSAGES['already registered tag']);
//					V2 : 3
					$checkbox = $('input:checkbox', $charge_option).eq(eq);
				}
				$('input:text', $form).val('');
				$checkbox.attr('checked', 'checked');
				$('ul.group_list', $charge_option).scrollTop($checkbox.parent().parent()[0].offsetTop - $checkbox.parent().parent().parent().position().top);
				toast_validate_form_return(form_id);
				return false;
			});
			
			$('a.btn_normal_s', $charge_option).click(function(){
				$(this).parent().parent().submit();
			});
			
			$('ul.tab_option>li>a', $charge_option).click(function(){
				if( $(this).hasClass('on') )
					return;
				
				var key = '';
				if( options.kind == 'charge' ) key = ( !$(this).parent('li').prev('li').length ) ? 'grade' : 'name_position';
				else key = ( !$(this).parent('li').prev('li').length ) ? 'idx': 'tag';
				
				var checked_values = $('input:'+options.select_type+':checked', $charge_option).map(function(row, idx){ return $(this).val(); });
				
				contents = array_sort(contents, { key: key, stand: ( key == "count" ) ? "desc" : "asc" });
				if( options.kind == 'charge' )
					contents = array_sort(contents, { key: 'me' });
				
				$('ul.group_list', $charge_option).html($.map(contents, function(content, idx){ return content['content']; }).join(''));
				if( checked_values ){
					$('ul.group_list>li', $charge_option).each(function(){
						var $checkbox = $('input:'+options.select_type, this);
						var val=$checkbox.val();
						if( $.inArray(val, checked_values) > -1 )
							$checkbox.attr('checked', 'checked');
						else
							$checkbox.removeAttr('checked');
						
						if(options.disabled_member_ids && options.disabled_member_ids.length>0){
							if($.inArray(val, options.disabled_member_ids) > -1){
								$checkbox.attr('disabled', 'disabled');
							}else{
								$checkbox.removeAttr('disabled');
							};
						};
						if(options.enabled_member_ids && options.enabled_member_ids.length>0){
							if($.inArray(val, options.enabled_member_ids) > -1){
								$checkbox.removeAttr('disabled');
							}else{
								$checkbox.attr('disabled', 'disabled');
							};
						};
						if(options.hidden_member_ids && options.hidden_member_ids.length > 0) {
							if($.inArray(val, options.hidden_member_ids) > -1 ){
								$checkbox.parent().parent().hide();
							}
							else{
								$checkbox.parent().parent().show();
							}
						};
						if( options.visible_member_ids && options.visible_member_ids.length > 0 ){
							if( val == "all" || $.inArray(val, options.visible_member_ids) > -1 ){
								$checkbox.parent().parent().show();
							}
							else {
								$checkbox.parent().parent().hide();
							}
						}
					});
				}
				
				$(this).parent().siblings('li').children('a').removeClass('on');
				$(this).addClass('on');
				
				if( typeof options.start == 'function' )
					options.start.call(this);
			});
			
			$('a.btn_layer, a.box_x', $charge_option).click(function(){
				$charge_option.removeData('id');
				
				if (options.kind.split('_').pop() == 'category') {
					var tmp = $('body').data(options.data_id);
					var categories = [];
					for (var i = 0; i < tmp.length; i++) {
						if (!tmp[i].insert) {
							categories.push(tmp[i]);
						}
					}
					$('body').data(options.data_id, categories);
				}

				if ($(this).hasClass('btn_layer')) {
					$.toast.pop_layer.hide(layer_id);
				}
			});
			
			if( options.kind == "charge" ){
				$('ul.group_list', $charge_option).bind('click', function(e){
					var $target = $(e.target);
					if( $target.is(':checkbox') ){
						if( $target.is(':checked') ){
							if( $target.val() == "all" ){
								$('input:checkbox:not(:disabled)', $charge_option).attr('checked', 'checked');
							}else{
								var all_length=$('input:checkbox', $charge_option).length;
								var selected_length=$('input:checkbox:checked', $charge_option).length;
								if(all_length-1<=selected_length){
									$('input:checkbox[value="all"]', $charge_option).attr('checked', 'checked');
								}
							}
						}
						else{
							if( $target.val() != "all" ){
								$('input:checkbox[value="all"]:not(:disabled)', $charge_option).removeAttr('checked');
							}
							else{
								$('input:checkbox:not(:disabled)', $charge_option).removeAttr('checked');
							}
						}
						
					}
				});
			}

		}

		$('a.btn_layer_m', $charge_option).unbind('click').click(function(){
			var select_members_id = $.map($('input:'+options.select_type+':checked', $charge_option), function(checkbox, row){ return ( $(checkbox).parent().parent().is(':visible') ? checkbox.value : ""); });
			
			if ( options.kind.split('_').pop() == 'category' ){
				var tmp = $('body').data(options.data_id);
				var categories = [];
				for( var i = 0 ; i < tmp.length; i++ ){
					if ( !tmp[i].insert || $.inArray(tmp[i].tag, select_members_id) > -1 ){
						tmp[i].insert = false;
						categories.push(tmp[i]);
					}
				}
				$('body').data(options.data_id, categories);
			}

			if( options.callback.call(this, get_datas_by_ids(select_members_id, options.kind)) ){
				$.toast.pop_layer.hide(layer_id);
			};
		});

		//$('div.t_wrap:first').append($charge_option);
		$('body').append($charge_option);
		if( typeof options.start == 'function' )
			options.start.call(this);

		$.toast.pop_layer.show(layer_id, { left: options.left, top: options.top });
		
		$charge_option.data('id', options.key);
		$charge_option.data('kind', options.kind);

		$('ul.group_list>li', $charge_option).each(function(){
			var $checkbox = $('input:'+options.select_type, this);
			var val = $checkbox.val();
			
			if ( $.inArray(val, options.selected_member_ids ) > -1) {
				$checkbox.attr('checked', 'checked');
			}
			else {
				$checkbox.removeAttr('checked');
			}
			if(options.disabled_member_ids && options.disabled_member_ids.length>0){
				if($.inArray(val, options.disabled_member_ids) > -1){
					$checkbox.attr('disabled', 'disabled');
				}else{
					$checkbox.removeAttr('disabled');
				};
			};
			if(options.enabled_member_ids && options.enabled_member_ids.length>0){
				if($.inArray(val, options.enabled_member_ids) > -1){
					$checkbox.removeAttr('disabled');
				}else{
					$checkbox.attr('disabled', 'disabled');
				};
			};
			if(options.hidden_member_ids && options.hidden_member_ids.length > 0) {
				if($.inArray(val, options.hidden_member_ids) > -1 ){
					$checkbox.parent().parent().hide();
				}
				else{
					$checkbox.parent().parent().show();
				}
			};
			if( options.visible_member_ids && options.visible_member_ids.length > 0 ){
				if( val == "all" || $.inArray(val, options.visible_member_ids) > -1 ){
					$checkbox.parent().parent().show();
				}
				else {
					$checkbox.parent().parent().hide();
				}
			}
		});
		
		try{
			var all_exist=$('input:'+options.select_type+":eq(0)", $charge_option).val()=="all";
			if(all_exist){
				if($('input:'+options.select_type+":visible", $charge_option).length
					==$('input:'+options.select_type+":checked", $charge_option).length+1){
					$('input:'+options.select_type+":eq(0)", $charge_option).attr('checked', 'checked');
				}
			}
		}catch(e){}
	}
}

$.fn.select_layer = function(options){
	options.id = options.id || "layer";
	options.klass = options.klass || "layer_sub";
	options.key = options.key || "";
	options.tab = options.tab || [];
	options.left = options.left || $(this).offset().left - $('body').offset().left;
	options.top = options.top || $(this).offset().top + $(this).height();
	options.selected_values = options.selected_values || [];
	options.disabled_values = options.disabled_values || [];
	options.enabled_values = options.enabled_values || [];
	options.visible_values = options.visible_values || [];
	options.hidden_values = options.hidden_values || [];
	options.select_type = options.select_type || "checkbox";
	options.select_klass = options.select_klass || options.select_type;
	options.start = ( typeof(options.start) == 'function' ) ? options.start : null;
	options.parent = options.parent || [];
	options.datas = options.datas || [];
	options.total = options.total || false;
	
	var $layer = $('#'+options.id);
	
	if ( $layer.length && $layer.is(":visible") && $layer.data("id") == options.key ){
		$.toast.pop_layer.hide(options.id);
	}
	else {
		if ( $layer.length ) {
			$layer.remove();
			$layer = null;
		}
		
		var datas = [];
		if ( options.datas == null || typeof options.datas == "undefined" ) {
			alert(MESSAGES['500']);
			return;
		}
		
		for( var i = 0 ; i < options.datas.length; i++ ) {
			var data = options.datas[i];

			var html = "<label><input type=\""+options.select_type+"\" class=\""+options.select_klass+"\" value=\""+data.value+"\" name=\"layer_items\" /> "+data.key.toHtml()+"</label>";
			data['html'] = html;
			if ( data.sort_default == null || "undefined" == typeof data.sort_default ) {
				data.sort_default = i;
			}
			datas.push(data);
		}

		var layer_options = {};
		layer_options[options.id] = {
			class_name: options.klass, 
			boxtop_title: "<h4 class=\"layer_title\">"+options.title+"</h4>", 
			boxbody_content: $.map(datas, function(data, idx){ return data.html; }).join("<br />"), 
			boxbottom_footer: "<a class=\"btn_layer_m\"><span>"+LAYER_MESSAGES['confirm']+"</span></a>" +
								"<a class=\"btn_layer\"><span>"+LAYER_MESSAGES['cancel']+"</span></a>",
			boxbottom_right: "", 
			version: 2, 
			draggable: false, //true, 
			parent: options.parent
		};
		
		$.toast.pop_layer.add_layer(layer_options);
		$layer = $('#'+options.id);
		$layer.data("datas", datas);

		$('input:'+options.select_type+'', $layer).each(function(idx){
			var $this = $(this);
			if( $.inArray($this.val(), options.selected_values) > -1 ) {
				$this.attr('checked', 'checked');
			}
			else {
				$this.removeAttr('checked');
			}
		});
			
		$('a.btn_layer_m', $layer).one('click', function(){
			var select_values = $.map($('input:'+options.select_type+':visible:checked', $layer), function(input, idx){ return input.value;});
			var select_datas = [];
			for( var i = 0 ; i < datas.length ; i++ ) {
				if( $.inArray(datas[i].value, select_values) > -1 ){
					var data = {};
					$.each(datas[i], function(key, value){
						data[key] = value;
					});
					select_datas.push(data);
				}
			}
			
			if ( options.callback.call(this, select_datas) ) {
				$.toast.pop_layer.hide(options.id);
			}
		});

		$('a.btn_layer', $layer).one('click', function(){
			$.toast.pop_layer.hide(options.id);
		});
		$.toast.pop_layer.show(options.id, { left: options.left, top: options.top });
	}
};

$.fn.calendar_double_option = function(options){
	var layer_id = 'calendar_double_option';
	var $obj = $(this);
	options.title = options.title || LAYER_MESSAGES['period'];
	options.start_date_title = options.start_date_title || LAYER_MESSAGES['start'];
	options.end_date_title = options.end_date_title || LAYER_MESSAGES['due'];
	var start_date = options.start_date || options.start_date_title;
	var end_date = options.end_date || options.end_date_title;
	options.start_date = options.start_date || TOAST_NOW.clone();
	options.end_date = options.end_date || TOAST_NOW.clone();
	options.parent = options.parent || '';
	
	var $start = ( $obj.parent().prev('p').length ) ? $obj.parent().prev('p'): $obj.parent();
	var undefined = ( typeof options.undefined == 'boolean' ) ? options.undefined : true;

	$(this).toast_double_datepicker({
		//left: options.left || $start.offset().left + $start.width()- 160 - $('div.t_wrap:first').offset().left,
		left: options.left || $start.offset().left + $start.width()- 160 - $('body').offset().left,
		top: options.top || $start.offset().top + $start.height(),  
		cal_option: "<span class=\"title\">" + options.title + "</span>" + 
							"<input class=\"text3\" type=\"text\" id=\"calendar_start_date\" readonly=\"readonly\" value='' />" +
								"~" +
							"<input class=\"text3\" type=\"text\" id=\"calendar_end_date\" readonly=\"readonly\" value='' />",
		undefined: undefined, 
		dates: [options.start_date, options.end_date], 
		parent: options.parent, 
		start: function(){
			var $start_date = $('#calendar_start_date', '#'+layer_id);
			var $end_date = $('#calendar_end_date', '#'+layer_id);
			
			$start_date.attr({
				'defaultValue': options.start_date_title,
				'value': options.start_date_title
			});

			$end_date.attr({
				'defaultValue': options.end_date_title,
				'value': options.end_date_title
			});
			
			if( typeof start_date != 'string' ) $start_date.val(start_date.yy_mm_dd_dash()).addClass('setted');
			if( typeof end_date != 'string' ) $end_date.val(end_date.yy_mm_dd_dash()).addClass('setted');
		}, 
		filter: function(obj, _date){
			var $start_date = $('#calendar_start_date', '#'+layer_id);
			var $end_date = $('#calendar_end_date', '#'+layer_id);
			
			if ( $(obj).parents('div.cal_start').length ) {
				if( _date == null ){
					$start_date.val($start_date.attr('defaultValue')).removeClass('setted');
					$(obj).parent().children('td.have').removeClass('have');
					return true;
				}
				else
				if( $end_date.val() == $end_date.attr('defaultValue') || $end_date.val().split('-').join('').to_date() >= _date ){
					$start_date.val(_date.yy_mm_dd_dash()).addClass('setted');
					$(obj).addClass('have');
					return true;
				}
			}
			else{
				if( _date == null ){
					$end_date.val($end_date.attr('defaultValue')).removeClass('setted');
					$(obj).parent().children('td.have').removeClass('have');
					return true;
				}
				else
				if( $start_date.val() == $start_date.attr('defaultValue') || $start_date.val().split('-').join('').to_date() <= _date ){
					$end_date.val(_date.yy_mm_dd_dash()).addClass('setted');
					$(obj).parent().children('td.have').removeClass('have');
					$(obj).addClass('have');
					return true;
				}
			}
			return false;
		}, 
		success: options.success
	}, function(_self, _date){
		
	});
}

$.fn.calendar_option = function(options){
	var layer_id = 'calendar_option';
	var $obj = $(this);
	options.dates = options.dates || TOAST_TODAY.to_date().clone();
	var undefined = ( typeof options.undefined == 'boolean' ) ? options.undefined : true;
	$(this).toast_datepicker({
		left: options.left || $obj.offset().left - $('body').offset().left, 
		top: options.top || $obj.offset().top + $obj.height(), 
		undefined: undefined, 
		dates: options.dates, 
		start: options.start, 
		filter: options.filter, 
		parent: options.parent 
	}, function(_self, _date){
		options.callback.call(this, _self, _date);
	});
}
