From d74b495736f0c04522ec54274b70fed0ded2878d Mon Sep 17 00:00:00 2001
From: zhongrj <646384940@qq.com>
Date: Tue, 27 Jun 2023 11:30:06 +0800
Subject: [PATCH] 任务新增导出

---
 public/map/widgets/securityMap/SecurityMap.js |  729 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 729 insertions(+), 0 deletions(-)

diff --git a/public/map/widgets/securityMap/SecurityMap.js b/public/map/widgets/securityMap/SecurityMap.js
new file mode 100644
index 0000000..8008b8c
--- /dev/null
+++ b/public/map/widgets/securityMap/SecurityMap.js
@@ -0,0 +1,729 @@
+/*
+ * @Description:
+ * @Version: 1.0
+ * @Author: yangsx
+ * @Date: 2019-12-09 19:01:40
+ * @LastEditors: yangsx
+ * @LastEditTime: 2019-12-14 14:44:57
+ */
+define([
+    "dojo",
+    "dojo/_base/declare",
+    "dojo/_base/lang",
+    "base/BaseWidget",
+    "dojo/text!widgets/securityMap/template.html",
+    "base/AppEvent",
+    "base/ConfigData",
+    "widgets/securityMap/config",
+    "dojo/dom",
+    "dojo/dom-construct",
+    "dojo/dom-attr",
+    "dojo/dom-style",
+    "dojo/on",
+    "esri/layers/ArcGISDynamicMapServiceLayer",
+    "esri/layers/ArcGISTiledMapServiceLayer",
+    "esri/layers/FeatureLayer",
+    "controls/tab/TabControl",
+    "esri/dijit/SymbolStyler",
+    "esri/styles/basic",
+    "dojo/_base/array",
+    "esri/InfoTemplate",
+    "esri/tasks/query",
+    "esri/tasks/QueryTask",
+    "esri/Color",
+    "esri/toolbars/edit",
+    "esri/graphic",
+    "esri/geometry/Point",
+    "esri/geometry/Polyline",
+    "esri/geometry/Polygon",
+    "esri/geometry/Extent",
+    "esri/tasks/FeatureSet",
+    "esri/renderers/HeatmapRenderer",
+    "esri/symbols/SimpleLineSymbol",
+    "esri/symbols/SimpleFillSymbol",
+    "esri/symbols/PictureMarkerSymbol",
+    "esri/symbols/SimpleMarkerSymbol",
+    "esri/SpatialReference",
+    "esri/tasks/GeometryService",
+    "esri/tasks/ProjectParameters",
+    "esri/layers/GraphicsLayer",
+    "esri/layers/LabelLayer",
+    "esri/symbols/TextSymbol",
+    "esri/renderers/SimpleRenderer",
+    "esri/renderers/ClassBreaksRenderer",
+    "esri/tasks/Geoprocessor",
+    "esri/tasks/DataFile",
+    "esri/geometry/webMercatorUtils",
+    "esri/symbols/Font",
+    "esri/geometry/ScreenPoint",
+    "esri/layers/ImageParameters",
+    "esri/geometry/geometryEngine",
+    "esri/dijit/PopupTemplate",
+    "widgets/securityMap/FlareClusterLayer_v3",
+    "dojo/domReady!"
+], function(
+    dojo,
+    declare,
+    lang,
+    BaseWidget,
+    template,
+    AppEvent,
+    ConfigData,
+    config,
+    dom,
+    domConstruct,
+    domAttr,
+    domStyle,
+    on,
+    ArcGISDynamicMapServiceLayer,
+    ArcGISTiledMapServiceLayer,
+    FeatureLayer,
+    TabControl,
+    SymbolStyler,
+    basic,
+    arrayUtils,
+    InfoTemplate,
+    Query,
+    QueryTask,
+    Color,
+    Edit,
+    Graphic,
+    Point,
+    Polyline,
+    Polygon,
+    Extent,
+    FeatureSet,
+    HeatmapRenderer,
+    SimpleLineSymbol,
+    SimpleFillSymbol,
+    PictureMarkerSymbol,
+    SimpleMarkerSymbol,
+    SpatialReference,
+    GeometryService,
+    ProjectParameters,
+    GraphicsLayer,
+    LabelLayer,
+    TextSymbol,
+    SimpleRenderer,
+    ClassBreaksRenderer,
+    Geoprocessor,
+    DataFile,
+    webMercatorUtils,
+    Font,
+    ScreenPoint,
+    ImageParameters,
+    geometryEngine,
+    PopupTemplate,
+    FlareClusterLayer
+) {
+    var Widget = declare([BaseWidget], {
+        widgetName: "SecurityMap",
+        label: "处警队伍管理",
+        templateString: template,
+        _map: null,
+        objThis: null,
+        _siteLayer: new GraphicsLayer(),
+        layuiLayer: null,
+        layuiLadate: null,
+
+        // 保留添加实体图层的变量
+        addEntitys: null,
+        entitysData: [],
+
+        // 存储新增点,线,面,数据的地方
+        polygonData: [],
+        polygonFlag: false,
+        editToolbar: null,
+        addPolygonEntitys: null,
+        addLineEntitys: null,
+
+        //是否选中电子围栏区域
+        isChecked: false,
+
+        //当前处警员是否已有电子围栏
+        isEngineer: false,
+
+        //是否可编辑
+        isEdit: false,
+
+        // 用来记录巡逻区域或者巡逻路线的下标的
+        patrolIndex: 0,
+
+        // 拖拽
+        isDown: false,
+        x: 0,
+        y: 0,
+        offset: null,
+        moveThis: null,
+
+        //编辑工具激活后为true
+        editToolbarStatus: false,
+
+        //基础路径
+        //pathUrl: "http://localhost:89",
+        pathUrl: "http://61.131.136.25:2082/api/blade-jfpts",
+
+        // 电子围栏需要新增的Id
+        newElectronicFenceId: null,
+
+        // 新增路线时,派发人员,人员名称,以及人员id
+        anumber: null,
+        realname: null,
+
+        //存放聚合实体
+        clusterLayer: null,
+        constructor: function(options, srcRefNode) {
+            this._map = options.map;
+            objThis = this;
+
+            //创建图层
+            this.addEntitys = new GraphicsLayer({
+                id: 'addEntitys'
+            });
+
+            // 添加点面线的图层
+            this.addPolygonEntitys = new GraphicsLayer({
+                id: 'addPolygonEntitys'
+            });
+
+
+            // 添加线的图层
+            this.addLineEntitys = new GraphicsLayer({
+                id: 'addLineEntitys'
+            });
+
+            // 添加所有图层的地方
+            this.entityPolygonAll = new GraphicsLayer({
+                id: 'entityPolygonAll'
+            });
+
+
+            this._map.addLayer(this.addEntitys);
+            this._map.addLayer(this.addPolygonEntitys);
+            this._map.addLayer(this.addLineEntitys);
+            this._map.addLayer(this.entityPolygonAll);
+
+        },
+
+        startup: function() {
+            objThis._map.addLayer(objThis._siteLayer);
+            var that = this;
+
+            //删除电子围栏点击事件
+            $(".mapBtn .delBtn").click(function() {
+                if (!that.isEngineer) {
+                    layui.use('layer', function() {
+                        layui.layer.msg('请先新增电子围栏信息!')
+                    })
+                    return;
+                }
+                //需选中电子围栏,然后进行删除
+                layer.confirm('是否确认删除', {
+                    btn: ['确定', '取消'], //按钮
+                    title: false
+                }, function() {
+                    //删除数据库数据
+                    $.ajax({
+                        url: that.pathUrl + '/enclosure/enclosure/deleteByAnumber',
+                        type: 'POST',
+                        dataType: 'JSON',
+                        data: {
+                            anumber: anumber
+                        },
+                        success: function(result) {
+                            if (result.code == 200) {
+                                layui.use('layer', function() {
+                                    layui.layer.msg('删除电子围栏成功!')
+                                })
+                            }
+                        }
+                    })
+                    that.addPolygonEntitys.clear();
+                    //修改围栏状态
+                    that.isEngineer = false;
+                })
+            })
+
+            //新增电子围栏
+            $('.mapBtn .insBtn').click(function() {
+                //修改按钮样式
+                $("#insertEngineeringMap").css("color", "#3385FF")
+                    //判断
+                if (that.isEngineer) {
+                    layui.use('layer', function() {
+                            layui.layer.msg('已存在电子围栏');
+                        })
+                        //新增按钮颜色改回
+                    $("#insertEngineeringMap").css("color", "#757575");
+                } else {
+                    layui.use('layer', function() {
+                        layui.layer.msg('请开始划分电子围栏');
+                    })
+                    that.polygonFlag = true;
+                }
+            })
+
+
+            //编辑电子围栏
+            $('.mapBtn .editBtn').click(function() {
+                if (!that.isEngineer) {
+                    layui.use('layer', function() {
+                        layui.layer.msg('请先新增电子围栏信息!')
+                    })
+                    return;
+                }
+                $("#editEngineeringMap").css("color", "#3385FF");
+                //修改为可编辑状态
+                that.isEdit = true;
+                layui.use('layer', function() {
+                    layui.layer.msg('点击电子围栏图形即可编辑');
+                })
+            })
+
+        },
+
+        //根据key 取value值
+        getQueryStringByKey: function(key) {
+            return (document.location.search.match(new RegExp("(?:^\\?|&)" + key + "=(.*?)(?=&|$)")) || ['', null])[1];
+        },
+
+        //带有中文的解码
+        getQueryString: function(name) {
+            var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
+            var r = window.location.search.substr(1).match(reg);
+            if (r != null) return decodeURI(r[2]);
+            return null;
+        },
+
+        //页面打开后,获取参数数据
+        open: function() {
+            var that = this;
+            //获取父页面传过来的参数
+            var lgtd = that.getQueryStringByKey('jd');
+            var lttd = that.getQueryStringByKey('wd');
+            anumber = that.getQueryStringByKey('code');
+            realname = that.getQueryString('name');
+            //如果处警员的位置信息存在
+            if (lgtd != null && lgtd != "") {
+                //所在位置标记
+                that.addPoint(that.addEntitys, lgtd, lttd, './images/security.png');
+            }
+
+            //获取当前处警员的电子围栏信息
+            $.ajax({
+                url: this.pathUrl + '/enclosure/enclosure/selectEnclosureDetail',
+                type: 'GET',
+                dataType: 'JSON',
+                data: {
+                    anumber: anumber
+                },
+                success: function(result) {
+                    //如果已有电子围栏信息,展示出围栏区域,并且可以编辑
+                    if (result.code == 200) {
+                        if (JSON.stringify(result.data) != "{}") {
+                            var entityArr = [];
+                            var coordinate = result.data.coordinate.match(/\(([^)]*)\)/).toString();
+                            var a = coordinate.indexOf("(");
+                            var b = coordinate.indexOf(")");
+                            coordinate = coordinate.substring(a + 1, b) + "";
+                            if (coordinate && coordinate != '') {
+                                coordinate = coordinate.split(',');
+                                for (var i = 0; i < coordinate.length; i++) {
+                                    entityArr.push([Number(coordinate[i].split(' ')[0]), Number(coordinate[i].split(' ')[1])]);
+                                }
+                            }
+                            that.isEngineer = true;
+                            that.addPolygon(that.addPolygonEntitys, entityArr);
+                        } else {
+                            //如果无电子围栏信息,则提示请编辑电子围栏信息
+                            //编辑好电子围栏信息后,将当前处警员的电子围栏信息保存到数据库
+                            that.newElectronicFenceId = null;
+                            that.newElectronicFenceId = anumber;
+                        }
+                    }
+                }
+            })
+
+            //调用点击事件
+            that.clickHand();
+
+            //鼠标右击事件
+            document.getElementById('mainMapWidget').onmousedown = function(event) {
+                //去除系统默认右键功能
+                document.oncontextmenu = function() {
+                        //alert("当前页面不能使用右键!");
+                        return false;
+                    }
+                    //event.preventDefault();
+                if (event.button == 2) {
+                    if (that.polygonFlag == true) {
+                        if (that.polygonData.length >= 2) {
+                            // 勾画最后一个点
+                            var normalizedVal = webMercatorUtils.xyToLngLat(event.mapPoint.x, event.mapPoint.y);
+                            that.polygonData.push([normalizedVal[0], normalizedVal[1]]);
+                            // 声明空字符串,存储数据
+                            var dataStr = '';
+                            var data = null;
+                            if (that.patrolIndex == 1) {
+                                that.addPolyline(that.addPolygonEntitys, that.polygonData);
+                                // 获取数据
+                                data = that.addPolygonEntitys.graphics[0].geometry.paths[0];
+                            } else {
+                                that.addPolygon(that.addPolygonEntitys, that.polygonData);
+                                // 获取数据
+                                data = that.addPolygonEntitys.graphics[0].geometry.rings[0];
+                            }
+
+                            // 组装数据
+                            for (var i = 0; i < data.length; i++) {
+                                dataStr += (data[i][0] + ' ' + data[i][1] + ',');
+                            }
+                            dataStr = dataStr.substring(0, dataStr.length - 1);
+
+                            //将数据存入数据库
+                            $.ajax({
+                                url: that.pathUrl + '/enclosure/enclosure/insertes',
+                                type: 'POST',
+                                dataType: 'JSON',
+                                data: {
+                                    aname: realname,
+                                    anumber: anumber,
+                                    routeInfo: dataStr
+                                },
+                                success: function(result) {
+                                    if (result.code == 200) {
+                                        layui.use('layer', function() {
+                                                layui.layer.msg('新增电子围栏成功!')
+                                            })
+                                            //清除点信息
+                                        that.polygonData = [];
+                                        //新增按钮颜色改回
+                                        $("#insertEngineeringMap").css("color", "#757575");
+                                        //清空线图层信息
+                                        that.addLineEntitys.clear();
+                                        //修改电子围栏数据状态
+                                        that.isEngineer = true;
+                                        //修改电子围栏选中状态
+                                        that.isChecked = false;
+                                        //修改电子围栏编辑状态
+                                        that.polygonFlag = false;
+                                    }
+                                }
+                            })
+                        }
+
+                    }
+
+                }
+            }
+        },
+
+        // 鼠标点击事件
+        clickHand: function() {
+            var that = this;
+            var self = this;
+            self._map.onClick = mapClick;
+
+
+            //点击事件
+            function mapClick(evt) {
+                //坐标格式转换
+                var normalizedVal = webMercatorUtils.xyToLngLat(evt.mapPoint.x, evt.mapPoint.y);
+                var y = self._map.toMap({
+                    spatialReference: '4326',
+                    type: "point",
+                    x: evt.screenPoint.x,
+                    y: evt.screenPoint.y,
+                });
+
+                // 编辑中的
+                if (self.polygonFlag == true) {
+                    if (self.polygonData.length == 0) {
+                        self.polygonData.push([normalizedVal[0], normalizedVal[1]]);
+                        self.addPoint(self.addPolygonEntitys, normalizedVal[0], normalizedVal[1]);
+                    } else if (self.polygonData.length == 1) {
+                        self.polygonData.push([normalizedVal[0], normalizedVal[1]]);
+                        self.addPolyline(self.addPolygonEntitys, self.polygonData);
+                        return;
+                    } else if (self.polygonData.length > 1) {
+                        self.polygonData.push([normalizedVal[0], normalizedVal[1]]);
+                        self.addPolygon(self.addPolygonEntitys, self.polygonData);
+                    }
+
+                } else { // 不在编辑中
+                    if (evt.graphic) { // 点击在图形上
+                        // 保存当前点击得图形
+                        // self.currentDrawing = evt.graphic;
+
+                        that.isChecked = true;
+
+                        //self.modifyPolygon();
+
+                        //进入编辑状态
+                        //self.activateToolbar(evt.graphic);
+                    } else { // 点击不在图形上
+                        //修改电子围栏选中状态
+                        that.isChecked = false;
+
+                        self.modifyPolygon()
+                    }
+
+                    if (that.isEdit) {
+                        that.isChecked = true;
+                        self.modifyPolygon();
+                        //进入编辑状态
+                        self.activateToolbar(evt.graphic);
+                    }
+                }
+
+            }
+
+            // 鼠标移动监听事件
+            $(document).off('mousemove').mousemove(function(ev) {
+                var oEvent = ev || event;
+                //鼠标移动,提示语
+                var oDiv1 = document.getElementById('securityMapTips1');
+                var oDiv2 = document.getElementById('securityMapTips2');
+                var oDiv3 = document.getElementById('securityMapTips3');
+                var oDiv4 = document.getElementById('securityMapTips4');
+                //新增电子围栏提示语
+                if (self.polygonFlag == true) {
+                    var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
+                    var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
+                    if (self.polygonData.length == 0) {
+                        oDiv1.style.left = oEvent.clientX + scrollLeft + 15 + 'px';
+                        oDiv1.style.top = oEvent.clientY + scrollTop + 'px';
+                        oDiv1.style.display = 'block';
+                    }
+
+                    if (self.polygonData.length == 1) {
+                        oDiv1.style.display = 'none';
+                        oDiv2.style.left = oEvent.clientX + scrollLeft + 15 + 'px';
+                        oDiv2.style.top = oEvent.clientY + scrollTop + 'px';
+                        oDiv2.style.display = 'block';
+                    }
+
+                    if (self.polygonData.length > 1) {
+                        oDiv2.style.display = 'none';
+                        oDiv3.style.left = oEvent.clientX + scrollLeft + 15 + 'px';
+                        oDiv3.style.top = oEvent.clientY + scrollTop + 'px';
+                        oDiv3.style.display = 'block';
+                    }
+
+                    //已经有一个点或以上
+                    if (self.polygonData.length >= 1) {
+                        //鼠标移动,上个点和当前点之间画线
+                        //临时的线数据
+                        var tempLineData = [];
+                        //鼠标当前点的数据
+                        var normalizedVal = webMercatorUtils.xyToLngLat(oEvent.originalEvent.mapPoint.x, oEvent.originalEvent.mapPoint.y);
+                        //获取面数据
+                        var polygonArr = self.polygonData;
+                        //上个点的数据
+                        var prevPointArr = polygonArr[self.polygonData.length - 1];
+                        //封装数据
+                        tempLineData.push([prevPointArr[0], prevPointArr[1]]);
+                        tempLineData.push([normalizedVal[0], normalizedVal[1]]);
+                        console.log(tempLineData, 123);
+                        //画线
+                        self.addLine(self.addLineEntitys, tempLineData);
+                    }
+                } else {
+                    oDiv3.style.display = 'none';
+                }
+
+                //编辑电子围栏提示语
+                if (that.editToolbarStatus) {
+                    $("#securityMapTips4").css("width", "220px");
+                    $("#securityMapTips4").css("height", "40px");
+                    $("#securityMapTips4").css("line-height", "20px");
+                    $("#securityMapTips4 span").css("line-height", "20px");
+                    var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
+                    var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
+                    oDiv4.style.left = oEvent.clientX + scrollLeft + 15 + 'px';
+                    oDiv4.style.top = oEvent.clientY + scrollTop + 'px';
+                    oDiv4.style.display = 'block';
+                } else {
+                    oDiv4.style.display = 'none';
+                }
+
+            })
+        },
+
+        /**
+         * 新增线图层
+         * @param {*} entitys  addPolygonEntitys
+         * @param {*} path  坐标点的数据
+         */
+        addPolyline: function(entitys, path) {
+            entitys.clear();
+            var polylineSymbol = new SimpleLineSymbol();
+            polylineSymbol.color = [255, 0, 0, 1];
+            polylineSymbol.width = 2;
+            var polyline = new Polyline({
+                "paths": [path],
+                "spatialReference": {
+                    "wkid": 4326
+                }
+            });
+
+            entitys.add(new Graphic(polyline, polylineSymbol));
+        },
+
+
+        /**
+         * 新增线图层
+         * @param {*} entitys  addLineEntitys
+         * @param {*} path  坐标点的数据
+         */
+        addLine: function(entitys, path) {
+            entitys.clear();
+            var polylineSymbol = new SimpleLineSymbol();
+            //var polylineSymbol = new SimpleMarkerSymbol();
+            polylineSymbol.color = [255, 0, 0, 1];
+            polylineSymbol.width = 2;
+            polylineSymbol.style = "short-dot";
+            var polyline = new Polyline({
+                "paths": [path],
+                "spatialReference": {
+                    "wkid": 4326
+                }
+            });
+
+            entitys.add(new Graphic(polyline, polylineSymbol));
+        },
+
+
+        //编辑电子围栏(多边形)
+        modifyPolygon: function() {
+            var self = this;
+            if (self.editToolbar != null) {
+                //获取当前的多边形数据
+                var polygon = self.editToolbar.getCurrentState();
+
+                //释放编辑后
+                self.editToolbar.deactivate();
+
+                self.editToolbar = null;
+
+                // 声明空字符串,存储数据
+                var dataStr = '';
+
+                // 获取数据
+                var data = polygon.graphic.geometry.rings[0];
+
+                // 组装数据
+                for (var i = 0; i < data.length; i++) {
+                    dataStr += (data[i][0] + ' ' + data[i][1] + ',');
+                }
+                dataStr = dataStr.substring(0, dataStr.length - 1);
+
+                //更新电子围栏数据
+                $.ajax({
+                    url: this.pathUrl + '/enclosure/enclosure/updatee',
+                    type: 'POST',
+                    dataType: 'JSON',
+                    data: {
+                        anumber: anumber,
+                        routeInfo: dataStr
+                    },
+                    success: function(result) {
+                        if (result.code == 200) {
+                            layui.use('layer', function() {
+                                layui.layer.msg('电子围栏修改成功!');
+                            })
+                            $("#editEngineeringMap").css("color", "#757575");
+                            $("#securityMapTips4").css("display", "none");
+                            self.isEdit = false;
+                            self.editToolbarStatus = false;
+                        }
+                    }
+                })
+            }
+        },
+
+
+        activateToolbar: function(graphic) {
+            var that = this;
+
+            that.editToolbarStatus = true;
+            var tool = 0;
+
+            this.editToolbar = new Edit(this._map);
+
+
+            // if (registry.byId("tool_move").checked) {
+            tool = tool | Edit.MOVE;
+            // }
+            // if (registry.byId("tool_vertices").checked) {
+            tool = tool | Edit.EDIT_VERTICES;
+            // }
+            // if (registry.byId("tool_scale").checked) {
+            tool = tool | Edit.SCALE;
+            // }
+            // if (registry.byId("tool_rotate").checked) {
+            tool = tool | Edit.ROTATE;
+            // }
+            // enable text editing if a graphic uses a text symbol
+            // if ( graphic.symbol.declaredClass === "esri.symbol.TextSymbol" ) {
+            tool = tool | Edit.EDIT_TEXT;
+            // }
+
+            var options = {
+                allowAddVertices: true,
+                allowDeleteVertices: true,
+                uniformScaling: true
+            };
+            this.editToolbar.activate(tool, graphic, options);
+
+        },
+
+        close: function() {},
+
+        // 创建实体图层
+        createEntitys: function(entitys, entityContent, name, item, lgtd, lttd, outlineColors) {
+            var symbol = new esri.symbol.PictureMarkerSymbol(outlineColors, 33, 48);
+            symbol.name = name;
+            var pt = new Point(lgtd, lttd, new esri.SpatialReference({
+                wkid: 4326
+            }));
+            pt.entityData = item;
+            var graphic = new esri.Graphic(pt, symbol);
+            entitys.add(graphic);
+            entityContent.push(item);
+        },
+
+        //在地图上新增点
+        addPoint: function(entitys, lgtd, lttd, img) {
+            if (img == undefined) {
+                var symbol = new esri.symbol.PictureMarkerSymbol('./images/point.png', 22, 22);
+            } else {
+                var symbol = new esri.symbol.PictureMarkerSymbol(img, 22, 22);
+            }
+            var pt = new Point(lgtd, lttd, new SpatialReference({
+                wkid: 4326
+            }));
+            var graphic = new esri.Graphic(pt, symbol);
+            entitys.add(graphic);
+        },
+
+
+        //绘制多边形
+        addPolygon: function(entitys, rings) {
+            entitys.clear();
+            var polygonSymbol = new SimpleFillSymbol();
+            polygonSymbol.color = [24, 255, 243, 0.411];
+            var polygon = new Polygon({
+                "rings": [rings],
+                "spatialReference": {
+                    "wkid": 4326
+                }
+            });
+            entitys.add(new Graphic(polygon, polygonSymbol));
+        }
+
+    });
+
+
+    return Widget;
+});

--
Gitblit v1.9.3