(function(document,window) {
	var jobsortJson;
	var language = 1;
	var sort;
	var layer = 1;
	var maxCheck = 3;
	var jobIdLabel = ['#jobFunction1', '#jobFunction2', '#jobFunction3'];
	var jobNameLabel = ['#jobFunctionName'];
	var bindButton = [];
	var panel = '<div id="jobSortPicker" class="select_down" style="display:none">\
					<div class="opacityDiv2"></div>\
					<div class="layer_btns">\
						<span>${span_text}：</span>\
						<div></div>\
						<i class="close">×</i>\
						<div></div>\
						<div class="clear"></div>\
					</div>\
					<div class="box_con" id="jobData">${jobHtml}\
					</div>\
					<div class="layer_bottom">\
						<a class="overlay_but sure" href="javascript:void(0);">${confirm}</a>\
						<a class="overlay_but bcolor close" href="javascript:void(0);">${cancel}</a>\
					</div>\
					<div style="clear:both;"></div>\
					<div class="kz_tishi">${modal_text}</div>\
					<div class="kz_tishi1" style="display:none;">最多只能选1个</div>\
				</div>';
	var span_text = ["结果栏显示文本","最多可选${check}项", "pick ${check} items at most"];
	var modal_text = ["超出可选数量后的提示","最多只能选${check}个", "pick ${check} items at most"];
	var confirm = ["确定按钮", "确定", "Confirm"];
	var cancel = ["取消按钮", "取消", "Cancel"]
	var category = '<div class="job_box">\
						<div class="job_tit" value="${sortId}">${sortName}</div>\
						<div class="job_sub" style="display:none;">${second}</div>\
					</div>';
	var second = '<div class="job_sorts"><label class="twolevel" for="#" style="cursor: default;"><input value="${sortId}" type="checkbox" style="display:none;">${sortName}</label></div>\
				  <div class="clear"></div>';
	var third = '<li><label><input value="${sortId}" type="checkbox">${sortName}</label></li>';
	
	/**
	 * 将后台生成的职位字典文件(/js/dis/jobSort.js)转化为
	 * 符合格式的json对象
	 */
	function initData(sort) {
		if (jobsortJson) {
			return jobsortJson;
		}
		jobsortJson = [];
		var childrenMap = {};
		// 遍历
		for (var i = 0; i < sort.length; i++) {
			if(isNaN(parseInt(i))) {
				debugger
			}
			var sortId = sort[i][0];
			var fatherId = sort[i][1];
			var sortName = sort[i][2];
			var enSortName = sort[i][3];
			if (fatherId == 0) {
				var second = childrenMap[sortId.toString().substring(0,2)];
				if (second) {
					second.sortName = sortName;
					second.enSortName = enSortName;
				} else {
					childrenMap[sortId.toString().substring(0,2)] = {
						"sortId" : sortId,
						"sortName" : sortName,
						"enSortName" : enSortName,
						"childs" : []								
					};
				}
			} else {
				var second = childrenMap[fatherId.toString().substring(0,2)];
				if (!second) {
					second = childrenMap[fatherId.toString().substring(0,2)] = {
						"sortId" : fatherId,
						"sortName" : "",
						"enSortName" : "",
						"childs" : []								
					};
				}
				second.childs.push({
					"sortId" : sortId,
					"sortName" : sortName,
					"enSortName" : enSortName
				});
			}
		}
		for (i in childrenMap) {
			jobsortJson.push({
				sortId:i,
				sortName:childrenMap[i].sortName,
				enSortName:childrenMap[i].enSortName,
				childs:[childrenMap[i]]
			});
		}
		
		return jobsortJson;
	}
	
	function initHtml() {
		var jobHtml = '';
		for (var i = 0; i < jobsortJson.length; i++) {
			var firstHtml = category.replace('${sortId}', jobsortJson[i].sortId)
				.replace('${sortName}', getName(jobsortJson[i]));
			var secondNode = jobsortJson[i].childs;
			var secondHtml = '';
			if (secondNode) {
				for (var j = 0; j < secondNode.length; j++) {
					var nodeHtml = second.replace('${sortId}', secondNode[j].sortId)
					.replace('${sortName}', getName(secondNode[j]));
					var thirdNode = secondNode[j].childs;
					if (thirdNode) {
						var thirdHtml = '<ul class="job_con">';
						for (var k = 0; k < thirdNode.length; k++) {
							thirdHtml += '<li><label><input value="' + thirdNode[k].sortId 
										+ '" type="checkbox">' + getName(thirdNode[k]) + '</label></li>';
							if ((k + 1) % 3 == 0) {
								thirdHtml += '<li class="clear"></li>'
							}
						}
						thirdHtml += '<li class="clear"></li></ul>'
						nodeHtml += thirdHtml;
					}
					secondHtml += nodeHtml;
				}
			}
			firstHtml = firstHtml.replace('${second}', secondHtml);
			jobHtml += firstHtml;
		}
		
		var div = document.createElement("div");
		div.innerHTML = panel.replace('${jobHtml}', jobHtml)
							.replace('${span_text}', span_text[language].replace('${check}', maxCheck))
							.replace('${modal_text}', modal_text[language])
							.replace('${confirm}', confirm[language])
							.replace('${cancel}', cancel[language]);
		document.body.appendChild(div);
		bindClick();
	}
	
	function show() {
		$('#jobSortPicker').css('display', '');
		$(".box_con .job_box").removeClass('current').find(".job_sub").css('display', 'none');
		$(".box_con div:first").appendClass('current').find(".job_sub").css('display', '');
		
		// 读取配置的职位id input 对已选择的进行回显
		for (var i = 0; i < maxCheck; i++) {
			var label = new Selector(jobIdLabel[i], document).eq(0) || undefined;
			if (label && label.nodeName == 'INPUT') {
				var jobId = label.value;
				$('#jobData input').each(function(el) {
					if (el.value == jobId) {
						$(el).attr('checked', 'true');
						var jobName = el.nextSibling.data;
						$('div.layer_btns .close').insertBefore(createLabel(jobId, jobName));
					}
				});
			}
		}
	}
	
	function confirmBind() {
		$('.layer_bottom .sure').click(function() {
			var labels = $('.layer_btns label');
			var jobName = '';
			for (var i = 0; i < maxCheck; i++) {
				var label = new Selector(jobIdLabel[i], document).eq(0) || undefined;
				if (label && label.nodeName == 'INPUT') {
					label.value = '';
					if (!labels.eq(i)) {
						continue;
					}
					label.value = labels.eq(i).id;
					jobName += labels.eq(i).innerHTML.replace(/<i>×<\/i>/ig, '') + ' + ';
				}
			}
			var nameLabel = new Selector(jobNameLabel[0], document).eq(0) || undefined;
			if (nameLabel && nameLabel.nodeName == 'INPUT') {
				nameLabel.value = jobName.substring(0, jobName.length - 3);
			}
			labels.remove();
			$('.job_box').find('input').attr("checked",false);
			$('#jobSortPicker').css('display','none');
		});
	}
	
	function setJobIdLabel(array) {
		jobIdLabel = array;
	}
	function setJobNameLabel(array) {
		jobNameLabel = array;
	}
	function setShowButton(select) {
		for (var i = 0; i < bindButton.length; i++) {
			if (select == bindButton[i]) {
				return;
			}
		}
		
		new Selector(select, document).delegate(show);
		bindButton.push(select);
	}
	
	function bindClick() {
		firstClick();
		hide();
		if (layer == 1) {
			secondClick();
		}
		thirdClick();
		confirmBind();
	}
	
	function firstClick() {
		$(".box_con .job_box").click(function(e) {
			$(".box_con .job_box").removeClass('current').find(".job_sub").css('display', 'none');
			$(this).appendClass('current').find(".job_sub").css('display', '');
		});
	}
	
	function secondClick() {
		$('div.job_sorts').click(function(e) {
			var input = $(this).find("input");
			var jobId = input.selectDoms[0].value;
			var jobName = input.selectDoms[0].nextSibling.data;
			if (!input.attr('checked')) {
				$(this).next().next().find("input").removeAttr('checked').each(function(el) {
					var thirdLevelId = el.value;
					if (thirdLevelId) {
						$('#' + thirdLevelId).remove();
					}
				});
				var checked = $("div.layer_btns label").length();
				if (checked < maxCheck) {
					$('div.layer_btns .close').insertBefore(createLabel(jobId, jobName));
					input.attr('checked', true);
				} else {
					var tips = $('.kz_tishi');
					tips.text(modal_text[language].replace('${check}', maxCheck)).css("display", "block");
					setTimeout(function() {
						tips.css("display", "none");
					}, 600);
				}
			} else {
				input.removeAttr('checked');
				$('#' + jobId).remove();
			}
			
		}).find("input").click(function(e) {
			var input = $(this);
			var jobId = input.selectDoms[0].value;
			var jobName = input.selectDoms[0].nextSibling.data;
			if (!input.attr('checked')) {
				input.removeAttr('checked');
				$('#' + jobId).remove();
			} else {
				$(this).parent(".job_sorts").next().next().find("input").removeAttr('checked').each(function(el) {
					var thirdLevelId = el.value;
					if (thirdLevelId) {
						$('#' + thirdLevelId).remove();
					}
				});
				var checked = $("div.layer_btns label").length();
				if (checked < maxCheck) {
					$('div.layer_btns .close').insertBefore(createLabel(jobId, jobName));
					input.attr('checked', true);
				} else {
					input.removeAttr('checked');
					var tips = $('.kz_tishi');
					tips.text(modal_text[language].replace('${check}', maxCheck)).css("display", "block");
					setTimeout(function() {
						tips.css("display", "none");
					}, 600);
				}
				
			}
		}); 
	}
	
	function createLabel(jobId, jobName) {
		var label = document.createElement("label");
		label.id = jobId;
		label.className = 'selected-label2';
		label.innerHTML = jobName + ' <i>×</i>';
		var i = label.getElementsByTagName('i')[0]
		i.onclick = function() {
			var parent = this.parentNode;
			var jobId = parent.id;
			$('#jobData input').each(function(el) {
				if (el.value == jobId) {
					$(el).removeAttr('checked');
				}
			});
			$(parent).remove();
		}
		return label;
	}
	
	function thirdClick() {
		$('.job_con li label').click(function(e) {
			
		}).find("input").click(function(e) {
			var input = $(this);
			var jobId = input.selectDoms[0].value;
			var jobName = input.selectDoms[0].nextSibling.data;
			if (!input.attr('checked')) {
				input.removeAttr('checked');
				$('#' + jobId).remove();
			} else {
				input.parent(".job_con").previous().previous().find("input").removeAttr('checked').each(function(el) {
					var secondLevelId = el.value;
					if (secondLevelId) {
						$('#' + secondLevelId).remove();
					}
				});
				input = $(this);
				var checked = $("div.layer_btns label").length();
				if (checked < maxCheck) {
					input.attr('checked', true);
					var levelTwoId = input.selectDoms[0].value;
					$('#' + levelTwoId).remove();
					$('div.layer_btns .close').insertBefore(createLabel(jobId, jobName));
				} else {
					input.removeAttr('checked');
					var tips = $('.kz_tishi');
					tips.text(modal_text[language].replace('${check}', maxCheck)).css("display", "block");
					setTimeout(function() {
						tips.css("display", "none");
					}, 600);
				}
			}
		});
	}
	
	function hide() {
		$('.close').click(function() {
            $('#jobSortPicker').css('display','none');
            $('.layer_btns').find('label').remove();           
            $('.job_box').find('input').attr("checked",false);            
     });  
	}
	
	function getName(jobsort) {
		return language == 1 ? jobsort.sortName : jobsort.enSortName;
	}
	
	function setLayer() {
		if (layer == 1) {
			var labels = $(".job_box .twolevel").css('cursor','pointer');
			labels.find("input").css('display','');
		}
	}
	
	// 选择器
	function Selector(selector, root) {
		this.selectDoms = [];
		if (typeof selector == 'string') {
			var selectors = [];
			if (selector) {
				selectors = selector.split(' ');
			}
			var pDom;
			if (root) {
				pDom = [root];
			} else {
				pDom = [document.getElementById('jobSortPicker')];
			}
			for (var i = 0; i < selectors.length; i++) {
				this.selectDoms = getElement(selectors[i], pDom);
				pDom = this.selectDoms;
			}
		} else if (typeof selector == 'object') {
			this.selectDoms.push(selector);
		}
	};
	
	Selector.prototype.each = function(fn) {
		for (var i = 0; i < this.selectDoms.length; i++) {
			fn.call(this, this.selectDoms[i]);
		}
		return this;
	}
	
	Selector.prototype.length = function () {
		return this.selectDoms.length;
	}
	
	Selector.prototype.text = function(str) {
		this.each(function(el) {
			if (el) {
				el.innerHTML = str;
			}
		});
		return this;
	}
	
	Selector.prototype.eq = function (index) {
		if (index < this.selectDoms.length) {
			return this.selectDoms[index];
		}
	}
	
	Selector.prototype.css = function(key, value) {
		this.each(function(el) {
			el.style[key] = value;
		});
		return this;
	}
	
	Selector.prototype.appendClass = function (className) {
		var reg= new RegExp('\\b'+className+'\\b','g');
		this.each(function(el) {
			if (!reg.test(el.className)) {
				el.className += ' ' + className;
			}
		});
		return this;
	}
	
	Selector.prototype.removeClass = function (className) {
		var reg= new RegExp('\\b'+className+'\\b','g');
		this.each(function(el) {
			if (reg.test(el.className)) {
				el.className = el.className.replace(' ' + className, '');
			}
		});
		return this;
	}
	
	Selector.prototype.click = function (fn) {
		var callback = fn;
		this.each(function(el) {
			if(document.addEventListener){
				el.addEventListener('click', function(event) {
					event.stopPropagation();
					callback.call(this, event);
				});
			} else { // ie8及以下事件this对象指向window
				el.attachEvent('onclick', function(event) {
					window.event.cancelBubble = true;
					callback.call(el, event);
				});
			}
		});
		return this;
	}
	
	Selector.prototype.delegate = function (fn) {
		var callback = fn;
		this.each(function(el) {
			if(document.addEventListener){
				document.addEventListener('click', function(event) {
					var ev = event || window.event;
					var target = ev.target || ev.srcElement;
					if(target.id == el.id){
			　 　　　　　　	callback.call(el, event);
			　　　　	}
				});
			} else { 
				document.attachEvent('onclick', function(event) {
					var ev = event || window.event;
					var target = ev.target || ev.srcElement;
					if(target.id == el.id){
			　 　　　　　　	callback.call(el, event);
			　　　　	}
				});
			}
		});
		return this;
	}
	
	Selector.prototype.find = function (selector) {
		this.selectDoms = getElement(selector, this.selectDoms);
		return this;
	}
	
	Selector.prototype.remove = function () {
		this.each(function(el) {
			if (el) {
				el.parentNode.removeChild(el);
			}
		});
		return this;
	}
	
	Selector.prototype.attr = function (key, value) {
		if (value != undefined) {
			this.each(function(el) {
				el.setAttribute(key, value);
				if (key == 'checked') {
					el.checked = value;
				}
			});
			return this;
		} else {
			if (this.selectDoms.length == 0) {
				return undefined;
			} else if (this.selectDoms.length == 1) {
				return this.selectDoms[0][key];
			} else {
				var values = [];
				for (var i = 0; i < this.selectDoms.length; i++) {
					values.push(this.selectDoms[i][key]);
				}
				return values;
			}
		}
	}
	
	Selector.prototype.removeAttr = function (key) {
		this.each(function(el) {
			el.removeAttribute(key);
			if (key == 'checked') {
				el.checked = false;
			}
		});
		return this;
	}
	
	Selector.prototype.insertBefore = function (dom) {
		this.each(function(el) {
			el.parentNode.insertBefore(dom, el);
		});
		return this;
	}
	
	Selector.prototype.next = function () {
		for (var i = 0; i < this.selectDoms.length; i++) {
			this.selectDoms[i] = this.selectDoms[i].nextElementSibling || this.selectDoms[i].nextSibling;
		}
		return this;
	}
	
	Selector.prototype.previous = function () {
		for (var i = 0; i < this.selectDoms.length; i++) {
			this.selectDoms[i] = this.selectDoms[i].previousElementSibling || this.selectDoms[i].previousSibling;
		}
		return this;
	}
	
	Selector.prototype.parent = function (selector) {
		for (var i = 0; i < this.selectDoms.length; i++) {
			if (!selector) {
				this.selectDoms[i] = this.selectDoms[i].parentNode;
			} else {
				this.selectDoms[i] = this.selectDoms[i].parentNode;
				var nodeName = this.selectDoms[i].nodeName;
				while (nodeName != 'BODY') {
					var flag = false;
					switch (selector.charAt(0)) {
						case '#':
							if (this.selectDoms[i].id == selector.substring(1)) {
								flag = true;
							}
							break;
						case '.':
							if (this.selectDoms[i].className == selector.substring(1)) {
								flag = true;
							}
							break;
						default:break;
					}
					if (flag) {
						break;
					}
					this.selectDoms[i] = this.selectDoms[i].parentNode;
					nodeName = this.selectDoms[i].nodeName;
				}
				if (nodeName == 'BODY') {
					this.selectDoms[i] = undefined;
				}
			}
		}
		return this;
	}
	
	var $ = function(selector) {
		return new Selector(selector);
	}
	
	function getElement(selector, pDom) {
		var selectDoms = [];
		for (var i = 0; i < pDom.length; i++) {
			if (pDom[i] === window) {
				continue;
			}
			switch (selector.charAt(0)) {
			case '#':
				var dom = document.getElementById(selector.substring(1));
				selectDoms.push(dom);
				break;
			case '.':
				var doms = getElementsByClass(selector.substring(1), pDom[i]);
				for (var j = 0; j < doms.length; j++) {
					selectDoms.push(doms[j]);
				}
				break;
			default:
				var str = selector;
				if(/\w+\.\w+/g.test(str)){
                    //先选择标签，在选择类选择器  使用类选择器的时候重复选择器函数即可
                    var aStr=str.split('.');
                    var aRes=pDom[i].getElementsByTagName(aStr[0]);
                    var reg=new RegExp('\\b'+aStr[1]+'\\b','g');
                    for(var j=0;j<aRes.length;j++){
                        if(reg.test(aRes[j].className)){
                        	selectDoms.push(aRes[j]);
                        }
                    }
				} else if (/\w+\:\w+/g.test(str)) {
					var aStr=str.split(':');
                    var aRes=pDom[i].getElementsByTagName(aStr[0]);
                    switch (aStr[1]) {
	                    case 'first' : 
	                    	selectDoms.push(aRes[0]);
	                    	break;
                    	default:
                    		break;
                    }
				} else {
                    var aRes=pDom[i].getElementsByTagName(str);
                    for(var j=0;j<aRes.length;j++){
                    	selectDoms.push(aRes[j]);
                    }
                }
                break;
			}
		}
		return selectDoms;
	}
	
	
	function getElementsByClass(className, pDom) {
		if(pDom.getElementsByClassName){//高级浏览器支持getElementsByClassName直接使用
	        return pDom.getElementsByClassName(className);
	    }else{//不支持需要选中所有标签的类名来选取
	        var res=[];
	        var aAll=pDom.getElementsByTagName('*');
	        for(var i=0;i<aAll.length;i++){
	            var reg= new RegExp('\\b'+className+'\\b','g');
	            if(reg.test(aAll[i].className)){
	                res.push(aAll[i]);
	            }
	        }
	        return res;
	    }
	}
	
	JobSort = function(options) {
		language = options.language || 1; // 默认语言为中文
		sort = options.sort || window.sort;
		layer = options.layer || layer;
		maxCheck = options.maxCheck || maxCheck;
		jobIdLabel = options.jobIdLabel || jobIdLabel; // 反填职位类型id
		jobNameLabel = options.jobNameLabel || jobNameLabel; // 反填职位类型名称
		var showButton = options.showButton;
		if (showButton) {// 绑定选择按钮
			initData(sort); // 初始化数据
			initHtml(); // 初始化选择器界面
			setLayer(); // 初始化可选择层数
			new Selector(showButton, document).delegate(show);
			bindButton.push(showButton);
		}
		return {
			setJobIdLabel : setJobIdLabel,
			setJobNameLabel : setJobNameLabel,
			setShowButton : setShowButton
		};
	}
})(document,window);