(function (KDApi, $) {
	var valueControlList = ['resultValueBooleanSelectDiv', 'resultValueTextDiv', 'resultValueNumberDiv', 'resultValueEnumSelectDiv', 'resultValueDateDiv'];

    function Result(model) {
        this._setModel(model)
    }

    Result.prototype = {
        _setModel: function (model) {
            this.model = model
			model.pageDom = $("#" + model.pageId);
        },
        init: function (props) {
            initFunc(this.model, props)
        },
        update: function (props) {
            if(this.model.dom.innerHTML){
				this.model.init = props.data.init;
				updateFunc(this.model, props)
				this.model.init = "false";
			}
        },
        destoryed: function () {

        }
    }

    var initFunc = function (model, props) {
		KDApi.loadFile(['./js/selectivity-jquery.js','./css/selectivity-jquery.css'], model, function () {
			// KDApi.loadFile可以通过路径加载js或css文件，并且在html文件头生成script或者link标签，第一个参数是路径，第二个参数是model，第三个参数是加载完成后执行的回调函数
			KDApi.loadFile('./css/ruleresult.css', model, function () {
				// 后端插件通过setData传给前端的数据，前端可以通过props.data去获取
				var text = props.data && props.data.text || ''
				// 通过路径去获取html字符串，第一个参数是路径，第二个参数是model，第三个参数是HTML模板中变量的值
				KDApi.getTemplateStringByFilePath('./html/ruleresult.html', model, {
					text: text
				}).then(function (data) {
					model.dom.innerHTML = data
					// 绑定DOM事件
					initEvent(model, props)
					//初始化数据
					model.invoke('initResultControlDataEvent');
				})
			})
		})
    }
	
	var updateFunc = function (model, props) {
        if (props.data) {
            if (props.data.param) {
				model._param = props.data.param;
				
				$('#ruleResult tr:visible', model.dom).remove();
				insertResult(model);
            }
            if (props.data.value) {
                updateTextValue(model, props.data.value);
            }
			if (props.data.date){//这个要放最后，防止控件还没初始化完成
				updateDateValue(model, props.data.date);
			}
            if (props.data.data) {
                initControl(model, JSON.parse(props.data.data));
            }
        }
    }
	
    //事件绑定
    var initEvent = function (model, props) {
		$(model.dom).on('keydown', '.resultValueDate:visible', function(){
			return false;
		});
		
		$(model.dom).on('keydown', '.resultValueNumber:visible', function(e){
			var code = e.keyCode;
			//只允许输入数字和小数点
			if(!((code >= 48 && code<=57) || code== 190 || (code>=96&&code<=105) || code==110 || code==8 || code==37 || code==39 || code==46)){
				return false;
			}
		});
		
		$(model.dom).on('change', '.resultValueBoolean:visible', function(){	
			setValue(model, $(this).parent().parent(), $(this).find("option:selected").html(), $(this).val());			
		})
		
		$(model.dom).on('change', '.resultValueEnum:visible', function(){	
			setValue(model, $(this).parent().parent(), $(this).find("option:selected").html(), $(this).val());
		})
		
		$(model.dom).on('blur', '.resultValueNumber:visible', function(){
			var value = $(this).val();
			value.replace(/^0*/, "").replace(/^0*\./, "0.");
			$(this).val(value)
			setValue(model, $(this).parent().parent(), value, value);
		})
		
		$(model.dom).on('blur', '.resultValueText:visible', function(){
			setValue(model, $(this).parent().parent(), $(this).val(), $(this).val());
		})

        $(model.dom).on('click', '.resultValueSearch', function () {
            var $tr = $(this).parent().parent().parent();
			var index = $tr.index();//从1开始
            model.invoke("openResultParamF7Event", {entityNumber: getResultParamValue(model, $tr), index: index, isMulti : false});
        })
		
		$(model.dom).on('click', '.resultValueDateDiv', function () {
			model.dateIndex = $(this).parent().parent().index();
			$("#resultdate", $("#" + model.pageId)).find("input").click()
			
			var top = $(this).offset().top;
			var left = $(this).offset().left;
			setTimeout(function(){
				if(document.body.scrollHeight < top + 28 + $(".j-left").parent().height()){//规则页面结果
					$(".j-left").parent().css("top", top - $(".j-left").parent().height());
				}else{//策略默认结果
					$(".j-left").parent().css("top", top + 28)
				}
				$(".j-left").parent().css("left", left)
				$(".j-left").attr("id", model.pageId + "date")
			}, 50);
		});
		
		$("#kd-theme").on("click", '#' + model.pageId + "date .rdtDay", function(){
			setTimeout(function(){
				$("#resultdate", model.pageDom).find("input").blur(); 
			}, 100);
		})		

        $(model.dom).on('click', '.deleteResult', function () {
			$(this).parent().parent().closest("tr").remove();
			resultJsonChange(model);
        })

        $('#addResult', model.dom).click(function () {
            insertResult(model);
			resultJsonChange(model);
        })
    }
	
	var getResultParamValue = function(model, $tr){
		return $tr.find(".resultParam").selectivity('value');
	}
	
	var getResultParamType = function(model, $tr){
		return $tr.find(".resultParam").selectivity('data') && $tr.find(".resultParam").selectivity('data').type;
	}
	
	var getResultParamIsTarget = function(model, $tr){
		return $tr.find(".resultParam").selectivity('data') && $tr.find(".resultParam").selectivity('data').target === "true";
	}
	
	var getResultEnumList = function(model, $tr){
		return $tr.find(".resultParam").selectivity('data') && $tr.find(".resultParam").selectivity('data').enumList;
	}
	
	var isEnum4ParamType = function(model, $tr){
		return $tr.find(".resultParam").selectivity('data') && $tr.find(".resultParam").selectivity('data').enumList ? true : false;
	}
	
	var setValue = function(model, $tr, displayValue, value){
		$tr.find(".resultDisplayValue").val(displayValue);
		$tr.find(".resultValue").val(value);
		
		resultJsonChange(model);
	}
	
	var resultJsonChange = function(model){
		if(model.init !== "true"){
			console.log(JSON.stringify(getResultControlJson(model)));
			model.invoke("setResultJsonEvent", JSON.stringify(getResultControlJson(model)));
		}
	}

    //创建参数控件
    var createParamControl = function (model, $tr) {
        //业务对象
        var dom = $tr || model.dom;
		$('.resultParam', dom).selectivity({
			allowClear: true,
			items: model._param
		});
		
		//参数改变时，初始化比较符（可以优化，比较参数类型是否改变）
		$('.resultParam:visible', dom).unbind('change').on('change', function(){
			var $tr = $(this).parent().parent();
			clearValue(model, $tr);
			
			var paramType = getResultParamType(model, $tr);
		
			if(isEnum4ParamType(model, $tr)){
				showEnumSelectDiv(model, $tr);
			}else if(paramType == 'boolean'){
				showBooleanSelectDiv(model, $tr);
			}else if(paramType == 'date'){
				showDateDiv(model, $tr);
			}else if(paramType == 'number'){
				showNumberDiv(model, $tr);
			}else{ 
				showTextDiv(model, $tr);
			}
			
			if(model.isResultJsonChange !== 'false'){
				resultJsonChange(model);
			}
		});
    } 
	
	var createValueEnumControl = function(model, $tr){
		var enumList = JSON.parse(getResultEnumList(model, $tr));
		$tr.find('.resultValueEnum').html('');
		$.each(enumList,function(i, obj){
			$tr.find('.resultValueEnum').append('<option value ="' + obj.value + '">' + obj.name.zh_CN + '</option>');
		});
	}
	
	var clearValue = function(model, $tr){	
		$tr.find(".resultValueDate").val('');
		$tr.find(".resultValueBoolean").val('');
		$tr.find(".resultValueNumber").val('');
		$tr.find(".resultValueText").val('');
		$tr.find(".resultDisplayValue").val('');
		$tr.find(".resultValue").val('');
	}

    //F7更新值
    var updateTextValue = function (model, data) {
        var index = data.index;
		$(".resultValueText", model.dom).eq(index).val(data.nameList);
        $(".resultDisplayValue", model.dom).eq(index).val(data.nameList);
        $(".resultValue", model.dom).eq(index).val(data.idList);
		
		resultJsonChange(model);
    }
	
	var updateDateValue = function(model, date){
		var index = model.dateIndex;
		$(".resultValueDate", model.dom).eq(index).val(date);
		$(".resultDisplayValue", model.dom).eq(index).val(date);
		$(".resultValue", model.dom).eq(index).val(date);
		
		resultJsonChange(model);
	}

    var initControl = function (model, data) {
        insertResult(model, data.resultList);
    }

    var insertResult = function (model, resultList) {
        if (resultList && resultList.length > 0) {
			$('#ruleResult tr:visible', model.dom).remove();
            for (var i = 0; i < resultList.length; i++) {
                var $tr = $('#templeteTrResult', model.dom).clone().removeAttr('id').show();
				$('#ruleResult', model.dom).append($tr);
				createParamControl(model, $tr);
            }

            $.each(resultList, function (i, resultObj) {
				var index = resultObj.index + 1;
				$tr = $('#ruleResult tr', model.dom).eq(index);
				
				$tr.find(".resultParam").selectivity('value', resultObj.param)	
				
				$tr.find(".resultComparisonOpt").val(resultObj.operators)
				
				//更新值类型
				if(isEnum4ParamType(model, $tr)){
					showEnumSelectDiv(model, $tr);
					$tr.find(".resultValueEnum").val(resultObj.value);
				}else if(resultObj.paramType == 'boolean'){
					showBooleanSelectDiv(model, $tr);
					$tr.find(".resultValueBoolean").val(resultObj.value);
				}else if(resultObj.paramType == 'date'){
					showDateDiv(model, $tr);
					$tr.find(".resultValueDate").val(resultObj.value);
				}else if(resultObj.paramType == 'number'){
					showNumberDiv(model, $tr);
					$tr.find(".resultValueNumber").val(resultObj.value);
				}else{ 
					showTextDiv(model, $tr);
					$tr.find(".resultValueText").val(resultObj.displayValue);
				}
				
				$tr.find(".resultDisplayValue").val(resultObj.displayValue)
				$tr.find(".resultValue").val(resultObj.value)
            });
        } else {			
			var $tr = $('#templeteTrResult', model.dom).clone().removeAttr('id').show();
			$('#ruleResult', model.dom).append($tr);
			createParamControl(model, $tr);
        }
    }
	
	var showValueSearch = function(model, $tr){
		var paramType = getResultParamType(model, $tr);
		if(paramType == 'dynamicObject'){		
			$tr.find(".resultValueSearch").show();
			$tr.find(".resultValueText").attr("disabled", true);
		}else{
			$tr.find(".resultValueSearch").hide();
			$tr.find(".resultValueText").attr("disabled", false);
		}
	}
	
	var showControl = function(model, $tr, controlKey){
		$.each(valueControlList, function(i, valueControlKey){
			if(valueControlKey == controlKey){
				$tr.find('.' + valueControlKey).show();
			}else{
				$tr.find('.' + valueControlKey).hide();
			}
		});	
	}
	
	var showNumberDiv = function(model, $tr){
		showControl(model, $tr, 'resultValueNumberDiv');
	}
	
	var showTextDiv = function(model, $tr){
		showControl(model, $tr, 'resultValueTextDiv');
		showValueSearch(model, $tr);
	}
	
	var showBooleanSelectDiv = function(model, $tr){
		showControl(model, $tr, 'resultValueBooleanSelectDiv');
	}
	
	var showEnumSelectDiv = function(model, $tr){
		showControl(model, $tr, 'resultValueEnumSelectDiv');
		createValueEnumControl(model, $tr);
	}
	
	var showDateDiv = function(model, $tr){
		showControl(model, $tr, 'resultValueDateDiv');
	}

    //条件控件的返回值
    var getResultControlJson = function(model){
        var data = {};
        data.resultList = getResultJson(model);
        return data;
    }

    //获取结果的List
    var getResultJson = function(model){
        var resultList = new Array();
        $("#ruleResult tr:visible", model.dom).each(function(i){
            var resultObj = {};
            resultObj.index = i;
            resultObj.param = getResultParamValue(model, $(this));
            resultObj.paramType = getResultParamType(model, $(this));
            resultObj.operators = $(this).find(".resultComparisonOpt").val();
			
			var selectValue = $(this).find('.resultValueTd select:visible').val();
            resultObj.displayValue = $(this).find(".resultDisplayValue").val() || $(this).find('.resultValueTd select:visible option[value="' + selectValue + '"]').html();
            resultObj.value = $(this).find(".resultValue").val() || selectValue;
            resultList.push(resultObj);
        });
        return resultList;
    }

    KDApi.register('ruleresult', Result)
})(window.KDApi, jQuery)