FLbs4amap_wev8.js 10.7 KB
define(['mUtil', "Component"],function(mUtil, Component) {
	var FLbs4amap = function(options) {
		var _lbs = {}, $comp, $wevField, $lngField, $latField, $addrField, $entry, $fieldtext;
		
		Component.super(this, options);	
		
		this.type = "FLbs4amap";
		this.tpl = this.type + "_html";
		this.css = this.type + "_css";
        this.dataload = true;

		var splitChar = "||||";
		
		var vm = this.viewModel = {
			form : "",
			field : {
				label : "所在位置",  //显示名称
				longitude : "",     //对应经度字段
				latitude : "",      //对应纬度字段
				address : "",       //对应地址中文字段
				value : ""          //对应经度字段value
			},
			datatype : "",          //数据保存类型
			poi : {
				postype : 1,        //定位类型
				radius : 500,       //poi半径
				num : 10,           //热点个数
				btntext : ""        //按钮名称
			},
			limit : {
				enabled: false,	    //定位限制 是否开启
				radius: 1000,       //半径 单位米
				tip: "当前位置超出限制范围",
				lng: "",            //经度, 如121.522443
				lat: "",	        //纬度, 如 31.082311
				coordinateType: 1   //坐标类型  1:高德,腾讯地图类的坐标系。2:百度地图类的坐标系。3:gps类的坐标系
			},
			isShowCurrLocation : true,//显示当前位置
			required : false,
			readonly : false
		};
		
		this.dbValueHasSet = false; //是否已设置表单数据值,调用this.setValueByDB()方法后修改此状态
		
		this.beforeMount = function(){
			if(vm.field.value){
				vm.hasvalue = "wev-flbs4amap-showtext";
			}
			var limitPoint = vm.limit.point;
			if(limitPoint && limitPoint.indexOf(",") != -1){
				var limitPArr = limitPoint.split(",");
				vm.limit.lng = limitPArr[0];
				vm.limit.lat = limitPArr[1];
			}
			if(vm.poi.postype == 1) vm.poi.num = -1;//在postype=1时,设置周围热点不显示
		};
		
		this.mounted = function () {
		    $comp = this.$el.children(".wev-comp-" + this.type);
			$wevField = this.$el.find(".wev-field");
			$lngField = $("input[name='fieldname_" + vm.field.longitude + "']", $comp);
			$latField = $("input[name='fieldname_" + vm.field.latitude + "']", $comp);
			$addrField = $("input[name='fieldname_" + vm.field.address + "']", $comp);
			$entry = $(".wev-flbs4amap-entry", $comp);
			$fieldtext = $(".wev-flbs4amap-detail", $comp);
			
			var that = this;
			
			$(".wev-flbs4amap-refresh-btn", $comp).on("click", function (e) {
                that.refresh();
                e.stopPropagation();
            });
			
			if (!vm.readonly) {
				$(".wev-flbs4amap-location, .wev-flbs4amap-content", $comp).on("click", function () {
					that.getPosition(that.pageid);
				});
			}else{
			    $(".wev-flbs4amap-content", $comp).on("click", function () {
	                var coordinate = "";
	                if(vm.datatype == 2){
	                    coordinate = $addrField.val();
	                }else{
	                    coordinate = $lngField.val() + "," + $latField.val();
	                }
	                Mobile_NS.openMap(coordinate, 1);
	            });
			}
			
			if (vm.isShowCurrLocation && !$p("billid")) {
			    _lbs.getCurrPosition();//获取当前位置
			}
		};
		
		this.getData = function () {
			var data = {};
			if(vm.datatype == "1" || vm.datatype == "3"){
			    data["fieldname_" + vm.field.longitude] = $lngField.val();
			    data["fieldname_" + vm.field.latitude] = $latField.val();
			}
			if (vm.datatype == "2" || vm.datatype == "3") {
				data["fieldname_" + vm.field.address] = $addrField.val();
			}
			return data;
		};
		
		this.reset = function () {//表单重置vm中内容
			$wevField.removeClass("wev-required-remind");

			if (vm.readonly) return;

			this.setValue(vm.field.value);
		};
		
		this.checkRequired = function () {
			var hasValue = $lngField.val() && $latField.val();
			if(vm.datatype == "2"){
			    hasValue = $addrField.val();
			}else if(vm.datatype == "3"){
			    hasValue = hasValue && $addrField.val();
			}
			var required = vm.required && !hasValue;
			var fieldLabel = vm.field.label || mUtil.getLabel(128155, "LBS");

			$wevField.toggleClass("wev-required-remind", required);
			
			return required && fieldLabel;
		};
		
		this.setRequired = function (required) {
			vm.required = required;
			$wevField.toggleClass("wev-field-required", required);
			!required && $wevField.removeClass("wev-required-remind");
		};
		
		this.setReadonly = function (readonly) {
			vm.readonly = readonly;
			readonly && $(".wev-flbs4amap-location, .wev-flbs4amap-content", $comp).unbind("click") || $(".wev-flbs4amap-content", $comp).unbind("click");
			this.mounted();
		};
		
		/**
		 * 是否包含指定字段名
		 * */
		this.containsField = function(name){
		    if(!name) return false;
		    return (vm.field.longitude.toLowerCase() === name.toLowerCase()) 
		        || (vm.field.latitude.toLowerCase() === name.toLowerCase())
		        || (vm.field.address.toLowerCase() === name.toLowerCase());
		};
		
		this.getValue = function(name){
		    name = name.toLowerCase();
		    if(vm.field.longitude.toLowerCase() === name){
		        return $lngField.val();
		    }else if(vm.field.latitude.toLowerCase() === name){
		        return $latField.val();
		    }else if(vm.field.address.toLowerCase() === name.toLowerCase()){
		        return $addrField.val();
		    }
		};
		
		this.text = function () {
			return $fieldtext.text();
		};
		
		this.getFieldNameOfDB = function(){
		    var name = vm.field.longitude + splitChar + vm.field.latitude;
		    if(vm.datatype == "2"){
		        name = vm.field.address;
		    }else if(vm.datatype == "3") {
				name += (splitChar + vm.field.address);
			}
			return name;
		};
		
		this.setValueByDB = function(v){
			this.dbValueHasSet = true;
			vm.field.value = v;
			this.setValue(v, true);
		};
		
		this.setValue = function(v, initialize){
		    var vArr = (v||"").split(splitChar), lng, lat, addr;
            if (vm.datatype == "1" || vm.datatype == "3") {
                lng = vArr[0];
                lat = vArr[1];
                if(vm.datatype == "3"){
                    addr = vArr[2];
                }
            } else if (vm.datatype == "2") {
                addr = vArr[0];
            }
            _lbs.setValue(lng, lat, addr, initialize);
		};
		
		_lbs.setValue = function(lng, lat, addr, initialize){
		    lng = lng || "";lat = lat || "";addr = addr || "";
		    if (vm.datatype == "1" || vm.datatype == "3") {
                $lngField.val(lng);
                $latField.val(lat);
                if(addr){
                    fillText(addr); 
                    $addrField.val(addr);
                }else{
                    if(lng && lat){
                        require(["amapHelper"], function(amapHelper){
                            amapHelper.getAddress(lng, lat, function(rs){
                                var _addr = rs.addr || "";
                                $addrField.val(_addr);
                                fillText(_addr);
                            });
                        });
                    }else{
                        $addrField.val("");
                        fillText("");
                    }
                }
            } else if (vm.datatype == "2") {
                $addrField.val(addr);
                fillText(addr); 
            }
            initialize && this.dbValueHasSet && mUtil.trigger('dataload', this.pageid, this.id);

			function fillText(text){
				$fieldtext.html(text);
				var isEmptyVal = (text == "");
				$entry.toggleClass("wev-flbs4amap-showtext", !isEmptyVal);
				if (!isEmptyVal && (!vm.readonly || !$p("billid"))) {
					$(".wev-flbs4amap-refresh-btn", $comp).show();
				}
			}
		};
		
		_lbs.getCurrPosition = function(){
		    var $fieldLabel = $(".wev-flbs4amap-location", $comp);
            mUtil.getLabel(4084, "正在获取...",function(msg){
                $fieldLabel.html(msg);
            });
            Mobile_NS.getCurrPosition(function (result) {
                if (!result){
                    mUtil.getLabel(5304, "获取定位信息失败",function(msg){
                        Mobile_NS.alert(msg);
                    });
                    $fieldLabel.html(vm.field.label);
                    return ;
                }

                var status = result.status;
                
                if (status == "1") {
                    if(vm.limit.enabled && vm.limit.lng && vm.limit.lat){
                        require(["amapHelper"], function (amapHelper) {
                            var checkLimit = function(){
                                var limitPoint = [vm.limit.lng, vm.limit.lat];
                                var currPoint = [result.lng, result.lat];
                                var distance = AMap.GeometryUtil.distance(limitPoint, currPoint).toFixed(0);
                                if(distance > vm.limit.radius){
                                    Mobile_NS.alert(vm.limit.tip);
                                    $fieldLabel.html(vm.field.label);
                                }else{
                                    _lbs.setValue(result.lng, result.lat, result.addr);
                                    $fieldLabel.html(vm.field.label);
                                }
                            };
                            if(vm.limit.coordinateType == 1){
                                checkLimit();
                            }else{
                                amapHelper.convertPoint([vm.limit.lng, vm.limit.lat], vm.limit.coordinateType, function(limitTransedPoint){
                                    vm.limit.lng = limitTransedPoint[0];
                                    vm.limit.lat = limitTransedPoint[1];
                                    vm.limit.coordinateType = 1;
                                    checkLimit();
                                });
                            }
                        });
                    }else{
                        _lbs.setValue(result.lng, result.lat, result.addr);
                        $fieldLabel.html(vm.field.label);
                    }
                } else {
                    Mobile_NS.alert(result.errMsg);
                    $fieldLabel.html(vm.field.label);
                }
            });
		};
		
		this.getPosition = function (pageid) {
			var that = this;
			var _this = $(".wev-flbs4amap-location", $comp);

			var poi = vm.poi;
			
			Mobile_NS.openLBSPage({
				posType: poi.postype,
				btnText: poi.btntext,
				poiRadius: poi.radius,
				numPois: poi.num,
				limit: vm.limit,
				success: function (lng, lat, address) {//LBSPage回调
					_lbs.setValue(lng, lat, address);

					vm.backscript && mUtil.eval(vm.backscript, pageid);
				}
			});
		};
		
		this.refresh = function () {
		    _lbs.setValue("", "", "");
		    _lbs.getCurrPosition();
		};

        _lbs.setValue = _lbs.setValue.bind(this);
    };

    return Component.init(FLbs4amap);
});