[
  {
    "path": ".gitattributes",
    "content": "*.js linguist-language=Java\n"
  },
  {
    "path": ".gitignore",
    "content": "##ignore this file##\n.idea/\ntarget\ntarget/\n*.iml\n\n"
  },
  {
    "path": "README.md",
    "content": "\n# Doe 发布 [V1.3.0]\n\n前段时间排查某问题的时候，想要快速知道某些dubbo接口（三无）的响应结果，但不想启动项目（因为这些项目不是你负责的，不会部署而且超级笨重），也不想新建一个dubbo客户端项目（占地方），也不想开telnet客户端连接口（麻烦而且有限制）。所以扣了dubbo的netty模块源码，封装了个收发客户端集成一个工具，可以快速调试dubbo接口。\n\n![极简模式](https://github.com/VIPJoey/doe/blob/master/deploy/easy.png)\n![普通模式](https://github.com/VIPJoey/doe/blob/master/deploy/normal.png)\n\n\n## 目录结构\n\n-   mmc-dubbo-api 接口项目，主要用于测试。\n-   mmc-dubbo-provider dubbo提供者项目，主要用于测试。\n-   mmc-dubbo-doe 主项目，实现dubbo接口调试。\n-   deploy 部署文档\n\n\n## 功能特性\n\n-   极简模式：通过dubbo提供的telnet协议收发数据。\n-   普通模式：通过封装netty客户端收发数据。\n-   用例模式：通过缓存数据，方便下一次操作，依赖普通模式。\n-   增加依赖：通过调用maven命令，下载jar包和热加载到系统，主要用来分析接口方法参数，主要作用在普通模式（已过时，请使用【依赖编辑】模块）。\n-   依赖列表：通过分析pom文件，展示已经加载的jar包。\n-   依赖编辑：可以直接编辑pom文件，新增修改依赖jar。\n-   注册中心：可以添加或删除zookeeper注册中心。\n-   系统配置：可以清空jar或者重新加载jar。\n\n\n## 其它特性\n\n-   springboot 整合 redis，支持spring el 表达式。\n-   springboot 整合 thymeleaf。\n-   springboot 整合 logback。\n-   netty rpc 实现原理。\n-   热加载和沙箱隔离原理。\n\n## 开发环境\n\n-   jdk 1.8\n-   maven 3.5.3\n-   dubbo 2.6.1\n-   lombok 1.16.20\n-   idea 2018\n-   windows 7\n\n\n## 启动方式\n* IDEA 启动\n    - 安装JDK、并设置环境变量\n    - 安装MAVEN，并设置好环境变量，仓库目录\n    - 安装REDIS，设置相关配置\n    - 安装IDEA，设置IDEA环境\n    - 导入项目到IDEA，设置为maven工程，勾选profile环境\n    - 根据各自需要，修改application-dev.yml或application-prd.yml配置文件，除了redis配置项，其它建议保持默认配置\n    - 在当前IDEA的workspace所在根目录，创建/app/doe目录\n        - 例如：application-*.yml为默认配置，且当前IDEA的workspace为F:\\idea-workspaces\\mmc-workspace\\，则在F盘创建F:\\app\\doe\n    - 进入mmc-dubbo-api目录，执行mvn clean install命令，生成api的jar包。\n    - 进入mmc-dubbo-doe目录，执行mvn clean install 命令，在target目录生成dubbo-doe.jar\n    - 打开mmc-dubbo-doe工程，找到DubboDoeApplication.java类，右键点击运行即可。\n    - 默认日志目录：/app/applogs/doe\n    - 打开浏览器，访问地址：http://localhost:9876/doe/home/index\n* LINUX 启动\n    - 安装JDK、并设置环境变量\n    - 安装MAVEN，并设置好环境变量，仓库目录\n    - 安装REDIS，设置相关配置\n    - 安装PYTHON（可选）\n    - 执行mkdir -p /app/doe，创建/app/doe目录，注意权限问题\n    - 把deploy目录中的所有文件上传到/app/doe\n    - 参考IDEA方式，下载DOE源码，并编译生成dubbo-doe.jar，并上传到/app/doe 目录\n    - 进入/app/doe 目录，执行chmod +x deploy.sh  \n    - 进入/app/doe 目录，执行 ./deploy.sh start 启动项目，支持(start/stop)参数，详细参数用途请阅读deploy.sh源码\n    - 默认日志目录：/app/applogs/doe\n    - 打开浏览器，访问地址：http://ip:9876/doe/home/index\n\n## 项目介绍\n- https://blog.csdn.net/hanyi_?t=1\n- https://blog.csdn.net/hanyi_/article/details/113945026\n\n## 发布记录\n* [发布记录](https://github.com/VIPJoey/doe/blob/feature/doe_v1.3.0/UPGRADE.md)\n\n## 特别说明\n- 由于平时比较忙，仓促写下的代码未免有BUG，请见谅\n- 如遇到问题，可以github上留言，或贡献您的代码\n\n## 关于内推\n\n<table>\n    <tr>\n        <td>关注公众号即可获得大厂内推机会，优质简历可以全程帮忙跟踪进度，欢迎投递。</td>\n    </tr>\n        <tr>\n            <td>\n                <img src=\"https://github.com/VIPJoey/doe/blob/master/deploy/qrcode_for_gh_0c6aeb037ce4_258.jpg\"/>\n           </td>\n    </tr>\n</table>\n\n"
  },
  {
    "path": "UPGRADE.md",
    "content": "\n版本发布记录\n\n# Doe 发布 [V1.0.0]\n## 版本特性\n一、连接发送\n* 极简模式\n* 普通模式\n* 用例模式\n\n二、依赖管理\n* 增加依赖\n* 依赖列表\n\n> 基础功能基本实现\n\n\n# Doe 发布 [V1.1.0]\n\n## 版本特性\n\n##### 一、新功能\n* 增加注册中心管理模块\n* 增加编辑依赖模块\n* 增加守护程序，停止、重启、重新发布\n\n##### 二. 优化功能\n* provider 修改为starter方式\n* 增加接口version和group支持\n\n##### 三. 缺陷修复\n* 修复grid序号问题\n* 修复spring 版本过低问题\n* 优化菜单栏展示方式\n\n\n\n# Doe 发布 [V1.2.0]\n\n## 版本特性\n\n##### 一、新功能\n* 增加独立加载JAR功能\n* 增加清空lib目录功能\n\n##### 二. 优化功能\n* 增加mac系统判断(commited by Lutong )\n* 增加泛型接口测试\n* 修改dubbo依赖为starter方式\n* 修改类加载方式，增加沙箱隔离\n* 移除python模块\n\n##### 三. 缺陷修复\n* 无\n\n\n\n# Doe 发布 [V1.3.0]\n\n## 功能特性\n\n##### 一、新功能\n* 无\n\n##### 二. 优化功能\n* 无\n\n##### 三. 缺陷修复\n* 修复【依赖编辑】模块未清空原目录残存jar包问题\n* 修复【重新加载】模块未清空缓存classMap问题\n\n\n\n\n\n"
  },
  {
    "path": "deploy/SimpleHttpServer.py",
    "content": "#!/usr/bin/env python2\n# --coding:utf-8--\n\nimport os\nimport time\nfrom BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer\nfrom os import path\nimport urlparse\n\ncurdir = path.dirname(path.realpath(__file__))\nsep = '/'\n\n# MIME-TYPE\nmimedic = [\n    ('.html', 'text/html'),\n    ('.htm', 'text/html'),\n    ('.js', 'application/javascript'),\n    ('.css', 'text/css'),\n    ('.json', 'application/json'),\n    ('.png', 'image/png'),\n    ('.jpg', 'image/jpeg'),\n    ('.gif', 'image/gif'),\n    ('.txt', 'text/plain'),\n    ('.avi', 'video/x-msvideo'),\n]\n\nclass SimpleHttpServerHandler(BaseHTTPRequestHandler):\n\n    def log(self, msg):\n        timstr = time.strftime(\"%Y-%m-%d %H:%M:%S\", time.localtime())\n        print(\"[%s] %s\" % (timstr, msg))\n\n    # GET\n    def do_GET(self):\n\n        querypath = urlparse.urlparse(self.path)\n        filepath, query = querypath.path, querypath.query\n\n        filename, fileext = path.splitext(filepath)\n\n        self.log(filename + \" --- \" + fileext)\n\n        # 支持命令集合\n        urlSet = set((\"/start\", \"/stop\", \"/reload\", \"/republish\"))\n        sendReply = filename in urlSet\n\n        if sendReply == True:\n            try:\n\n                param = filename[1:]\n\n                self.log(\"/app/doe/deploy.sh \" + param)\n\t\tos.system(\"/app/doe/deploy.sh \" + param)\n\n                content = (\"{'success': true, 'msg': 'success.'}\").encode(\"utf-8\")\n                self.send_response(200)\n                self.send_header('Content-type', 'application/json')\n                self.end_headers()\n                self.wfile.write(content)\n            except IOError:\n                self.log('File Not Found: %s' % self.path)\n                self.send_error(404, 'File Not Found: %s' % self.path)\n        else:\n\n            try:\n                content = (\"{'success': false, 'msg': 'no match url.'}\").encode(\"utf-8\")\n                self.send_response(200)\n                self.send_header('Content-type', 'application/json')\n                self.end_headers()\n                self.wfile.write(content)\n            except IOError:\n                self.log('File Not Found: %s' % self.path)\n                self.send_error(404, 'File Not Found: %s' % self.path)\n\n\ndef run():\n    port = 8000\n    print('starting server, port', port)\n\n    # Server settings\n    server_address = ('', port)\n    httpd = HTTPServer(server_address, SimpleHttpServerHandler)\n    print('running server...')\n    httpd.serve_forever()\n\n\nif __name__ == '__main__':\n    run()\n\n"
  },
  {
    "path": "deploy/deploy.sh",
    "content": "#!/bin/bash\n\nsource /etc/profile\n\nfunction log() {\n    echo `date '+%Y-%m-%d %H:%M:%S'` \"$1\"\n}\n\nfunction doStop() {\n\tlog \"bein to stop doe.\"\n\t\n\tcount=`ps aux|grep \"java -jar dubbo-doe\" |grep -v grep|wc -l`\n\n\tif [ $count -gt 0 ]\n\tthen\n\t\tlog \"bein to shutdown doe.\"\n\t\tpid=`ps aux|grep \"java -jar dubbo-doe\" |grep -v grep|awk  '{ print $2 }'`\n\t\tkill $pid\n\t\tsleep 3s\n\tfi\n\t\n\tcount=`ps aux|grep \"java -jar dubbo-doe\" |grep -v grep|wc -l`\n\tif [ $count -gt 0 ]\n\tthen\n\t\tlog \"bein to force to kill doe.\"\n\t\tpid=`ps aux|grep \"java -jar dubbo-doe\" |grep -v grep|awk  '{ print $2 }'`\n\t\tkill -9 $pid\n\t\tsleep 3s\n\tfi\n\tlog \"finish stop doe.\"\n}\nfunction doStart() {\n        log \"bein to install doe.\"\n\n        java -jar dubbo-doe.jar --spring.profiles.active=prd &\n\n        log \"finish install doe.\"\n}\n\nfunction main() {\n\n\tlog \"welcome to doe.\"\n\t\n\toption=\"$1\"\n\t\n\tif [ \"$option\" = \"start\" ] \n\tthen \n\t\tdoStart\n\telif [ \"$option\" = \"stop\" ]\n\tthen\n\t\tdoStop\n\telif [ \"$option\" = \"reload\" ]\n\tthen\n\t    doStop\n\t    sleep 3s\n\t    doStart\n\telif [ \"$option\" = \"republish\" ]\n\tthen\n\t    doStop\n\t    cp pom.xml.backup pom.xml\n\t    rm -rf ./lib/*\n\t    sleep 3s\n\t    doStart\n\telse \n\t\tlog \"input option error (start/stop/reload/republish)\"\n\tfi\n\t\n\tlog \"done.\"\n\n}\n\nmain \"$1\""
  },
  {
    "path": "deploy/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>mmc-dubbo</groupId>\n    <artifactId>doe</artifactId>\n    <version>1.0-SNAPSHOT</version>\n\n    <dependencies>\n\n\n\t</dependencies>\n\t\n\n    <build>\n        <defaultGoal>compile</defaultGoal>\n        <plugins>\n            <plugin>\n                <artifactId>maven-dependency-plugin</artifactId>\n                    <executions>\n                        <execution>\n                            <phase>process-sources</phase>\n\n                            <goals>\n                                <goal>copy-dependencies</goal>\n                            </goals>\n\n                            <configuration>\n                                <outputDirectory>/app/doe/lib</outputDirectory>\n                            </configuration>\n                        </execution>\n                    </executions>\n            </plugin>\n        </plugins>\n    </build>\n\t\n</project>\n"
  },
  {
    "path": "deploy/pom.xml.backup",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>mmc-dubbo</groupId>\n    <artifactId>doe</artifactId>\n    <version>1.0-SNAPSHOT</version>\n\n    <dependencies>\n\n\n\t</dependencies>\n\t\n\n    <build>\n        <defaultGoal>compile</defaultGoal>\n        <plugins>\n            <plugin>\n                <artifactId>maven-dependency-plugin</artifactId>\n                    <executions>\n                        <execution>\n                            <phase>process-sources</phase>\n\n                            <goals>\n                                <goal>copy-dependencies</goal>\n                            </goals>\n\n                            <configuration>\n                                <outputDirectory>/app/doe/lib</outputDirectory>\n                            </configuration>\n                        </execution>\n                    </executions>\n            </plugin>\n        </plugins>\n    </build>\n\t\n</project>\n"
  },
  {
    "path": "mmc-dubbo-api/.gitignore",
    "content": "##ignore this file##\n.idea/\ntarget\ntarget/\n*.iml\n"
  },
  {
    "path": "mmc-dubbo-api/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>mmc-dubbo</groupId>\n    <artifactId>api</artifactId>\n    <version>1.3-RELEASE</version>\n\n    <name>mmc-dubbo-api</name>\n\n    <properties>\n        <maven.compiler.source>1.8</maven.compiler.source>\n        <maven.compiler.target>1.8</maven.compiler.target> \n    </properties>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.1</version>\n                <configuration>\n                    <source>1.8</source>\n                    <target>1.8</target>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n</project>"
  },
  {
    "path": "mmc-dubbo-api/src/main/java/com/mmc/dubbo/api/user/GenericReq.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.api.user;\n\nimport java.io.Serializable;\n\n/**\n * @author Joey\n * @date 2019/5/10 16:10\n */\npublic class GenericReq<T> implements Serializable {\n\n\n    private static final long serialVersionUID = 3998577120137245599L;\n    private String name;\n    private T data;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public T getData() {\n        return data;\n    }\n\n    public void setData(T data) {\n        this.data = data;\n    }\n}\n\n"
  },
  {
    "path": "mmc-dubbo-api/src/main/java/com/mmc/dubbo/api/user/GenericResp.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.api.user;\n\nimport java.io.Serializable;\n\n/**\n * @author Joey\n * @date 2019/5/10 16:11\n */\npublic class GenericResp<T> implements Serializable {\n\n    private static final long serialVersionUID = 6753766666093779059L;\n    private T data;\n    private String name;\n\n    public T getData() {\n        return data;\n    }\n\n    public void setData(T data) {\n        this.data = data;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-api/src/main/java/com/mmc/dubbo/api/user/UserFact.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.api.user;\n\nimport java.io.Serializable;\n\n/**\n * @author Joey\n * @date 2018/5/8 20:26\n */\npublic class UserFact implements Serializable {\n\n    private static final long serialVersionUID = 2798561567572955369L;\n    private long id;\n    private String name;\n    private int sex;\n    private int height;\n\n    public long getId() {\n        return id;\n    }\n\n    public void setId(long id) {\n        this.id = id;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public int getSex() {\n        return sex;\n    }\n\n    public void setSex(int sex) {\n        this.sex = sex;\n    }\n\n    public int getHeight() {\n        return height;\n    }\n\n    public void setHeight(int height) {\n        this.height = height;\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-api/src/main/java/com/mmc/dubbo/api/user/UserService.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\n\npackage com.mmc.dubbo.api.user;\n\n/**\n * @author Joey\n * @date 2018/5/8 20:25\n */\npublic interface UserService {\n\n    /**\n     * 测试方法一（单个参数）.\n     * @param id\n     * @return\n     */\n    UserFact getCurrentById(long id);\n\n    /**\n     * 测试方法二（多个参数）.\n     * @param u\n     * @param name\n     * @param sex\n     * @return\n     */\n    UserFact insert(UserFact u, String name, int sex);\n\n    /**\n     * 泛型测试.\n     * @param user\n     * @return\n     */\n    GenericResp<UserFact> echo(GenericReq<UserFact> user);\n\n}\n\n"
  },
  {
    "path": "mmc-dubbo-doe/.gitignore",
    "content": "/target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springBeans\n.sts4-cache\n\n### IntelliJ IDEA ###\n.idea\n*.iws\n*.iml\n*.ipr\n\n### NetBeans ###\n/nbproject/private/\n/build/\n/nbbuild/\n/dist/\n/nbdist/\n/.nb-gradle/"
  },
  {
    "path": "mmc-dubbo-doe/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.mmc</groupId>\n    <artifactId>dubbo-doe</artifactId>\n    <version>1.3.0-RELEASE</version>\n    <packaging>jar</packaging>\n\n    <name>mmc-dubbo-doe</name>\n    <description>Demo project for Spring Boot</description>\n\n    <parent>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>2.0.2.RELEASE</version>\n        <relativePath/> <!-- lookup parent from repository -->\n    </parent>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n        <java.version>1.8</java.version>\n        <!-- springboot 整合 dubbo -->\n        <version.starter.dubbo>0.2.0</version.starter.dubbo>\n    </properties>\n\n    <dependencies>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-thymeleaf</artifactId>\n        </dependency>\n\n        <!-- Spring Boot Redis 依赖 -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-data-redis</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>com.alibaba.boot</groupId>\n            <artifactId>dubbo-spring-boot-starter</artifactId>\n            <version>${version.starter.dubbo}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>com.alibaba</groupId>\n            <artifactId>fastjson</artifactId>\n            <version>1.2.46</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <optional>true</optional>\n        </dependency>\n\n        <!-- https://mvnrepository.com/artifact/ru.dmerkushov/xml-helper -->\n        <dependency>\n            <groupId>ru.dmerkushov</groupId>\n            <artifactId>xml-helper</artifactId>\n            <version>1.5.0</version>\n        </dependency>\n\n        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->\n        <!-- 要用redis连接池 必须有pool依赖-->\n        <dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-pool2</artifactId>\n            <version>2.5.0</version>\n        </dependency>\n\n        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-text -->\n        <dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-text</artifactId>\n            <version>1.3</version>\n        </dependency>\n        <!-- https://mvnrepository.com/artifact/commons-net/commons-net -->\n        <dependency>\n            <groupId>commons-net</groupId>\n            <artifactId>commons-net</artifactId>\n            <version>3.6</version>\n        </dependency>\n\n\n        <!-- 测试使用 -->\n        <dependency>\n            <groupId>mmc-dubbo</groupId>\n            <artifactId>api</artifactId>\n            <version>1.0-RELEASE</version>\n        </dependency>\n\n    </dependencies>\n\n    <build>\n        <finalName>dubbo-doe</finalName>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n\n    <profiles>\n        <profile>\n            <id>dev</id>\n            <activation>\n                <activeByDefault>true</activeByDefault>\n            </activation>\n            <properties>\n                <spring.profiles.active>dev</spring.profiles.active>\n            </properties>\n        </profile>\n        <profile>\n            <id>prd</id>\n            <properties>\n                <spring.profiles.active>prd</spring.profiles.active>\n            </properties>\n        </profile>\n    </profiles>\n\n\n</project>\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/DubboDoeApplication.java",
    "content": "package com.mmc.dubbo.doe;\n\nimport com.mmc.dubbo.doe.context.ApplicationReadyEventListener;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class DubboDoeApplication {\n\n    public static void main(String[] args) {\n\n        SpringApplication springApplication = new SpringApplication(DubboDoeApplication.class);\n        springApplication.addListeners(new ApplicationReadyEventListener()); // load jars when startup\n        springApplication.run(args);\n    }\n}\n\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/auth/MenuNode.java",
    "content": "/*  \n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.  \n *  \n * This software is the confidential and proprietary information of  \n * Founder. You shall not disclose such Confidential Information  \n * and shall use it only in accordance with the terms of the agreements  \n * you entered into with Founder.  \n *  \n */ \n/**\n * \n */\npackage com.mmc.dubbo.doe.auth;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * 菜单节点.\n * @author Joey\n * 2016年6月24日 下午4:50:47\n */\npublic class MenuNode extends MenuTree{\n    \n    /**\n     * \n     */\n    private static final long serialVersionUID = 1456456456L;\n    \n    private List<MenuNode> children = new ArrayList<MenuNode>();\n\n    public List<MenuNode> getChildren() {\n        return children;\n    }\n\n    public void setChildren(List<MenuNode> children) {\n        this.children = children;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/auth/MenuTree.java",
    "content": "/*  \n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.  \n *  \n * This software is the confidential and proprietary information of  \n * Founder. You shall not disclose such Confidential Information  \n * and shall use it only in accordance with the terms of the agreements  \n * you entered into with Founder.  \n *  \n */ \n/**\n * \n */\npackage com.mmc.dubbo.doe.auth;\n\nimport java.io.Serializable;\n\n/**\n * 菜单树实体类.\n * @author Joey\n * 2016年5月26日 下午1:20:34\n */\npublic class MenuTree implements Serializable{\n    \n    /**\n     * \n     */\n    private static final long serialVersionUID = 1485485452L;\n    \n    private Integer uId;\n    private Integer roleId;\n    private Integer menuId;\n    private Integer pmenuId;\n    private String menuName;\n    private String menuUrl;\n    private String menuStyle;\n    private Integer mlevel;\n    private Integer mleft;\n    private Integer mright;\n    \n    public Integer getuId() {\n        return uId;\n    }\n    public void setuId(Integer uId) {\n        this.uId = uId;\n    }\n    public Integer getMenuId() {\n        return menuId;\n    }\n    public void setMenuId(Integer menuId) {\n        this.menuId = menuId;\n    }\n    public Integer getPmenuId() {\n        return pmenuId;\n    }\n    public void setPmenuId(Integer pmenuId) {\n        this.pmenuId = pmenuId;\n    }\n    public String getMenuName() {\n        return menuName;\n    }\n    public void setMenuName(String menuName) {\n        this.menuName = menuName;\n    }\n    public String getMenuUrl() {\n        return menuUrl;\n    }\n    public void setMenuUrl(String menuUrl) {\n        this.menuUrl = menuUrl;\n    }\n    public String getMenuStyle() {\n        return menuStyle;\n    }\n    public void setMenuStyle(String menuStyle) {\n        this.menuStyle = menuStyle;\n    }\n    public Integer getMlevel() {\n        return mlevel;\n    }\n    public void setMlevel(Integer mlevel) {\n        this.mlevel = mlevel;\n    }\n    public Integer getMleft() {\n        return mleft;\n    }\n    public void setMleft(Integer mleft) {\n        this.mleft = mleft;\n    }\n    public Integer getMright() {\n        return mright;\n    }\n    public void setMright(Integer mright) {\n        this.mright = mright;\n    }\n    public Integer getRoleId() {\n        return roleId;\n    }\n    public void setRoleId(Integer roleId) {\n        this.roleId = roleId;\n    }\n    \n    \n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/cache/CuratorCaches.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.cache;\n\nimport com.mmc.dubbo.doe.exception.DoeException;\nimport com.mmc.dubbo.doe.handler.CuratorHandler;\nimport com.mmc.dubbo.doe.model.PointModel;\nimport com.mmc.dubbo.doe.util.ParamUtil;\nimport com.mmc.dubbo.doe.util.StringUtil;\n\nimport javax.validation.constraints.NotNull;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * cache all zk connection.\n *\n * @author Joey\n * @date 2018/6/18 20:12\n */\npublic class CuratorCaches {\n\n    private final static Map<String, CuratorHandler> map = new ConcurrentHashMap<>();\n\n    public static CuratorHandler getHandler(@NotNull String conn) throws NoSuchFieldException, IllegalAccessException {\n\n        CuratorHandler client = map.get(conn);\n\n        if (null == client) {\n\n\n            try {\n                // split host and port\n                PointModel model = ParamUtil.parsePointModel(conn);\n\n                client = new CuratorHandler(\"zookeeper\", model.getIp(), model.getPort());\n                // connect to zk\n                client.doConnect();\n                // async connecting, so we should wait a few second.\n                Thread.sleep(1000);\n                if (client.isAvailable()) {\n                    // cache client for reuse\n                    map.putIfAbsent(conn, client);\n                } else {\n                    client.close();\n                }\n\n            } catch(Exception e) {\n                throw new DoeException(StringUtil.format(\"can't connect to {}, {}\", conn, e.getMessage()));\n            }\n        }\n\n        return client;\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/cache/DoeRedisResolver.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.cache;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.stereotype.Service;\nimport org.springframework.util.CollectionUtils;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * @author Joey\n * @date 2018/6/17 18:00\n */\n@Service(\"redisResolver\")\n@Slf4j\npublic class DoeRedisResolver implements RedisResolver {\n\n    @Autowired\n    private RedisTemplate<String, Object> redisTemplate;\n\n    public RedisTemplate<String, Object> getRedisTemplate() {\n        return redisTemplate;\n    }\n\n    //=============================common============================\n\n    @Override\n    public boolean expire(String key, long time) {\n        try {\n            if (time > 0) {\n                redisTemplate.expire(key, time, TimeUnit.SECONDS);\n            }\n            return true;\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return false;\n        }\n    }\n\n    @Override\n    public long getExpire(String key) {\n        return redisTemplate.getExpire(key, TimeUnit.SECONDS);\n    }\n\n    @Override\n    public boolean hasKey(String key) {\n        try {\n            return redisTemplate.hasKey(key);\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return false;\n        }\n    }\n\n    @Override\n    @SuppressWarnings(\"unchecked\")\n    public void del(String... key) {\n        if (key != null && key.length > 0) {\n            if (key.length == 1) {\n                redisTemplate.delete(key[0]);\n            } else {\n                redisTemplate.delete(CollectionUtils.arrayToList(key));\n            }\n        }\n    }\n\n    //============================String=============================\n\n    @Override\n    public Object get(String key) {\n        return key == null ? null : redisTemplate.opsForValue().get(key);\n    }\n\n    @Override\n    public boolean set(String key, Object value) {\n        try {\n            redisTemplate.opsForValue().set(key, value);\n            return true;\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return false;\n        }\n\n    }\n\n    @Override\n    public boolean set(String key, Object value, long time) {\n        return set(key, value, time, TimeUnit.SECONDS);\n    }\n\n    @Override\n    public boolean set(String key, Object value, long time, TimeUnit unit) {\n        try {\n            if (time > 0) {\n                redisTemplate.opsForValue().set(key, value, time, unit);\n            } else {\n                set(key, value);\n            }\n            return true;\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return false;\n        }\n    }\n\n    @Override\n    public long incr(String key, long delta) {\n        if (delta < 0) {\n            throw new RuntimeException(\"递增因子必须大于0\");\n        }\n        return redisTemplate.opsForValue().increment(key, delta);\n    }\n\n    @Override\n    public long decr(String key, long delta) {\n        if (delta < 0) {\n            throw new RuntimeException(\"递减因子必须大于0\");\n        }\n        return redisTemplate.opsForValue().increment(key, -delta);\n    }\n\n    //================================Map=================================\n\n    @Override\n    public Object hget(String key, String item) {\n        return redisTemplate.opsForHash().get(key, item);\n    }\n\n    @Override\n    public Map<Object, Object> hmget(String key) {\n        return redisTemplate.opsForHash().entries(key);\n    }\n\n    @Override\n    public boolean hmset(String key, Map<String, Object> map) {\n        try {\n            redisTemplate.opsForHash().putAll(key, map);\n            return true;\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return false;\n        }\n    }\n\n    @Override\n    public boolean hmset(String key, Map<String, Object> map, long time) {\n        try {\n            redisTemplate.opsForHash().putAll(key, map);\n            if (time > 0) {\n                expire(key, time);\n            }\n            return true;\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return false;\n        }\n    }\n\n    @Override\n    public boolean hset(String key, String item, Object value) {\n        try {\n            redisTemplate.opsForHash().put(key, item, value);\n            return true;\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return false;\n        }\n    }\n\n    @Override\n    public boolean hset(String key, String item, Object value, long time) {\n        try {\n            redisTemplate.opsForHash().put(key, item, value);\n            if (time > 0) {\n                expire(key, time);\n            }\n            return true;\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return false;\n        }\n    }\n\n    @Override\n    public void hdel(String key, Object... item) {\n        redisTemplate.opsForHash().delete(key, item);\n    }\n\n    @Override\n    public boolean hHasKey(String key, String item) {\n        return redisTemplate.opsForHash().hasKey(key, item);\n    }\n\n    @Override\n    public double hincr(String key, String item, double by) {\n        return redisTemplate.opsForHash().increment(key, item, by);\n    }\n\n    @Override\n    public double hdecr(String key, String item, double by) {\n        return redisTemplate.opsForHash().increment(key, item, -by);\n    }\n\n    //============================set=============================\n\n    @Override\n    public Set<Object> sMembers(String key) {\n        try {\n            return redisTemplate.opsForSet().members(key);\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return null;\n        }\n    }\n\n    @Override\n    public boolean sHasKey(String key, Object value) {\n        try {\n            return redisTemplate.opsForSet().isMember(key, value);\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return false;\n        }\n    }\n\n    @Override\n    public long sAdd(String key, Object... values) {\n        try {\n            return redisTemplate.opsForSet().add(key, values);\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return 0;\n        }\n    }\n\n    @Override\n    public long sSetAndTime(String key, long time, Object... values) {\n        try {\n            Long count = redisTemplate.opsForSet().add(key, values);\n            if (time > 0) expire(key, time);\n            return count;\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return 0;\n        }\n    }\n\n    @Override\n    public long sGetSetSize(String key) {\n        try {\n            return redisTemplate.opsForSet().size(key);\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return 0;\n        }\n    }\n\n    @Override\n    public long sRem(String key, Object... values) {\n        try {\n            Long count = redisTemplate.opsForSet().remove(key, values);\n            return count;\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return 0;\n        }\n    }\n    //===============================list=================================\n\n    @Override\n    public List<Object> lGet(String key, long start, long end) {\n        try {\n            return redisTemplate.opsForList().range(key, start, end);\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return null;\n        }\n    }\n\n    @Override\n    public long lGetListSize(String key) {\n        try {\n            return redisTemplate.opsForList().size(key);\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return 0;\n        }\n    }\n\n    @Override\n    public Object lGetIndex(String key, long index) {\n        try {\n            return redisTemplate.opsForList().index(key, index);\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return null;\n        }\n    }\n\n    @Override\n    public boolean lSet(String key, Object value) {\n        try {\n            redisTemplate.opsForList().rightPush(key, value);\n            return true;\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return false;\n        }\n    }\n\n    @Override\n    public boolean lSet(String key, Object value, long time) {\n        try {\n            redisTemplate.opsForList().rightPush(key, value);\n            if (time > 0) expire(key, time);\n            return true;\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return false;\n        }\n    }\n\n    @Override\n    public boolean lSet(String key, List<Object> value) {\n        try {\n            redisTemplate.opsForList().rightPushAll(key, value);\n            return true;\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return false;\n        }\n    }\n\n    @Override\n    public boolean lSet(String key, List<Object> value, long time) {\n        try {\n            redisTemplate.opsForList().rightPushAll(key, value);\n            if (time > 0) expire(key, time);\n            return true;\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return false;\n        }\n    }\n\n    @Override\n    public boolean lUpdateIndex(String key, long index, Object value) {\n        try {\n            redisTemplate.opsForList().set(key, index, value);\n            return true;\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return false;\n        }\n    }\n\n    @Override\n    public long lRemove(String key, long count, Object value) {\n        try {\n            Long remove = redisTemplate.opsForList().remove(key, count, value);\n            return remove;\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return 0;\n        }\n    }\n\n    @Override\n    public boolean rPush(String key, Object value) {\n        try {\n            return redisTemplate.opsForList().rightPush(key, value) > 0;\n        } catch(Exception e) {\n            log.error(e.getMessage(), e);\n            return false;\n        }\n    }\n\n    @Override\n    public Object lPop(String key) {\n        try {\n            return redisTemplate.opsForList().leftPop(key);\n        } catch(Exception e) {\n            log.error(e.getMessage(), e);\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/cache/MethodCaches.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.cache;\n\nimport com.mmc.dubbo.doe.model.MethodModel;\nimport com.mmc.dubbo.doe.dto.MethodModelDTO;\nimport com.mmc.dubbo.doe.util.MD5Util;\nimport com.mmc.dubbo.doe.util.StringUtil;\n\nimport javax.validation.constraints.NotNull;\nimport java.lang.reflect.Method;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.atomic.AtomicLong;\n\n/**\n * @author Joey\n * @date 2018/6/15 14:55\n */\npublic class MethodCaches {\n\n    private final static Map<String, MethodModel> map = new ConcurrentHashMap<>();\n\n    /**\n     * cache the method object so we can get them next time quickly.\n     *\n     * @param interfaceName\n     * @param methods\n     * @return\n     */\n    public static List<MethodModelDTO> cache(final String interfaceName, Method[] methods) {\n\n        List<MethodModelDTO> ret = new ArrayList<>();\n\n        Arrays.stream(methods).forEach(m -> {\n\n            String key = generateMethodKey(m, interfaceName);\n\n            MethodModel model = new MethodModel(key, m);\n\n            ret.add(new MethodModelDTO(model));\n\n            map.putIfAbsent(key, model); // add to cache\n\n        });\n\n\n        return ret;\n    }\n\n    private static String generateMethodKey(Method method, String interfaceName) {\n        return StringUtil.format(\"{}#{}\", interfaceName, MD5Util.encrypt(method.toGenericString()));\n    }\n\n    public static MethodModel get(@NotNull String key) {\n        return map.get(key);\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/cache/RedisConfiguration.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.cache;\n\nimport com.fasterxml.jackson.annotation.JsonAutoDetect;\nimport com.fasterxml.jackson.annotation.PropertyAccessor;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.mmc.dubbo.doe.context.Const;\nimport org.springframework.boot.autoconfigure.EnableAutoConfiguration;\nimport org.springframework.cache.CacheManager;\nimport org.springframework.cache.annotation.*;\nimport org.springframework.cache.interceptor.KeyGenerator;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.data.redis.cache.RedisCacheConfiguration;\nimport org.springframework.data.redis.cache.RedisCacheManager;\nimport org.springframework.data.redis.cache.RedisCacheWriter;\nimport org.springframework.data.redis.connection.RedisConnectionFactory;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.data.redis.core.StringRedisTemplate;\nimport org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;\nimport org.springframework.data.redis.serializer.RedisSerializationContext;\nimport org.springframework.data.redis.serializer.StringRedisSerializer;\n\nimport java.lang.reflect.Method;\nimport java.time.Duration;\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * redis cache configuration.\n *\n * @author Joey\n * @date 2018/6/17 11:20\n */\n@Configuration\n@EnableAutoConfiguration\n@EnableCaching\npublic class RedisConfiguration extends CachingConfigurerSupport {\n\n    @Bean\n    public RedisTemplate<?, ?> getRedisTemplate(RedisConnectionFactory connectionFactory) {\n        RedisTemplate<?, ?> template = new StringRedisTemplate(connectionFactory);\n        template.setKeySerializer(new StringRedisSerializer());\n        Jackson2JsonRedisSerializer<?> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);\n        ObjectMapper om = new ObjectMapper();\n        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);\n        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);\n        jackson2JsonRedisSerializer.setObjectMapper(om);\n        template.setValueSerializer(jackson2JsonRedisSerializer);\n        template.setHashValueSerializer(jackson2JsonRedisSerializer);\n        return template;\n    }\n\n    // 缓存管理器\n    @Bean\n    public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {\n\n        // 生成一个默认配置，通过config对象即可对缓存进行自定义配置\n        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()\n                .entryTtl(Duration.ofMinutes(1)) // 设置缓存的默认过期时间，也是使用Duration设置\n                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))\n                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(createJacksonRedisSerializer()))\n                .disableCachingNullValues(); // 不缓存空值\n\n        // 对每个缓存空间应用不同的配置\n        Map<String, RedisCacheConfiguration> redisCacheConfigurationMap = new HashMap<>();\n        redisCacheConfigurationMap.put(Const.DOE_CACHE_PREFIX, config);\n\n        // 初始化一个RedisCacheWriter\n        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);\n\n        // 初始化RedisCacheManager\n        RedisCacheManager cacheManager = new RedisCacheManager(redisCacheWriter, config, redisCacheConfigurationMap);\n        return cacheManager;\n\n//        RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory)     // 使用自定义的缓存配置初始化一个cacheManager\n//                .initialCacheNames(cacheNames)  // 注意这两句的调用顺序，一定要先调用该方法设置初始化的缓存名，再初始化相关的配置\n//                .withInitialCacheConfigurations(configMap)\n//                .build();\n\n    }\n\n    private Jackson2JsonRedisSerializer createJacksonRedisSerializer() {\n        Jackson2JsonRedisSerializer<?> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);\n        ObjectMapper om = new ObjectMapper();\n        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);\n        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);\n        jackson2JsonRedisSerializer.setObjectMapper(om);\n        return jackson2JsonRedisSerializer;\n    }\n\n    @Bean\n    public KeyGenerator keyGenerator() {\n        return new KeyGenerator() {\n            @Override\n            public Object generate(Object target, Method method, Object... params) {\n                StringBuilder sb = new StringBuilder();\n                String[] value = new String[1];\n                Cacheable cacheable = method.getAnnotation(Cacheable.class);\n                if (cacheable != null) {\n                    value = cacheable.value();\n                }\n                CachePut cachePut = method.getAnnotation(CachePut.class);\n                if (cachePut != null) {\n                    value = cachePut.value();\n                }\n                CacheEvict cacheEvict = method.getAnnotation(CacheEvict.class);\n                if (cacheEvict != null) {\n                    value = cacheEvict.value();\n                }\n                sb.append(value[0]);\n                for (Object obj : params) {\n                    sb.append(\":\")\n                            .append(obj.toString());\n                }\n                return sb.toString();\n            }\n        };\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/cache/RedisResolver.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\n\npackage com.mmc.dubbo.doe.cache;\n\nimport org.springframework.data.redis.core.RedisTemplate;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * @author Joey\n * @date 2018/6/17 18:13\n */\npublic interface RedisResolver {\n\n    /**\n     * 获取模板.\n     *\n     * @return\n     */\n    RedisTemplate<String, Object> getRedisTemplate();\n\n    /**\n     * 指定缓存失效时间\n     *\n     * @param key  键\n     * @param time 时间(秒)\n     * @return\n     */\n    boolean expire(String key, long time);\n\n    /**\n     * 根据key 获取过期时间\n     *\n     * @param key 键 不能为null\n     * @return 时间(秒) 返回0代表为永久有效\n     */\n    long getExpire(String key);\n\n    /**\n     * 判断key是否存在\n     *\n     * @param key 键\n     * @return true 存在 false不存在\n     */\n    boolean hasKey(String key);\n\n    /**\n     * 删除缓存\n     *\n     * @param key 可以传一个值 或多个\n     */\n    @SuppressWarnings(\"unchecked\")\n    void del(String... key);\n\n    /**\n     * 普通缓存获取\n     *\n     * @param key 键\n     * @return 值\n     */\n    Object get(String key);\n\n    /**\n     * 普通缓存放入\n     *\n     * @param key   键\n     * @param value 值\n     * @return true成功 false失败\n     */\n    boolean set(String key, Object value);\n\n    /**\n     * 普通缓存放入并设置时间.\n     *\n     * @param key   键\n     * @param value 值\n     * @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期\n     * @return true成功 false 失败\n     */\n    boolean set(String key, Object value, long time);\n\n    /**\n     *  普通缓存放入并设置时间.\n     * @param key\n     * @param value\n     * @param time\n     * @param unit\n     * @return\n     */\n    boolean set(String key, Object value, long time, TimeUnit unit);\n\n    /**\n     * 递增\n     * @param key 键\n     * @param delta 要增加几(大于0)\n     * @return\n     */\n    long incr(String key, long delta);\n\n    /**\n     * 递减\n     * @param key 键\n     * @param delta 要减少几(大于0)\n     * @return\n     */\n    long decr(String key, long delta);\n\n    /**\n     * HashGet\n     *\n     * @param key  键 不能为null\n     * @param item 项 不能为null\n     * @return 值\n     */\n    Object hget(String key, String item);\n\n    /**\n     * 获取hashKey对应的所有键值\n     *\n     * @param key 键\n     * @return 对应的多个键值\n     */\n    Map<Object, Object> hmget(String key);\n\n    /**\n     * HashSet\n     *\n     * @param key 键\n     * @param map 对应多个键值\n     * @return true 成功 false 失败\n     */\n    boolean hmset(String key, Map<String, Object> map);\n\n    /**\n     * HashSet 并设置时间\n     *\n     * @param key  键\n     * @param map  对应多个键值\n     * @param time 时间(秒)\n     * @return true成功 false失败\n     */\n    boolean hmset(String key, Map<String, Object> map, long time);\n\n    /**\n     * 向一张hash表中放入数据,如果不存在将创建\n     *\n     * @param key   键\n     * @param item  项\n     * @param value 值\n     * @return true 成功 false失败\n     */\n    boolean hset(String key, String item, Object value);\n\n    /**\n     * 向一张hash表中放入数据,如果不存在将创建\n     *\n     * @param key   键\n     * @param item  项\n     * @param value 值\n     * @param time  时间(秒)  注意:如果已存在的hash表有时间,这里将会替换原有的时间\n     * @return true 成功 false失败\n     */\n    boolean hset(String key, String item, Object value, long time);\n\n    /**\n     * 删除hash表中的值\n     *\n     * @param key  键 不能为null\n     * @param item 项 可以使多个 不能为null\n     */\n    void hdel(String key, Object... item);\n\n    /**\n     * 判断hash表中是否有该项的值\n     *\n     * @param key  键 不能为null\n     * @param item 项 不能为null\n     * @return true 存在 false不存在\n     */\n    boolean hHasKey(String key, String item);\n\n    /**\n     * hash递增 如果不存在,就会创建一个 并把新增后的值返回\n     *\n     * @param key  键\n     * @param item 项\n     * @param by   要增加几(大于0)\n     * @return\n     */\n    double hincr(String key, String item, double by);\n\n    /**\n     * hash递减\n     *\n     * @param key  键\n     * @param item 项\n     * @param by   要减少记(小于0)\n     * @return\n     */\n    double hdecr(String key, String item, double by);\n\n    /**\n     * 根据key获取Set中的所有值\n     *\n     * @param key 键\n     * @return\n     */\n    Set<Object> sMembers(String key);\n\n    /**\n     * 根据value从一个set中查询,是否存在\n     *\n     * @param key   键\n     * @param value 值\n     * @return true 存在 false不存在\n     */\n    boolean sHasKey(String key, Object value);\n\n    /**\n     * 将数据放入set缓存\n     *\n     * @param key    键\n     * @param values 值 可以是多个\n     * @return 成功个数\n     */\n    long sAdd(String key, Object... values);\n\n    /**\n     * 将set数据放入缓存\n     *\n     * @param key    键\n     * @param time   时间(秒)\n     * @param values 值 可以是多个\n     * @return 成功个数\n     */\n    long sSetAndTime(String key, long time, Object... values);\n\n    /**\n     * 获取set缓存的长度\n     *\n     * @param key 键\n     * @return\n     */\n    long sGetSetSize(String key);\n\n    /**\n     * 移除值为value的\n     *\n     * @param key    键\n     * @param values 值 可以是多个\n     * @return 移除的个数\n     */\n    long sRem(String key, Object... values);\n\n    /**\n     * 获取list缓存的内容\n     *\n     * @param key   键\n     * @param start 开始\n     * @param end   结束  0 到 -1代表所有值\n     * @return\n     */\n    List<Object> lGet(String key, long start, long end);\n\n    /**\n     * 获取list缓存的长度\n     *\n     * @param key 键\n     * @return\n     */\n    long lGetListSize(String key);\n\n    /**\n     * 通过索引 获取list中的值\n     *\n     * @param key   键\n     * @param index 索引  index>=0时， 0 表头，1 第二个元素，依次类推；index<0时，-1，表尾，-2倒数第二个元素，依次类推\n     * @return\n     */\n    Object lGetIndex(String key, long index);\n\n    /**\n     * 将list放入缓存.\n     * @param key\n     * @param value\n     * @return\n     */\n    boolean lSet(String key, Object value);\n\n    /**\n     * 将list放入缓存\n     *\n     * @param key   键\n     * @param value 值\n     * @param time  时间(秒)\n     * @return\n     */\n    boolean lSet(String key, Object value, long time);\n\n    /**\n     * 将list放入缓存.\n     * @param key\n     * @param value\n     * @return\n     */\n    boolean lSet(String key, List<Object> value);\n\n    /**\n     * 将list放入缓存\n     *\n     * @param key   键\n     * @param value 值\n     * @param time  时间(秒)\n     * @return\n     */\n    boolean lSet(String key, List<Object> value, long time);\n\n    /**\n     * 根据索引修改list中的某条数据\n     *\n     * @param key   键\n     * @param index 索引\n     * @param value 值\n     * @return\n     */\n    boolean lUpdateIndex(String key, long index, Object value);\n\n    /**\n     * 移除N个值为value\n     *\n     * @param key   键\n     * @param count 移除多少个\n     * @param value 值\n     * @return 移除的个数\n     */\n    long lRemove(String key, long count, Object value);\n\n    /**\n     * 从右边加入队列.\n     * @param key\n     * @param value\n     * @return\n     */\n    boolean rPush(String key, Object value);\n\n    /**\n     * 从左边出队.\n     * @param key\n     * @return\n     */\n    Object lPop(String key);\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/cache/UrlCaches.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.cache;\n\nimport com.alibaba.dubbo.common.URL;\nimport com.mmc.dubbo.doe.model.UrlModel;\nimport com.mmc.dubbo.doe.util.StringUtil;\n\nimport javax.validation.constraints.NotNull;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.atomic.AtomicLong;\n\n/**\n * @author Joey\n * @date 2018/6/15 17:59\n */\npublic class UrlCaches {\n\n    private final static Map<String, UrlModel> map = new ConcurrentHashMap<>();\n\n    /**\n     * cache all providers by unique key.\n     *\n     * @param interfaceName\n     * @param urls\n     * @return\n     */\n    public static List<UrlModel> cache(String interfaceName, List<URL> urls) {\n\n        List<UrlModel> ret = new ArrayList<>();\n\n        for (int i = 0; i < urls.size(); i++) {\n\n            URL url = urls.get(i);\n            String key = generateUrlKey(interfaceName, url.getHost(), url.getPort());\n            UrlModel model = new UrlModel(key, url);\n            ret.add(model);\n\n            map.put(model.getKey(), model); // 存入缓存\n        }\n\n        return ret;\n    }\n\n    private static String generateUrlKey(String interfaceName, String host, int port) {\n        return StringUtil.format(\"{}#{}#{}#\", interfaceName, host, port);\n    }\n\n    public static UrlModel get(@NotNull String key) {\n        return map.get(key);\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/channel/NettyChannel.java",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n  * contributor license agreements.  See the NOTICE file distributed with\n  * this work for additional information regarding copyright ownership.\n  * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.mmc.dubbo.doe.channel;\n\nimport com.alibaba.dubbo.common.Constants;\nimport com.alibaba.dubbo.common.URL;\nimport com.alibaba.dubbo.common.logger.Logger;\nimport com.alibaba.dubbo.common.logger.LoggerFactory;\nimport com.alibaba.dubbo.remoting.ChannelHandler;\nimport com.alibaba.dubbo.remoting.RemotingException;\nimport com.alibaba.dubbo.remoting.transport.AbstractChannel;\nimport org.jboss.netty.channel.ChannelFuture;\n\nimport java.net.InetSocketAddress;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\n\n/**\n * NettyChannel.\n */\npublic class NettyChannel extends AbstractChannel {\n\n    private static final Logger logger = LoggerFactory.getLogger(NettyChannel.class);\n\n    private static final ConcurrentMap<org.jboss.netty.channel.Channel, NettyChannel> channelMap = new ConcurrentHashMap<org.jboss.netty.channel.Channel, NettyChannel>();\n\n    private final org.jboss.netty.channel.Channel channel;\n\n    private final Map<String, Object> attributes = new ConcurrentHashMap<String, Object>();\n\n    private NettyChannel(org.jboss.netty.channel.Channel channel, URL url, ChannelHandler handler) {\n        super(url, handler);\n        if (channel == null) {\n            throw new IllegalArgumentException(\"netty channel == null;\");\n        }\n        this.channel = channel;\n    }\n\n    public static NettyChannel getOrAddChannel(org.jboss.netty.channel.Channel ch, URL url, ChannelHandler handler) {\n        if (ch == null) {\n            return null;\n        }\n        NettyChannel ret = channelMap.get(ch);\n        if (ret == null) {\n            NettyChannel nc = new NettyChannel(ch, url, handler);\n            if (ch.isConnected()) {\n                ret = channelMap.putIfAbsent(ch, nc);\n            }\n            if (ret == null) {\n                ret = nc;\n            }\n        }\n        return ret;\n    }\n\n    public static void removeChannelIfDisconnected(org.jboss.netty.channel.Channel ch) {\n        if (ch != null && !ch.isConnected()) {\n            channelMap.remove(ch);\n        }\n    }\n\n    public InetSocketAddress getLocalAddress() {\n        return (InetSocketAddress) channel.getLocalAddress();\n    }\n\n    public InetSocketAddress getRemoteAddress() {\n        return (InetSocketAddress) channel.getRemoteAddress();\n    }\n\n    public boolean isConnected() {\n        return channel.isConnected();\n    }\n\n    public void send(Object message, boolean sent) throws RemotingException {\n        super.send(message, sent);\n\n        boolean success = true;\n        int timeout = 0;\n        try {\n            ChannelFuture future = channel.write(message);\n            if (sent) {\n                timeout = getUrl().getPositiveParameter(Constants.TIMEOUT_KEY, Constants.DEFAULT_TIMEOUT);\n                success = future.await(timeout);\n            }\n            Throwable cause = future.getCause();\n            if (cause != null) {\n                throw cause;\n            }\n        } catch (Throwable e) {\n            throw new RemotingException(this, \"Failed to send message \" + message + \" to \" + getRemoteAddress() + \", cause: \" + e.getMessage(), e);\n        }\n\n        if (!success) {\n            throw new RemotingException(this, \"Failed to send message \" + message + \" to \" + getRemoteAddress()\n                    + \"in timeout(\" + timeout + \"ms) limit\");\n        }\n    }\n\n    public void close() {\n        try {\n            super.close();\n        } catch (Exception e) {\n            logger.warn(e.getMessage(), e);\n        }\n        try {\n            removeChannelIfDisconnected(channel);\n        } catch (Exception e) {\n            logger.warn(e.getMessage(), e);\n        }\n        try {\n            attributes.clear();\n        } catch (Exception e) {\n            logger.warn(e.getMessage(), e);\n        }\n        try {\n            if (logger.isInfoEnabled()) {\n                logger.info(\"Close netty channel \" + channel);\n            }\n            channel.close();\n        } catch (Exception e) {\n            logger.warn(e.getMessage(), e);\n        }\n    }\n\n    public boolean hasAttribute(String key) {\n        return attributes.containsKey(key);\n    }\n\n    public Object getAttribute(String key) {\n        return attributes.get(key);\n    }\n\n    public void setAttribute(String key, Object value) {\n        if (value == null) { // The null value unallowed in the ConcurrentHashMap.\n            attributes.remove(key);\n        } else {\n            attributes.put(key, value);\n        }\n    }\n\n    public void removeAttribute(String key) {\n        attributes.remove(key);\n    }\n\n    @Override\n    public int hashCode() {\n        final int prime = 31;\n        int result = 1;\n        result = prime * result + ((channel == null) ? 0 : channel.hashCode());\n        return result;\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n        if (this == obj) return true;\n        if (obj == null) return false;\n        if (getClass() != obj.getClass()) return false;\n        NettyChannel other = (NettyChannel) obj;\n        if (channel == null) {\n            if (other.channel != null) return false;\n        } else if (!channel.equals(other.channel)) return false;\n        return true;\n    }\n\n    @Override\n    public String toString() {\n        return \"com.mmc.dubbo.test.NettyChannel [channel=\" + channel + \"]\";\n    }\n\n}"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/client/DoeClient.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.client;\n\nimport com.alibaba.dubbo.common.URL;\nimport com.alibaba.dubbo.remoting.RemotingException;\nimport com.alibaba.dubbo.remoting.exchange.Request;\nimport com.mmc.dubbo.doe.channel.NettyChannel;\nimport com.mmc.dubbo.doe.handler.SendReceiveHandler;\nimport org.jboss.netty.channel.Channel;\nimport org.jboss.netty.channel.ChannelFuture;\n\nimport java.util.concurrent.TimeUnit;\n\n\n/**\n * @author Joey\n * @date 2018/6/7 10:42\n */\npublic class DoeClient extends TransportClient {\n\n\n    public DoeClient(URL url) {\n        super(url, new SendReceiveHandler());\n    }\n\n    public void doConnect() {\n        ChannelFuture future = bootstrap.connect(getConnectAddress());\n        boolean ret = future.awaitUninterruptibly(timeout, TimeUnit.MILLISECONDS);\n        if (ret && future.isSuccess()) {\n            Channel newChannel = future.getChannel();\n            newChannel.setInterestOps(Channel.OP_READ_WRITE);\n            DoeClient.this.channel = future.getChannel();\n        } else {\n            throw new RuntimeException(\"can't not connect to server.\");\n        }\n    }\n\n    public void send(Request req) throws RemotingException {\n\n        NettyChannel ch = NettyChannel.getOrAddChannel(this.channel, url, handler);\n\n        ch.send(req);\n\n    }\n\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/client/ProcessClient.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.client;\n\nimport com.mmc.dubbo.doe.cache.RedisResolver;\nimport com.mmc.dubbo.doe.context.Const;\nimport com.mmc.dubbo.doe.context.TaskContainer;\nimport com.mmc.dubbo.doe.dto.PomDTO;\nimport com.mmc.dubbo.doe.handler.StreamHandler;\nimport com.mmc.dubbo.doe.util.StringUtil;\nimport lombok.extern.slf4j.Slf4j;\n\nimport java.io.IOException;\nimport java.util.Properties;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * @author Joey\n * @date 2018/6/17 23:43\n */\n@Slf4j\npublic class ProcessClient extends Thread {\n\n    private final String libPath;\n    private final RedisResolver redisResolver;\n    private final PomDTO dto;\n    private final String pomXml;\n    private long timeout = 20;\n    private volatile boolean done;\n\n    public ProcessClient(PomDTO dto, RedisResolver redisResolver, String pomXml, String libPath) {\n        this.dto = dto;\n        this.redisResolver = redisResolver;\n        this.pomXml = pomXml;\n        this.libPath = libPath;\n    }\n\n    @Override\n    public void run() {\n\n        log.info(\"begin to download the jars.\");\n\n        // set running flag\n        this.putFlag();\n\n        // make the command depends on the OS.\n        String command = makeCommand(pomXml);\n\n        log.info(\"begin to exec the command {}\", command);\n        Process ps = null;\n        try {\n            ps = Runtime.getRuntime().exec(command);\n        } catch (IOException e) {\n            log.error(StringUtil.format(\"can't execute the command {}\", command), e);\n            return;\n        }\n\n        // 再开线程执行\n        TaskContainer.getTaskContainer().execute(new StreamHandler(ps, redisResolver, dto.getRequestId(), libPath));\n\n        // no longer than default 20 minutes.\n        try {\n            ps.waitFor(timeout, TimeUnit.MINUTES);\n        } catch (InterruptedException e) {\n            log.error(\"waiting too long...\", e);\n        }\n\n        // remove the key\n        this.removeFlag();\n\n        // set complete normally flag\n        this.done = true;\n\n    }\n\n    private void putFlag() {\n        // set the key mark as the running flag and the longest lifetime of task was one hour.\n        log.info(\"set the key to mark as the running flag and the longest lifetime of task was one hour\");\n        redisResolver.set(Const.DOE_DOWNLOAD_JAR_TASK, Const.RUNNING_FlAG, 1, TimeUnit.HOURS);\n    }\n\n    /**\n     * remove the running flag.\n     */\n    private void removeFlag() {\n        log.info(\"remove the running flag.\");\n        redisResolver.del(Const.DOE_DOWNLOAD_JAR_TASK);\n    }\n    /**\n     * get the cmd code.\n     *\n     * @param pomXml\n     * @return\n     */\n    private String makeCommand(String pomXml) {\n\n        if (isOSLinux()) {\n            return StringUtil.format(\"/bin/bash -c  mvn dependency:copy-dependencies -DoutputDirectory={} -DincludeScope=compile -f {}\", libPath, pomXml);\n        } else if (isOSMac()){\n            return StringUtil.format(\"mvn dependency:copy-dependencies -DoutputDirectory={} -DincludeScope=compile -f {}\", libPath, pomXml);\n        }else {\n            return StringUtil.format(\"cmd /c  mvn dependency:copy-dependencies -DoutputDirectory=lib -DincludeScope=compile -f {}\", pomXml);\n        }\n    }\n\n    /**\n     * judge if linux os.\n     *\n     * @return\n     */\n    public static boolean isOSLinux() {\n        Properties prop = System.getProperties();\n\n        String os = prop.getProperty(\"os.name\");\n        if (os != null && os.toLowerCase().contains(\"linux\")) {\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * judge if mac os.\n     *\n     * @return\n     */\n    public static boolean isOSMac() {\n        Properties prop = System.getProperties();\n\n        String os = prop.getProperty(\"os.name\");\n        if (os != null && os.toLowerCase().contains(\"mac\")) {\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n\n    public boolean isDone() {\n        return done;\n    }\n\n    public boolean isRunning() {\n\n        if (redisResolver.hasKey(Const.DOE_DOWNLOAD_JAR_TASK)) {\n            log.warn(\"some task was already running at background, please try again for a few minutes later.\");\n            return true;\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/client/TransportClient.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.client;\n\nimport com.alibaba.dubbo.common.Constants;\nimport com.alibaba.dubbo.common.URL;\nimport com.alibaba.dubbo.common.extension.ExtensionLoader;\nimport com.alibaba.dubbo.common.utils.NamedThreadFactory;\nimport com.alibaba.dubbo.common.utils.NetUtils;\nimport com.alibaba.dubbo.remoting.Codec2;\nimport com.alibaba.dubbo.remoting.buffer.DynamicChannelBuffer;\nimport com.alibaba.dubbo.remoting.transport.netty.NettyHandler;\nimport com.mmc.dubbo.doe.channel.NettyChannel;\nimport org.jboss.netty.bootstrap.ClientBootstrap;\nimport org.jboss.netty.buffer.ChannelBuffer;\nimport org.jboss.netty.buffer.ChannelBuffers;\nimport org.jboss.netty.channel.*;\nimport org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;\nimport org.jboss.netty.handler.codec.oneone.OneToOneEncoder;\n\nimport java.io.IOException;\nimport java.net.InetSocketAddress;\nimport java.net.SocketAddress;\nimport java.util.concurrent.Executors;\n\n/**\n * @author Joey\n * @date 2018/6/15 11:26\n */\npublic class TransportClient {\n\n\n    protected static final ChannelFactory channelFactory = new NioClientSocketChannelFactory(\n            Executors.newCachedThreadPool(new NamedThreadFactory(\"NettyClientBoss\", true)),\n            Executors.newCachedThreadPool(new NamedThreadFactory(\"NettyClientWorker\", true)),\n            Constants.DEFAULT_IO_THREADS);\n\n    protected ClientBootstrap bootstrap = new ClientBootstrap(channelFactory);\n\n    protected int bufferSize = Constants.DEFAULT_BUFFER_SIZE;\n    protected int timeout = Constants.DEFAULT_TIMEOUT;\n    protected final Codec2 codec;\n    protected final URL url;\n    protected volatile Channel channel; // volatile, please copy reference to use\n    protected com.alibaba.dubbo.remoting.ChannelHandler handler;\n\n    public TransportClient(URL url, com.alibaba.dubbo.remoting.ChannelHandler handler) {\n\n        this.url = url;\n        this.handler = handler;\n        this.codec = getChannelCodec(url);\n\n        bootstrap.setOption(\"keepAlive\", true);\n        bootstrap.setOption(\"tcpNoDelay\", true);\n        bootstrap.setOption(\"connectTimeoutMillis\", timeout);\n\n        final NettyHandler nettyHandler = new NettyHandler(url, handler);\n        bootstrap.setPipelineFactory(new ChannelPipelineFactory() {\n            public ChannelPipeline getPipeline() {\n\n                ChannelPipeline pipeline = Channels.pipeline();\n                pipeline.addLast(\"decoder\", getDecoder());\n                pipeline.addLast(\"encoder\", getEncoder());\n                pipeline.addLast(\"handler\", nettyHandler);\n                return pipeline;\n            }\n        });\n    }\n\n    protected static Codec2 getChannelCodec(URL url) {\n        String codecName = url.getParameter(Constants.CODEC_KEY, \"telnet\");\n        return ExtensionLoader.getExtensionLoader(Codec2.class).getExtension(codecName);\n    }\n\n    protected SocketAddress getConnectAddress() {\n        return new InetSocketAddress(NetUtils.filterLocalHost(url.getHost()), url.getPort());\n    }\n\n    private org.jboss.netty.channel.ChannelHandler getEncoder() {\n        return new InternalEncoder();\n    }\n\n    private org.jboss.netty.channel.ChannelHandler getDecoder() {\n        return new InternalDecoder();\n    }\n\n    private class InternalEncoder extends OneToOneEncoder {\n\n        @Override\n        protected Object encode(ChannelHandlerContext ctx, Channel ch, Object msg) throws Exception {\n            com.alibaba.dubbo.remoting.buffer.ChannelBuffer buffer =\n                    com.alibaba.dubbo.remoting.buffer.ChannelBuffers.dynamicBuffer(1024);\n            NettyChannel channel = NettyChannel.getOrAddChannel(ch, url, handler);\n            try {\n                codec.encode(channel, buffer, msg);\n            } finally {\n                NettyChannel.removeChannelIfDisconnected(ch);\n            }\n            return ChannelBuffers.wrappedBuffer(buffer.toByteBuffer());\n        }\n    }\n    private class InternalDecoder extends SimpleChannelUpstreamHandler {\n\n        private com.alibaba.dubbo.remoting.buffer.ChannelBuffer buffer =\n                com.alibaba.dubbo.remoting.buffer.ChannelBuffers.EMPTY_BUFFER;\n\n        @Override\n        public void messageReceived(ChannelHandlerContext ctx, MessageEvent event) throws Exception {\n            Object o = event.getMessage();\n            if (!(o instanceof ChannelBuffer)) {\n                ctx.sendUpstream(event);\n                return;\n            }\n\n            ChannelBuffer input = (ChannelBuffer) o;\n            int readable = input.readableBytes();\n            if (readable <= 0) {\n                return;\n            }\n\n            com.alibaba.dubbo.remoting.buffer.ChannelBuffer message;\n            if (buffer.readable()) {\n                if (buffer instanceof DynamicChannelBuffer) {\n                    buffer.writeBytes(input.toByteBuffer());\n                    message = buffer;\n                } else {\n                    int size = buffer.readableBytes() + input.readableBytes();\n                    message = com.alibaba.dubbo.remoting.buffer.ChannelBuffers.dynamicBuffer(\n                            size > bufferSize ? size : bufferSize);\n                    message.writeBytes(buffer, buffer.readableBytes());\n                    message.writeBytes(input.toByteBuffer());\n                }\n            } else {\n                message = com.alibaba.dubbo.remoting.buffer.ChannelBuffers.wrappedBuffer(\n                        input.toByteBuffer());\n            }\n\n            NettyChannel channel = NettyChannel.getOrAddChannel(ctx.getChannel(), url, handler);\n            Object msg;\n            int saveReaderIndex;\n\n            try {\n                // decode object.\n                do {\n                    saveReaderIndex = message.readerIndex();\n                    try {\n                        msg = codec.decode(channel, message);\n                    } catch (IOException e) {\n                        buffer = com.alibaba.dubbo.remoting.buffer.ChannelBuffers.EMPTY_BUFFER;\n                        throw e;\n                    }\n                    if (msg == Codec2.DecodeResult.NEED_MORE_INPUT) {\n                        message.readerIndex(saveReaderIndex);\n                        break;\n                    } else {\n                        if (saveReaderIndex == message.readerIndex()) {\n                            buffer = com.alibaba.dubbo.remoting.buffer.ChannelBuffers.EMPTY_BUFFER;\n                            throw new IOException(\"Decode without read data.\");\n                        }\n                        if (msg != null) {\n                            Channels.fireMessageReceived(ctx, msg, event.getRemoteAddress());\n                        }\n                    }\n                } while (message.readable());\n            } finally {\n                if (message.readable()) {\n                    message.discardReadBytes();\n                    buffer = message;\n                } else {\n                    buffer = com.alibaba.dubbo.remoting.buffer.ChannelBuffers.EMPTY_BUFFER;\n                }\n                NettyChannel.removeChannelIfDisconnected(ctx.getChannel());\n            }\n        }\n\n        @Override\n        public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {\n            ctx.sendUpstream(e);\n        }\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/context/ApplicationReadyEventListener.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.context;\n\nimport com.mmc.dubbo.doe.service.PomService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.boot.context.event.ApplicationReadyEvent;\nimport org.springframework.context.ApplicationEvent;\nimport org.springframework.context.ApplicationListener;\nimport org.springframework.context.ConfigurableApplicationContext;\n\nimport java.net.MalformedURLException;\n\n/**\n * @author Joey\n * @date 2018/6/22 13:55\n */\n@Slf4j\npublic class ApplicationReadyEventListener implements ApplicationListener<ApplicationReadyEvent> {\n\n\n    /**\n     * Handle an application event.\n     *\n     * @param event the event to respond to\n     */\n    @Override\n    public void onApplicationEvent(ApplicationReadyEvent event) {\n\n        log.info(\"ApplicationReadyEventListener.onApplicationEvent()\");\n        ConfigurableApplicationContext applicationContext = event.getApplicationContext();\n\n        PomService pomService = applicationContext.getBean(\"pomService\", PomService.class);\n        try {\n            log.info(\"begin auto to load jars.\");\n            pomService.loadJars(\"\");\n            log.info(\"finished load jars.\");\n        } catch (NoSuchMethodException | MalformedURLException e) {\n            log.error(\"fail to load jars.\", e);\n        }\n\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/context/Const.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.context;\n\n/**\n * @author Joey\n * @date 2018/6/17 18:38\n */\npublic class Const {\n\n    /**\n     * download task key.\n     */\n    public static final String DOE_DOWNLOAD_JAR_TASK = \"doe:download:jar:task\";\n    /**\n     * when the task was running.\n     */\n    public static final int RUNNING_FlAG = 1;\n    /**\n     * when the task has completed.\n     */\n    public static final int COMPLETE_FLAG = 2;\n    /**\n     * download task real time message key.\n     */\n    public static final String DOE_DOWNLOAD_JAR_MESSAGE = \"doe:download:jar:msg:{}\";\n\n    /**\n     * the project cache namespace.\n     */\n    public static final String DOE_CACHE_PREFIX = \"doe:cache\";\n    /**\n     * use case key.\n     */\n    public static final String DOE_CASE_KEY = \"doe:case\";\n    /**\n     * all config of zk address key.\n     */\n    public static final String DOE_REGISTRY_KEY = \"doe:registry:list\";\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/context/DoeClassLoader.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.context;\n\nimport com.alibaba.dubbo.common.utils.StringUtils;\nimport com.mmc.dubbo.doe.exception.DoeException;\nimport com.mmc.dubbo.doe.util.StringUtil;\nimport lombok.extern.slf4j.Slf4j;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\nimport java.util.Enumeration;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.jar.JarEntry;\nimport java.util.jar.JarFile;\n\n/**\n * 自定义类加载器，做沙箱隔离.\n *\n * @author Joey\n * @date 2019/6/28 14:20\n */\n@Slf4j\npublic class DoeClassLoader extends ClassLoader {\n\n\n    private final String path;\n\n    private static Map<String, byte[]> classMap = new ConcurrentHashMap<>();\n\n\n    /**\n     * destroy the Parental Entrustment.\n     */\n    public DoeClassLoader(String path) {\n        super(null);\n        this.path = path;\n    }\n\n\n    private void scanJarFile(File file) throws Exception {\n\n        JarFile jar = new JarFile(file);\n\n        Enumeration<JarEntry> en = jar.entries();\n        while (en.hasMoreElements()) {\n            JarEntry je = en.nextElement();\n            je.getName();\n            String name = je.getName();\n            if (name.endsWith(\".class\")) {\n\n                String className = makeClassName(name);\n\n                try (InputStream input = jar.getInputStream(je); ByteArrayOutputStream baos = new ByteArrayOutputStream()) {\n                    int bufferSize = 1024;\n                    byte[] buffer = new byte[bufferSize];\n                    int bytesNumRead;\n                    while ((bytesNumRead = input.read(buffer)) != -1) {\n                        baos.write(buffer, 0, bytesNumRead);\n                    }\n                    addClass(className, baos.toByteArray());\n                }\n            }\n        }\n        jar.close();\n    }\n\n    private String makeClassName(String name) {\n        String ret = name.replace(\"\\\\\", \".\")\n                .replace(\"/\", \".\")\n                .replace(\".class\", \"\");\n        return ret;\n    }\n\n    /**\n     * load jars from the Specified path.\n     */\n    public void loadJars() throws Exception {\n\n        if (StringUtils.isEmpty(path)) {\n            throw new DoeException(StringUtil.format(\"can't found the path {}\", path));\n        }\n\n        File libPath = new File(path);\n        if (!libPath.exists()) {\n            throw new DoeException(StringUtil.format(\"the path[{}] is not exists.\", path));\n        }\n\n        File[] files = libPath.listFiles((dir, name) -> name.endsWith(\".jar\") || name.endsWith(\".zip\"));\n\n        if (files != null) {\n            for (File file : files) {\n                scanJarFile(file);\n            }\n        }\n    }\n\n    /**\n     * Add one class dynamically.\n     */\n    public static boolean addClass(String className, byte[] byteCode) {\n        if (!classMap.containsKey(className)) {\n            classMap.put(className, byteCode);\n            return true;\n        }\n        return false;\n    }\n\n    @Override\n    protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {\n\n        name = makeClassName(name);\n\n        byte[] stream = get(name);\n\n        if (null != stream) {\n\n            return defineClass(name, stream, 0, stream.length);\n        }\n\n        return super.loadClass(name, resolve);\n\n    }\n\n    /**\n     * Get class in our classloader rather than system classloader.\n     */\n    public static Class<?> getClass(String name) throws ClassNotFoundException {\n        return new DoeClassLoader(\"\").loadClass(name, false);\n    }\n\n    private static byte[] get(String className) {\n        return classMap.getOrDefault(className, null);\n    }\n\n    private void scanClassFile(File file) {\n        if (file.exists()) {\n            if (file.isFile() && file.getName().endsWith(\".class\")) {\n                try {\n                    byte[] byteCode = Files.readAllBytes(Paths.get(file.getAbsolutePath()));\n                    String className = file.getAbsolutePath().replace(this.path, \"\")\n                            .replace(File.separator, \".\");\n\n                    className = makeClassName(className);\n\n                    addClass(className, byteCode);\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n            } else if (file.isDirectory()) {\n                for (File f : Objects.requireNonNull(file.listFiles())) {\n                    scanClassFile(f);\n                }\n            }\n        }\n    }\n\n    /**\n     * load classes from the Specified path.\n     */\n    public void loadClassFile() {\n        File[] files = new File(path).listFiles();\n        if (files != null) {\n            for (File file : files) {\n                scanClassFile(file);\n            }\n        }\n    }\n\n    /**\n     * clear the class cache.\n     */\n    public void clearCache() {\n        classMap.clear();\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/context/ResponseDispatcher.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.context;\n\nimport com.alibaba.dubbo.remoting.exchange.Request;\nimport com.alibaba.dubbo.remoting.exchange.Response;\nimport com.alibaba.dubbo.rpc.RpcResult;\n\nimport java.util.Map;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * @author Joey\n * @date 2018/6/11 12:33\n */\npublic class ResponseDispatcher {\n\n    private Map<Long, CompletableFuture> futures = new ConcurrentHashMap<>();\n\n    private ResponseDispatcher() {\n\n    }\n\n    @SuppressWarnings(\"uncheck\")\n    public CompletableFuture<RpcResult> getFuture(Request req) {\n        return futures.get(req.getId());\n    }\n\n    public void register(Request req) {\n\n        CompletableFuture future = new CompletableFuture();\n        futures.put(req.getId(), future);\n    }\n\n    public void dispatch(Response res) {\n\n        CompletableFuture future = futures.get(res.getId());\n        if (null == future) {\n            throw new RuntimeException();\n        }\n        future.complete(res.getResult());\n    }\n\n    public CompletableFuture removeFuture(Request req) {\n        return futures.remove(req.getId());\n    }\n\n    static class ResponseDispatcherHolder {\n        static final ResponseDispatcher instance = new ResponseDispatcher();\n    }\n\n    public static ResponseDispatcher getDispatcher() {\n        return ResponseDispatcherHolder.instance;\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/context/TaskContainer.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.context;\n\nimport lombok.extern.slf4j.Slf4j;\n\nimport java.util.concurrent.*;\n\n/**\n * @author Joey\n * @date 2018/6/29 20:00\n */\n@Slf4j\npublic class TaskContainer {\n\n    // 获取当前的cpu核心数\n    private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();\n    // 线程池最大容量\n    public static final int MAXIMUM_POOL_SIZE = CPU_COUNT;\n    // 线程池核心容量\n    private static final int CORE_POOL_SIZE = CPU_COUNT;\n    // 线程池\n    private final ThreadPoolExecutor poolExecutor;\n    // 判断是否关闭\n    protected volatile boolean isShutdown;\n    // 任务计数器\n    protected CountDownLatch watch;\n\n    private TaskContainer() {\n\n        // 创建任务池\n        poolExecutor = new ThreadPoolExecutor(2, MAXIMUM_POOL_SIZE, 1,\n                TimeUnit.HOURS, new ArrayBlockingQueue<Runnable>(CORE_POOL_SIZE), new RejectedExecutionHandler() {\n            @Override\n            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {\n                try {\n                    // 核心改造点，由blocking queue的offer改成put阻塞方法\n                    executor.getQueue().put(r);\n                } catch (InterruptedException e) {\n                    log.error(\"任务进入队列出错：\", e);\n                }\n            }\n        });\n\n    }\n\n    public static TaskContainer getTaskContainer() {\n        return TaskContainerHolder.instance;\n    }\n\n    /**\n     * execute task.\n     *\n     * @param task\n     */\n    public void execute(Runnable task) {\n        poolExecutor.execute(task);\n    }\n\n    static class TaskContainerHolder {\n        static final TaskContainer instance = new TaskContainer();\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/crontroller/CaseController.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.crontroller;\n\nimport com.alibaba.fastjson.JSON;\nimport com.mmc.dubbo.doe.dto.CaseModelDTO;\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.model.CaseModel;\nimport com.mmc.dubbo.doe.service.CaseService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.ResponseBody;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.validation.constraints.NotNull;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n/**\n * @author Joey\n * @date 2018/6/29 15:57\n */\n@RestController\n@RequestMapping(\"/doe/case\")\n@Slf4j\npublic class CaseController {\n\n    @Autowired\n    private CaseService caseService;\n\n\n    @RequestMapping(\"/doSave\")\n    public ResultDTO<CaseModel> doSave(@NotNull CaseModelDTO dto) {\n\n        log.info(\"CaseController.doSave({})\", JSON.toJSONString(dto));\n\n        ResultDTO<CaseModel> resultDTO;\n\n        try {\n\n            CaseModel model = new CaseModel();\n            BeanUtils.copyProperties(dto, model);\n            resultDTO = caseService.save(model);\n\n        } catch(Exception e) {\n\n            resultDTO = ResultDTO.createExceptionResult(e, CaseModel.class);\n        }\n\n        return resultDTO;\n    }\n\n    @RequestMapping(\"/doList\")\n    public String doList(CaseModelDTO dto) {\n\n        log.info(\"CaseController.doList({})\", JSON.toJSONString(dto));\n\n        try {\n\n            List<Object> list = caseService.listAll();\n\n            List<CaseModel> ret = list.stream().map(l -> {\n                CaseModel model = new CaseModel();\n                BeanUtils.copyProperties(l, model);\n                return model;\n            }).collect(Collectors.toList());\n\n            return JSON.toJSONString(ret);\n\n        } catch(Exception e) {\n\n            return \"[]\";\n        }\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/crontroller/DubboController.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.crontroller;\n\nimport com.alibaba.fastjson.JSON;\nimport com.mmc.dubbo.doe.dto.ConnectDTO;\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.dto.MethodModelDTO;\nimport com.mmc.dubbo.doe.dto.UrlModelDTO;\nimport com.mmc.dubbo.doe.model.ServiceModel;\nimport com.mmc.dubbo.doe.service.ClassService;\nimport com.mmc.dubbo.doe.service.ConnectService;\nimport com.mmc.dubbo.doe.service.TelnetService;\nimport com.mmc.dubbo.doe.util.StringUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.util.CollectionUtils;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.validation.constraints.NotNull;\nimport java.util.List;\n\n/**\n * @author Joey\n * @date 2018/6/18 17:07\n */\n@RestController\n@RequestMapping(\"/doe/dubbo\")\n@Slf4j\npublic class DubboController {\n\n    @Autowired\n    private ConnectService connectService;\n\n    @Autowired\n    private ClassService classService;\n\n    @Autowired\n    private TelnetService telnetService;\n\n    @RequestMapping(\"/doSendWithTelnet\")\n    public ResultDTO<String> doSendWithTelnet(@NotNull ConnectDTO dto) {\n\n        log.info(\"DubboController.doSendWithTelnet({})\", JSON.toJSONString(dto));\n\n        ResultDTO<String> resultDTO;\n\n        try {\n\n            resultDTO = telnetService.send(dto);\n\n        } catch(Exception e) {\n\n            resultDTO = ResultDTO.createExceptionResult(e, String.class);\n        }\n\n        return resultDTO;\n    }\n\n    @RequestMapping(\"/doSend\")\n    public ResultDTO<String> doSend(@NotNull ConnectDTO dto) {\n\n        log.info(\"DubboController.doSend({})\", JSON.toJSONString(dto));\n\n        ResultDTO<String> resultDTO;\n\n        try {\n\n            resultDTO = connectService.send(dto);\n\n        } catch(Exception e) {\n\n            resultDTO = ResultDTO.createExceptionResult(e, String.class);\n        }\n\n        return resultDTO;\n    }\n\n    @RequestMapping(\"/doListParams\")\n    public ResultDTO<String> doListParams(@NotNull MethodModelDTO dto) {\n\n        log.info(\"DubboController.doListParams({})\", JSON.toJSONString(dto));\n\n        ResultDTO<String> resultDTO;\n\n        try {\n\n            resultDTO = classService.generateMethodParamsJsonString(dto);\n\n        } catch(Exception e) {\n\n            resultDTO = ResultDTO.createExceptionResult(e, String.class);\n        }\n\n\n        return resultDTO;\n    }\n\n    @RequestMapping(\"/doListMethods\")\n    public ResultDTO<Object> doListMethods(@NotNull ConnectDTO dto) {\n\n        log.info(\"DubboController.doListMethods({})\", dto.getProviderKey());\n\n        ResultDTO<Object> resultDTO = new ResultDTO<>();\n\n        try {\n\n            List<MethodModelDTO> models = classService.listMethods(dto);\n            if (CollectionUtils.isEmpty(models)) {\n\n                resultDTO = ResultDTO.createErrorResult(StringUtil.format(\"no methods for {}.\",\n                        dto.getServiceName()), Object.class);\n\n            } else {\n\n                log.info(\"methods: {}\", JSON.toJSONString(models));\n                resultDTO.setData(models);\n                resultDTO.setSuccess(true);\n\n            }\n\n        } catch(Exception e) {\n\n            resultDTO = ResultDTO.createExceptionResult(e, Object.class);\n            resultDTO.setMsg(\"occur an error when get methods : \" + resultDTO.getMsg());\n        }\n\n        return resultDTO;\n    }\n\n    @RequestMapping(\"/doListProviders\")\n    public ResultDTO<Object> doListProviders(@NotNull ConnectDTO dto) {\n\n        log.info(\"DubboController.doListProviders({} {} {})\", dto.getServiceName(), dto.getVersion(), dto.getGroup());\n\n        ResultDTO<Object> resultDTO = new ResultDTO<>();\n\n        try {\n\n\n            List<UrlModelDTO> models = connectService.listProviders(dto);\n            if (CollectionUtils.isEmpty(models)) {\n\n                resultDTO = ResultDTO.createErrorResult(StringUtil.format(\"no provider for {} in this zookeeper registry.\",\n                        dto.getServiceName()), Object.class);\n\n            } else {\n\n                log.info(\"providers: {}\", JSON.toJSONString(models));\n                resultDTO.setData(models);\n                resultDTO.setSuccess(true);\n\n            }\n\n        } catch(Exception e) {\n\n            resultDTO = ResultDTO.createExceptionResult(e, Object.class);\n            resultDTO.setMsg(\"occur an error when get provider : \" + resultDTO.getMsg());\n        }\n\n        return resultDTO;\n    }\n\n    @RequestMapping(\"/doConnect\")\n    public ResultDTO<Object> doConnect(@NotNull String conn) {\n\n        log.debug(\"DubboController.doConnect({})\", conn);\n\n        ResultDTO<Object> resultDTO = new ResultDTO<>();\n\n        try {\n\n            List<ServiceModel> models = connectService.connect(conn);\n            if (CollectionUtils.isEmpty(models)) {\n\n                resultDTO = ResultDTO.createErrorResult(\"no provider for this this zookeeper registry.\", Object.class);\n\n            } else {\n\n                resultDTO.setData(models);\n                resultDTO.setSuccess(true);\n\n            }\n\n        } catch(Exception e) {\n\n            resultDTO = ResultDTO.createExceptionResult(e, Object.class);\n        }\n\n        return resultDTO;\n\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/crontroller/HomeController.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.crontroller;\n\nimport com.mmc.dubbo.doe.service.MenuService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\n/**\n * @author Joey\n * @date 2018/6/16 11:57\n */\n@Controller\n@RequestMapping(\"/doe/home\")\npublic class HomeController {\n\n    @Autowired\n    private MenuService menuService;\n\n    @RequestMapping(\"/index\")\n    public String index(Model model) {\n\n        // open easyCnt page defaultly.\n        return index(\"f16001100\", model);\n    }\n\n    @RequestMapping(\"/main\")\n    public String index(String mid, Model model) {\n\n        // you can do something here, such as auth validation,,,\n        Integer menuId = Integer.valueOf(mid.substring(1));\n        String path = menuService.getUrl(menuId);\n        String menuHtml = menuService.getHtml();\n\n        model.addAttribute(\"mid\", mid);\n        model.addAttribute(\"menuHtml\", menuHtml);\n\n        return path;\n\n    }\n\n\n    @RequestMapping(\"/normalCnt\")\n    public String openNormalPage() {\n\n        return \"/pages/v3/normalCnt.html\";\n    }\n\n    @RequestMapping(\"/caseCnt\")\n    public String openCasePage() {\n\n        return \"/pages/v3/caseCnt.html\";\n    }\n\n    @RequestMapping(\"/easyCnt\")\n    public String openEasyPage() {\n\n        return \"/pages/v3/easyCnt.html\";\n    }\n\n    @RequestMapping(\"/addJar\")\n    public String openAddJarPage() {\n\n        return \"/pages/v3/addJar.html\";\n    }\n\n    @RequestMapping(\"/listJar\")\n    public String openListJarPage() {\n\n        return \"/pages/v3/listJar.html\";\n    }\n    @RequestMapping(\"/editPom\")\n    public String openEditPomPage() {\n\n        return \"/pages/v3/editPom.html\";\n    }\n\n    @RequestMapping(\"/listZk\")\n    public String openListZkPage() {\n\n        return \"/pages/v3/listZk.html\";\n    }\n\n    @RequestMapping(\"/sys\")\n    public String openSysPage() {\n\n        return \"/pages/v3/sys.html\";\n    }\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/crontroller/PomController.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.crontroller;\n\nimport com.alibaba.dubbo.common.utils.StringUtils;\nimport com.alibaba.fastjson.JSON;\nimport com.mmc.dubbo.doe.dto.PomDTO;\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.exception.DoeException;\nimport com.mmc.dubbo.doe.model.PomModel;\nimport com.mmc.dubbo.doe.service.PomService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.List;\n\n/**\n * Dependency controller.\n * @author Joey\n * @date 2018/6/17 8:53\n */\n@RestController\n@RequestMapping(\"/doe/pom\")\n@Slf4j\npublic class PomController {\n\n\n    @Autowired\n    private PomService pomService;\n\n    /**\n     * load jars.\n     *\n     * @return\n     */\n    @RequestMapping(\"/doLoad\")\n    public ResultDTO<String> doLoad() {\n\n        log.info(\"PomController.doLoad\");\n\n        ResultDTO<String> resultDTO = null;\n\n        try {\n\n            resultDTO = pomService.loadJars(\"\");\n\n        } catch(Exception e) {\n\n            resultDTO = ResultDTO.createExceptionResult(e, String.class);\n        }\n\n        return resultDTO;\n\n    }\n\n    /**\n     * parse the upload content to pom model and fork another process to invoke cmd/shell command to download the jars at background.\n     *\n     * @param pom\n     * @return\n     */\n    @RequestMapping(\"/doParse\")\n    public ResultDTO<PomDTO> doParse(String pom) {\n\n        log.info(\"PomController.doParse({})\", pom);\n\n        ResultDTO<PomDTO> resultDTO;\n\n        try {\n\n            if (StringUtils.isEmpty(pom)) {\n                throw new DoeException(\"the pom content can't be blank.\");\n            }\n            // convert the pom\n            pom = org.apache.commons.text.StringEscapeUtils.unescapeXml(pom);\n            log.debug(\"pom after escape was {}\", pom);\n\n            PomDTO dto = new PomDTO();\n            dto.setPom(pom);\n\n            resultDTO = pomService.invoke(dto);\n\n        } catch(Exception e) {\n\n            resultDTO = ResultDTO.createExceptionResult(e, PomDTO.class);\n        }\n\n        return resultDTO;\n\n    }\n\n    /**\n     * invoke the mvn command to download the jars again.\n     *\n     * @return\n     */\n    @RequestMapping(\"/doReparse\")\n    public ResultDTO<PomDTO> doReparse() {\n\n        log.info(\"PomController.doReparse({})\");\n\n        ResultDTO<PomDTO> resultDTO;\n\n        try {\n\n            resultDTO = pomService.invoke();\n\n        } catch(Exception e) {\n\n            resultDTO = ResultDTO.createExceptionResult(e, PomDTO.class);\n        }\n\n        return resultDTO;\n\n    }\n\n    @RequestMapping(\"/doMsg\")\n    public ResultDTO<String> getRealTimeMsg(String requestId) {\n\n        log.info(\"PomController.getRealTimeMsg({})\", requestId);\n\n        ResultDTO<String> resultDTO;\n\n        try {\n\n            if (StringUtils.isEmpty(requestId)) {\n                resultDTO = ResultDTO.createErrorResult(\"ERROR\", String.class);\n            } else {\n                resultDTO = pomService.getRealTimeMsg(requestId);\n            }\n\n        } catch(Exception e) {\n\n            resultDTO = ResultDTO.createExceptionResult(e, String.class);\n        }\n\n        return resultDTO;\n    }\n\n    @RequestMapping(\"/doListJars\")\n    public String doListJars(PomDTO dto) {\n\n        log.info(\"PomController.doListJars({})\", JSON.toJSONString(dto));\n\n        String result;\n\n        try {\n\n            List<PomModel> models = pomService.listJars(dto);\n            result = JSON.toJSONString(models);\n\n        } catch(Exception e) {\n\n            result = \"[]\";\n        }\n\n        return result;\n    }\n\n    @RequestMapping(\"/doLoadPomFile\")\n    public ResultDTO<String> doLoadPomFile() {\n\n        log.info(\"PomController.doLoadPomFile\");\n\n        ResultDTO<String> resultDTO;\n\n        try {\n\n            String content = pomService.loadPomFile(null);\n\n            resultDTO = ResultDTO.handleSuccess(\"SUCCESS\", content);\n\n        } catch(Exception e) {\n\n            resultDTO = ResultDTO.createExceptionResult(e, String.class);\n        }\n\n        return resultDTO;\n    }\n\n    @RequestMapping(\"/doOverridePomFile\")\n    public ResultDTO<Boolean> doOverridePomFile(String content) {\n\n        log.info(\"PomController.doOverridePomFile\");\n\n        ResultDTO<Boolean> resultDTO;\n\n        try {\n\n            Boolean flag = pomService.overridePomFile(\"\", content);\n\n            resultDTO = ResultDTO.handleSuccess(\"SUCCESS\", flag);\n\n        } catch(Exception e) {\n\n            resultDTO = ResultDTO.createExceptionResult(e, Boolean.class);\n        }\n\n        return resultDTO;\n    }\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/crontroller/RegistryController.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.crontroller;\n\nimport com.alibaba.fastjson.JSON;\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.model.RegistryModel;\nimport com.mmc.dubbo.doe.service.ConfigService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.validation.constraints.NotNull;\nimport java.util.List;\n\n/**\n * @author Joey\n * @date 2018/7/9 19:39\n */\n@RestController\n@RequestMapping(\"/doe/zk\")\n@Slf4j\npublic class RegistryController {\n\n    @Autowired\n    private ConfigService configService;\n\n    @RequestMapping(\"/doListZk\")\n    public String doListZk() {\n\n        log.info(\"RegistryController.doListZk()\");\n\n        String result;\n\n        try {\n\n            List<RegistryModel> models = configService.listRegistry();\n            result = JSON.toJSONString(models);\n\n        } catch (Exception e) {\n\n            result = \"[]\";\n        }\n\n        return result;\n    }\n\n\n    @RequestMapping(\"/doListRegistry\")\n    public ResultDTO<Object> doListRegistry() {\n\n        log.info(\"RegistryController.doListRegistry()\");\n\n        ResultDTO<Object> resultDTO = new ResultDTO<>();\n\n        try {\n\n            List<RegistryModel> models = configService.listRegistry();\n            resultDTO.setData(models);\n            resultDTO.setSuccess(true);\n\n        } catch (Exception e) {\n\n            resultDTO = ResultDTO.createExceptionResult(\"occur an error when list registry address : \", e, Object.class);\n        }\n\n        return resultDTO;\n    }\n\n    @RequestMapping(\"/addRegistry\")\n    public ResultDTO<RegistryModel> addRegistry(@NotNull RegistryModel dto) {\n\n        log.info(\"RegistryController.addRegistry({})\", JSON.toJSONString(dto));\n\n        ResultDTO<RegistryModel> resultDTO;\n\n        try {\n\n            resultDTO = configService.addRegistry(dto);\n\n        } catch (Exception e) {\n\n            resultDTO = ResultDTO.createExceptionResult(e, RegistryModel.class);\n        }\n\n        return resultDTO;\n    }\n\n    @RequestMapping(\"/delRegistry\")\n    public ResultDTO<RegistryModel> delRegistry(@NotNull RegistryModel dto) {\n\n        log.info(\"RegistryController.delRegistry({})\", JSON.toJSONString(dto));\n\n        ResultDTO<RegistryModel> resultDTO;\n\n        try {\n\n            resultDTO = configService.delRegistry(dto);\n\n        } catch (Exception e) {\n\n            resultDTO = ResultDTO.createExceptionResult(e, RegistryModel.class);\n        }\n\n        return resultDTO;\n    }\n\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/crontroller/SysConfController.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.crontroller;\n\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.service.PomService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletResponse;\nimport java.net.MalformedURLException;\n\n/**\n * @author Joey\n * @date 2018/10/30 16:28\n */\n@Slf4j\n@RestController\n@RequestMapping(\"/doe/sys\")\npublic class SysConfController {\n\n    @Value(\"${doe.watchdog.url}\")\n    private String url;\n\n    @Resource\n    private PomService pomService;\n\n    @RequestMapping(\"/doReload\")\n    public ResultDTO<String> doReload(HttpServletResponse response) {\n\n        log.info(\"SysConfController.doReload\");\n\n        try {\n\n            return pomService.loadJars(\"\");\n\n        } catch (NoSuchMethodException | MalformedURLException e) {\n\n            return ResultDTO.handleException(null, null, e);\n        }\n\n    }\n\n    @RequestMapping(\"/doRepublish\")\n    public ResultDTO<String> doRepublish(HttpServletResponse response) {\n\n        log.info(\"SysConfController.doRepublish\");\n\n        return pomService.deleteJars(\"\");\n\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/dao/CaseDAO.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.dao;\n\nimport com.mmc.dubbo.doe.model.CaseModel;\n\nimport java.util.List;\n\n/**\n * @author Joey\n * @date 2018/6/29 15:36\n */\npublic interface CaseDAO {\n\n    /**\n     * save the case.\n     *\n     * @param model\n     * @return\n     */\n    int save(CaseModel model);\n\n    /**\n     * list all model.\n     * @return\n     */\n    List<CaseModel> listAll();\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/dto/BaseDTO.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.dto;\n\nimport java.util.concurrent.atomic.AtomicLong;\n\n/**\n * @author Joey\n * @date 2018/6/17 10:11\n */\npublic class BaseDTO {\n\n    private static final AtomicLong counter = new AtomicLong();\n\n    private final String requestId;\n\n    public BaseDTO() {\n\n        this.requestId = String.valueOf(counter.getAndAdd(1));\n    }\n\n    public String getRequestId() {\n        return requestId;\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/dto/CaseModelDTO.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.dto;\n\nimport com.mmc.dubbo.doe.model.CaseModel;\n\n/**\n * @author Joey\n * @date 2018/6/29 15:58\n */\npublic class CaseModelDTO extends CaseModel {\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/dto/ConnectDTO.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.dto;\n\nimport lombok.Data;\n\n/**\n * @author Joey\n * @date 2018/6/18 19:10\n */\n@Data\npublic class ConnectDTO extends BaseDTO {\n\n    /**\n     * ip and port.\n     */\n    private String conn;\n    /**\n     * interface name;\n     */\n    private String serviceName;\n    /**\n     * the provider cache key.\n     */\n    private String providerKey;\n    /**\n     * method key.\n     */\n    private String methodKey;\n    /**\n     * method name.\n     */\n    private String methodName;\n    /**\n     * method params.\n     */\n    private String json;\n    /**\n     * timeout of waiting for result.\n     */\n    private int timeout;\n    /**\n     * interface version number, eg: 1.0.0\n     */\n    private String version;\n    /**\n     * the group of interface, eg: mmcgroup\n     */\n    private String group;\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/dto/MethodModelDTO.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.dto;\n\nimport com.mmc.dubbo.doe.model.MethodModel;\nimport lombok.Data;\n\n/**\n * @author Joey\n * @date 2018/6/18 21:49\n */\n@Data\npublic class MethodModelDTO {\n\n    /**\n     * the name of interface which the method belong to.\n     */\n    private String interfaceName;\n    /**\n     * the cache key.\n     */\n    private String methodKey;\n    /**\n     * just only the method name.\n     */\n    private String methodName;\n    /**\n     * show on the web.\n     */\n    private String methodText;\n\n    public MethodModelDTO() {\n\n    }\n\n    public MethodModelDTO(MethodModel model) {\n\n        this.methodKey = model.getKey();\n        this.methodName = model.getMethod().getName();\n        this.methodText = model.getMethodText();\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/dto/PomDTO.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.dto;\n\nimport lombok.Data;\n\n/**\n * @author Joey\n * @date 2018/6/17 10:03\n */\n@Data\npublic class PomDTO extends BaseDTO {\n\n    /**\n     * the pom xml content.\n     */\n    private String pom;\n\n    /**\n     * the path of pom file.\n     */\n    private String path;\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/dto/ResultDTO.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.dto;\n\nimport com.alibaba.dubbo.common.utils.StringUtils;\nimport lombok.Data;\n\n/**\n * common result.\n *\n * @author Joey\n * @date 2018/6/17 9:30\n */\n@Data\npublic class ResultDTO<T> {\n\n    private static final long serialVersionUID = 1789151585L;\n    private static final int DEFAULT_EXCEPTION_CODE = -1; // 默认异常码\n    private static final int DEFAULT_SUCCESS_CODE = 1; // 默认成功吗\n    private static final int DEFAULT_ERROR_CODE = 0; // 默认错误吗\n\n    private int code; // 响应码\n    private boolean success; // 执行结果标识\n    private String msg; // 消息\n    private String remark; // 备注\n    private T data; // 附带数据\n    private Throwable exception; // 异常\n\n    public static <T> ResultDTO<T> handleSuccess(String msg, T data) {\n\n        ResultDTO<T> ret = new ResultDTO<>();\n        ret.setCode(DEFAULT_SUCCESS_CODE);\n        ret.setSuccess(true);\n        ret.setMsg(msg);\n        ret.setRemark(\"success\");\n        ret.setData(data);\n        ret.setException(null);\n        return ret;\n\n    }\n    public static <T> ResultDTO<T> handleError(String msg, T data) {\n        ResultDTO<T> ret = new ResultDTO<>();\n        ret.setCode(DEFAULT_ERROR_CODE);\n        ret.setMsg(msg);\n        ret.setSuccess(false);\n        ret.setRemark(\"occur an error\");\n        ret.setData(data);\n        ret.setException(null);\n        return ret;\n    }\n    public static <T> ResultDTO<T> handleException(String msg, T data, Throwable e) {\n        ResultDTO<T> ret = new ResultDTO<>();\n        ret.setCode(DEFAULT_EXCEPTION_CODE);\n        ret.setSuccess(false);\n        ret.setMsg(null == msg ? e.getMessage() : msg);\n        ret.setRemark(\"occur an exception\");\n        ret.setData(data);\n        ret.setException(e);\n        return ret;\n\n    }\n\n    public static <T> ResultDTO<T> createExceptionResult(Throwable e, Class<T> clazz) {\n\n        return createExceptionResult(\"\", e, clazz);\n    }\n\n    public static <T> ResultDTO<T> createExceptionResult(String msg, Throwable e, Class<T> clazz) {\n\n        ResultDTO<T> ret = new ResultDTO<>();\n        ret.setCode(DEFAULT_EXCEPTION_CODE);\n        ret.setSuccess(false);\n        ret.setMsg(StringUtils.isEmpty(msg) ? e.getMessage() : msg);\n        ret.setRemark(\"occur an exception\");\n        ret.setData(null);\n        ret.setException(e);\n        return ret;\n    }\n\n    public static <T> ResultDTO<T> createErrorResult(String msg, Class<T> clazz) {\n        ResultDTO<T> ret = new ResultDTO<>();\n        ret.setCode(DEFAULT_ERROR_CODE);\n        ret.setMsg(msg);\n        ret.setSuccess(false);\n        ret.setRemark(\"occur an error\");\n        ret.setData(null);\n        ret.setException(null);\n        return ret;\n    }\n\n    public static <T> ResultDTO<T> createSuccessResult(String msg, Class<T> clazz) {\n       return createSuccessResult(msg, null, clazz);\n    }\n\n    public static <T> ResultDTO<T> createSuccessResult(String msg, T data, Class<T> clazz) {\n        ResultDTO<T> ret = new ResultDTO<>();\n        ret.setCode(DEFAULT_SUCCESS_CODE);\n        ret.setSuccess(true);\n        ret.setMsg(msg);\n        ret.setRemark(\"success\");\n        ret.setData(data);\n        ret.setException(null);\n        return ret;\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/dto/UrlModelDTO.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.dto;\n\nimport lombok.Data;\n\n/**\n * @author Joey\n * @date 2018/6/18 21:19\n */\n@Data\npublic class UrlModelDTO {\n\n    private String key;\n    private String host;\n    private Integer port;\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/exception/DoeException.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.exception;\n\n/**\n * @author Joey\n * @date 2018/6/13 19:29\n */\npublic class DoeException extends RuntimeException {\n\n    public DoeException(String message) {\n        super(message);\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/handler/CuratorHandler.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.handler;\n\nimport com.alibaba.dubbo.common.Constants;\nimport com.alibaba.dubbo.common.URL;\nimport com.alibaba.dubbo.common.utils.StringUtils;\nimport com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry;\nimport com.alibaba.dubbo.remoting.zookeeper.ZookeeperClient;\nimport com.alibaba.dubbo.remoting.zookeeper.curator.CuratorZookeeperTransporter;\nimport com.mmc.dubbo.doe.cache.MethodCaches;\nimport com.mmc.dubbo.doe.cache.UrlCaches;\nimport com.mmc.dubbo.doe.dto.ConnectDTO;\nimport com.mmc.dubbo.doe.dto.MethodModelDTO;\nimport com.mmc.dubbo.doe.exception.DoeException;\nimport com.mmc.dubbo.doe.model.ServiceModel;\nimport com.mmc.dubbo.doe.model.UrlModel;\n\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Method;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @author Joey\n * @date 2018/6/15 10:21\n */\npublic class CuratorHandler {\n\n    private final String protocol;\n    private final String host;\n    private final int port;\n    private ZookeeperClient zkClient;\n    private ZookeeperRegistry registry;\n    private String root = \"/dubbo\";\n\n    public CuratorHandler(String protocol, String host, int port) {\n        this.protocol = protocol;\n        this.host = host;\n        this.port = port;\n    }\n\n    public void doConnect() throws NoSuchFieldException, IllegalAccessException {\n\n        CuratorZookeeperTransporter zookeeperTransporter = new CuratorZookeeperTransporter();\n        URL url = new URL(protocol, host, port);\n\n        registry = new ZookeeperRegistry(url, zookeeperTransporter);\n\n        Field field = registry.getClass().getDeclaredField(\"zkClient\");\n        field.setAccessible(true);\n        zkClient = (ZookeeperClient) field.get(registry);\n\n    }\n\n    public List<ServiceModel> getInterfaces() {\n        List<ServiceModel> ret = new ArrayList<>();\n        List<String> list = zkClient.getChildren(root);\n        for (int i = 0; i < list.size(); i++) {\n            ServiceModel model = new ServiceModel();\n            model.setServiceName(list.get(i));\n            ret.add(model);\n        }\n\n        return ret;\n    }\n\n    public List<UrlModel> getProviders(ConnectDTO dto) {\n\n        if (null == dto) {\n            throw new DoeException(\"dto can't be null.\");\n        }\n        if (StringUtils.isEmpty(dto.getServiceName())) {\n            throw new DoeException(\"service name can't be null.\");\n        }\n\n        Map<String, String> map = new HashMap<>();\n        map.put(Constants.INTERFACE_KEY, dto.getServiceName());\n\n        if (StringUtils.isNotEmpty(dto.getVersion())) {\n            map.put(Constants.VERSION_KEY, dto.getVersion());\n        }\n        if (StringUtils.isNotEmpty(dto.getGroup())) {\n            map.put(Constants.GROUP_KEY, dto.getGroup());\n        }\n\n        URL url = new URL(protocol, host, port, map);\n        List<URL> list = registry.lookup(url);\n\n        return UrlCaches.cache(dto.getServiceName(), list);\n    }\n\n    public List<MethodModelDTO> getMethods(String interfaceName) throws ClassNotFoundException {\n\n        Class<?> clazz = Class.forName(interfaceName);\n        Method[] methods = clazz.getMethods();\n\n        return MethodCaches.cache(interfaceName, methods); // 缓存一份，方便下次调用\n\n    }\n\n    public void close() {\n        registry.destroy();\n    }\n\n    public boolean isAvailable() {\n        return registry.isAvailable();\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/handler/SendReceiveHandler.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.handler;\n\nimport com.alibaba.dubbo.remoting.Channel;\nimport com.alibaba.dubbo.remoting.ChannelHandler;\nimport com.alibaba.dubbo.remoting.RemotingException;\nimport com.alibaba.dubbo.remoting.TimeoutException;\nimport com.alibaba.dubbo.remoting.exchange.Request;\nimport com.alibaba.dubbo.remoting.exchange.Response;\nimport com.alibaba.dubbo.rpc.RpcResult;\nimport com.alibaba.fastjson.JSON;\nimport com.mmc.dubbo.doe.context.ResponseDispatcher;\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * nio event listener.\n * @author Joey\n * @date 2018/6/7 10:55\n */\n@Slf4j\npublic class SendReceiveHandler implements ChannelHandler {\n\n\n    @Override\n    public void connected(Channel channel) throws RemotingException {\n        log.info(\"SendReceiveHandler.connected\");\n    }\n\n    @Override\n    public void disconnected(Channel channel) throws RemotingException {\n        log.info(\"SendReceiveHandler.disconnected\");\n    }\n\n    @Override\n    public void sent(Channel channel, Object message) throws RemotingException {\n\n        log.info(\"SendReceiveHandler.sent\");\n\n        if (message instanceof Request) {\n\n            Request req = (Request) message;\n            ResponseDispatcher.getDispatcher().register(req);\n\n        }\n    }\n\n    @Override\n    public void received(Channel channel, Object message) {\n\n        log.info(\"SendReceiveHandler.received({})\", JSON.toJSONString(message));\n\n        if (message instanceof Response) {\n\n            Response res = (Response) message;\n\n            if (res.getStatus() == Response.OK) {\n                try {\n\n                    if (res.getResult() instanceof RpcResult) {\n                        ResponseDispatcher.getDispatcher().dispatch(res);\n                    }\n\n                } catch (Exception e) {\n                    log.error(\"callback invoke error .result:\" + res.getResult() + \",url:\" + channel.getUrl(), e);\n                }\n            } else if (res.getStatus() == Response.CLIENT_TIMEOUT || res.getStatus() == Response.SERVER_TIMEOUT) {\n                try {\n                    TimeoutException te = new TimeoutException(res.getStatus() == Response.SERVER_TIMEOUT, channel, res.getErrorMessage());\n//                    callbackCopy.caught(te);\n                } catch (Exception e) {\n                    log.error(\"callback invoke error ,url:\" + channel.getUrl(), e);\n                }\n            } else {\n                try {\n                    RuntimeException re = new RuntimeException(res.getErrorMessage());\n//                    callbackCopy.caught(re);\n                } catch (Exception e) {\n                    log.error(\"callback invoke error ,url:\" + channel.getUrl(), e);\n                }\n            }\n        }\n    }\n\n    @Override\n    public void caught(Channel channel, Throwable exception) throws RemotingException {\n        log.error(\"SendReceiveHandler.caught\", exception);\n    }\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/handler/StreamHandler.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.handler;\n\nimport com.alibaba.dubbo.common.utils.StringUtils;\nimport com.mmc.dubbo.doe.cache.RedisResolver;\nimport com.mmc.dubbo.doe.context.Const;\nimport com.mmc.dubbo.doe.dto.PomDTO;\nimport com.mmc.dubbo.doe.util.StringUtil;\nimport lombok.extern.slf4j.Slf4j;\n\nimport java.io.BufferedReader;\nimport java.io.InputStreamReader;\n\n/**\n * @author Joey\n * @date 2018/6/29 20:20\n */\n@Slf4j\npublic class StreamHandler implements Runnable {\n\n    private final String libPath;\n    private final RedisResolver redisResolver;\n    private final String requestId;\n    private final Process ps;\n\n    public StreamHandler(Process ps, RedisResolver redisResolver, String requestId, String libPath) {\n        this.ps = ps;\n        this.redisResolver = redisResolver;\n        this.requestId = requestId;\n        this.libPath = libPath;\n    }\n\n    /**\n     * When an object implementing interface <code>Runnable</code> is used\n     * to create a thread, starting the thread causes the object's\n     * <code>run</code> method to be called in that separately executing\n     * thread.\n     * <p>\n     * The general contract of the method <code>run</code> is that it may\n     * take any action whatsoever.\n     *\n     * @see Thread#run()\n     */\n    @Override\n    public void run() {\n\n        log.info(\"begin to put the message into redis.\");\n\n        // 获取标准输出\n        BufferedReader readStdout = new BufferedReader(new InputStreamReader(ps.getInputStream()));\n        // 获取错误输出\n        BufferedReader readStderr = new BufferedReader(new InputStreamReader(ps.getErrorStream()));\n        try {\n\n            // auto expire\n            String key = StringUtil.format(Const.DOE_DOWNLOAD_JAR_MESSAGE, requestId);\n            redisResolver.rPush(key, \"\");\n            redisResolver.expire(key, 15 * 60); // ten minute\n\n            String successLine;\n            String errorLine = null;\n            while (null != (successLine = readStdout.readLine()) || (errorLine = readStderr.readLine()) != null) {\n\n                if (StringUtils.isNotEmpty(successLine)) {\n                    putToRedis(requestId, successLine);\n                }\n                if (StringUtils.isNotEmpty(errorLine)) {\n                    putToRedis(requestId, errorLine);\n                }\n            }\n\n            log.info(\"finish download the jars to the path {}.\", libPath);\n\n        } catch (Exception e) {\n\n            log.error(\"occur something wrong when download the jars.\", e);\n\n        } finally {\n\n            try {\n\n                readStdout.close();\n                readStderr.close();\n\n            } catch (Exception e) {\n                log.error(\"occur something wrong when close resources\", e);\n            }\n        }\n    }\n\n    private void putToRedis(String requestId, String message) {\n\n        log.info(\"{}|{}\", requestId, message);\n\n        String key = StringUtil.format(Const.DOE_DOWNLOAD_JAR_MESSAGE, requestId);\n\n        redisResolver.rPush(key, message);\n\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/model/CaseModel.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.model;\n\nimport lombok.Data;\n\nimport java.util.Date;\nimport java.util.Map;\n\n/**\n * @author Joey\n * @date 2018/6/28 10:42\n */\n@Data\npublic class CaseModel {\n\n    /**\n     * case Id.\n     */\n    private long caseId;\n    /**\n     * case group.\n     */\n    private String caseGroup;\n    private String caseName;\n    private String caseDesc;\n    private String insertTime;\n    /**\n     * provider address.\n     */\n    private String address;\n    private String interfaceName;\n    /**\n     * the method name with parameters.\n     */\n    private String methodText;\n    private String providerKey;\n    private String methodKey;\n    /**\n     * parameters.\n     */\n    private String json;\n    /**\n     * assert condition.\n     */\n    private String condition;\n    /**\n     * expected result.\n     */\n    private String expect;\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/model/MethodModel.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.model;\n\nimport com.alibaba.dubbo.common.utils.StringUtils;\nimport com.mmc.dubbo.doe.util.StringUtil;\n\nimport java.lang.reflect.Method;\nimport java.lang.reflect.Parameter;\n\n/**\n * @author Joey\n * @date 2018/6/15 14:54\n */\npublic class MethodModel {\n\n    private final Method method;\n    private final String key;\n\n    public String getKey() {\n        return key;\n    }\n\n    public Method getMethod() {\n        return method;\n    }\n\n    public MethodModel(String key, Method method) {\n        this.key = key;\n        this.method = method;\n    }\n\n    @Override\n    public String toString() {\n\n        StringBuilder sb = new StringBuilder();\n        sb.append(method.getName());\n        sb.append(\"(\");\n\n        for (Parameter param : method.getParameters()) {\n            sb.append(param.getType().getName());\n            sb.append(\" \");\n            sb.append(param.getName());\n            sb.append(\", \");\n        }\n        sb.delete(sb.length() - 2, sb.length());\n        sb.append(\")\");\n\n        return sb.toString();\n\n    }\n\n    public String getMethodText() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(method.getName());\n        sb.append(\"(\");\n\n        for (Parameter param : method.getParameters()) {\n            sb.append(getShortType(param.getType().getName()));\n            sb.append(\" \");\n            sb.append(param.getName());\n            sb.append(\", \");\n        }\n        sb.delete(sb.length() - 2, sb.length());\n        sb.append(\")\");\n\n        return sb.toString();\n    }\n\n    private String getShortType(String name) {\n\n        if (StringUtils.isEmpty(name)) {\n            return name;\n        }\n        int index = name.lastIndexOf(\".\");\n        if (index > 0 && index < name.length()) {\n            name = name.substring(index + 1);\n        }\n        return name;\n    }\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/model/PointModel.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.model;\n\nimport lombok.Data;\n\n/**\n * ip and port.\n *\n * @author Joey\n * @date 2018/7/18 10:17\n */\n@Data\npublic class PointModel {\n\n    private String ip;\n    private int port;\n\n    public PointModel(String host, Integer port) {\n        this.ip = host;\n        this.port = port;\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/model/PomModel.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.model;\n\nimport com.alibaba.dubbo.common.utils.StringUtils;\n\n/**\n * @author Joey\n * @date 2018/6/16 9:55\n */\npublic class PomModel {\n\n    private String groupId;\n    private String artifactId;\n    private String version;\n    private String scope;\n\n    public String getGroupId() {\n        return groupId;\n    }\n\n    public void setGroupId(String groupId) {\n        this.groupId = groupId;\n    }\n\n    public String getArtifactId() {\n        return artifactId;\n    }\n\n    public void setArtifactId(String artifactId) {\n        this.artifactId = artifactId;\n    }\n\n    public String getVersion() {\n        return version;\n    }\n\n    public void setVersion(String version) {\n        this.version = version;\n    }\n\n    public String getScope() {\n        return scope;\n    }\n\n    public void setScope(String scope) {\n        this.scope = scope;\n    }\n\n    public boolean isBroken() {\n        return StringUtils.isEmpty(groupId) || StringUtils.isEmpty(artifactId) || StringUtils.isEmpty(version);\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/model/RegistryModel.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.model;\n\nimport lombok.Data;\n\n/**\n * @author Joey\n * @date 2018/7/9 19:42\n */\n@Data\npublic class RegistryModel {\n\n    private String registryKey;\n    private String registryDesc;\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/model/ServiceModel.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.model;\n\nimport lombok.Data;\n\n/**\n * interface wrapper.\n *\n * @author Joey\n * @date 2018/6/18 17:51\n */\n@Data\npublic class ServiceModel {\n\n    private String serviceName;\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/model/UrlModel.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.model;\n\nimport com.alibaba.dubbo.common.URL;\n\n/**\n * @author Joey\n * @date 2018/6/15 17:56\n */\npublic class UrlModel {\n\n    private final String key;\n    private final URL url;\n\n    public UrlModel(String key, URL url) {\n        this.key = key;\n        this.url = url;\n    }\n\n    public String getKey() {\n        return key;\n    }\n\n    public URL getUrl() {\n        return url;\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/service/CaseService.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\n\npackage com.mmc.dubbo.doe.service;\n\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.model.CaseModel;\n\nimport java.util.List;\n\n/**\n * @author Joey\n * @date 2018/6/29 15:21\n */\npublic interface CaseService {\n\n    /**\n     * save the case.\n     *\n     * @param model\n     * @return\n     */\n    ResultDTO<CaseModel> save(CaseModel model);\n\n    /**\n     * list all case.\n     *\n     * @return\n     */\n    List<Object> listAll();\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/service/ClassService.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\n\npackage com.mmc.dubbo.doe.service;\n\nimport com.mmc.dubbo.doe.dto.ConnectDTO;\nimport com.mmc.dubbo.doe.dto.MethodModelDTO;\nimport com.mmc.dubbo.doe.dto.ResultDTO;\n\nimport javax.validation.constraints.NotNull;\nimport java.util.List;\n\n/**\n * @author Joey\n * @date 2018/6/28 11:28\n */\npublic interface ClassService {\n\n    /**\n     * generate the simple json string of the method parameters.\n     *\n     * @param dto\n     * @return\n     */\n    ResultDTO<String> generateMethodParamsJsonString(@NotNull MethodModelDTO dto) throws ClassNotFoundException, InstantiationException, IllegalAccessException;\n\n    /**\n     * get all methods from the given interface.\n     *\n     * @param dto\n     * @return\n     */\n    List<MethodModelDTO> listMethods(ConnectDTO dto);\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/service/ConfigService.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\n\npackage com.mmc.dubbo.doe.service;\n\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.model.RegistryModel;\n\nimport java.util.List;\n\n/**\n * @author Joey\n * @date 2018/7/9 19:40\n */\npublic interface ConfigService {\n\n    /**\n     * list all registry.\n     *\n     * @return\n     */\n    List<RegistryModel> listRegistry();\n\n    /**\n     * add registry.\n     *\n     * @return\n     */\n    ResultDTO<RegistryModel> addRegistry(RegistryModel model);\n\n    /**\n     * load zk config.\n     */\n    void loadZkConfigFromResource();\n\n    /**\n     * delete registry.\n     *\n     * @param model\n     * @return\n     */\n    ResultDTO<RegistryModel> delRegistry(RegistryModel model);\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/service/ConnectService.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.service;\n\nimport com.mmc.dubbo.doe.dto.ConnectDTO;\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.dto.MethodModelDTO;\nimport com.mmc.dubbo.doe.dto.UrlModelDTO;\nimport com.mmc.dubbo.doe.model.ServiceModel;\n\nimport javax.validation.constraints.NotNull;\nimport java.util.List;\n\n/**\n * @author Joey\n * @date 2018/6/18 17:10\n */\npublic interface ConnectService {\n\n    /**\n     * connect to zk and get all providers.\n     *\n     * @param conn\n     * @return\n     */\n    List<ServiceModel> connect(@NotNull String conn) throws NoSuchFieldException, IllegalAccessException;\n\n    /**\n     * list providers of service.\n     *\n     * @param connect\n     * @return\n     */\n    List<UrlModelDTO> listProviders(@NotNull ConnectDTO connect) throws NoSuchFieldException, IllegalAccessException;\n\n    /**\n     * send request to the real dubbo server.\n     *\n     * @param dto\n     * @return\n     */\n    ResultDTO<String> send(ConnectDTO dto) throws Exception;\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/service/MenuService.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.service;\n\n/**\n * @author Joey\n * @date 2018/11/26 16:20\n */\npublic interface MenuService {\n\n    /**\n     * get url map to the mid.\n     *\n     * @param mid menuId\n     * @return the menu mrl\n     */\n    String getUrl(Integer mid);\n\n    /**\n     * get the menu text.\n     * @return\n     */\n    String getHtml();\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/service/PomService.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\n\npackage com.mmc.dubbo.doe.service;\n\nimport com.mmc.dubbo.doe.dto.PomDTO;\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.model.PomModel;\nimport org.xml.sax.SAXException;\n\nimport javax.validation.constraints.NotNull;\nimport javax.xml.parsers.ParserConfigurationException;\nimport java.io.IOException;\nimport java.net.MalformedURLException;\nimport java.util.List;\n\n/**\n * @author Joey\n * @date 2018/6/17 9:41\n */\npublic interface PomService {\n\n    /**\n     * download jar, push message to redis.\n     * <br>\n     *     it's a backdoor.\n     *\n     * @return\n     */\n    ResultDTO<PomDTO> invoke() throws Exception;\n\n    /**\n     * parse pom, download jar, push message to redis.\n     *\n     * @param dto\n     * @return\n     */\n    ResultDTO<PomDTO> invoke(PomDTO dto) throws Exception;\n\n    /**\n     * do parse pom.\n     *\n     * @param xml\n     * @return\n     * @throws IOException\n     * @throws SAXException\n     */\n    List<PomModel> parsePom(@NotNull String xml) throws IOException, SAXException;\n\n    /**\n     * do append content to the end of pom.xml.\n     *\n     * @param models\n     * @param pomXml\n     * @throws Exception\n     */\n    void appendPom(List<PomModel> models, @NotNull String pomXml) throws Exception;\n\n    /**\n     * get the real time message from redis.\n     *\n     * @param requestId\n     * @return\n     */\n    ResultDTO<String> getRealTimeMsg(@NotNull String requestId);\n\n    /**\n     * load jars.\n     *\n     * @param libPath the lib full path.\n     * @return\n     */\n    ResultDTO<String> loadJars(String libPath) throws NoSuchMethodException, MalformedURLException;\n\n    /**\n     * list all dependency.\n     *\n     * @param dto\n     * @return\n     */\n    List<PomModel> listJars(PomDTO dto) throws ParserConfigurationException, IOException, SAXException;\n\n    /**\n     * read the content from pom xml.\n     *\n     * @param pomXmlPath the path of pom xml file\n     * @return the pom content\n     */\n    String loadPomFile(String pomXmlPath);\n\n    /**\n     * override the content of pom xml.\n     *\n     * @param pomXmlPath the path of pom xml file\n     * @param content text\n     */\n    Boolean overridePomFile(String pomXmlPath, String content);\n\n    /**\n     * delete all jars in the specifiy path.\n     */\n    ResultDTO<String> deleteJars(String path);\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/service/TelnetService.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\n\npackage com.mmc.dubbo.doe.service;\n\nimport com.mmc.dubbo.doe.dto.ConnectDTO;\nimport com.mmc.dubbo.doe.dto.ResultDTO;\n\nimport javax.validation.constraints.NotNull;\n\n/**\n * @author Joey\n * @date 2018/7/17 15:10\n */\npublic interface TelnetService {\n\n    /**\n     * send message with telnet client.\n     * @param dto\n     * @return\n     */\n    ResultDTO<String> send(@NotNull ConnectDTO dto);\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/service/impl/CaseServiceImpl.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.service.impl;\n\nimport com.alibaba.dubbo.common.Constants;\nimport com.alibaba.dubbo.common.utils.StringUtils;\nimport com.mmc.dubbo.doe.cache.MethodCaches;\nimport com.mmc.dubbo.doe.cache.RedisResolver;\nimport com.mmc.dubbo.doe.cache.UrlCaches;\nimport com.mmc.dubbo.doe.context.Const;\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.exception.DoeException;\nimport com.mmc.dubbo.doe.model.CaseModel;\nimport com.mmc.dubbo.doe.service.CaseService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.util.CollectionUtils;\n\nimport javax.validation.constraints.NotNull;\nimport java.time.LocalDateTime;\nimport java.time.format.DateTimeFormatter;\nimport java.util.Date;\nimport java.util.List;\nimport java.util.concurrent.atomic.AtomicLong;\n\n/**\n * @author Joey\n * @date 2018/6/29 15:20\n */\n@Service(\"caseService\")\npublic class CaseServiceImpl implements CaseService {\n\n    @Autowired\n    private RedisResolver redisResolver;\n\n    private static final AtomicLong counter = new AtomicLong();\n\n    /**\n     * save the case.\n     *\n     * @param model\n     * @return\n     */\n    @Override\n    public ResultDTO<CaseModel> save(@NotNull CaseModel model) {\n\n        if (StringUtils.isEmpty(model.getProviderKey())) {\n            throw new DoeException(\"获取不到提供者！\");\n        }\n        if (StringUtils.isEmpty(model.getMethodKey())) {\n            throw new DoeException(\"获取不到方法！\");\n        }\n\n        model.setAddress(UrlCaches.get(model.getProviderKey()).getUrl().getAddress());\n        model.setInterfaceName(UrlCaches.get(model.getProviderKey()).getUrl().getParameter(Constants.INTERFACE_KEY ));\n        model.setMethodText(MethodCaches.get(model.getMethodKey()).getMethodText());\n        model.setCaseId(counter.getAndAdd(1));\n        model.setInsertTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\")));\n\n        redisResolver.rPush(Const.DOE_CASE_KEY, model);\n\n        // TODO\n        // save to db.\n\n        return ResultDTO.createSuccessResult(\"SUCCESS\", model, CaseModel.class);\n    }\n\n    /**\n     * list all case.\n     *\n     * @return\n     */\n    @Override\n    public List<Object> listAll() {\n\n        List<Object> list = redisResolver.lGet(Const.DOE_CASE_KEY, 0, -1);\n\n        if (CollectionUtils.isEmpty(list)) {\n\n            // TODO\n            // get from db and put them to cache.\n\n        }\n\n        return list;\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/service/impl/ClassServiceImpl.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.service.impl;\n\nimport com.alibaba.dubbo.common.Constants;\nimport com.alibaba.dubbo.common.utils.StringUtils;\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.serializer.SerializerFeature;\nimport com.mmc.dubbo.doe.cache.MethodCaches;\nimport com.mmc.dubbo.doe.cache.UrlCaches;\nimport com.mmc.dubbo.doe.context.Const;\nimport com.mmc.dubbo.doe.context.DoeClassLoader;\nimport com.mmc.dubbo.doe.dto.ConnectDTO;\nimport com.mmc.dubbo.doe.dto.MethodModelDTO;\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.exception.DoeException;\nimport com.mmc.dubbo.doe.model.MethodModel;\nimport com.mmc.dubbo.doe.model.UrlModel;\nimport com.mmc.dubbo.doe.service.ClassService;\nimport com.mmc.dubbo.doe.util.StringUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.RandomUtils;\nimport org.springframework.cache.annotation.Cacheable;\nimport org.springframework.stereotype.Service;\nimport org.springframework.util.ReflectionUtils;\n\nimport javax.validation.constraints.NotNull;\nimport java.lang.reflect.*;\nimport java.util.*;\n\n/**\n * @author Joey\n * @date 2018/6/28 11:32\n */\n@Service(\"classService\")\n@Slf4j\npublic class ClassServiceImpl implements ClassService {\n\n\n    @Override\n    @Cacheable(value = Const.DOE_CACHE_PREFIX, key = \"#dto.serviceName\")\n    public List<MethodModelDTO> listMethods(ConnectDTO dto) {\n\n        log.info(\"begin to invoke listMethods({})\", JSON.toJSONString(dto));\n\n        String interfaceName = dto.getServiceName();\n\n        if (StringUtils.isEmpty(interfaceName)) {\n\n            // get provider\n            UrlModel provider = UrlCaches.get(dto.getProviderKey());\n            if (null == provider) {\n                throw new DoeException(StringUtil.format(\"can't found the provider key {}.\", dto.getProviderKey()));\n            }\n            interfaceName = provider.getUrl().getParameter(Constants.INTERFACE_KEY);\n        }\n\n        if (StringUtils.isEmpty(interfaceName)) {\n            throw new DoeException(\"interface name and provider cache key can't both be blank.\");\n        }\n\n        try {\n\n            // show only public method\n            // Class<?> clazz = Class.forName(interfaceName);\n            // load classes without affect system class since v1.2.0\n            Class<?> clazz = DoeClassLoader.getClass(interfaceName);\n            Method[] methods = clazz.getMethods();\n            // convert and cache method object associate witch the unique key\n            return MethodCaches.cache(interfaceName, methods);\n\n        } catch (ClassNotFoundException e) {\n            throw new DoeException(\"can't found the interface from classpath, please add the dependency first.\");\n        }\n\n    }\n\n    /**\n     * generate the simple json string of the method parameters.\n     *\n     * @param dto\n     * @return\n     */\n    @Override\n    public ResultDTO<String> generateMethodParamsJsonString(@NotNull MethodModelDTO dto) throws ClassNotFoundException, InstantiationException, IllegalAccessException {\n\n        Method method = null;\n\n        // get method from cache\n        if (StringUtils.isNotEmpty(dto.getMethodKey())) {\n            MethodModel model = MethodCaches.get(dto.getMethodKey());\n            method = (null == model) ? null : model.getMethod();\n        }\n        // search from classpath\n        if (null == method && StringUtils.isNotEmpty(dto.getInterfaceName()) && StringUtils.isNotEmpty(dto.getMethodName())) {\n            method = getMethodByName(dto.getInterfaceName(), dto.getMethodName());\n        }\n        if (null == method) {\n            return ResultDTO.createErrorResult(\n                    StringUtil.format(\"can't find the method[{}] in the interface[{}]\",\n                            dto.getInterfaceName(), dto.getMethodName()), String.class);\n        }\n\n        List<Object> objects = new ArrayList<>();\n        for (Parameter param : method.getParameters()) {\n\n            objects.add(initObject(param.getType(), param.getParameterizedType()));\n\n        }\n\n        String json = JSON.toJSONString(objects, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteDateUseDateFormat);\n        return ResultDTO.createSuccessResult(\"SUCCESS\", json, String.class);\n    }\n\n    /**\n     * we must to make sure we have one no parameter constructor in our class.\n     *\n     * @param clazz\n     * @param type\n     * @return\n     */\n    private Object initObject(Class<?> clazz, Type type) throws IllegalAccessException, InstantiationException {\n\n        log.debug(\"begin to init {}\", clazz.getTypeName());\n\n        if (clazz == Integer.class || clazz == int.class) {\n\n            return RandomUtils.nextInt(0, 1000);\n\n        } else if (clazz == String.class) {\n\n            String base = UUID.randomUUID().toString();\n            return base.substring(RandomUtils.nextInt(1, base.length()));\n\n        } else if (clazz == Long.class || clazz == long.class) {\n\n            return RandomUtils.nextLong(0, 1000);\n\n        } else if (clazz == Short.class || clazz == short.class) {\n\n            return RandomUtils.nextInt(0, 100);\n\n        } else if (clazz == Date.class) {\n\n            return new Date();\n\n        } else if (clazz == List.class) {\n\n            if (null != type) {\n                return initArrayList(type);\n            }\n\n        } else if (clazz == Map.class) {\n\n            return new HashMap<>();\n\n        } else if (clazz == Set.class) {\n\n            return new HashSet<>();\n\n        }\n\n        Object ret;\n        try {\n            ret = clazz.newInstance();\n        } catch (InstantiationException | IllegalAccessException e) {\n            log.debug(\"you should define one no parameter constructor.\", e);\n            return new Object();\n        }\n\n        List<Field> fields = new ArrayList<>();\n        ReflectionUtils.doWithFields(clazz, fields::add);\n        for (Field field : fields) {\n\n            field.setAccessible(true);\n            boolean isStatic = Modifier.isStatic(field.getModifiers());\n            if(isStatic) {\n                continue;\n            }\n            try {\n                field.set(ret, initObject(field.getType(), field.getGenericType()));\n            } catch (Exception e) {\n                log.debug(\"can't set value for the field, you should complete the method initObject(Class<?> clazz, Type type) later.\", e);\n            }\n        }\n\n        return ret;\n    }\n\n    private List<Object> initArrayList(Type genericType) throws InstantiationException, IllegalAccessException {\n\n        List<Object> list = new ArrayList<>();\n\n        if (genericType == null) {\n            return list;\n        }\n        // 如果是泛型参数的类型\n        if (genericType instanceof ParameterizedType) {\n            ParameterizedType pt = (ParameterizedType) genericType;\n            // 得到泛型里的class类型对象\n            Class<?> genericClazz = (Class<?>) pt.getActualTypeArguments()[0];\n            list.add(initObject(genericClazz, null)); // too deep...\n        }\n        return list;\n    }\n\n    /**\n     * we will get wrong result if there are overload method in the interface.\n     *\n     * @param interfaceName\n     * @param methodName\n     * @return\n     * @throws ClassNotFoundException\n     */\n    private Method getMethodByName(String interfaceName, String methodName) throws ClassNotFoundException {\n\n        Class<?> clazz = Class.forName(interfaceName);\n\n        for (Method method : clazz.getDeclaredMethods()) {\n            if (methodName.equals(method.getName())) {\n                return method;\n            }\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/service/impl/ConfigServiceImpl.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.service.impl;\n\nimport com.alibaba.dubbo.common.utils.CollectionUtils;\nimport com.alibaba.dubbo.common.utils.StringUtils;\nimport com.alibaba.fastjson.JSON;\nimport com.mmc.dubbo.doe.cache.RedisResolver;\nimport com.mmc.dubbo.doe.context.Const;\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.exception.DoeException;\nimport com.mmc.dubbo.doe.model.RegistryModel;\nimport com.mmc.dubbo.doe.service.ConfigService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.core.io.Resource;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.PostConstruct;\nimport java.io.BufferedReader;\nimport java.io.InputStreamReader;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.stream.Collectors;\n\n/**\n * @author Joey\n * @date 2018/7/9 19:41\n */\n@Service(\"configService\")\n@Slf4j\npublic class ConfigServiceImpl implements ConfigService {\n\n    @Autowired\n    private RedisResolver redisResolver;\n\n    @Value(\"classpath:registry.json\")\n    private Resource resource;\n\n    /**\n     * list all registry.\n     *\n     * @return\n     */\n    @Override\n    public List<RegistryModel> listRegistry() {\n\n        List<RegistryModel> ret = new ArrayList<>();\n        Set<Object> list = redisResolver.sMembers(Const.DOE_REGISTRY_KEY);\n\n        if (CollectionUtils.isNotEmpty(list)) {\n            ret = list.stream().map(l -> {\n                RegistryModel model = new RegistryModel();\n                BeanUtils.copyProperties(l, model);\n                return model;\n            }).collect(Collectors.toList());\n        }\n\n        return ret;\n    }\n\n    /**\n     * add registry.\n     *\n     * @param model\n     * @return\n     */\n    @Override\n    public ResultDTO<RegistryModel> addRegistry(RegistryModel model) {\n\n\n        if (null == model) {\n            throw new DoeException(\"the paramter can't be null.\");\n        }\n        if (StringUtils.isEmpty(model.getRegistryKey())) {\n            throw new DoeException(\"the registryKey can not be null.\");\n        }\n        if (StringUtils.isEmpty(model.getRegistryDesc())) {\n            throw new DoeException(\"the registryDesc can not be null.\");\n        }\n\n        boolean flag = redisResolver.sAdd(Const.DOE_REGISTRY_KEY, model) > 0;\n        if (flag) {\n            return ResultDTO.createSuccessResult(\"success to add registry.\", RegistryModel.class);\n        } else {\n            return ResultDTO.createErrorResult(\"fail to add registry, check whether if duplicate configuration or not.\", RegistryModel.class);\n        }\n    }\n\n    @Override\n    public ResultDTO<RegistryModel> delRegistry(RegistryModel model) {\n\n        if (null == model) {\n            throw new DoeException(\"the paramter can't be null.\");\n        }\n        if (StringUtils.isEmpty(model.getRegistryKey())) {\n            throw new DoeException(\"the registryKey can not be null.\");\n        }\n        if (StringUtils.isEmpty(model.getRegistryDesc())) {\n            throw new DoeException(\"the registryDesc can not be null.\");\n        }\n\n        boolean flag = redisResolver.sRem(Const.DOE_REGISTRY_KEY, model) > 0;\n        if (flag) {\n            return ResultDTO.createSuccessResult(\"success to delete registry.\", RegistryModel.class);\n        } else {\n            return ResultDTO.createErrorResult(\"fail to delete registry, check whether if the configuration exists or not.\", RegistryModel.class);\n        }\n    }\n\n    @PostConstruct\n    public void loadConfig() {\n\n        log.info(\"ConfigServiceImpl.loadConfig()\");\n\n        loadZkConfigFromResource();\n\n    }\n\n    @Override\n    public void loadZkConfigFromResource() {\n\n        try {\n\n            BufferedReader tBufferedReader = new BufferedReader(new InputStreamReader(resource.getInputStream()));\n\n            StringBuilder sb = new StringBuilder();\n\n            String sTempOneLine;\n\n            while ((sTempOneLine = tBufferedReader.readLine()) != null) {\n\n                sb.append(sTempOneLine);\n\n            }\n\n            List<RegistryModel> list = JSON.parseArray(sb.toString(), RegistryModel.class);\n            redisResolver.sAdd(Const.DOE_REGISTRY_KEY,list.toArray());\n\n\n        } catch (Exception e) {\n\n            log.error(\"occur an error when reading zk address configuration.\", e);\n\n        }\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/service/impl/ConnectServiceImpl.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.service.impl;\n\nimport com.alibaba.dubbo.common.Constants;\nimport com.alibaba.dubbo.common.URL;\nimport com.alibaba.dubbo.remoting.exchange.Request;\nimport com.alibaba.dubbo.rpc.RpcInvocation;\nimport com.alibaba.dubbo.rpc.RpcResult;\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.serializer.SerializerFeature;\nimport com.mmc.dubbo.doe.cache.CuratorCaches;\nimport com.mmc.dubbo.doe.cache.MethodCaches;\nimport com.mmc.dubbo.doe.cache.UrlCaches;\nimport com.mmc.dubbo.doe.client.DoeClient;\nimport com.mmc.dubbo.doe.context.ResponseDispatcher;\nimport com.mmc.dubbo.doe.dto.ConnectDTO;\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.dto.UrlModelDTO;\nimport com.mmc.dubbo.doe.exception.DoeException;\nimport com.mmc.dubbo.doe.handler.CuratorHandler;\nimport com.mmc.dubbo.doe.model.MethodModel;\nimport com.mmc.dubbo.doe.model.ServiceModel;\nimport com.mmc.dubbo.doe.model.UrlModel;\nimport com.mmc.dubbo.doe.service.ConnectService;\nimport com.mmc.dubbo.doe.util.ParamUtil;\nimport com.mmc.dubbo.doe.util.StringUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Service;\n\nimport javax.validation.constraints.NotNull;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * @author Joey\n * @date 2018/6/18 17:10\n */\n@Service(\"connectService\")\n@Slf4j\npublic class ConnectServiceImpl implements ConnectService {\n\n    @Override\n    public ResultDTO<String> send(@NotNull ConnectDTO dto) throws Exception {\n\n        log.info(\"begin to send {} .\", JSON.toJSONString(dto));\n\n        // get provider url\n        URL url = UrlCaches.get(dto.getProviderKey()).getUrl();\n        // get method\n        MethodModel methodModel = MethodCaches.get(dto.getMethodKey());\n        // parse parameter\n        Object[] params = ParamUtil.parseJson(dto.getJson(), methodModel.getMethod());\n\n\n        url = url.addParameter(Constants.CODEC_KEY, \"dubbo\"); // 非常重要，必须要设置编码器协议类型\n        DoeClient client = new DoeClient(url);\n        client.doConnect();\n\n        // set the path variables\n        Map<String, String> map = ParamUtil.getAttachmentFromUrl(url);\n\n        // create request.\n        Request req = new Request();\n        req.setVersion(\"2.0.0\");\n        req.setTwoWay(true);\n        req.setData(new RpcInvocation(methodModel.getMethod(), params, map));\n\n        client.send(req);\n\n        int timeout = (0 == dto.getTimeout()) ? 10 : dto.getTimeout(); // send timeout\n        CompletableFuture<RpcResult> future = ResponseDispatcher.getDispatcher().getFuture(req);\n        RpcResult result = future.get(timeout, TimeUnit.SECONDS);\n        ResponseDispatcher.getDispatcher().removeFuture(req);\n\n        return ResultDTO.createSuccessResult(\"SUCCESS\",\n                JSON.toJSONString(result.getValue(), SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteDateUseDateFormat),\n                String.class);\n    }\n\n    @Override\n    public List<UrlModelDTO> listProviders(@NotNull ConnectDTO connect) throws NoSuchFieldException, IllegalAccessException {\n\n        // get client\n        CuratorHandler client = CuratorCaches.getHandler(connect.getConn());\n\n        if (null == client) {\n            throw new DoeException(\"the cache is validate, please reconnect to zk againt.\");\n        }\n\n        List<UrlModel> providers = client.getProviders(connect);\n\n        // throw fast json error if you don't convert simple pojo\n        // I have no idea why the UrlModel object will throw stack over flow exception.\n        List<UrlModelDTO> ret = new ArrayList<>();\n        providers.forEach(p -> {\n            UrlModelDTO m = new UrlModelDTO();\n            m.setKey(p.getKey());\n            m.setHost(p.getUrl().getHost());\n            m.setPort(p.getUrl().getPort());\n\n            ret.add(m);\n        });\n\n        return ret;\n\n    }\n\n    /**\n     * connect to zk and get all providers.\n     *\n     * @param conn\n     * @return\n     */\n    @Override\n    public List<ServiceModel> connect(@NotNull String conn) throws NoSuchFieldException, IllegalAccessException {\n\n        // get client\n        CuratorHandler client = CuratorCaches.getHandler(conn);\n\n        if (!client.isAvailable()) {\n            throw new DoeException(StringUtil.format(\"can't connect to {}\", conn));\n        }\n\n        // get providers\n        List<ServiceModel> list = client.getInterfaces();\n\n\n        return list;\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/service/impl/MenuServiceImpl.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.service.impl;\n\nimport com.mmc.dubbo.doe.auth.MenuNode;\nimport com.mmc.dubbo.doe.auth.MenuTree;\nimport com.mmc.dubbo.doe.service.MenuService;\nimport com.mmc.dubbo.doe.util.JsonFileUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.core.io.Resource;\nimport org.springframework.stereotype.Service;\nimport org.springframework.util.CollectionUtils;\n\nimport javax.annotation.PostConstruct;\nimport java.io.File;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.PrintWriter;\nimport java.text.MessageFormat;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\n/**\n * @author Joey\n * @date 2018/11/26 16:21\n */\n@Service(\"menuService\")\n@Slf4j\npublic class MenuServiceImpl implements MenuService {\n\n    /**\n     * 用户静态资源文件路径.\n     */\n    private static final String STATIC_MENU_PATH = \"templates/pages/v3/\";\n\n    @Value(\"classpath:menu.json\")\n    private Resource resource;\n\n    /**\n     * cache urls.\n     */\n    private Map<Integer, String> cacheMap;\n    /**\n     * the html text.\n     */\n    private String html;\n\n    @Override\n    public String getHtml() {\n        return html;\n    }\n\n    @Override\n    public String getUrl(Integer mid) {\n\n        return cacheMap.get(mid);\n    }\n\n    private void cacheMenu(List<MenuNode> tree) {\n\n        if (CollectionUtils.isEmpty(tree)) {\n            return;\n        }\n        cacheMap = tree.stream().collect(Collectors.toMap(MenuNode::getMenuId, MenuTree::getMenuUrl));\n    }\n\n    /**\n     * 真正生成文件方法.\n     */\n    @PostConstruct\n    private void createFile() throws IOException {\n\n        List<MenuNode> tree = JsonFileUtil.readList(resource.getInputStream(), MenuNode.class);\n        MenuNode root = null;\n\n        cacheMenu(tree);\n\n        try {\n            root = buildTree(tree, -1);\n        } catch (Exception e) {\n            log.error(\"fail to build the menu tree：\", e);\n            return;\n        }\n        String html = toHtml(\"\", root);\n        String projectRealPath = getProjectRealPath();\n        try {\n            createFile(projectRealPath, html);\n        } catch (Exception e) {\n            log.error(\"fail to create the menu file：\", e);\n        }\n    }\n\n\n\n    private String getProjectRealPath() throws FileNotFoundException {\n\n        // useless when you run doe in the jar way, so comment these code.\n//        String path = ResourceUtils.getURL(\"classpath:\").getPath();\n        String path = \"/app/doe/\";\n        path = path + STATIC_MENU_PATH;\n        return path;\n    }\n\n    private void createFile(String projectRealPath, String html) throws Exception {\n\n        // 创建目录\n        File path = new File(projectRealPath);\n        if (!path.exists()) {\n            path.mkdirs();\n        }\n\n        // 删除旧文件\n        File file = new File(path, \"menu.html\");\n        if (file.exists()) {\n            file.delete();\n        }\n\n        // 写入权限菜单\n        PrintWriter out = new PrintWriter(file);\n        String content = \"\"\n//                + \"<div th:fragment=\\\"lefter\\\" xmlns:th=\\\"http://www.thymeleaf.org\\\">\"\n                + \"\\n<div class=\\\"sidebar\\\" id=\\\"sidebar\\\" >                                                                                        \\n\"\n                + \"\\n    <script type=\\\"text/javascript\\\">                                                                                         \\n\"\n                + \"\\n        try{ace.settings.check('sidebar' , 'fixed')}catch(e){}                                                                \\n\"\n                + \"\\n    </script>                                                                                                                 \\n\"\n                + \"\\n    <div id=\\\"NoraMenuTree\\\">                                                                                                 \\n\"\n                + html\n                + \"\\n    </div>                                                                                                                    \\n\"\n                + \"\\n                                                                                                                              \\n\"\n                + \"\\n    <div class=\\\"sidebar-collapse\\\" id=\\\"sidebar-collapse\\\">                                                                  \\n\"\n                + \"\\n        <i class=\\\"icon-double-angle-left\\\" data-icon1=\\\"icon-double-angle-left\\\" data-icon2=\\\"icon-double-angle-right\\\"></i> \\n\"\n                + \"\\n    </div>                                                                                                                    \\n\"\n                + \"\\n                                                                                                                              \\n\"\n                + \"\\n    <script type=\\\"text/javascript\\\">                                                                                         \\n\"\n                + \"\\n        try{ace.settings.check('sidebar' , 'collapsed')}catch(e){}                                                            \\n\"\n                + \"\\n    </script>                                                                                                                 \\n\"\n//                + \"\\n</div>\"\n                + \"</div>\";\n\n        this.html = content;\n        out.append(content);\n        out.flush();\n        out.close();\n\n    }\n\n    private MenuNode buildTree(List<MenuNode> menuList, int pMenuId) {\n        MenuNode result = new MenuNode();\n        MenuNode temp = new MenuNode();\n        for (int i = 0; i < menuList.size(); i++) {\n            if (menuList.get(i).getPmenuId() == pMenuId) {\n                result.getChildren().add(menuList.get(i));\n                temp = buildTree(menuList, menuList.get(i).getMenuId());\n                if (temp.getChildren().size() > 0) {\n                    menuList.get(i).setChildren(temp.getChildren());\n                }\n            }\n        }\n        return result;\n    }\n\n    private String toHtml(String elementId, MenuNode root) {\n\n        StringBuilder sb = new StringBuilder();\n        boolean useCache = true; // 判断是否使用缓存\n\n        for (MenuNode item : root.getChildren()) {\n\n            if (null != item && item.getChildren().size() > 0) {\n                if (item.getPmenuId() == -1) {\n                    String html = \"\\n<ul id=\\\"{0}\\\" class=\\\"nav nav-list\\\">\\n\";\n                    html = MessageFormat.format(html, item.getMenuId().toString());\n                    sb.append(html);\n                    sb.append(toHtml(null, item));\n                    sb.append(\"</ul>\");\n                } else {\n\n                    String html = \"\\n\"\n                            + \"<li id=\\\"f{0}\\\" class=\\\"nr-pmenu\\\">                 \\n\"\n                            + \"    <a href=\\\"#\\\" class=\\\"dropdown-toggle\\\">    \\n\"\n                            + \"    <i class=\\\"{1}\\\"></i>                       \\n\"\n                            + \"    <span class=\\\"menu-text\\\"> {2} </span>      \\n\"\n                            + \"    <b class=\\\"arrow icon-angle-down\\\"></b>     \\n\"\n                            + \"    </a>                                        \\n\"\n                            + \"    <ul id=\\\"{0}\\\" class=\\\"submenu\\\">           \\n\"\n                            + \"\\n\";\n                    html = MessageFormat.format(html, item.getMenuId().toString(), item.getMenuStyle(), item.getMenuName());\n\n                    sb.append(html);\n                    sb.append(toHtml(null, item));\n                    sb.append(\"</ul></li>\");\n                }\n            } else {\n                String html = \"\\n\"\n                        + \"<li id=\\\"f{0}\\\">        \\n\"\n                        + \"<a href=\\\"{4}?mid=f{0}\\\" data-url=\\\"{1}\\\">        \\n\"\n                        + \"<i class=\\\"{2}\\\"></i>   \\n\"\n                        + \"{3}                     \\n\"\n                        + \"</a>                    \\n\"\n                        + \"</li>                   \\n\"\n                        + \"\\n\";\n                if (useCache) {\n                    html = MessageFormat.format(html, item.getMenuId().toString(), item.getMenuUrl(), item.getMenuStyle(), item.getMenuName(), \"main\");\n                } else {\n                    html = MessageFormat.format(html, item.getMenuId().toString(), item.getMenuUrl(), item.getMenuStyle(), item.getMenuName(), item.getMenuUrl());\n                }\n                sb.append(html);\n            }\n        }\n\n        return sb.toString();\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/service/impl/PomServiceImpl.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.service.impl;\n\nimport com.alibaba.dubbo.common.utils.StringUtils;\nimport com.alibaba.fastjson.JSON;\nimport com.mmc.dubbo.doe.cache.RedisResolver;\nimport com.mmc.dubbo.doe.client.ProcessClient;\nimport com.mmc.dubbo.doe.context.Const;\nimport com.mmc.dubbo.doe.context.DoeClassLoader;\nimport com.mmc.dubbo.doe.context.TaskContainer;\nimport com.mmc.dubbo.doe.dto.PomDTO;\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.exception.DoeException;\nimport com.mmc.dubbo.doe.model.PomModel;\nimport com.mmc.dubbo.doe.service.PomService;\nimport com.mmc.dubbo.doe.util.DOMUtil;\nimport com.mmc.dubbo.doe.util.FileUtil;\nimport com.mmc.dubbo.doe.util.StringUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.tomcat.util.http.fileupload.FileUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Service;\nimport org.springframework.util.CollectionUtils;\nimport org.w3c.dom.Document;\nimport org.w3c.dom.Element;\nimport org.w3c.dom.Node;\nimport org.w3c.dom.NodeList;\nimport org.xml.sax.SAXException;\n\nimport javax.validation.constraints.NotNull;\nimport javax.xml.parsers.DocumentBuilder;\nimport javax.xml.parsers.DocumentBuilderFactory;\nimport javax.xml.parsers.ParserConfigurationException;\nimport javax.xml.transform.OutputKeys;\nimport javax.xml.transform.Transformer;\nimport javax.xml.transform.TransformerFactory;\nimport javax.xml.transform.dom.DOMSource;\nimport javax.xml.transform.stream.StreamResult;\nimport java.io.*;\nimport java.lang.reflect.Method;\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport java.net.URLClassLoader;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.locks.Lock;\nimport java.util.concurrent.locks.ReentrantLock;\nimport java.util.stream.Collectors;\n\n/**\n * dependency service.\n *\n * @author Joey\n * @date 2018/6/17 9:42\n */\n@Service(\"pomService\")\n@Slf4j\npublic class PomServiceImpl implements PomService {\n\n    private Lock locker = new ReentrantLock();\n\n    @Value(\"${doe.dependency.pom}\")\n    private String pomXml;\n\n    @Value(\"${doe.dependency.lib}\")\n    private String libPath = null;\n\n    @Autowired\n    private RedisResolver redisResolver;\n\n    @Override\n    public ResultDTO<PomDTO> invoke() {\n\n        PomDTO dto = new PomDTO();\n        ProcessClient processClient = new ProcessClient(dto, redisResolver, pomXml, libPath);\n\n        // just can only invoke one task to downloaded the jars.\n        // we can invoke more task after we have finished all code actually.\n        if (processClient.isRunning()) {\n            return ResultDTO.createErrorResult(\"some task was already running at background, please try again for a few minutes later.\", PomDTO.class);\n        }\n\n        try {\n\n            locker.lock();\n\n            // clear old directory\n            deleteJars(libPath);\n\n            // download jars asynchronously\n            log.info(\"fork another thread to download jars.\");\n            TaskContainer.getTaskContainer().execute(processClient);\n            log.info(\"success fork another thread to download jars.\");\n\n        } catch (Exception e) {\n            throw e;\n        } finally {\n            locker.unlock();\n        }\n\n        // return the success signal and redirect another url to get real time information.\n        return ResultDTO.createSuccessResult(\"the download task is running at background, please wait...\", dto, PomDTO.class);\n    }\n\n    @Override\n    public ResultDTO<PomDTO> invoke(@NotNull PomDTO dto) throws Exception {\n\n        ProcessClient processClient = new ProcessClient(dto, redisResolver, pomXml, libPath);\n\n        // just can only invoke one task to downloaded the jars.\n        // we can invoke more task after we have finished all code actually.\n        if (processClient.isRunning()) {\n            return ResultDTO.createErrorResult(\"some task was already running at background, please try again for a few minutes later.\", PomDTO.class);\n        }\n\n        // parse the pom\n        log.info(\"begin to parse the pom.\");\n        List<PomModel> models = parsePom(dto.getPom());\n\n        // check the model is good or not\n        checkModels(models);\n\n        // check maven configuration\n        checkMaven(models);\n\n        try {\n\n            locker.lock();\n\n            // append the parse content to the end of real pom.xml.\n            log.info(\"begin to append the parse content to the end of {}.\", pomXml);\n            appendPom(models, pomXml);\n\n            // download jars asynchronously\n            log.info(\"fork another thread to download jars.\");\n            TaskContainer.getTaskContainer().execute(processClient);\n            log.info(\"success fork another thread to download jars.\");\n\n        } catch (Exception e) {\n            throw e;\n        } finally {\n            locker.unlock();\n        }\n\n        // return the success signal and redirect another url to get real time information.\n        return ResultDTO.createSuccessResult(\"the download task is running at background, please wait...\", dto, PomDTO.class);\n    }\n\n    // the mvn environment variable must be set.\n    private void checkMaven(List<PomModel> models) {\n\n    }\n\n    @Override\n    public void appendPom(List<PomModel> models, @NotNull String pomXml) throws Exception {\n\n        File file = new File(pomXml);\n\n        // 1.得到DOM解析器的工厂实例\n        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();\n        // 2.从DOM工厂里获取DOM解析器\n        DocumentBuilder db = dbf.newDocumentBuilder();\n        // 3.解析XML文档，得到document，即DOM树\n        Document doc = db.parse(file);\n        // root\n        Element rootDependency = (Element) doc.getElementsByTagName(\"dependencies\").item(0);\n\n        for (PomModel model : models) {\n\n            // 创建节点\n            Element dependencyElement = doc.createElement(\"dependency\");\n            // 创建group节点\n            Element groupElement = doc.createElement(\"groupId\");\n            groupElement.appendChild(doc.createTextNode(model.getGroupId()));\n            // 创建artifactId节点\n            Element artifactIdElement = doc.createElement(\"artifactId\");\n            artifactIdElement.appendChild(doc.createTextNode(model.getArtifactId()));\n            // 创建version节点\n            Element versionElement = doc.createElement(\"version\");\n            versionElement.appendChild(doc.createTextNode(model.getVersion()));\n            // 添加父子关系\n            dependencyElement.appendChild(groupElement);\n            dependencyElement.appendChild(artifactIdElement);\n            dependencyElement.appendChild(versionElement);\n            // 追加节点\n            rootDependency.appendChild(dependencyElement);\n        }\n        // 保存xml文件\n        TransformerFactory transformerFactory = TransformerFactory.newInstance();\n        Transformer transformer = transformerFactory.newTransformer();\n        // 格式化\n        transformer.setOutputProperty(OutputKeys.INDENT, \"yes\");\n        transformer.setOutputProperty(\"{http://xml.apache.org/xslt}indent-amount\", \"4\");\n        // 设置编码类型\n        transformer.setOutputProperty(OutputKeys.ENCODING, \"GB2312\");\n        DOMSource domSource = new DOMSource(doc);\n        StreamResult result = new StreamResult(new FileOutputStream(file));\n        // 把DOM树转换为xml文件\n        transformer.transform(domSource, result);\n    }\n\n    private void checkModels(List<PomModel> models) {\n\n        if (CollectionUtils.isEmpty(models)) {\n            throw new DoeException(\"Can't parse any dependency, please check your pom before you execute the do parse request.\");\n        }\n        models.forEach(m -> {\n            if (m.isBroken()) {\n                throw new DoeException(StringUtil.format(\"The content of pom is Incomplete.[{}]\", JSON.toJSONString(m)));\n            }\n        });\n\n    }\n\n    @Override\n    public List<PomModel> parsePom(@NotNull String xml) throws IOException, SAXException {\n\n        List<PomModel> models = new ArrayList<>();\n\n        xml = \"<root>\" + xml + \"</root>\";\n\n        Document document = DOMUtil.parse(xml);\n        Node root = document.getElementsByTagName(\"root\").item(0);\n\n        for (int i = 0; i < root.getChildNodes().getLength(); i++) {\n            Node dependencyNode = root.getChildNodes().item(i);\n            String nodeName = dependencyNode.getNodeName();\n\n            if (\"dependency\".equals(nodeName)) {\n\n                PomModel model = new PomModel();\n                for (int j = 0; j < dependencyNode.getChildNodes().getLength(); j++) {\n                    Node childNode = dependencyNode.getChildNodes().item(j);\n                    if (childNode.getNodeType() == Node.ELEMENT_NODE) {\n\n                        Element element = (Element) childNode;\n\n                        if (\"groupId\".equals(element.getNodeName())) {\n                            model.setGroupId(element.getFirstChild().getNodeValue());\n                        } else if (\"artifactId\".equals(element.getNodeName())) {\n                            model.setArtifactId(element.getFirstChild().getNodeValue());\n                        } else if (\"version\".equals(element.getNodeName())) {\n                            model.setVersion(element.getFirstChild().getNodeValue());\n                        }\n                    }\n                }\n                models.add(model);\n            }\n        }\n        return models;\n    }\n\n    @Override\n    public ResultDTO<String> getRealTimeMsg(@NotNull String requestId) {\n\n        String key = StringUtil.format(Const.DOE_DOWNLOAD_JAR_MESSAGE, requestId);\n\n        ResultDTO<String> ret = ResultDTO.createSuccessResult(\"SUCCESS\", String.class);\n\n        boolean isRunning = redisResolver.hasKey(Const.DOE_DOWNLOAD_JAR_TASK);\n\n        if (!isRunning) {\n\n            // if the task was done, get all message prevent the task running too fast.\n            List<Object> list = redisResolver.lGet(key, 0, -1);\n            String data = list.stream().map(l -> l.toString()).collect(Collectors.joining(\"\\r\\n\"));\n\n            ret.setMsg(\"download completed!\");\n            ret.setData(data);\n            ret.setCode(Const.COMPLETE_FLAG);\n\n        } else {\n\n            // loop time of queue length\n            long size = redisResolver.lGetListSize(key);\n            StringBuilder sb = new StringBuilder();\n            while (--size > 0) {\n                String value = (String) redisResolver.lPop(key);\n                sb.append(\"\\r\\n\");\n                sb.append(value);\n            }\n\n            ret.setData(sb.toString());\n            ret.setCode(Const.RUNNING_FlAG); // tell the jquery continue to ask message.\n        }\n\n        return ret;\n    }\n\n    @Override\n    public ResultDTO<String> loadJars(String path) {\n\n        String realPath = (StringUtils.isEmpty(path)) ? this.libPath : path;\n        DoeClassLoader classLoader = new DoeClassLoader(realPath);\n        try {\n            classLoader.clearCache();\n            classLoader.loadJars();\n            return ResultDTO.createSuccessResult(\"load jars completely and successfully\", String.class);\n        } catch (Exception e) {\n            return ResultDTO.handleException(\"occur an error when load jars\", null, e);\n        }\n\n    }\n\n    @Deprecated // since v1.1.0\n    public ResultDTO<String> loadJars$$(String path) throws NoSuchMethodException, MalformedURLException {\n\n        String fullLibPath = StringUtils.isEmpty(path) ? this.libPath : path;\n\n        if (StringUtils.isEmpty(fullLibPath)) {\n            return ResultDTO.createErrorResult(StringUtil.format(\"can't found the path {}\", fullLibPath), String.class);\n        }\n\n        if (!new File(fullLibPath).exists()) {\n            throw new DoeException(StringUtil.format(\"the path[{}] is not exists.\", fullLibPath));\n        }\n\n        log.info(\"begin to load jars from {}.\", fullLibPath);\n\n        // check for changes prevent to do useless job.\n        checkForChanges();\n\n        // 系统类库路径\n        File libPath = new File(fullLibPath);\n\n        // 获取所有的.jar和.zip文件\n        File[] jarFiles = libPath.listFiles((dir, name) -> name.endsWith(\".jar\") || name.endsWith(\".zip\"));\n\n        if (jarFiles != null) {\n            // 从URLClassLoader类中获取类所在文件夹的方法\n            // 对于jar文件，可以理解为一个存放class文件的文件夹\n            Method method = URLClassLoader.class.getDeclaredMethod(\"addURL\", URL.class);\n            boolean accessible = method.isAccessible();     // 获取方法的访问权限\n            try {\n                if (!accessible) {\n                    method.setAccessible(true);     // 设置方法的访问权限\n                }\n                // 获取系统类加载器\n                URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();\n                for (File file : jarFiles) {\n                    URL url = file.toURI().toURL();\n                    try {\n                        method.invoke(classLoader, url);\n                        log.debug(\"读取jar文件[name={}]\", file.getName());\n                    } catch (Exception e) {\n                        log.error(\"读取jar文件[name={}]失败\", file.getName());\n                    }\n                }\n                return ResultDTO.createSuccessResult(\"load jars completely and successfully\", String.class);\n\n            } finally {\n                method.setAccessible(accessible);\n            }\n        } else {\n            return ResultDTO.createErrorResult(StringUtil.format(\"Can't found any jars from {}.\", fullLibPath), String.class);\n        }\n\n    }\n\n    /**\n     * list all dependency.\n     *\n     * @param dto\n     * @return\n     */\n    @Override\n    public List<PomModel> listJars(PomDTO dto) throws ParserConfigurationException, IOException, SAXException {\n\n        List<PomModel> result = new ArrayList<>();\n\n        String pomPath = (StringUtils.isEmpty(dto.getPath())) ? pomXml : dto.getPath();\n        File file = new File(pomPath);\n\n        // 1.得到DOM解析器的工厂实例\n        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();\n        // 2.从DOM工厂里获取DOM解析器\n        DocumentBuilder db = dbf.newDocumentBuilder();\n        // 3.解析XML文档，得到document，即DOM树\n        Document doc = db.parse(file);\n        // list\n        NodeList list = doc.getElementsByTagName(\"dependency\");\n\n        for (int i = 0; i < list.getLength(); i++) {\n\n            Node node = list.item(i);\n            if (node.getNodeType() == Node.ELEMENT_NODE) {\n\n                Element element = (Element) node;\n                PomModel model = new PomModel();\n                model.setGroupId(element.getElementsByTagName(\"groupId\").item(0).getTextContent());\n                model.setArtifactId(element.getElementsByTagName(\"artifactId\").item(0).getTextContent());\n                model.setVersion(element.getElementsByTagName(\"version\").item(0).getTextContent());\n\n                result.add(model);\n            }\n        }\n\n        return result;\n    }\n\n    private void checkForChanges() {\n\n        // TODO\n        // check if any changes\n    }\n\n    @Override\n    public String loadPomFile(String pomXmlPath) {\n\n        String pomPath = StringUtils.isEmpty(pomXmlPath) ? pomXml : pomXmlPath;\n        return FileUtil.readToString(pomPath);\n\n    }\n\n    @Override\n    public Boolean overridePomFile(String pomXmlPath, String content) {\n\n        String pomPath = StringUtils.isEmpty(pomXmlPath) ? pomXml : pomXmlPath;\n\n        FileUtil.WriteStringToFile(pomPath, content);\n\n        return true;\n\n    }\n\n    @Override\n    public ResultDTO<String> deleteJars(String path) {\n\n        String realPath = (StringUtils.isEmpty(path)) ? this.libPath : path;\n\n        if (StringUtils.isEmpty(realPath)) {\n            throw new DoeException(StringUtil.format(\"can't found the path {}\", path));\n        }\n\n        File libPath = new File(realPath);\n        if (!libPath.exists()) {\n            throw new DoeException(StringUtil.format(\"the path[{}] is not exists.\", path));\n        }\n\n        File[] jarFiles = libPath.listFiles((dir, name) -> name.endsWith(\".jar\") || name.endsWith(\".zip\"));\n\n        if (jarFiles != null) {\n            for (File file : jarFiles) {\n                log.info(\"begin to delete file {}.\", file.getAbsolutePath());\n                boolean ret = file.delete();\n                if (!ret) {\n                    try {\n                        log.info(\"begin to force to delete file {}.\", file.getAbsolutePath());\n                        FileUtils.forceDelete(file);\n                    } catch (IOException e) {\n                        e.printStackTrace();\n                    }\n                }\n            }\n        }\n        return ResultDTO.handleSuccess(\"delete sucess!\", path);\n    }\n\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/service/impl/TelnetServiceImpl.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.service.impl;\n\nimport com.alibaba.dubbo.common.utils.StringUtils;\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.serializer.SerializerFeature;\nimport com.mmc.dubbo.doe.dto.ConnectDTO;\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.model.PointModel;\nimport com.mmc.dubbo.doe.service.TelnetService;\nimport com.mmc.dubbo.doe.util.ParamUtil;\nimport com.mmc.dubbo.doe.util.StringUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.net.telnet.TelnetClient;\nimport org.springframework.stereotype.Service;\n\nimport javax.validation.constraints.NotNull;\nimport java.io.BufferedInputStream;\nimport java.io.InputStream;\nimport java.io.PrintStream;\n\n/**\n * @author Joey\n * @date 2018/7/17 19:43\n */\n@Slf4j\n@Service(\"telnetService\")\npublic class TelnetServiceImpl implements TelnetService {\n\n    /**\n     * send message with telnet client.\n     *\n     * @param dto\n     * @return\n     */\n    @Override\n    public ResultDTO<String> send(@NotNull ConnectDTO dto) {\n\n        PointModel model = ParamUtil.parsePointModel(dto.getConn());\n\n        TelnetClient telnetClient = null;\n        try {\n            telnetClient = new TelnetClient(\"VT220\");  // 指明Telnet终端类型，否则会返回来的数据中文会乱码\n            telnetClient.setDefaultTimeout(dto.getTimeout() <= 0 ? 5000 : dto.getTimeout()); // socket延迟时间：5000ms\n            telnetClient.connect(model.getIp(), model.getPort());  // 建立一个连接,默认端口是23\n            InputStream in = telnetClient.getInputStream(); // 读取命令的流\n            PrintStream out = new PrintStream(telnetClient.getOutputStream());  // 写命令的流\n\n            String command = makeCommand(dto.getServiceName(), dto.getMethodName(), dto.getJson());\n            log.info(\"send: {}\", command);\n\n            out.println(\"\\r\\n\");\n            out.println(command);\n            out.println(\"\\r\\n\");\n            out.flush();\n\n            // handle inputStream\n            StringBuilder sb = new StringBuilder();\n            BufferedInputStream bi = new BufferedInputStream(in);\n\n            while (true) {\n                byte[] buffer = new byte[1024];\n                int len = bi.read(buffer);\n                if (len <= -1) {\n                    break;\n                }\n\n                String msg = new String(buffer, 0, len, \"GBK\");\n                sb.append(msg);\n                if (msg.endsWith(\"dubbo>\")) {\n                    break;\n                }\n            }\n\n            out.println(\"exit\"); // 写命令\n            out.flush(); // 将命令发送到telnet Server\n            telnetClient.disconnect();\n\n            String ret = sb.toString();\n            String lineSeparator = System.getProperty(\"line.separator\", \"\\n\");\n            if (StringUtils.isNotEmpty(ret)) {\n                ret = ret.split(lineSeparator)[0];\n            }\n            log.info(\"receive: {}\", ret);\n\n            // format the json string\n            String result = JSON.toJSONString(JSON.parse(ret), SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteDateUseDateFormat);\n            return ResultDTO.createSuccessResult(\"SUCCESS\", result, String.class);\n\n        } catch (Exception e) {\n\n            log.error(\"occur an error when sending message with telnet client.\", e);\n            return ResultDTO.createExceptionResult(e, String.class);\n\n        } finally {\n            try {\n                if (null != telnetClient) {\n                    telnetClient.disconnect();\n                }\n            } catch (Exception e) {\n                e.printStackTrace();\n            }\n        }\n    }\n\n    private String makeCommand(String serviceName, String methodName, String json) {\n\n        return StringUtil.format(\"invoke {}.{}({})\", serviceName, methodName, json);\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/util/DOMUtil.java",
    "content": "package com.mmc.dubbo.doe.util;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.util.List;\nimport java.util.Vector;\n\nimport javax.naming.ConfigurationException;\nimport javax.xml.parsers.DocumentBuilder;\nimport javax.xml.parsers.DocumentBuilderFactory;\nimport javax.xml.parsers.FactoryConfigurationError;\nimport javax.xml.parsers.ParserConfigurationException;\nimport javax.xml.transform.OutputKeys;\nimport javax.xml.transform.Transformer;\nimport javax.xml.transform.TransformerFactory;\nimport javax.xml.transform.dom.DOMSource;\nimport javax.xml.transform.stream.StreamResult;\nimport javax.xml.xpath.XPath;\nimport javax.xml.xpath.XPathConstants;\nimport javax.xml.xpath.XPathExpressionException;\nimport javax.xml.xpath.XPathFactory;\n\nimport org.w3c.dom.Attr;\nimport org.w3c.dom.Document;\nimport org.w3c.dom.Element;\nimport org.w3c.dom.NamedNodeMap;\nimport org.w3c.dom.Node;\nimport org.w3c.dom.NodeList;\nimport org.xml.sax.SAXException;\n\n/**\n * DOM utility\n * \n * Thanks to Tom Fennelly from Jboss Group\n * \n */\npublic class DOMUtil {\n\t\n\t/**\n\t * Create a new W3C Document.\n\t * <p/>\n\t * Handles exceptions etc.\n\t * @return The new Document instance.\n\t * @throws ConfigurationException \n\t */\n\tpublic static Document createDocument() throws ConfigurationException {\n\t\tDocument doc = null;\n\t\t\n\t\ttry {\n\t\t\tdoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();\n\t\t} catch (ParserConfigurationException e) {\n\t\t\tthrow new ConfigurationException(\"Failed to create ESB Configuration Document instance.\");\n\t\t}\n\t\t\n\t\treturn doc;\n\t}\n\n    /**\n     * Parse the supplied XML String and return the associated W3C Document object.\n     *\n     * @param xml XML String.\n     * @return The W3C Document object associated with the input stream.\n     */\n    public static Document parse(String xml) throws SAXException, IOException {\n        return parseStream(new ByteArrayInputStream(xml.getBytes()), false, false);\n    }\n\n    /**\n     * Parse the XML stream and return the associated W3C Document object.\n     * <p/>\n     * Performs a namespace unaware parse.\n     *\n     * @param stream\n     *            The stream to be parsed.\n     * @param validate\n     *            True if the document is to be validated, otherwise false.\n     * @param expandEntityRefs\n     *            Expand entity References as per\n     *            {@link DocumentBuilderFactory#setExpandEntityReferences(boolean)}.\n     * @return The W3C Document object associated with the input stream.\n     */\n    public static Document parseStream(InputStream stream, boolean validate,\n            boolean expandEntityRefs) throws SAXException, IOException {\n        return parseStream(stream, validate, expandEntityRefs, false);\n    }\n\n    /**\n     * Parse the XML stream and return the associated W3C Document object.\n     *\n     * @param stream\n     *            The stream to be parsed.\n     * @param validate\n     *            True if the document is to be validated, otherwise false.\n     * @param expandEntityRefs\n     *            Expand entity References as per\n     *            {@link DocumentBuilderFactory#setExpandEntityReferences(boolean)}.\n     * @param namespaceAware\n     *            True if the document parse is to be namespace aware,\n     *            otherwise false.\n     * @return The W3C Document object associated with the input stream.\n     */\n    public static Document parseStream(InputStream stream, boolean validate,\n            boolean expandEntityRefs, boolean namespaceAware) throws SAXException, IOException {\n        if (stream == null) {\n            throw new IllegalArgumentException(\n                    \"null 'stream' arg in method call.\");\n        }\n        try {\n            DocumentBuilderFactory factory = DocumentBuilderFactory\n                    .newInstance();\n            DocumentBuilder docBuilder = null;\n\n            factory.setValidating(validate);\n            factory.setExpandEntityReferences(expandEntityRefs);\n            factory.setNamespaceAware(namespaceAware);\n            docBuilder = factory.newDocumentBuilder();\n\n            return docBuilder.parse(stream);\n        } catch (ParserConfigurationException e) {\n            IllegalStateException state = new IllegalStateException(\n                    \"Unable to parse XML stream - XML Parser not configured correctly.\");\n            state.initCause(e);\n            throw state;\n        } catch (FactoryConfigurationError e) {\n            IllegalStateException state = new IllegalStateException(\n                    \"Unable to parse XML stream - DocumentBuilderFactory not configured correctly.\");\n            state.initCause(e);\n            throw state;\n        }\n    }\n\n    public static String getAttribute(Element element, String name, String defaultVal) {\n        if(element.hasAttribute(name)) {\n            return element.getAttribute(name);\n        } else {\n            return defaultVal;\n        }\n    }\n\n    /**\n\t * Add an Element node to the supplied parent name.\n\t * @param parent The parent to to which the new Element node is to be added.\n\t * @param elementName The name of the Element to be added.\n\t * @return The new Element.\n\t */\n\tpublic static Element addElement(Node parent, String elementName) {\n\t\tElement element = null;\n\t\t\n\t\tif(parent instanceof Document) {\n\t\t\telement = ((Document)parent).createElement(elementName);\n\t\t} else {\n\t\t\telement = parent.getOwnerDocument().createElement(elementName);\n\t\t}\n\t\tparent.appendChild(element);\n\t\t\n\t\treturn element;\n\t}\n\t\n\t/**\n\t * Remove all attributes having an empty value.\n\t * @param element The element to be processed.\n\t */\n\tpublic static void removeEmptyAttributes(Element element) {\n\t\tNamedNodeMap attributes = element.getAttributes();\n\t\tint attribCount = attributes.getLength();\n\t\t\n\t\tfor(int i = attribCount - 1; i >= 0; i--) {\n\t\t\tAttr attribute = (Attr) attributes.item(i);\n\t\t\t\n\t\t\t// Note - doesn't account for namespaces.  Not needed here !\n\t\t\tif(attribute.getValue().equals(\"\")) {\n\t\t\t\tattributes.removeNamedItem(attribute.getName());\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Serialize the supplied DOM node to the specified file in the specified output directory.\n\t * @param node The DOM node to be serialised.\n\t * @param outdir The directory into which the file is to be serialised.\n\t * @param fileName The name of the file.\n\t * @throws ConfigurationException Unable to serialise the node.\n\t */\n\tpublic static void serialize(Node node, File outdir, String fileName) throws ConfigurationException {\n\t\tserialize(node, new StreamResult(new File(outdir, fileName)));\n\t}\n\n    public static void serialize(Node node, OutputStream out) throws ConfigurationException {\n      serialize(node, new StreamResult(out));\n    }\n\n    /**\n      * Serialize the supplied DOM node to the supplied DOM StreamResult instance.\n      * @param node The DOM node to be serialised.\n      * @param streamRes The StreamResult into which the node is to be serialised.\n      * @throws ConfigurationException Unable to serialise the node.\n      */\n    public static void serialize(Node node, StreamResult streamRes) throws ConfigurationException {\n        serialize(node, streamRes, false);\n    }\n\n   /**\n\t * Serialize the supplied DOM node to the supplied DOM StreamResult instance.\n\t * @param node The DOM node to be serialised.\n\t * @param streamRes The StreamResult into which the node is to be serialised.\n     * @param omitXmlDecl Omit the XML declaration.\n\t * @throws ConfigurationException Unable to serialise the node.\n\t */\n\tpublic static void serialize(Node node, StreamResult streamRes, boolean omitXmlDecl) throws ConfigurationException {\n\t\tDOMSource domSource = new DOMSource(node);\n\t\t\n\t\ttry {\n\t\t\tTransformer transformer = TransformerFactory.newInstance().newTransformer();\n\n            // There's a bug in Java 5 re this code (formatting).\n            // See http://forum.java.sun.com/thread.jspa?threadID=562510&start=0 and it explains the\n            // whys of the following code.\n            // transformer.setOutputProperty(\"{http://xml.apache.org/xalan}indent-amount\", \"4\");\n\t\t\ttransformer.setOutputProperty(OutputKeys.INDENT, \"yes\");\n            transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, (omitXmlDecl?\"yes\":\"no\"));\n\t\t\ttransformer.transform(domSource, streamRes);\n\t\t} catch (Exception e) {\n\t\t\tthrow new ConfigurationException(\"Failed to serialize ESB Configuration Document instance.\");\n\t\t}\n\t}\n\n    /**\n     * Count the DOM element nodes before the supplied node, having the specified\n     * tag name, not including the node itself.\n     * <p/>\n     * Counts the sibling nodes.\n     *\n     * @param node    Node whose element siblings are to be counted.\n     * @param tagName The tag name of the sibling elements to be counted.\n     * @return The number of siblings elements before the supplied node with the\n     *         specified tag name.\n     */\n    public static int countElementsBefore(Node node, String tagName) {\n        Node parent = node.getParentNode();\n\n        NodeList siblings = parent.getChildNodes();\n        int count = 0;\n        int siblingCount = siblings.getLength();\n\n        for (int i = 0; i < siblingCount; i++) {\n            Node sibling = siblings.item(i);\n\n            if (sibling == node) {\n                break;\n            }\n            if (sibling.getNodeType() == Node.ELEMENT_NODE && ((Element) sibling).getTagName().equals(tagName)) {\n                count++;\n            }\n        }\n\n        return count;\n    }\n\n    /**\n     * Copy the nodes of a NodeList into the supplied list.\n     * <p/>\n     * This is not a cloneCollectionTemplateElement.  It's just a copy of the node references.\n     * <p/>\n     * Allows iteration over the Nodelist using the copy in the knowledge that\n     * the list will remain the same length, even if we modify the underlying NodeList.\n     * Using the NodeList can result in problems because elements can get removed from\n     * the list while we're iterating over it.\n     * <p/>\n     * <i>This code was acquired donated by the Milyn Smooks project.</i>\n     *\n     * @param nodeList Nodelist to copy.\n     * @return List copy.\n     */\n    public static List<Node> copyNodeList(NodeList nodeList) {\n        List<Node> copy = new Vector<Node>();\n\n        if (nodeList != null) {\n            int nodeCount = nodeList.getLength();\n\n            for (int i = 0; i < nodeCount; i++) {\n                copy.add(nodeList.item(i));\n            }\n        }\n\n        return copy;\n    }\n    \n    public static Element getNextSiblingElement(Node node) {\n        Node nextSibling = node.getNextSibling();\n\n        while (nextSibling != null) {\n            if (nextSibling.getNodeType() == Node.ELEMENT_NODE) {\n                return (Element) nextSibling;\n            }\n            nextSibling = nextSibling.getNextSibling();\n        }\n\n        return null;\n    }\n\n    public static Node getFirstChildByType(Element element, int nodeType) {\n        NodeList children = element.getChildNodes();\n        int childCount = children.getLength();\n\n        for(int i = 0; i < childCount; i++) {\n            Node child = children.item(i);\n            if (child.getNodeType() == nodeType) {\n                return child;\n            }\n        }\n\n        return null;\n    }\n\n    private static String ELEMENT_NAME_FUNC = \"/name()\";\n\n    private static XPathFactory xPathFactory = XPathFactory.newInstance();\n\n    /**\n     * Get the W3C NodeList instance associated with the XPath selection\n     * supplied.\n     * <p/>\n     * <b>NOTE</b>: Taken from Milyn Commons.\n     *\n     * @param node  The document node to be searched.\n     * @param xpath The XPath String to be used in the selection.\n     * @return The W3C NodeList instance at the specified location in the\n     *         document, or null.\n     */\n    public static NodeList getNodeList(Node node, String xpath) {\n        if (node == null) {\n            throw new IllegalArgumentException(\n                    \"null 'document' arg in method call.\");\n        } else if (xpath == null) {\n            throw new IllegalArgumentException(\n                    \"null 'xpath' arg in method call.\");\n        }\n        try {\n            XPath xpathEvaluater = xPathFactory.newXPath();\n\n            if (xpath.endsWith(ELEMENT_NAME_FUNC)) {\n                return (NodeList) xpathEvaluater.evaluate(xpath.substring(0,\n                        xpath.length() - ELEMENT_NAME_FUNC.length()), node,\n                        XPathConstants.NODESET);\n            } else {\n                return (NodeList) xpathEvaluater.evaluate(xpath, node,\n                        XPathConstants.NODESET);\n            }\n        } catch (XPathExpressionException e) {\n            throw new IllegalArgumentException(\"bad 'xpath' expression [\"\n                    + xpath + \"].\");\n        }\n    }\n\n    /**\n     * Get the W3C Node instance associated with the XPath selection supplied.\n     * <p/>\n     * <b>NOTE</b>: Taken from Milyn Commons.\n     *\n     * @param node  The document node to be searched.\n     * @param xpath The XPath String to be used in the selection.\n     * @return The W3C Node instance at the specified location in the document,\n     *         or null.\n     */\n    public static Node getNode(Node node, String xpath) {\n        NodeList nodeList = getNodeList(node, xpath);\n\n        if (nodeList == null || nodeList.getLength() == 0) {\n            return null;\n        } else {\n            return nodeList.item(0);\n        }\n    }\n\n    /**\n     * Get the name from the supplied element.\n     * <p/>\n     * Returns the {@link Node#getLocalName() localName} of the element\n     * if set (namespaced element), otherwise the\n     * element's {@link Element#getTagName() tagName} is returned.\n     * <p/>\n     * <b>NOTE</b>: Taken from Milyn Smooks.\n     *\n     * @param element The element.\n     * @return The element name.\n     */\n    public static String getName(Element element) {\n\n        String name = element.getLocalName();\n\n        if(name != null) {\n            return name;\n        } else {\n            return element.getTagName();\n        }\n    }\n    /**\n     * Copy child node references from source to target.\n     * @param source Source Node.\n     * @param target Target Node.\n     */\n    public static void copyChildNodes(Node source, Node target) {\n        \n        List nodeList = copyNodeList(source.getChildNodes());\n        int childCount = nodeList.size();\n        \n        for(int i = 0; i < childCount; i++) {\n            target.appendChild((Node)nodeList.get(i));\n        }\n    }\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/util/FileUtil.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.util;\n\nimport com.mmc.dubbo.doe.exception.DoeException;\nimport lombok.extern.slf4j.Slf4j;\n\nimport java.io.*;\n\n/**\n * @author Joey\n * @date 2018/11/23 17:28\n */\n@Slf4j\npublic class FileUtil {\n\n    public static String readToString(String fileName) throws DoeException {\n        String encoding = \"UTF-8\";\n        File file = new File(fileName);\n        Long filelength = file.length();\n        byte[] filecontent = new byte[filelength.intValue()];\n        try {\n            FileInputStream in = new FileInputStream(file);\n            int read = in.read(filecontent);\n            in.close();\n            log.info(\"read:{} filelength:{}\", read, filelength);\n        } catch (IOException e) {\n            throw new DoeException(StringUtil.format(\"can't load the file content, because {}.\", e.getMessage()));\n        }\n        try {\n            return new String(filecontent, encoding);\n        } catch (UnsupportedEncodingException e) {\n            throw new DoeException(StringUtil.format(\"can't load the file content, because {}.\", e.getMessage()));\n        }\n    }\n\n    public static void WriteStringToFile(String fileName, String text) {\n        try {\n            try (PrintWriter out = new PrintWriter(new File(fileName).getAbsoluteFile())) {\n                out.print(text);\n            }\n        } catch (IOException e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/util/JsonFileUtil.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.util;\n\nimport com.alibaba.fastjson.JSON;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.util.List;\n\n/**\n * Json文件处理类.\n * @author Joey\n * @date 2018/11/14 9:23\n */\npublic class JsonFileUtil {\n\n    /**\n     * 从JSON文件流中读取列表.\n     */\n    public static <T> List<T> readList(InputStream inputStream, Class<T> clazz) throws IOException {\n\n        BufferedReader tBufferedReader = new BufferedReader(new InputStreamReader(inputStream));\n\n        StringBuilder sb = new StringBuilder();\n\n        String sTempOneLine;\n\n        while ((sTempOneLine = tBufferedReader.readLine()) != null) {\n\n            sb.append(sTempOneLine);\n\n        }\n\n        return JSON.parseArray(sb.toString(), clazz);\n\n    }\n\n    /**\n     * 从JSON文件流中读取对象.\n     */\n    public static <T> T readObject(InputStream inputStream, Class<T> clazz) throws IOException {\n\n        BufferedReader tBufferedReader = new BufferedReader(new InputStreamReader(inputStream));\n\n        StringBuilder sb = new StringBuilder();\n\n        String sTempOneLine;\n\n        while ((sTempOneLine = tBufferedReader.readLine()) != null) {\n\n            sb.append(sTempOneLine);\n\n        }\n\n        return JSON.parseObject(sb.toString(), clazz);\n\n    }\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/util/MD5Util.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.util;\n\nimport lombok.extern.slf4j.Slf4j;\n\nimport java.security.MessageDigest;\n\n/**\n * MD5加密工具类.\n * @author Joey\n * @date 2018/6/24 16:40\n */\n@Slf4j\npublic class MD5Util {\n\n    public final static String encrypt(String pwd) {\n        //用于加密的字符\n        char md5String[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n                'A', 'B', 'C', 'D', 'E', 'F' };\n        try {\n            //使用平台的默认字符集将此 String 编码为 byte序列，并将结果存储到一个新的 byte数组中\n            byte[] btInput = pwd.getBytes();\n\n            //信息摘要是安全的单向哈希函数，它接收任意大小的数据，并输出固定长度的哈希值。\n            MessageDigest mdInst = MessageDigest.getInstance(\"MD5\");\n\n            //MessageDigest对象通过使用 update方法处理数据， 使用指定的byte数组更新摘要\n            mdInst.update(btInput);\n\n            // 摘要更新之后，通过调用digest（）执行哈希计算，获得密文\n            byte[] md = mdInst.digest();\n\n            // 把密文转换成十六进制的字符串形式\n            int j = md.length;\n            char str[] = new char[j * 2];\n            int k = 0;\n            for (int i = 0; i < j; i++) {   //  i = 0\n                byte byte0 = md[i];  //95\n                str[k++] = md5String[byte0 >>> 4 & 0xf];    //    5\n                str[k++] = md5String[byte0 & 0xf];   //   F\n            }\n\n            //返回经过加密后的字符串\n            return new String(str);\n\n        } catch (Exception e) {\n            log.error(\"encrypt error: \", e);\n            return null;\n        }\n    }\n}"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/util/ParamUtil.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.util;\n\nimport com.alibaba.dubbo.common.Constants;\nimport com.alibaba.dubbo.common.URL;\nimport com.alibaba.dubbo.common.utils.PojoUtils;\nimport com.alibaba.dubbo.common.utils.StringUtils;\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.mmc.dubbo.doe.exception.DoeException;\nimport com.mmc.dubbo.doe.model.PointModel;\n\nimport javax.validation.constraints.NotNull;\nimport java.lang.reflect.Method;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\n\n/**\n * @author Joey\n * @date 2018/6/13 19:22\n */\npublic class ParamUtil {\n\n    public static HashMap<String,String> getAttachmentFromUrl(URL url) throws Exception {\n\n        String interfaceName = url.getParameter(Constants.INTERFACE_KEY, \"\");\n        if (StringUtils.isEmpty(interfaceName)) {\n            throw new DoeException(\"找不到接口名称！\");\n        }\n\n        HashMap<String, String> map = new HashMap<String, String>();\n        map.put(Constants.PATH_KEY, interfaceName);\n        map.put(Constants.VERSION_KEY, url.getParameter(Constants.VERSION_KEY));\n        map.put(Constants.GROUP_KEY, url.getParameter(Constants.GROUP_KEY));\n        /**\n         *  doesn't necessary to set these params.\n         *\n         map.put(Constants.SIDE_KEY, Constants.CONSUMER_SIDE);\n         map.put(Constants.DUBBO_VERSION_KEY, Version.getVersion());\n         map.put(Constants.TIMESTAMP_KEY, String.valueOf(System.currentTimeMillis()));\n         map.put(Constants.PID_KEY, String.valueOf(ConfigUtils.getPid()));\n         map.put(Constants.METHODS_KEY, methodNames);\n         map.put(Constants.INTERFACE_KEY, interfaceName);\n         map.put(Constants.VERSION_KEY, \"1.0\"); // 不能设置这个，不然服务端找不到invoker\n         */\n        return map;\n    }\n\n    /**\n     * prepare method parameters.\n     *\n     * @param jsonStr\n     * @param invokeMethod\n     * @return\n     */\n    public static Object[] parseJson(String jsonStr, Method invokeMethod) {\n\n        jsonStr = jsonStr.trim();\n\n        // we should convert to array model if more the one parameter prevent someone forgetting about it.\n        String json;\n        if (invokeMethod.getParameters().length > 0) {\n            if (StringUtils.isEmpty(jsonStr)) {\n                throw new DoeException(\"json parameter can't be blank.\");\n            }\n            if (jsonStr.startsWith(\"[\") && jsonStr.endsWith(\"]\")) {\n                json = jsonStr;\n            } else {\n                json = \"[\" + jsonStr + \"]\";\n            }\n        } else {\n            json = jsonStr;\n        }\n\n        List<Object> list = JSON.parseArray(json, Object.class);\n        Object[] array = PojoUtils.realize(list.toArray(), invokeMethod.getParameterTypes(), invokeMethod.getGenericParameterTypes());\n\n        return array;\n    }\n\n    /**\n     * parse ip and port from the conn.\n     *\n     * @param conn\n     * @return\n     */\n    public static PointModel parsePointModel(@NotNull String conn) {\n\n        // split host and port\n        String[] pairs = conn.replace(\"：\", \":\").split(\":\");\n        String host = pairs[0];\n        String port = pairs[1];\n\n        return new PointModel(host, Integer.valueOf(port));\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/java/com/mmc/dubbo/doe/util/StringUtil.java",
    "content": "/*  \n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.  \n *  \n * This software is the confidential and proprietary information of  \n * Founder. You shall not disclose such Confidential Information  \n * and shall use it only in accordance with the terms of the agreements  \n * you entered into with Founder.  \n *  \n */ \npackage com.mmc.dubbo.doe.util;\n\n/**\n * 字符串工具类.\n * @author Joey\n * 2016年10月17日 下午4:08:55\n */\npublic class StringUtil {\n\n\t/**\n\t * 简单格式化{}样式的字符串.<br>\n\t * String str = \"aaa{} bbb{} ccc{}\";<br>\n\t * System.out.println(StringUtil.format(str, \"1\", \"2\", \"3\"));\n\t * @param src 源字符串\n\t * @param param 跟源字符串{}匹配的个数字符串\n\t * @return\n\t */\n\tpublic static String format(String src, Object... param) {\n\t\tint i = 0;\n\t\tint index = 0;\n\t\tStringBuffer sb = new StringBuffer(src);\n\t\twhile (-1 != (index = sb.indexOf(\"{}\"))) {\n\t\t\tsb.replace(index, index + 2, String.valueOf(param[i++]));\n\t\t}\n\t\treturn sb.toString();\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tString str = \"aaa{} bbb{} ccc{}\";\n\t\tSystem.out.println(StringUtil.format(str, \"1\", \"2\", \"3\"));\n\t}\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/application-dev.yml",
    "content": "# ====================server====================\nserver:\n  port: 9876\nspring:\n  thymeleaf:\n    # 开发环境禁用页面缓存\n    cache: false\n    encoding: utf-8\n    mode: HTML5\n  redis:\n      # 数据库索引\n      database: 0\n      host: 127.0.0.1\n      port: 6379\n      jedis:\n          pool:\n              # 最大连接数\n              max-active: 8\n              # 最大空闲\n              max-idle: 8\n              # 最小空闲\n              min-idle: 4\n          # 连接超时时间\n          timeout: 10000\n\n# ====================doe====================\ndoe:\n  dependency:\n    # 用于下载依赖的pom文件\n    pom: /app/doe/pom.xml\n    # 用于存放下载的jar的目录\n    lib: /app/doe/lib/\n    # 用于执行mvn命令超时时间（秒）\n    timeout: 20\n  watchdog:\n    url: http://localhost:8000\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/application-prd.yml",
    "content": "# ====================server====================\nserver:\n  port: 9876\nspring:\n  thymeleaf:\n    # 开发环境禁用页面缓存\n    cache: true\n    encoding: utf-8\n    mode: HTML5\n    prefix: classpath:/templates\n    suffix: .html\n  redis:\n      # 数据库索引\n      database: 0\n      host: 127.0.0.1\n      port: 6379\n      jedis:\n          pool:\n              # 最大连接数\n              max-active: 8\n              # 最大空闲\n              max-idle: 8\n              # 最小空闲\n              min-idle: 4\n          # 连接超时时间\n          timeout: 10000\n\n# ====================doe====================\ndoe:\n  dependency:\n    # 用于下载依赖的pom文件\n    pom: /app/doe/pom.xml\n    # 用于存放下载的jar的目录\n    lib: /app/doe/lib/\n    # 用于执行mvn命令超时时间（秒）\n    timeout: 20\n  watchdog:\n    url: http://localhost:8000"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/application.yml",
    "content": "spring:\n  profiles:\n    active: @spring.profiles.active@\n\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration scan=\"true\" scanPeriod=\"60 seconds\" debug=\"false\">\n\n\n    <property name=\"APP_NAME\" value=\"doe\" />\n    <property name=\"LOG_PATH\" value=\"/app/applogs/${APP_NAME}\" />\n\n\n    <appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n            <!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度%msg：日志消息，%n是换行符-->\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>\n        </encoder>\n    </appender>\n    <appender name=\"INFO\"  class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_PATH}/info.log</file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <!--日志文件输出的文件名-->\n            <FileNamePattern>${LOG_PATH}/info.%d{yyyy-MM-dd}.%i.log.zip</FileNamePattern>\n            <!--日志文件保留天数-->\n            <maxHistory>60</maxHistory>\n            <totalSizeCap>30GB</totalSizeCap>\n            <timeBasedFileNamingAndTriggeringPolicy class=\"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP\">\n                <!--文件达到 最大128MB时会被压缩和切割 -->\n                <maxFileSize>128MB</maxFileSize>\n            </timeBasedFileNamingAndTriggeringPolicy>\n        </rollingPolicy>\n        <encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>\n        </encoder>\n        <filter class=\"ch.qos.logback.classic.filter.LevelFilter\">\n            <level>INFO</level>\n            <onMatch>ACCEPT</onMatch>\n            <onMismatch>DENY</onMismatch>\n        </filter>\n    </appender>\n    <appender name=\"WARN\"  class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_PATH}/warn.log</file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <!--日志文件输出的文件名-->\n            <FileNamePattern>${LOG_PATH}/warn.%d{yyyy-MM-dd}.%i.log.zip</FileNamePattern>\n            <!--日志文件保留天数-->\n            <maxHistory>60</maxHistory>\n            <totalSizeCap>30GB</totalSizeCap>\n            <timeBasedFileNamingAndTriggeringPolicy class=\"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP\">\n                <!--文件达到 最大128MB时会被压缩和切割 -->\n                <maxFileSize>128MB</maxFileSize>\n            </timeBasedFileNamingAndTriggeringPolicy>\n        </rollingPolicy>\n        <encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>\n        </encoder>\n        <filter class=\"ch.qos.logback.classic.filter.LevelFilter\">\n            <level>WARN</level>\n            <onMatch>ACCEPT</onMatch>\n            <onMismatch>DENY</onMismatch>\n        </filter>\n    </appender>\n    <appender name=\"ERROR\"  class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_PATH}/error.log</file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <!--日志文件输出的文件名-->\n            <FileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.%i.log.zip</FileNamePattern>\n            <!--日志文件保留天数-->\n            <maxHistory>60</maxHistory>\n            <totalSizeCap>30GB</totalSizeCap>\n            <timeBasedFileNamingAndTriggeringPolicy class=\"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP\">\n                <!--文件达到 最大128MB时会被压缩和切割 -->\n                <maxFileSize>128MB</maxFileSize>\n            </timeBasedFileNamingAndTriggeringPolicy>\n        </rollingPolicy>\n        <encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>\n        </encoder>\n        <filter class=\"ch.qos.logback.classic.filter.LevelFilter\">\n            <level>ERROR</level>\n            <onMatch>ACCEPT</onMatch>\n            <onMismatch>DENY</onMismatch>\n        </filter>\n    </appender>\n    <appender name=\"asyncFileAppender\" class=\"ch.qos.logback.classic.AsyncAppender\">\n        <discardingThreshold>0</discardingThreshold>\n        <queueSize>512</queueSize>\n        <appender-ref ref=\"INFO\" />\n    </appender>\n\n\n    <!-- 单独文件 -->\n    <!--<appender></appender>-->\n\n\n    <!-- 开发环境 -->\n    <springProfile name=\"dev\">\n        <root level=\"INFO\">\n            <appender-ref ref=\"STDOUT\" />\n        </root>\n    </springProfile>\n\n\n    <!-- 生产环境 -->\n    <springProfile name=\"prd\">\n        <!--<include resource=\"org/springframework/boot/logging/logback/base.xml\" />-->\n        <root level=\"INFO\">\n            <appender-ref ref=\"asyncFileAppender\" />\n            <appender-ref ref=\"ERROR\" />\n            <appender-ref ref=\"WARN\" />\n        </root>\n    </springProfile>\n\n\n</configuration>"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/menu.json",
    "content": "[\n  {\n    \"autoId\":\"1\",\n    \"menuId\":\"16000000\",\n    \"pmenuId\":\"-1\",\n    \"menuName\":\"Doe\",\n    \"menuUrl\":\"#\",\n    \"menuStyle\":\"#\",\n    \"mlevel\":\"0\",\n    \"mleft\":\"0\",\n    \"mright\":\"0\",\n    \"isUse\":\"1\",\n    \"seq\":\"1000\",\n    \"cTime\":\"2018/5/26 11:23\",\n    \"uTime\":\"2018/5/26 11:23\",\n    \"sysId\":\"1605\"\n  },\n  {\n    \"autoId\":\"2\",\n    \"menuId\":\"16001000\",\n    \"pmenuId\":\"16000000\",\n    \"menuName\":\"连接发送\",\n    \"menuUrl\":\"#\",\n    \"menuStyle\":\"icon-list\",\n    \"mlevel\":\"1\",\n    \"mleft\":\"0\",\n    \"mright\":\"0\",\n    \"isUse\":\"1\",\n    \"seq\":\"1001\",\n    \"cTime\":\"2018/5/26 11:23\",\n    \"uTime\":\"2018/5/25 20:56\",\n    \"sysId\":\"1605\"\n  },\n  {\n    \"autoId\":\"3\",\n    \"menuId\":\"16001100\",\n    \"pmenuId\":\"16001000\",\n    \"menuName\":\"极简模式\",\n    \"menuUrl\":\"/pages/v3/easyCnt.html\",\n    \"menuStyle\":\"icon-double-angle-right\",\n    \"mlevel\":\"2\",\n    \"mleft\":\"0\",\n    \"mright\":\"0\",\n    \"isUse\":\"1\",\n    \"seq\":\"1002\",\n    \"cTime\":\"2018/5/26 11:23\",\n    \"uTime\":\"2018/5/26 11:23\",\n    \"sysId\":\"1605\"\n  },\n  {\n    \"autoId\":\"4\",\n    \"menuId\":\"16001200\",\n    \"pmenuId\":\"16001000\",\n    \"menuName\":\"普通模式\",\n    \"menuUrl\":\"/pages/v3/normalCnt.html\",\n    \"menuStyle\":\"icon-double-angle-right\",\n    \"mlevel\":\"2\",\n    \"mleft\":\"0\",\n    \"mright\":\"0\",\n    \"isUse\":\"1\",\n    \"seq\":\"1003\",\n    \"cTime\":\"2018/5/26 11:23\",\n    \"uTime\":\"2018/5/26 11:23\",\n    \"sysId\":\"1605\"\n  },\n  {\n    \"autoId\":\"5\",\n    \"menuId\":\"16001300\",\n    \"pmenuId\":\"16001000\",\n    \"menuName\":\"用例模式\",\n    \"menuUrl\":\"/pages/v3/caseCnt.html\",\n    \"menuStyle\":\"icon-double-angle-right\",\n    \"mlevel\":\"2\",\n    \"mleft\":\"0\",\n    \"mright\":\"0\",\n    \"isUse\":\"1\",\n    \"seq\":\"1004\",\n    \"cTime\":\"2018/5/26 11:23\",\n    \"uTime\":\"2018/5/26 11:23\",\n    \"sysId\":\"1605\"\n  },\n  {\n    \"autoId\":\"6\",\n    \"menuId\":\"16002000\",\n    \"pmenuId\":\"16000000\",\n    \"menuName\":\"依赖管理\",\n    \"menuUrl\":\"#\",\n    \"menuStyle\":\"icon-exchange\",\n    \"mlevel\":\"1\",\n    \"mleft\":\"0\",\n    \"mright\":\"0\",\n    \"isUse\":\"1\",\n    \"seq\":\"1005\",\n    \"cTime\":\"2018/5/26 11:23\",\n    \"uTime\":\"2018/5/26 11:23\",\n    \"sysId\":\"1605\"\n  },\n  {\n    \"autoId\":\"7\",\n    \"menuId\":\"16002100\",\n    \"pmenuId\":\"16002000\",\n    \"menuName\":\"增加依赖\",\n    \"menuUrl\":\"/pages/v3/addJar.html\",\n    \"menuStyle\":\"icon-double-angle-right\",\n    \"mlevel\":\"2\",\n    \"mleft\":\"0\",\n    \"mright\":\"0\",\n    \"isUse\":\"1\",\n    \"seq\":\"1006\",\n    \"cTime\":\"2018/5/26 11:23\",\n    \"uTime\":\"2018/5/26 11:23\",\n    \"sysId\":\"1605\"\n  },\n  {\n    \"autoId\":\"8\",\n    \"menuId\":\"16002200\",\n    \"pmenuId\":\"16002000\",\n    \"menuName\":\"依赖列表\",\n    \"menuUrl\":\"/pages/v3/listJar.html\",\n    \"menuStyle\":\"icon-double-angle-right\",\n    \"mlevel\":\"2\",\n    \"mleft\":\"0\",\n    \"mright\":\"0\",\n    \"isUse\":\"1\",\n    \"seq\":\"1007\",\n    \"cTime\":\"2018/5/26 11:23\",\n    \"uTime\":\"2018/5/26 11:23\",\n    \"sysId\":\"1605\"\n  },\n  {\n    \"autoId\":\"9\",\n    \"menuId\":\"16002300\",\n    \"pmenuId\":\"16002000\",\n    \"menuName\":\"依赖编辑\",\n    \"menuUrl\":\"/pages/v3/editPom.html\",\n    \"menuStyle\":\"icon-double-angle-right\",\n    \"mlevel\":\"2\",\n    \"mleft\":\"0\",\n    \"mright\":\"0\",\n    \"isUse\":\"1\",\n    \"seq\":\"1008\",\n    \"cTime\":\"2018/5/26 11:23\",\n    \"uTime\":\"2018/5/26 11:23\",\n    \"sysId\":\"1605\"\n  },\n  {\n    \"autoId\":\"10\",\n    \"menuId\":\"16003000\",\n    \"pmenuId\":\"16000000\",\n    \"menuName\":\"系统管理\",\n    \"menuUrl\":\"#\",\n    \"menuStyle\":\"icon-cogs\",\n    \"mlevel\":\"1\",\n    \"mleft\":\"0\",\n    \"mright\":\"0\",\n    \"isUse\":\"1\",\n    \"seq\":\"1009\",\n    \"cTime\":\"2018/5/26 11:23\",\n    \"uTime\":\"2018/5/26 11:23\",\n    \"sysId\":\"1605\"\n  },\n  {\n    \"autoId\":\"11\",\n    \"menuId\":\"16003100\",\n    \"pmenuId\":\"16003000\",\n    \"menuName\":\"注册中心\",\n    \"menuUrl\":\"/pages/v3/listZk.html\",\n    \"menuStyle\":\"icon-double-angle-right\",\n    \"mlevel\":\"0\",\n    \"mleft\":\"0\",\n    \"mright\":\"0\",\n    \"isUse\":\"1\",\n    \"seq\":\"1010\",\n    \"cTime\":\"2018/5/26 11:23\",\n    \"uTime\":\"2018/5/26 11:23\",\n    \"sysId\":\"1605\"\n  },\n  {\n    \"autoId\":\"12\",\n    \"menuId\":\"16003200\",\n    \"pmenuId\":\"16003000\",\n    \"menuName\":\"系统配置\",\n    \"menuUrl\":\"/pages/v3/sys.html\",\n    \"menuStyle\":\"icon-double-angle-right\",\n    \"mlevel\":\"0\",\n    \"mleft\":\"0\",\n    \"mright\":\"0\",\n    \"isUse\":\"1\",\n    \"seq\":\"1011\",\n    \"cTime\":\"2018/5/26 11:23\",\n    \"uTime\":\"2018/5/26 11:23\",\n    \"sysId\":\"1605\"\n  }\n]"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/registry.json",
    "content": "[\n  {\n    \"registryKey\": \"127.0.0.1:2181\",\n    \"registryDesc\": \"localhost -- 127.0.0.1:2181\"\n  }\n]\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/css/bootstrap-editable.css",
    "content": "/*! X-editable - v1.4.6 \n* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery\n* http://github.com/vitalets/x-editable\n* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */\n\n.editableform {\n    margin-bottom: 0; /* overwrites bootstrap margin */\n}\n\n.editableform .control-group {\n    margin-bottom: 0; /* overwrites bootstrap margin */\n    white-space: nowrap; /* prevent wrapping buttons on new line */\n    line-height: 20px; /* overwriting bootstrap line-height. See #133 */\n}\n\n.editable-buttons {\n   display: inline-block; /* should be inline to take effect of parent's white-space: nowrap */\n   vertical-align: top;\n   margin-left: 7px;\n   /* inline-block emulation for IE7*/\n   zoom: 1; \n   *display: inline;\n}\n\n.editable-buttons.editable-buttons-bottom {\n   display: block; \n   margin-top: 7px;\n   margin-left: 0;\n}\n\n.editable-input {\n    vertical-align: top; \n    display: inline-block; /* should be inline to take effect of parent's white-space: nowrap */\n    width: auto; /* bootstrap-responsive has width: 100% that breakes layout */\n    white-space: normal; /* reset white-space decalred in parent*/\n   /* display-inline emulation for IE7*/\n   zoom: 1; \n   *display: inline;   \n}\n\n.editable-buttons .editable-cancel {\n   margin-left: 7px; \n}\n\n/*for jquery-ui buttons need set height to look more pretty*/\n.editable-buttons button.ui-button-icon-only {\n   height: 24px; \n   width: 30px;\n}\n\n.editableform-loading {\n    background: url('../img/loading.gif') center center no-repeat;  \n    height: 25px;\n    width: auto; \n    min-width: 25px; \n}\n\n.editable-inline .editableform-loading {\n    background-position: left 5px;      \n}\n\n .editable-error-block {\n    max-width: 300px;\n    margin: 5px 0 0 0;\n    width: auto;\n    white-space: normal;\n}\n\n/*add padding for jquery ui*/\n.editable-error-block.ui-state-error {\n    padding: 3px;  \n}  \n\n.editable-error {\n   color: red;  \n}\n\n/* ---- For specific types ---- */\n\n.editableform .editable-date {\n    padding: 0; \n    margin: 0;\n    float: left;\n}\n\n/* move datepicker icon to center of add-on button. See https://github.com/vitalets/x-editable/issues/183 */\n.editable-inline .add-on .icon-th {\n   margin-top: 3px;\n   margin-left: 1px; \n}\n\n\n/* checklist vertical alignment */\n.editable-checklist label input[type=\"checkbox\"], \n.editable-checklist label span {\n    vertical-align: middle;\n    margin: 0;\n}\n\n.editable-checklist label {\n    white-space: nowrap; \n}\n\n/* set exact width of textarea to fit buttons toolbar */\n.editable-wysihtml5 {\n    width: 566px; \n    height: 250px; \n}\n\n/* clear button shown as link in date inputs */\n.editable-clear {\n   clear: both;\n   font-size: 0.9em;\n   text-decoration: none;\n   text-align: right;\n}\n\n/* IOS-style clear button for text inputs */\n.editable-clear-x {\n   background: url('../img/clear.png') center center no-repeat;\n   display: block;\n   width: 13px;    \n   height: 13px;\n   position: absolute;\n   opacity: 0.6;\n   z-index: 100;\n   \n   top: 50%;\n   right: 6px;\n   margin-top: -6px;\n   \n}\n\n.editable-clear-x:hover {\n   opacity: 1;\n}\n\n.editable-pre-wrapped {\n   white-space: pre-wrap;\n}\n.editable-container.editable-popup {\n    max-width: none !important; /* without this rule poshytip/tooltip does not stretch */\n}  \n\n.editable-container.popover {\n    width: auto; /* without this rule popover does not stretch */\n}\n\n.editable-container.editable-inline {\n    display: inline-block; \n    vertical-align: middle;\n    width: auto;\n    /* inline-block emulation for IE7*/\n    zoom: 1; \n    *display: inline;    \n}\n\n.editable-container.ui-widget {\n   font-size: inherit;  /* jqueryui widget font 1.1em too big, overwrite it */\n   z-index: 9990; /* should be less than select2 dropdown z-index to close dropdown first when click */\n}\n.editable-click, \na.editable-click, \na.editable-click:hover {\n    text-decoration: none;\n    border-bottom: dashed 1px #0088cc;\n}\n\n.editable-click.editable-disabled, \na.editable-click.editable-disabled, \na.editable-click.editable-disabled:hover {\n   color: #585858;  \n   cursor: default;\n   border-bottom: none;\n}\n\n.editable-empty, .editable-empty:hover, .editable-empty:focus{\n  font-style: italic; \n  color: #DD1144;  \n  /* border-bottom: none; */\n  text-decoration: none;\n}\n\n.editable-unsaved {\n  font-weight: bold; \n}\n\n.editable-unsaved:after {\n/*    content: '*'*/\n}\n\n.editable-bg-transition {\n  -webkit-transition: background-color 1400ms ease-out;\n  -moz-transition: background-color 1400ms ease-out;\n  -o-transition: background-color 1400ms ease-out;\n  -ms-transition: background-color 1400ms ease-out;\n  transition: background-color 1400ms ease-out;  \n}\n\n/*see https://github.com/vitalets/x-editable/issues/139 */\n.form-horizontal .editable\n{ \n    padding-top: 5px;\n    display:inline-block;\n}\n\n\n/*!\n * Datepicker for Bootstrap\n *\n * Copyright 2012 Stefan Petre\n * Improvements by Andrew Rowls\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n */\n.datepicker {\n  padding: 4px;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  direction: ltr;\n  /*.dow {\n\t\tborder-top: 1px solid #ddd !important;\n\t}*/\n\n}\n.datepicker-inline {\n  width: 220px;\n}\n.datepicker.datepicker-rtl {\n  direction: rtl;\n}\n.datepicker.datepicker-rtl table tr td span {\n  float: right;\n}\n.datepicker-dropdown {\n  top: 0;\n  left: 0;\n}\n.datepicker-dropdown:before {\n  content: '';\n  display: inline-block;\n  border-left: 7px solid transparent;\n  border-right: 7px solid transparent;\n  border-bottom: 7px solid #ccc;\n  border-bottom-color: rgba(0, 0, 0, 0.2);\n  position: absolute;\n  top: -7px;\n  left: 6px;\n}\n.datepicker-dropdown:after {\n  content: '';\n  display: inline-block;\n  border-left: 6px solid transparent;\n  border-right: 6px solid transparent;\n  border-bottom: 6px solid #ffffff;\n  position: absolute;\n  top: -6px;\n  left: 7px;\n}\n.datepicker > div {\n  display: none;\n}\n.datepicker.days div.datepicker-days {\n  display: block;\n}\n.datepicker.months div.datepicker-months {\n  display: block;\n}\n.datepicker.years div.datepicker-years {\n  display: block;\n}\n.datepicker table {\n  margin: 0;\n}\n.datepicker td,\n.datepicker th {\n  text-align: center;\n  width: 20px;\n  height: 20px;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  border: none;\n}\n.table-striped .datepicker table tr td,\n.table-striped .datepicker table tr th {\n  background-color: transparent;\n}\n.datepicker table tr td.day:hover {\n  background: #eeeeee;\n  cursor: pointer;\n}\n.datepicker table tr td.old,\n.datepicker table tr td.new {\n  color: #999999;\n}\n.datepicker table tr td.disabled,\n.datepicker table tr td.disabled:hover {\n  background: none;\n  color: #999999;\n  cursor: default;\n}\n.datepicker table tr td.today,\n.datepicker table tr td.today:hover,\n.datepicker table tr td.today.disabled,\n.datepicker table tr td.today.disabled:hover {\n  background-color: #fde19a;\n  background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a);\n  background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));\n  background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a);\n  background-image: -o-linear-gradient(top, #fdd49a, #fdf59a);\n  background-image: linear-gradient(top, #fdd49a, #fdf59a);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);\n  border-color: #fdf59a #fdf59a #fbed50;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  color: #000;\n}\n.datepicker table tr td.today:hover,\n.datepicker table tr td.today:hover:hover,\n.datepicker table tr td.today.disabled:hover,\n.datepicker table tr td.today.disabled:hover:hover,\n.datepicker table tr td.today:active,\n.datepicker table tr td.today:hover:active,\n.datepicker table tr td.today.disabled:active,\n.datepicker table tr td.today.disabled:hover:active,\n.datepicker table tr td.today.active,\n.datepicker table tr td.today:hover.active,\n.datepicker table tr td.today.disabled.active,\n.datepicker table tr td.today.disabled:hover.active,\n.datepicker table tr td.today.disabled,\n.datepicker table tr td.today:hover.disabled,\n.datepicker table tr td.today.disabled.disabled,\n.datepicker table tr td.today.disabled:hover.disabled,\n.datepicker table tr td.today[disabled],\n.datepicker table tr td.today:hover[disabled],\n.datepicker table tr td.today.disabled[disabled],\n.datepicker table tr td.today.disabled:hover[disabled] {\n  background-color: #fdf59a;\n}\n.datepicker table tr td.today:active,\n.datepicker table tr td.today:hover:active,\n.datepicker table tr td.today.disabled:active,\n.datepicker table tr td.today.disabled:hover:active,\n.datepicker table tr td.today.active,\n.datepicker table tr td.today:hover.active,\n.datepicker table tr td.today.disabled.active,\n.datepicker table tr td.today.disabled:hover.active {\n  background-color: #fbf069 \\9;\n}\n.datepicker table tr td.today:hover:hover {\n  color: #000;\n}\n.datepicker table tr td.today.active:hover {\n  color: #fff;\n}\n.datepicker table tr td.range,\n.datepicker table tr td.range:hover,\n.datepicker table tr td.range.disabled,\n.datepicker table tr td.range.disabled:hover {\n  background: #eeeeee;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.datepicker table tr td.range.today,\n.datepicker table tr td.range.today:hover,\n.datepicker table tr td.range.today.disabled,\n.datepicker table tr td.range.today.disabled:hover {\n  background-color: #f3d17a;\n  background-image: -moz-linear-gradient(top, #f3c17a, #f3e97a);\n  background-image: -ms-linear-gradient(top, #f3c17a, #f3e97a);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a));\n  background-image: -webkit-linear-gradient(top, #f3c17a, #f3e97a);\n  background-image: -o-linear-gradient(top, #f3c17a, #f3e97a);\n  background-image: linear-gradient(top, #f3c17a, #f3e97a);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);\n  border-color: #f3e97a #f3e97a #edde34;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.datepicker table tr td.range.today:hover,\n.datepicker table tr td.range.today:hover:hover,\n.datepicker table tr td.range.today.disabled:hover,\n.datepicker table tr td.range.today.disabled:hover:hover,\n.datepicker table tr td.range.today:active,\n.datepicker table tr td.range.today:hover:active,\n.datepicker table tr td.range.today.disabled:active,\n.datepicker table tr td.range.today.disabled:hover:active,\n.datepicker table tr td.range.today.active,\n.datepicker table tr td.range.today:hover.active,\n.datepicker table tr td.range.today.disabled.active,\n.datepicker table tr td.range.today.disabled:hover.active,\n.datepicker table tr td.range.today.disabled,\n.datepicker table tr td.range.today:hover.disabled,\n.datepicker table tr td.range.today.disabled.disabled,\n.datepicker table tr td.range.today.disabled:hover.disabled,\n.datepicker table tr td.range.today[disabled],\n.datepicker table tr td.range.today:hover[disabled],\n.datepicker table tr td.range.today.disabled[disabled],\n.datepicker table tr td.range.today.disabled:hover[disabled] {\n  background-color: #f3e97a;\n}\n.datepicker table tr td.range.today:active,\n.datepicker table tr td.range.today:hover:active,\n.datepicker table tr td.range.today.disabled:active,\n.datepicker table tr td.range.today.disabled:hover:active,\n.datepicker table tr td.range.today.active,\n.datepicker table tr td.range.today:hover.active,\n.datepicker table tr td.range.today.disabled.active,\n.datepicker table tr td.range.today.disabled:hover.active {\n  background-color: #efe24b \\9;\n}\n.datepicker table tr td.selected,\n.datepicker table tr td.selected:hover,\n.datepicker table tr td.selected.disabled,\n.datepicker table tr td.selected.disabled:hover {\n  background-color: #9e9e9e;\n  background-image: -moz-linear-gradient(top, #b3b3b3, #808080);\n  background-image: -ms-linear-gradient(top, #b3b3b3, #808080);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080));\n  background-image: -webkit-linear-gradient(top, #b3b3b3, #808080);\n  background-image: -o-linear-gradient(top, #b3b3b3, #808080);\n  background-image: linear-gradient(top, #b3b3b3, #808080);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);\n  border-color: #808080 #808080 #595959;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  color: #fff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker table tr td.selected:hover,\n.datepicker table tr td.selected:hover:hover,\n.datepicker table tr td.selected.disabled:hover,\n.datepicker table tr td.selected.disabled:hover:hover,\n.datepicker table tr td.selected:active,\n.datepicker table tr td.selected:hover:active,\n.datepicker table tr td.selected.disabled:active,\n.datepicker table tr td.selected.disabled:hover:active,\n.datepicker table tr td.selected.active,\n.datepicker table tr td.selected:hover.active,\n.datepicker table tr td.selected.disabled.active,\n.datepicker table tr td.selected.disabled:hover.active,\n.datepicker table tr td.selected.disabled,\n.datepicker table tr td.selected:hover.disabled,\n.datepicker table tr td.selected.disabled.disabled,\n.datepicker table tr td.selected.disabled:hover.disabled,\n.datepicker table tr td.selected[disabled],\n.datepicker table tr td.selected:hover[disabled],\n.datepicker table tr td.selected.disabled[disabled],\n.datepicker table tr td.selected.disabled:hover[disabled] {\n  background-color: #808080;\n}\n.datepicker table tr td.selected:active,\n.datepicker table tr td.selected:hover:active,\n.datepicker table tr td.selected.disabled:active,\n.datepicker table tr td.selected.disabled:hover:active,\n.datepicker table tr td.selected.active,\n.datepicker table tr td.selected:hover.active,\n.datepicker table tr td.selected.disabled.active,\n.datepicker table tr td.selected.disabled:hover.active {\n  background-color: #666666 \\9;\n}\n.datepicker table tr td.active,\n.datepicker table tr td.active:hover,\n.datepicker table tr td.active.disabled,\n.datepicker table tr td.active.disabled:hover {\n  background-color: #006dcc;\n  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -ms-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));\n  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -o-linear-gradient(top, #0088cc, #0044cc);\n  background-image: linear-gradient(top, #0088cc, #0044cc);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);\n  border-color: #0044cc #0044cc #002a80;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  color: #fff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker table tr td.active:hover,\n.datepicker table tr td.active:hover:hover,\n.datepicker table tr td.active.disabled:hover,\n.datepicker table tr td.active.disabled:hover:hover,\n.datepicker table tr td.active:active,\n.datepicker table tr td.active:hover:active,\n.datepicker table tr td.active.disabled:active,\n.datepicker table tr td.active.disabled:hover:active,\n.datepicker table tr td.active.active,\n.datepicker table tr td.active:hover.active,\n.datepicker table tr td.active.disabled.active,\n.datepicker table tr td.active.disabled:hover.active,\n.datepicker table tr td.active.disabled,\n.datepicker table tr td.active:hover.disabled,\n.datepicker table tr td.active.disabled.disabled,\n.datepicker table tr td.active.disabled:hover.disabled,\n.datepicker table tr td.active[disabled],\n.datepicker table tr td.active:hover[disabled],\n.datepicker table tr td.active.disabled[disabled],\n.datepicker table tr td.active.disabled:hover[disabled] {\n  background-color: #0044cc;\n}\n.datepicker table tr td.active:active,\n.datepicker table tr td.active:hover:active,\n.datepicker table tr td.active.disabled:active,\n.datepicker table tr td.active.disabled:hover:active,\n.datepicker table tr td.active.active,\n.datepicker table tr td.active:hover.active,\n.datepicker table tr td.active.disabled.active,\n.datepicker table tr td.active.disabled:hover.active {\n  background-color: #003399 \\9;\n}\n.datepicker table tr td span {\n  display: block;\n  width: 23%;\n  height: 54px;\n  line-height: 54px;\n  float: left;\n  margin: 1%;\n  cursor: pointer;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.datepicker table tr td span:hover {\n  background: #eeeeee;\n}\n.datepicker table tr td span.disabled,\n.datepicker table tr td span.disabled:hover {\n  background: none;\n  color: #999999;\n  cursor: default;\n}\n.datepicker table tr td span.active,\n.datepicker table tr td span.active:hover,\n.datepicker table tr td span.active.disabled,\n.datepicker table tr td span.active.disabled:hover {\n  background-color: #006dcc;\n  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -ms-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));\n  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -o-linear-gradient(top, #0088cc, #0044cc);\n  background-image: linear-gradient(top, #0088cc, #0044cc);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);\n  border-color: #0044cc #0044cc #002a80;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  color: #fff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker table tr td span.active:hover,\n.datepicker table tr td span.active:hover:hover,\n.datepicker table tr td span.active.disabled:hover,\n.datepicker table tr td span.active.disabled:hover:hover,\n.datepicker table tr td span.active:active,\n.datepicker table tr td span.active:hover:active,\n.datepicker table tr td span.active.disabled:active,\n.datepicker table tr td span.active.disabled:hover:active,\n.datepicker table tr td span.active.active,\n.datepicker table tr td span.active:hover.active,\n.datepicker table tr td span.active.disabled.active,\n.datepicker table tr td span.active.disabled:hover.active,\n.datepicker table tr td span.active.disabled,\n.datepicker table tr td span.active:hover.disabled,\n.datepicker table tr td span.active.disabled.disabled,\n.datepicker table tr td span.active.disabled:hover.disabled,\n.datepicker table tr td span.active[disabled],\n.datepicker table tr td span.active:hover[disabled],\n.datepicker table tr td span.active.disabled[disabled],\n.datepicker table tr td span.active.disabled:hover[disabled] {\n  background-color: #0044cc;\n}\n.datepicker table tr td span.active:active,\n.datepicker table tr td span.active:hover:active,\n.datepicker table tr td span.active.disabled:active,\n.datepicker table tr td span.active.disabled:hover:active,\n.datepicker table tr td span.active.active,\n.datepicker table tr td span.active:hover.active,\n.datepicker table tr td span.active.disabled.active,\n.datepicker table tr td span.active.disabled:hover.active {\n  background-color: #003399 \\9;\n}\n.datepicker table tr td span.old,\n.datepicker table tr td span.new {\n  color: #999999;\n}\n.datepicker th.datepicker-switch {\n  width: 145px;\n}\n.datepicker thead tr:first-child th,\n.datepicker tfoot tr th {\n  cursor: pointer;\n}\n.datepicker thead tr:first-child th:hover,\n.datepicker tfoot tr th:hover {\n  background: #eeeeee;\n}\n.datepicker .cw {\n  font-size: 10px;\n  width: 12px;\n  padding: 0 2px 0 5px;\n  vertical-align: middle;\n}\n.datepicker thead tr:first-child th.cw {\n  cursor: default;\n  background-color: transparent;\n}\n.input-append.date .add-on i,\n.input-prepend.date .add-on i {\n  display: block;\n  cursor: pointer;\n  width: 16px;\n  height: 16px;\n}\n.input-daterange input {\n  text-align: center;\n}\n.input-daterange input:first-child {\n  -webkit-border-radius: 3px 0 0 3px;\n  -moz-border-radius: 3px 0 0 3px;\n  border-radius: 3px 0 0 3px;\n}\n.input-daterange input:last-child {\n  -webkit-border-radius: 0 3px 3px 0;\n  -moz-border-radius: 0 3px 3px 0;\n  border-radius: 0 3px 3px 0;\n}\n.input-daterange .add-on {\n  display: inline-block;\n  width: auto;\n  min-width: 16px;\n  height: 18px;\n  padding: 4px 5px;\n  font-weight: normal;\n  line-height: 18px;\n  text-align: center;\n  text-shadow: 0 1px 0 #ffffff;\n  vertical-align: middle;\n  background-color: #eeeeee;\n  border: 1px solid #ccc;\n  margin-left: -5px;\n  margin-right: -5px;\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/css/bootstrap-timepicker.css",
    "content": "/*!\n * Timepicker Component for Twitter Bootstrap\n *\n * Copyright 2013 Joris de Wit\n *\n * Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n.bootstrap-timepicker {\n  position: relative;\n}\n.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu {\n  left: auto;\n  right: 0;\n}\n.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:before {\n  left: auto;\n  right: 12px;\n}\n.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:after {\n  left: auto;\n  right: 13px;\n}\n.bootstrap-timepicker .add-on {\n  cursor: pointer;\n}\n.bootstrap-timepicker .add-on i {\n  display: inline-block;\n  width: 16px;\n  height: 16px;\n}\n.bootstrap-timepicker-widget.dropdown-menu {\n  padding: 2px 3px 2px 2px;\n}\n.bootstrap-timepicker-widget.dropdown-menu.open {\n  display: inline-block;\n}\n.bootstrap-timepicker-widget.dropdown-menu:before {\n  border-bottom: 7px solid rgba(0, 0, 0, 0.2);\n  border-left: 7px solid transparent;\n  border-right: 7px solid transparent;\n  content: \"\";\n  display: inline-block;\n  left: 9px;\n  position: absolute;\n  top: -7px;\n}\n.bootstrap-timepicker-widget.dropdown-menu:after {\n  border-bottom: 6px solid #FFFFFF;\n  border-left: 6px solid transparent;\n  border-right: 6px solid transparent;\n  content: \"\";\n  display: inline-block;\n  left: 10px;\n  position: absolute;\n  top: -6px;\n}\n.bootstrap-timepicker-widget a.btn,\n.bootstrap-timepicker-widget input {\n  border-radius: 4px;\n}\n.bootstrap-timepicker-widget table {\n  width: 100%;\n  margin: 0;\n}\n.bootstrap-timepicker-widget table td {\n  text-align: center;\n  height: 30px;\n  margin: 0;\n  padding: 2px;\n}\n.bootstrap-timepicker-widget table td:not(.separator) {\n  min-width: 30px;\n}\n.bootstrap-timepicker-widget table td span {\n  width: 100%;\n}\n.bootstrap-timepicker-widget table td a {\n  border: 1px transparent solid;\n  width: 100%;\n  display: inline-block;\n  margin: 0;\n  padding: 8px 0;\n  outline: 0;\n  color: #333;\n}\n.bootstrap-timepicker-widget table td a:hover {\n  text-decoration: none;\n  background-color: #eee;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  border-color: #ddd;\n}\n.bootstrap-timepicker-widget table td a i {\n  margin-top: 2px;\n}\n.bootstrap-timepicker-widget table td input {\n  width: 25px;\n  margin: 0;\n  text-align: center;\n}\n.bootstrap-timepicker-widget .modal-content {\n  padding: 4px;\n}\n@media (min-width: 767px) {\n  .bootstrap-timepicker-widget.modal {\n    width: 200px;\n    margin-left: -100px;\n  }\n}\n@media (max-width: 767px) {\n  .bootstrap-timepicker {\n    width: 100%;\n  }\n  .bootstrap-timepicker .dropdown-menu {\n    width: 100%;\n  }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/css/chosen.css",
    "content": "/* @group Base */\n.chosen-container {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n  font-size: 13px;\n  zoom: 1;\n  *display: inline;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n}\n.chosen-container .chosen-drop {\n  position: absolute;\n  top: 100%;\n  left: -9999px;\n  z-index: 1010;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  width: 100%;\n  border: 1px solid #aaa;\n  border-top: 0;\n  background: #fff;\n  box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15);\n}\n.chosen-container.chosen-with-drop .chosen-drop {\n  left: 0;\n}\n.chosen-container a {\n  cursor: pointer;\n}\n\n/* @end */\n/* @group Single Chosen */\n.chosen-container-single .chosen-single {\n  position: relative;\n  display: block;\n  overflow: hidden;\n  padding: 0 0 0 8px;\n  height: 23px;\n  border: 1px solid #aaa;\n  border-radius: 5px;\n  background-color: #fff;\n  background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));\n  background: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);\n  background: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);\n  background: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);\n  background: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);\n  background-clip: padding-box;\n  box-shadow: 0 0 3px white inset, 0 1px 1px rgba(0, 0, 0, 0.1);\n  color: #444;\n  text-decoration: none;\n  white-space: nowrap;\n  line-height: 24px;\n}\n.chosen-container-single .chosen-default {\n  color: #999;\n}\n.chosen-container-single .chosen-single span {\n  display: block;\n  overflow: hidden;\n  margin-right: 26px;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.chosen-container-single .chosen-single-with-deselect span {\n  margin-right: 38px;\n}\n.chosen-container-single .chosen-single abbr {\n  position: absolute;\n  top: 6px;\n  right: 26px;\n  display: block;\n  width: 12px;\n  height: 12px;\n  background: url('chosen-sprite.png') -42px 1px no-repeat;\n  font-size: 1px;\n}\n.chosen-container-single .chosen-single abbr:hover {\n  background-position: -42px -10px;\n}\n.chosen-container-single.chosen-disabled .chosen-single abbr:hover {\n  background-position: -42px -10px;\n}\n.chosen-container-single .chosen-single div {\n  position: absolute;\n  top: 0;\n  right: 0;\n  display: block;\n  width: 18px;\n  height: 100%;\n}\n.chosen-container-single .chosen-single div b {\n  display: block;\n  width: 100%;\n  height: 100%;\n  background: url('chosen-sprite.png') no-repeat 0px 2px;\n}\n.chosen-container-single .chosen-search {\n  position: relative;\n  z-index: 1010;\n  margin: 0;\n  padding: 3px 4px;\n  white-space: nowrap;\n}\n.chosen-container-single .chosen-search input[type=\"text\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  margin: 1px 0;\n  padding: 4px 20px 4px 5px;\n  width: 100%;\n  height: auto;\n  outline: 0;\n  border: 1px solid #aaa;\n  background: white url('chosen-sprite.png') no-repeat 100% -20px;\n  background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));\n  background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);\n  background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);\n  background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(#eeeeee 1%, #ffffff 15%);\n  background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);\n  font-size: 1em;\n  font-family: sans-serif;\n  line-height: normal;\n  border-radius: 0;\n}\n.chosen-container-single .chosen-drop {\n  margin-top: -1px;\n  border-radius: 0 0 4px 4px;\n  background-clip: padding-box;\n}\n.chosen-container-single.chosen-container-single-nosearch .chosen-search {\n  position: absolute;\n  left: -9999px;\n}\n\n/* @end */\n/* @group Results */\n.chosen-container .chosen-results {\n  position: relative;\n  overflow-x: hidden;\n  overflow-y: auto;\n  margin: 0 4px 4px 0;\n  padding: 0 0 0 4px;\n  max-height: 240px;\n  -webkit-overflow-scrolling: touch;\n}\n.chosen-container .chosen-results li {\n  display: none;\n  margin: 0;\n  padding: 5px 6px;\n  list-style: none;\n  line-height: 15px;\n}\n.chosen-container .chosen-results li.active-result {\n  display: list-item;\n  cursor: pointer;\n}\n.chosen-container .chosen-results li.disabled-result {\n  display: list-item;\n  color: #ccc;\n  cursor: default;\n}\n.chosen-container .chosen-results li.highlighted {\n  background-color: #3875d7;\n  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));\n  background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%);\n  background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%);\n  background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%);\n  background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);\n  color: #fff;\n}\n.chosen-container .chosen-results li.no-results {\n  display: list-item;\n  background: #f4f4f4;\n}\n.chosen-container .chosen-results li.group-result {\n  display: list-item;\n  font-weight: bold;\n  cursor: default;\n}\n.chosen-container .chosen-results li.group-option {\n  padding-left: 15px;\n}\n.chosen-container .chosen-results li em {\n  font-style: normal;\n  text-decoration: underline;\n}\n\n/* @end */\n/* @group Multi Chosen */\n.chosen-container-multi .chosen-choices {\n  position: relative;\n  overflow: hidden;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  width: 100%;\n  height: auto !important;\n  height: 1%;\n  border: 1px solid #aaa;\n  background-color: #fff;\n  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));\n  background-image: -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);\n  background-image: -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);\n  background-image: -o-linear-gradient(#eeeeee 1%, #ffffff 15%);\n  background-image: linear-gradient(#eeeeee 1%, #ffffff 15%);\n  cursor: text;\n}\n.chosen-container-multi .chosen-choices li {\n  float: left;\n  list-style: none;\n}\n.chosen-container-multi .chosen-choices li.search-field {\n  margin: 0;\n  padding: 0;\n  white-space: nowrap;\n}\n.chosen-container-multi .chosen-choices li.search-field input[type=\"text\"] {\n  margin: 1px 0;\n  padding: 5px;\n  height: 15px;\n  outline: 0;\n  border: 0 !important;\n  background: transparent !important;\n  box-shadow: none;\n  color: #666;\n  font-size: 100%;\n  font-family: sans-serif;\n  line-height: normal;\n  border-radius: 0;\n}\n.chosen-container-multi .chosen-choices li.search-field .default {\n  color: #999;\n}\n.chosen-container-multi .chosen-choices li.search-choice {\n  position: relative;\n  margin: 3px 0 3px 5px;\n  padding: 3px 20px 3px 5px;\n  border: 1px solid #aaa;\n  border-radius: 3px;\n  background-color: #e4e4e4;\n  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));\n  background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);\n  background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);\n  background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);\n  background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);\n  background-clip: padding-box;\n  box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05);\n  color: #333;\n  line-height: 13px;\n  cursor: default;\n}\n.chosen-container-multi .chosen-choices li.search-choice .search-choice-close {\n  position: absolute;\n  top: 4px;\n  right: 3px;\n  display: block;\n  width: 12px;\n  height: 12px;\n  background: url('chosen-sprite.png') -42px 1px no-repeat;\n  font-size: 1px;\n}\n.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover {\n  background-position: -42px -10px;\n}\n.chosen-container-multi .chosen-choices li.search-choice-disabled {\n  padding-right: 5px;\n  border: 1px solid #ccc;\n  background-color: #e4e4e4;\n  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));\n  background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);\n  background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);\n  background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);\n  background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);\n  color: #666;\n}\n.chosen-container-multi .chosen-choices li.search-choice-focus {\n  background: #d4d4d4;\n}\n.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close {\n  background-position: -42px -10px;\n}\n.chosen-container-multi .chosen-results {\n  margin: 0;\n  padding: 0;\n}\n.chosen-container-multi .chosen-drop .result-selected {\n  display: list-item;\n  color: #ccc;\n  cursor: default;\n}\n\n/* @end */\n/* @group Active  */\n.chosen-container-active .chosen-single {\n  border: 1px solid #5897fb;\n  box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);\n}\n.chosen-container-active.chosen-with-drop .chosen-single {\n  border: 1px solid #aaa;\n  -moz-border-radius-bottomright: 0;\n  border-bottom-right-radius: 0;\n  -moz-border-radius-bottomleft: 0;\n  border-bottom-left-radius: 0;\n  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff));\n  background-image: -webkit-linear-gradient(#eeeeee 20%, #ffffff 80%);\n  background-image: -moz-linear-gradient(#eeeeee 20%, #ffffff 80%);\n  background-image: -o-linear-gradient(#eeeeee 20%, #ffffff 80%);\n  background-image: linear-gradient(#eeeeee 20%, #ffffff 80%);\n  box-shadow: 0 1px 0 #fff inset;\n}\n.chosen-container-active.chosen-with-drop .chosen-single div {\n  border-left: none;\n  background: transparent;\n}\n.chosen-container-active.chosen-with-drop .chosen-single div b {\n  background-position: -18px 2px;\n}\n.chosen-container-active .chosen-choices {\n  border: 1px solid #5897fb;\n  box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);\n}\n.chosen-container-active .chosen-choices li.search-field input[type=\"text\"] {\n  color: #111 !important;\n}\n\n/* @end */\n/* @group Disabled Support */\n.chosen-disabled {\n  opacity: 0.5 !important;\n  cursor: default;\n}\n.chosen-disabled .chosen-single {\n  cursor: default;\n}\n.chosen-disabled .chosen-choices .search-choice .search-choice-close {\n  cursor: default;\n}\n\n/* @end */\n/* @group Right to Left */\n.chosen-rtl {\n  text-align: right;\n}\n.chosen-rtl .chosen-single {\n  overflow: visible;\n  padding: 0 8px 0 0;\n}\n.chosen-rtl .chosen-single span {\n  margin-right: 0;\n  margin-left: 26px;\n  direction: rtl;\n}\n.chosen-rtl .chosen-single-with-deselect span {\n  margin-left: 38px;\n}\n.chosen-rtl .chosen-single div {\n  right: auto;\n  left: 3px;\n}\n.chosen-rtl .chosen-single abbr {\n  right: auto;\n  left: 26px;\n}\n.chosen-rtl .chosen-choices li {\n  float: right;\n}\n.chosen-rtl .chosen-choices li.search-field input[type=\"text\"] {\n  direction: rtl;\n}\n.chosen-rtl .chosen-choices li.search-choice {\n  margin: 3px 5px 3px 0;\n  padding: 3px 5px 3px 19px;\n}\n.chosen-rtl .chosen-choices li.search-choice .search-choice-close {\n  right: auto;\n  left: 4px;\n}\n.chosen-rtl.chosen-container-single-nosearch .chosen-search,\n.chosen-rtl .chosen-drop {\n  left: 9999px;\n}\n.chosen-rtl.chosen-container-single .chosen-results {\n  margin: 0 0 4px 4px;\n  padding: 0 4px 0 0;\n}\n.chosen-rtl .chosen-results li.group-option {\n  padding-right: 15px;\n  padding-left: 0;\n}\n.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div {\n  border-right: none;\n}\n.chosen-rtl .chosen-search input[type=\"text\"] {\n  padding: 4px 5px 4px 20px;\n  background: white url('chosen-sprite.png') no-repeat -30px -20px;\n  background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));\n  background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);\n  background: url('chosen-sprite.png') no-repeat -30px -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);\n  background: url('chosen-sprite.png') no-repeat -30px -20px, -o-linear-gradient(#eeeeee 1%, #ffffff 15%);\n  background: url('chosen-sprite.png') no-repeat -30px -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);\n  direction: rtl;\n}\n.chosen-rtl.chosen-container-single .chosen-single div b {\n  background-position: 6px 2px;\n}\n.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b {\n  background-position: -12px 2px;\n}\n\n/* @end */\n/* @group Retina compatibility */\n@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) {\n  .chosen-rtl .chosen-search input[type=\"text\"],\n  .chosen-container-single .chosen-single abbr,\n  .chosen-container-single .chosen-single div b,\n  .chosen-container-single .chosen-search input[type=\"text\"],\n  .chosen-container-multi .chosen-choices .search-choice .search-choice-close,\n  .chosen-container .chosen-results-scroll-down span,\n  .chosen-container .chosen-results-scroll-up span {\n    background-image: url('chosen-sprite@2x.png') !important;\n    background-size: 52px 37px !important;\n    background-repeat: no-repeat !important;\n  }\n}\n/* @end */\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/css/colorbox.css",
    "content": "/*\n    Colorbox Core Style:\n    The following CSS is consistent between example themes and should not be altered.\n*/\n#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}\n#cboxOverlay{position:fixed; width:100%; height:100%;}\n#cboxMiddleLeft, #cboxBottomLeft{clear:left;}\n#cboxContent{position:relative;}\n#cboxLoadedContent{overflow:auto; -webkit-overflow-scrolling: touch;}\n#cboxTitle{margin:0;}\n#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}\n#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}\n.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none; -ms-interpolation-mode:bicubic;}\n.cboxIframe{width:100%; height:100%; display:block; border:0;}\n#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}\n\n/* \n    User Style:\n    Change the following styles to modify the appearance of Colorbox.  They are\n    ordered & tabbed in a way that represents the nesting of the generated HTML.\n*/\n#cboxOverlay{background:url(images/overlay.png) repeat 0 0;}\n#colorbox{outline:0;}\n    #cboxTopLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -101px 0;}\n    #cboxTopRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -130px 0;}\n    #cboxBottomLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -101px -29px;}\n    #cboxBottomRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -130px -29px;}\n    #cboxMiddleLeft{width:21px; background:url(images/controls.png) left top repeat-y;}\n    #cboxMiddleRight{width:21px; background:url(images/controls.png) right top repeat-y;}\n    #cboxTopCenter{height:21px; background:url(images/border.png) 0 0 repeat-x;}\n    #cboxBottomCenter{height:21px; background:url(images/border.png) 0 -29px repeat-x;}\n    #cboxContent{background:#fff; overflow:hidden;}\n        .cboxIframe{background:#fff;}\n        #cboxError{padding:50px; border:1px solid #ccc;}\n        #cboxLoadedContent{margin-bottom:28px;}\n        #cboxTitle{position:absolute; bottom:4px; left:0; text-align:center; width:100%; color:#949494;}\n        #cboxCurrent{position:absolute; bottom:4px; left:58px; color:#949494;}\n        #cboxLoadingOverlay{background:url(images/loading_background.png) no-repeat center center;}\n        #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}\n\n        /* these elements are buttons, and may need to have additional styles reset to avoid unwanted base styles */\n        #cboxPrevious, #cboxNext, #cboxSlideshow, #cboxClose {border:0; padding:0; margin:0; overflow:visible; width:auto; background:none; }\n        \n        /* avoid outlines on :active (mouseclick), but preserve outlines on :focus (tabbed navigating) */\n        #cboxPrevious:active, #cboxNext:active, #cboxSlideshow:active, #cboxClose:active {outline:0;}\n\n        #cboxSlideshow{position:absolute; bottom:4px; right:30px; color:#0092ef;}\n        #cboxPrevious{position:absolute; bottom:0; left:0; background:url(images/controls.png) no-repeat -75px 0; width:25px; height:25px; text-indent:-9999px;}\n        #cboxPrevious:hover{background-position:-75px -25px;}\n        #cboxNext{position:absolute; bottom:0; left:27px; background:url(images/controls.png) no-repeat -50px 0; width:25px; height:25px; text-indent:-9999px;}\n        #cboxNext:hover{background-position:-50px -25px;}\n        #cboxClose{position:absolute; bottom:0; right:0; background:url(images/controls.png) no-repeat -25px 0; width:25px; height:25px; text-indent:-9999px;}\n        #cboxClose:hover{background-position:-25px -25px;}\n\n/*\n  The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill\n  when an alpha filter (opacity change) is set on the element or ancestor element.  This style is not applied to or needed in IE9.\n  See: http://jacklmoore.com/notes/ie-transparency-problems/\n*/\n.cboxIE #cboxTopLeft,\n.cboxIE #cboxTopCenter,\n.cboxIE #cboxTopRight,\n.cboxIE #cboxBottomLeft,\n.cboxIE #cboxBottomCenter,\n.cboxIE #cboxBottomRight,\n.cboxIE #cboxMiddleLeft,\n.cboxIE #cboxMiddleRight {\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF);\n}"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/css/colorpicker.css",
    "content": "/*!\n* Colorpicker for Bootstrap\n*\n* Copyright 2012 Stefan Petre\n* Licensed under the Apache License v2.0\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n*/\n.colorpicker-saturation {\n\twidth: 100px;\n\theight: 100px;\n\tbackground-image: url(img/saturation.png);\n\tcursor: crosshair;\n\tfloat: left;\n}\n.colorpicker-saturation i {\n\tdisplay: block;\n\theight: 5px;\n\twidth: 5px;\n\tborder: 1px solid #000;\n\t-webkit-border-radius: 5px;\n\t-moz-border-radius: 5px;\n\tborder-radius: 5px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tmargin: -4px 0 0 -4px;\n}\n.colorpicker-saturation i b {\n\tdisplay: block;\n\theight: 5px;\n\twidth: 5px;\n\tborder: 1px solid #fff;\n\t-webkit-border-radius: 5px;\n\t-moz-border-radius: 5px;\n\tborder-radius: 5px;\n}\n.colorpicker-hue, .colorpicker-alpha {\n\twidth: 15px;\n\theight: 100px;\n\tfloat: left;\n\tcursor: row-resize;\n\tmargin-left: 4px;\n\tmargin-bottom: 4px;\n}\n.colorpicker-hue i, .colorpicker-alpha i {\n\tdisplay: block;\n\theight: 1px;\n\tbackground: #000;\n\tborder-top: 1px solid #fff;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\tmargin-top: -1px;\n}\n.colorpicker-hue {\n\tbackground-image: url(img/hue.png);\n}\n.colorpicker-alpha {\n\tbackground-image: url(img/alpha.png);\n\tdisplay: none;\n}\n.colorpicker {\n\t*zoom: 1;\n\ttop: 0;\n\tleft: 0;\n\tpadding: 4px;\n\tmin-width: 120px;\n\tmargin-top: 1px;\n\t-webkit-border-radius: 4px;\n\t-moz-border-radius: 4px;\n\tborder-radius: 4px;\n}\n.colorpicker:before, .colorpicker:after {\n\tdisplay: table;\n\tcontent: \"\";\n}\n.colorpicker:after {\n\tclear: both;\n}\n.colorpicker:before {\n\tcontent: '';\n\tdisplay: inline-block;\n\tborder-left: 7px solid transparent;\n\tborder-right: 7px solid transparent;\n\tborder-bottom: 7px solid #ccc;\n\tborder-bottom-color: rgba(0, 0, 0, 0.2);\n\tposition: absolute;\n\ttop: -7px;\n\tleft: 6px;\n}\n.colorpicker:after {\n\tcontent: '';\n\tdisplay: inline-block;\n\tborder-left: 6px solid transparent;\n\tborder-right: 6px solid transparent;\n\tborder-bottom: 6px solid #ffffff;\n\tposition: absolute;\n\ttop: -6px;\n\tleft: 7px;\n}\n.colorpicker div {\n\tposition: relative;\n}\n.colorpicker.alpha {\n\tmin-width: 140px;\n}\n.colorpicker.alpha .colorpicker-alpha {\n\tdisplay: block;\n}\n.colorpicker-color {\n\theight: 10px;\n\tmargin-top: 5px;\n\tclear: both;\n\tbackground-image: url(img/alpha.png);\n\tbackground-position: 0 100%;\n}\n.colorpicker-color div {\n\theight: 10px;\n}\n.input-append.color .add-on i, .input-prepend.color .add-on i {\n\tdisplay: block;\n\tcursor: pointer;\n\twidth: 16px;\n\theight: 16px;\n} "
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/css/datepicker.css",
    "content": "/*!\n * Datepicker for Bootstrap\n *\n * Copyright 2012 Stefan Petre\n * Improvements by Andrew Rowls\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n */\n.datepicker {\n  padding: 4px;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  direction: ltr;\n  /*.dow {\n\t\tborder-top: 1px solid #ddd !important;\n\t}*/\n\n}\n.datepicker-inline {\n  width: 220px;\n}\n.datepicker.datepicker-rtl {\n  direction: rtl;\n}\n.datepicker.datepicker-rtl table tr td span {\n  float: right;\n}\n.datepicker-dropdown {\n  top: 0;\n  left: 0;\n}\n.datepicker-dropdown:before {\n  content: '';\n  display: inline-block;\n  border-left: 7px solid transparent;\n  border-right: 7px solid transparent;\n  border-bottom: 7px solid #ccc;\n  border-bottom-color: rgba(0, 0, 0, 0.2);\n  position: absolute;\n  top: -7px;\n  left: 6px;\n}\n.datepicker-dropdown:after {\n  content: '';\n  display: inline-block;\n  border-left: 6px solid transparent;\n  border-right: 6px solid transparent;\n  border-bottom: 6px solid #ffffff;\n  position: absolute;\n  top: -6px;\n  left: 7px;\n}\n.datepicker > div {\n  display: none;\n}\n.datepicker.days div.datepicker-days {\n  display: block;\n}\n.datepicker.months div.datepicker-months {\n  display: block;\n}\n.datepicker.years div.datepicker-years {\n  display: block;\n}\n.datepicker table {\n  margin: 0;\n}\n.datepicker td,\n.datepicker th {\n  text-align: center;\n  width: 20px;\n  height: 20px;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  border: none;\n}\n.table-striped .datepicker table tr td,\n.table-striped .datepicker table tr th {\n  background-color: transparent;\n}\n.datepicker table tr td.day:hover {\n  background: #eeeeee;\n  cursor: pointer;\n}\n.datepicker table tr td.old,\n.datepicker table tr td.new {\n  color: #999999;\n}\n.datepicker table tr td.disabled,\n.datepicker table tr td.disabled:hover {\n  background: none;\n  color: #999999;\n  cursor: default;\n}\n.datepicker table tr td.today,\n.datepicker table tr td.today:hover,\n.datepicker table tr td.today.disabled,\n.datepicker table tr td.today.disabled:hover {\n  background-color: #fde19a;\n  background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a);\n  background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));\n  background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a);\n  background-image: -o-linear-gradient(top, #fdd49a, #fdf59a);\n  background-image: linear-gradient(top, #fdd49a, #fdf59a);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);\n  border-color: #fdf59a #fdf59a #fbed50;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  color: #000 !important;\n}\n.datepicker table tr td.today:hover,\n.datepicker table tr td.today:hover:hover,\n.datepicker table tr td.today.disabled:hover,\n.datepicker table tr td.today.disabled:hover:hover,\n.datepicker table tr td.today:active,\n.datepicker table tr td.today:hover:active,\n.datepicker table tr td.today.disabled:active,\n.datepicker table tr td.today.disabled:hover:active,\n.datepicker table tr td.today.active,\n.datepicker table tr td.today:hover.active,\n.datepicker table tr td.today.disabled.active,\n.datepicker table tr td.today.disabled:hover.active,\n.datepicker table tr td.today.disabled,\n.datepicker table tr td.today:hover.disabled,\n.datepicker table tr td.today.disabled.disabled,\n.datepicker table tr td.today.disabled:hover.disabled,\n.datepicker table tr td.today[disabled],\n.datepicker table tr td.today:hover[disabled],\n.datepicker table tr td.today.disabled[disabled],\n.datepicker table tr td.today.disabled:hover[disabled] {\n  background-color: #fdf59a;\n}\n.datepicker table tr td.today:active,\n.datepicker table tr td.today:hover:active,\n.datepicker table tr td.today.disabled:active,\n.datepicker table tr td.today.disabled:hover:active,\n.datepicker table tr td.today.active,\n.datepicker table tr td.today:hover.active,\n.datepicker table tr td.today.disabled.active,\n.datepicker table tr td.today.disabled:hover.active {\n  background-color: #fbf069 \\9;\n}\n.datepicker table tr td.active,\n.datepicker table tr td.active:hover,\n.datepicker table tr td.active.disabled,\n.datepicker table tr td.active.disabled:hover {\n  background-color: #006dcc;\n  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -ms-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));\n  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -o-linear-gradient(top, #0088cc, #0044cc);\n  background-image: linear-gradient(top, #0088cc, #0044cc);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);\n  border-color: #0044cc #0044cc #002a80;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  color: #fff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker table tr td.active:hover,\n.datepicker table tr td.active:hover:hover,\n.datepicker table tr td.active.disabled:hover,\n.datepicker table tr td.active.disabled:hover:hover,\n.datepicker table tr td.active:active,\n.datepicker table tr td.active:hover:active,\n.datepicker table tr td.active.disabled:active,\n.datepicker table tr td.active.disabled:hover:active,\n.datepicker table tr td.active.active,\n.datepicker table tr td.active:hover.active,\n.datepicker table tr td.active.disabled.active,\n.datepicker table tr td.active.disabled:hover.active,\n.datepicker table tr td.active.disabled,\n.datepicker table tr td.active:hover.disabled,\n.datepicker table tr td.active.disabled.disabled,\n.datepicker table tr td.active.disabled:hover.disabled,\n.datepicker table tr td.active[disabled],\n.datepicker table tr td.active:hover[disabled],\n.datepicker table tr td.active.disabled[disabled],\n.datepicker table tr td.active.disabled:hover[disabled] {\n  background-color: #0044cc;\n}\n.datepicker table tr td.active:active,\n.datepicker table tr td.active:hover:active,\n.datepicker table tr td.active.disabled:active,\n.datepicker table tr td.active.disabled:hover:active,\n.datepicker table tr td.active.active,\n.datepicker table tr td.active:hover.active,\n.datepicker table tr td.active.disabled.active,\n.datepicker table tr td.active.disabled:hover.active {\n  background-color: #003399 \\9;\n}\n.datepicker table tr td span {\n  display: block;\n  width: 23%;\n  height: 54px;\n  line-height: 54px;\n  float: left;\n  margin: 1%;\n  cursor: pointer;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.datepicker table tr td span:hover {\n  background: #eeeeee;\n}\n.datepicker table tr td span.disabled,\n.datepicker table tr td span.disabled:hover {\n  background: none;\n  color: #999999;\n  cursor: default;\n}\n.datepicker table tr td span.active,\n.datepicker table tr td span.active:hover,\n.datepicker table tr td span.active.disabled,\n.datepicker table tr td span.active.disabled:hover {\n  background-color: #006dcc;\n  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -ms-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));\n  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -o-linear-gradient(top, #0088cc, #0044cc);\n  background-image: linear-gradient(top, #0088cc, #0044cc);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);\n  border-color: #0044cc #0044cc #002a80;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  color: #fff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker table tr td span.active:hover,\n.datepicker table tr td span.active:hover:hover,\n.datepicker table tr td span.active.disabled:hover,\n.datepicker table tr td span.active.disabled:hover:hover,\n.datepicker table tr td span.active:active,\n.datepicker table tr td span.active:hover:active,\n.datepicker table tr td span.active.disabled:active,\n.datepicker table tr td span.active.disabled:hover:active,\n.datepicker table tr td span.active.active,\n.datepicker table tr td span.active:hover.active,\n.datepicker table tr td span.active.disabled.active,\n.datepicker table tr td span.active.disabled:hover.active,\n.datepicker table tr td span.active.disabled,\n.datepicker table tr td span.active:hover.disabled,\n.datepicker table tr td span.active.disabled.disabled,\n.datepicker table tr td span.active.disabled:hover.disabled,\n.datepicker table tr td span.active[disabled],\n.datepicker table tr td span.active:hover[disabled],\n.datepicker table tr td span.active.disabled[disabled],\n.datepicker table tr td span.active.disabled:hover[disabled] {\n  background-color: #0044cc;\n}\n.datepicker table tr td span.active:active,\n.datepicker table tr td span.active:hover:active,\n.datepicker table tr td span.active.disabled:active,\n.datepicker table tr td span.active.disabled:hover:active,\n.datepicker table tr td span.active.active,\n.datepicker table tr td span.active:hover.active,\n.datepicker table tr td span.active.disabled.active,\n.datepicker table tr td span.active.disabled:hover.active {\n  background-color: #003399 \\9;\n}\n.datepicker table tr td span.old {\n  color: #999999;\n}\n.datepicker th.switch {\n  width: 145px;\n}\n.datepicker thead tr:first-child th,\n.datepicker tfoot tr:first-child th {\n  cursor: pointer;\n}\n.datepicker thead tr:first-child th:hover,\n.datepicker tfoot tr:first-child th:hover {\n  background: #eeeeee;\n}\n.datepicker .cw {\n  font-size: 10px;\n  width: 12px;\n  padding: 0 2px 0 5px;\n  vertical-align: middle;\n}\n.datepicker thead tr:first-child th.cw {\n  cursor: default;\n  background-color: transparent;\n}\n.input-append.date .add-on i,\n.input-prepend.date .add-on i {\n  display: block;\n  cursor: pointer;\n  width: 16px;\n  height: 16px;\n}"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/css/daterangepicker.css",
    "content": "/*!\n * Stylesheet for the Date Range Picker, for use with Bootstrap 3.x\n *\n * Copyright 2013 Dan Grossman ( http://www.dangrossman.info )\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Built for http://www.improvely.com\n */\n\n .daterangepicker.dropdown-menu {\n  max-width: none;\n}\n\n.daterangepicker.opensleft .ranges, .daterangepicker.opensleft .calendar {\n  float: left;\n  margin: 4px;\n}\n\n.daterangepicker.opensright .ranges, .daterangepicker.opensright .calendar {\n  float: right;\n  margin: 4px;\n}\n\n.daterangepicker .ranges {\n  width: 160px;\n  text-align: left;\n}\n\n.daterangepicker .ranges .range_inputs>div {\n  float: left;\n}\n\n.daterangepicker .ranges .range_inputs>div:nth-child(2) {\n  padding-left: 11px;\n}\n\n.daterangepicker .calendar {\n  display: none;\n  max-width: 270px;\n}\n\n.daterangepicker .calendar th, .daterangepicker .calendar td {\n  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  white-space: nowrap;\n  text-align: center;\n  min-width: 32px;\n}\n\n.daterangepicker .ranges label {\n  color: #333;\n  display: block;\n  font-size: 11px;\n  font-weight: normal;\n  height: 20px;\n  line-height: 20px;\n  margin-bottom: 2px;\n  text-shadow: #fff 1px 1px 0px;\n  text-transform: uppercase;\n  width: 74px;\n}\n\n.daterangepicker .ranges input {\n  font-size: 11px;\n}\n\n.daterangepicker .ranges .input-mini {\n  background-color: #eee;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  color: #555;\n  display: block;\n  font-size: 11px;\n  height: 30px;\n  line-height: 30px;\n  vertical-align: middle;\n  margin: 0 0 10px 0;\n  padding: 0 6px;\n  width: 74px;\n}\n\n.daterangepicker .ranges ul {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n\n.daterangepicker .ranges li {\n  font-size: 13px;\n  background: #f5f5f5;\n  border: 1px solid #f5f5f5;\n  color: #08c;\n  padding: 3px 12px;\n  margin-bottom: 8px;\n  -webkit-border-radius: 5px;\n  -moz-border-radius: 5px;\n  border-radius: 5px;\n  cursor: pointer;\n}\n\n.daterangepicker .ranges li.active, .daterangepicker .ranges li:hover {\n  background: #08c;\n  border: 1px solid #08c;\n  color: #fff;\n}\n\n.daterangepicker .calendar-date {\n  border: 1px solid #ddd;\n  padding: 4px;\n  border-radius: 4px;\n  background: #fff;\n}\n\n.daterangepicker .calendar-time {\n  text-align: center;\n  margin: 8px auto 0 auto;\n  line-height: 30px;\n}\n\n.daterangepicker {\n  position: absolute;\n  background: #fff;\n  top: 100px;\n  left: 20px;\n  padding: 4px;\n  margin-top: 1px;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n\n.daterangepicker.opensleft:before {\n  position: absolute;\n  top: -7px;\n  right: 9px;\n  display: inline-block;\n  border-right: 7px solid transparent;\n  border-bottom: 7px solid #ccc;\n  border-left: 7px solid transparent;\n  border-bottom-color: rgba(0, 0, 0, 0.2);\n  content: '';\n}\n\n.daterangepicker.opensleft:after {\n  position: absolute;\n  top: -6px;\n  right: 10px;\n  display: inline-block;\n  border-right: 6px solid transparent;\n  border-bottom: 6px solid #fff;\n  border-left: 6px solid transparent;\n  content: '';\n}\n\n.daterangepicker.opensright:before {\n  position: absolute;\n  top: -7px;\n  left: 9px;\n  display: inline-block;\n  border-right: 7px solid transparent;\n  border-bottom: 7px solid #ccc;\n  border-left: 7px solid transparent;\n  border-bottom-color: rgba(0, 0, 0, 0.2);\n  content: '';\n}\n\n.daterangepicker.opensright:after {\n  position: absolute;\n  top: -6px;\n  left: 10px;\n  display: inline-block;\n  border-right: 6px solid transparent;\n  border-bottom: 6px solid #fff;\n  border-left: 6px solid transparent;\n  content: '';\n}\n\n.daterangepicker table {\n  width: 100%;\n  margin: 0;\n}\n\n.daterangepicker td, .daterangepicker th {\n  text-align: center;\n  width: 20px;\n  height: 20px;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  cursor: pointer;\n  white-space: nowrap;\n}\n\n.daterangepicker td.off {\n  color: #999;\n}\n\n.daterangepicker td.disabled {\n  color: #999;\n}\n\n.daterangepicker td.available:hover, .daterangepicker th.available:hover {\n  background: #eee;\n}\n\n.daterangepicker td.in-range {\n  background: #ebf4f8;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n\n.daterangepicker td.active, .daterangepicker td.active:hover {\n  background-color: #357ebd;\n  border-color: #3071a9;\n  color: #fff;\n}\n\n.daterangepicker td.week, .daterangepicker th.week {\n  font-size: 80%;\n  color: #ccc;\n}\n\n.daterangepicker select.monthselect, .daterangepicker select.yearselect {\n  font-size: 12px;\n  padding: 1px;\n  height: auto;\n  margin: 0;\n  cursor: default;\n}\n\n.daterangepicker select.monthselect {\n  margin-right: 2%;\n  width: 56%;\n}\n\n.daterangepicker select.yearselect {\n  width: 40%;\n}\n\n.daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.ampmselect {\n  width: 50px;\n  margin-bottom: 0;\n}"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/css/dropzone.css",
    "content": "/* The MIT License */\n.dropzone,\n.dropzone *,\n.dropzone-previews,\n.dropzone-previews * {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n.dropzone {\n  position: relative;\n  border: 1px solid rgba(0,0,0,0.08);\n  background: rgba(0,0,0,0.02);\n  padding: 1em;\n}\n.dropzone.dz-clickable {\n  cursor: pointer;\n}\n.dropzone-excel { background: url(\"/nora.web/ico/excel_ico.png\") center top no-repeat; }\n\n.dropzone.dz-clickable .dz-message,\n.dropzone.dz-clickable .dz-message span {\n  cursor: pointer;\n}\n.dropzone.dz-clickable * {\n  cursor: default;\n}\n.dropzone .dz-message {\n  opacity: 1;\n  -ms-filter: none;\n  filter: none;\n}\n.dropzone.dz-drag-hover {\n  border-color: rgba(0,0,0,0.15);\n  background: rgba(0,0,0,0.04);\n}\n.dropzone.dz-started .dz-message {\n  display: none;\n}\n.dropzone .dz-preview,\n.dropzone-previews .dz-preview {\n  background: rgba(255,255,255,0.8);\n  position: relative;\n  display: inline-block;\n  margin: 17px;\n  vertical-align: top;\n  border: 1px solid #acacac;\n  padding: 6px 6px 6px 6px;\n}\n.dropzone .dz-preview.dz-file-preview [data-dz-thumbnail],\n.dropzone-previews .dz-preview.dz-file-preview [data-dz-thumbnail] {\n  display: none;\n}\n.dropzone .dz-preview .dz-details,\n.dropzone-previews .dz-preview .dz-details {\n  width: 100px;\n  height: 100px;\n  position: relative;\n  background: #ebebeb;\n  padding: 5px;\n  margin-bottom: 22px;\n}\n.dropzone .dz-preview .dz-details .dz-filename,\n.dropzone-previews .dz-preview .dz-details .dz-filename {\n  overflow: hidden;\n  height: 100%;\n}\n.dropzone .dz-preview .dz-details img,\n.dropzone-previews .dz-preview .dz-details img {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100px;\n  height: 100px;\n}\n.dropzone .dz-preview .dz-details .dz-size,\n.dropzone-previews .dz-preview .dz-details .dz-size {\n  position: absolute;\n  bottom: -28px;\n  left: 3px;\n  height: 28px;\n  line-height: 28px;\n}\n.dropzone .dz-preview.dz-error .dz-error-mark,\n.dropzone-previews .dz-preview.dz-error .dz-error-mark {\n  display: block;\n}\n.dropzone .dz-preview.dz-success .dz-success-mark,\n.dropzone-previews .dz-preview.dz-success .dz-success-mark {\n  display: block;\n}\n.dropzone .dz-preview:hover .dz-details img,\n.dropzone-previews .dz-preview:hover .dz-details img {\n  display: none;\n}\n.dropzone .dz-preview .dz-success-mark,\n.dropzone-previews .dz-preview .dz-success-mark,\n.dropzone .dz-preview .dz-error-mark,\n.dropzone-previews .dz-preview .dz-error-mark {\n  display: none;\n  position: absolute;\n  width: 40px;\n  height: 40px;\n  font-size: 30px;\n  text-align: center;\n  right: -10px;\n  top: -10px;\n}\n.dropzone .dz-preview .dz-success-mark,\n.dropzone-previews .dz-preview .dz-success-mark {\n  color: #8cc657;\n}\n.dropzone .dz-preview .dz-error-mark,\n.dropzone-previews .dz-preview .dz-error-mark {\n  color: #ee162d;\n}\n.dropzone .dz-preview .dz-progress,\n.dropzone-previews .dz-preview .dz-progress {\n  position: absolute;\n  top: 100px;\n  left: 6px;\n  right: 6px;\n  height: 6px;\n  background: #d7d7d7;\n  display: none;\n}\n.dropzone .dz-preview .dz-progress .dz-upload,\n.dropzone-previews .dz-preview .dz-progress .dz-upload {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 0%;\n  background-color: #8cc657;\n}\n.dropzone .dz-preview.dz-processing .dz-progress,\n.dropzone-previews .dz-preview.dz-processing .dz-progress {\n  display: block;\n}\n.dropzone .dz-preview .dz-error-message,\n.dropzone-previews .dz-preview .dz-error-message {\n  display: none;\n  position: absolute;\n  top: -5px;\n  left: -20px;\n  background: rgba(245,245,245,0.8);\n  padding: 8px 10px;\n  color: #800;\n  min-width: 140px;\n  max-width: 500px;\n  z-index: 500;\n}\n.dropzone .dz-preview:hover.dz-error .dz-error-message,\n.dropzone-previews .dz-preview:hover.dz-error .dz-error-message {\n  display: block;\n}\n.dropzone {\n  border: 1px solid rgba(0,0,0,0.03);\n  min-height: 360px;\n  -webkit-border-radius: 3px;\n  border-radius: 3px;\n  background: rgba(0,0,0,0.03);\n  padding: 23px;\n}\n.dropzone .dz-default.dz-message {\n  opacity: 1;\n  -ms-filter: none;\n  filter: none;\n  -webkit-transition: opacity 0.3s ease-in-out;\n  -moz-transition: opacity 0.3s ease-in-out;\n  -o-transition: opacity 0.3s ease-in-out;\n  -ms-transition: opacity 0.3s ease-in-out;\n  transition: opacity 0.3s ease-in-out;\n  background-image: url(\"../images/spritemap.png\");\n  background-repeat: no-repeat;\n  background-position: 0 0;\n  position: absolute;\n  width: 428px;\n  height: 123px;\n  margin-left: -214px;\n  margin-top: -61.5px;\n  top: 50%;\n  left: 50%;\n}\n@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) {\n  .dropzone .dz-default.dz-message {\n    background-image: url(\"../images/spritemap@2x.png\");\n    -webkit-background-size: 428px 406px;\n    -moz-background-size: 428px 406px;\n    background-size: 428px 406px;\n  }\n}\n.dropzone .dz-default.dz-message span {\n  display: none;\n}\n.dropzone.dz-square .dz-default.dz-message {\n  background-position: 0 -123px;\n  width: 268px;\n  margin-left: -134px;\n  height: 174px;\n  margin-top: -87px;\n}\n.dropzone.dz-drag-hover .dz-message {\n  opacity: 0.15;\n  -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=15)\";\n  filter: alpha(opacity=15);\n}\n.dropzone.dz-started .dz-message {\n  display: block;\n  opacity: 0;\n  -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";\n  filter: alpha(opacity=0);\n}\n.dropzone .dz-preview,\n.dropzone-previews .dz-preview {\n  -webkit-box-shadow: 1px 1px 4px rgba(0,0,0,0.16);\n  box-shadow: 1px 1px 4px rgba(0,0,0,0.16);\n  font-size: 14px;\n}\n.dropzone .dz-preview.dz-image-preview:hover .dz-details img,\n.dropzone-previews .dz-preview.dz-image-preview:hover .dz-details img {\n  display: block;\n  opacity: 0.1;\n  -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=10)\";\n  filter: alpha(opacity=10);\n}\n.dropzone .dz-preview.dz-success .dz-success-mark,\n.dropzone-previews .dz-preview.dz-success .dz-success-mark {\n  opacity: 1;\n  -ms-filter: none;\n  filter: none;\n}\n.dropzone .dz-preview.dz-error .dz-error-mark,\n.dropzone-previews .dz-preview.dz-error .dz-error-mark {\n  opacity: 1;\n  -ms-filter: none;\n  filter: none;\n}\n.dropzone .dz-preview.dz-error .dz-progress .dz-upload,\n.dropzone-previews .dz-preview.dz-error .dz-progress .dz-upload {\n  background: #ee1e2d;\n}\n.dropzone .dz-preview .dz-error-mark,\n.dropzone-previews .dz-preview .dz-error-mark,\n.dropzone .dz-preview .dz-success-mark,\n.dropzone-previews .dz-preview .dz-success-mark {\n  display: block;\n  opacity: 0;\n  -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";\n  filter: alpha(opacity=0);\n  -webkit-transition: opacity 0.4s ease-in-out;\n  -moz-transition: opacity 0.4s ease-in-out;\n  -o-transition: opacity 0.4s ease-in-out;\n  -ms-transition: opacity 0.4s ease-in-out;\n  transition: opacity 0.4s ease-in-out;\n  background-image: url(\"../images/spritemap.png\");\n  background-repeat: no-repeat;\n}\n@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) {\n  .dropzone .dz-preview .dz-error-mark,\n  .dropzone-previews .dz-preview .dz-error-mark,\n  .dropzone .dz-preview .dz-success-mark,\n  .dropzone-previews .dz-preview .dz-success-mark {\n    background-image: url(\"../images/spritemap@2x.png\");\n    -webkit-background-size: 428px 406px;\n    -moz-background-size: 428px 406px;\n    background-size: 428px 406px;\n  }\n}\n.dropzone .dz-preview .dz-error-mark span,\n.dropzone-previews .dz-preview .dz-error-mark span,\n.dropzone .dz-preview .dz-success-mark span,\n.dropzone-previews .dz-preview .dz-success-mark span {\n  display: none;\n}\n.dropzone .dz-preview .dz-error-mark,\n.dropzone-previews .dz-preview .dz-error-mark {\n  background-position: -268px -123px;\n}\n.dropzone .dz-preview .dz-success-mark,\n.dropzone-previews .dz-preview .dz-success-mark {\n  background-position: -268px -163px;\n}\n.dropzone .dz-preview .dz-progress .dz-upload,\n.dropzone-previews .dz-preview .dz-progress .dz-upload {\n  -webkit-animation: loading 0.4s linear infinite;\n  -moz-animation: loading 0.4s linear infinite;\n  -o-animation: loading 0.4s linear infinite;\n  -ms-animation: loading 0.4s linear infinite;\n  animation: loading 0.4s linear infinite;\n  -webkit-transition: width 0.3s ease-in-out;\n  -moz-transition: width 0.3s ease-in-out;\n  -o-transition: width 0.3s ease-in-out;\n  -ms-transition: width 0.3s ease-in-out;\n  transition: width 0.3s ease-in-out;\n  -webkit-border-radius: 2px;\n  border-radius: 2px;\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 0%;\n  height: 100%;\n  background-image: url(\"../images/spritemap.png\");\n  background-repeat: repeat-x;\n  background-position: 0px -400px;\n}\n@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) {\n  .dropzone .dz-preview .dz-progress .dz-upload,\n  .dropzone-previews .dz-preview .dz-progress .dz-upload {\n    background-image: url(\"../images/spritemap@2x.png\");\n    -webkit-background-size: 428px 406px;\n    -moz-background-size: 428px 406px;\n    background-size: 428px 406px;\n  }\n}\n.dropzone .dz-preview.dz-success .dz-progress,\n.dropzone-previews .dz-preview.dz-success .dz-progress {\n  display: block;\n  opacity: 0;\n  -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";\n  filter: alpha(opacity=0);\n  -webkit-transition: opacity 0.4s ease-in-out;\n  -moz-transition: opacity 0.4s ease-in-out;\n  -o-transition: opacity 0.4s ease-in-out;\n  -ms-transition: opacity 0.4s ease-in-out;\n  transition: opacity 0.4s ease-in-out;\n}\n.dropzone .dz-preview .dz-error-message,\n.dropzone-previews .dz-preview .dz-error-message {\n  display: block;\n  opacity: 0;\n  -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";\n  filter: alpha(opacity=0);\n  -webkit-transition: opacity 0.3s ease-in-out;\n  -moz-transition: opacity 0.3s ease-in-out;\n  -o-transition: opacity 0.3s ease-in-out;\n  -ms-transition: opacity 0.3s ease-in-out;\n  transition: opacity 0.3s ease-in-out;\n}\n.dropzone .dz-preview:hover.dz-error .dz-error-message,\n.dropzone-previews .dz-preview:hover.dz-error .dz-error-message {\n  opacity: 1;\n  -ms-filter: none;\n  filter: none;\n}\n.dropzone a.dz-remove,\n.dropzone-previews a.dz-remove {\n  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fafafa), color-stop(1, #eee));\n  background-image: -webkit-linear-gradient(top, #fafafa 0, #eee 100%);\n  background-image: -moz-linear-gradient(top, #fafafa 0, #eee 100%);\n  background-image: -o-linear-gradient(top, #fafafa 0, #eee 100%);\n  background-image: -ms-linear-gradient(top, #fafafa 0, #eee 100%);\n  background-image: linear-gradient(top, #fafafa 0, #eee 100%);\n  -webkit-border-radius: 2px;\n  border-radius: 2px;\n  border: 1px solid #eee;\n  text-decoration: none;\n  display: block;\n  padding: 4px 5px;\n  text-align: center;\n  color: #aaa;\n  margin-top: 26px;\n}\n.dropzone a.dz-remove:hover,\n.dropzone-previews a.dz-remove:hover {\n  color: #666;\n}\n@-moz-keyframes loading {\n  0% {\n    background-position: 0 -400px;\n  }\n\n  100% {\n    background-position: -7px -400px;\n  }\n}\n@-webkit-keyframes loading {\n  0% {\n    background-position: 0 -400px;\n  }\n\n  100% {\n    background-position: -7px -400px;\n  }\n}\n@-o-keyframes loading {\n  0% {\n    background-position: 0 -400px;\n  }\n\n  100% {\n    background-position: -7px -400px;\n  }\n}\n@-ms-keyframes loading {\n  0% {\n    background-position: 0 -400px;\n  }\n\n  100% {\n    background-position: -7px -400px;\n  }\n}\n@keyframes loading {\n  0% {\n    background-position: 0 -400px;\n  }\n\n  100% {\n    background-position: -7px -400px;\n  }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/css/fullcalendar.css",
    "content": "/*!\n * FullCalendar v1.6.4 Stylesheet\n * Docs & License: http://arshaw.com/fullcalendar/\n * (c) 2013 Adam Shaw\n */\n\n\n.fc {\n\tdirection: ltr;\n\ttext-align: left;\n\t}\n\t\n.fc table {\n\tborder-collapse: collapse;\n\tborder-spacing: 0;\n\t}\n\t\nhtml .fc,\n.fc table {\n\tfont-size: 1em;\n\t}\n\t\n.fc td,\n.fc th {\n\tpadding: 0;\n\tvertical-align: top;\n\t}\n\n\n\n/* Header\n------------------------------------------------------------------------*/\n\n.fc-header td {\n\twhite-space: nowrap;\n\t}\n\n.fc-header-left {\n\twidth: 25%;\n\ttext-align: left;\n\t}\n\t\n.fc-header-center {\n\ttext-align: center;\n\t}\n\t\n.fc-header-right {\n\twidth: 25%;\n\ttext-align: right;\n\t}\n\t\n.fc-header-title {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\t}\n\t\n.fc-header-title h2 {\n\tmargin-top: 0;\n\twhite-space: nowrap;\n\t}\n\t\n.fc .fc-header-space {\n\tpadding-left: 10px;\n\t}\n\t\n.fc-header .fc-button {\n\tmargin-bottom: 1em;\n\tvertical-align: top;\n\t}\n\t\n/* buttons edges butting together */\n\n.fc-header .fc-button {\n\tmargin-right: -1px;\n\t}\n\t\n.fc-header .fc-corner-right,  /* non-theme */\n.fc-header .ui-corner-right { /* theme */\n\tmargin-right: 0; /* back to normal */\n\t}\n\t\n/* button layering (for border precedence) */\n\t\n.fc-header .fc-state-hover,\n.fc-header .ui-state-hover {\n\tz-index: 2;\n\t}\n\t\n.fc-header .fc-state-down {\n\tz-index: 3;\n\t}\n\n.fc-header .fc-state-active,\n.fc-header .ui-state-active {\n\tz-index: 4;\n\t}\n\t\n\t\n\t\n/* Content\n------------------------------------------------------------------------*/\n\t\n.fc-content {\n\tclear: both;\n\tzoom: 1; /* for IE7, gives accurate coordinates for [un]freezeContentHeight */\n\t}\n\t\n.fc-view {\n\twidth: 100%;\n\toverflow: hidden;\n\t}\n\t\n\t\n\n/* Cell Styles\n------------------------------------------------------------------------*/\n\n.fc-widget-header,    /* <th>, usually */\n.fc-widget-content {  /* <td>, usually */\n\tborder: 1px solid #ddd;\n\t}\n\t\n.fc-state-highlight { /* <td> today cell */ /* TODO: add .fc-today to <th> */\n\tbackground: #fcf8e3;\n\t}\n\t\n.fc-cell-overlay { /* semi-transparent rectangle while dragging */\n\tbackground: #bce8f1;\n\topacity: .3;\n\tfilter: alpha(opacity=30); /* for IE */\n\t}\n\t\n\n\n/* Buttons\n------------------------------------------------------------------------*/\n\n.fc-button {\n\tposition: relative;\n\tdisplay: inline-block;\n\tpadding: 0 .6em;\n\toverflow: hidden;\n\theight: 1.9em;\n\tline-height: 1.9em;\n\twhite-space: nowrap;\n\tcursor: pointer;\n\t}\n\t\n.fc-state-default { /* non-theme */\n\tborder: 1px solid;\n\t}\n\n.fc-state-default.fc-corner-left { /* non-theme */\n\tborder-top-left-radius: 4px;\n\tborder-bottom-left-radius: 4px;\n\t}\n\n.fc-state-default.fc-corner-right { /* non-theme */\n\tborder-top-right-radius: 4px;\n\tborder-bottom-right-radius: 4px;\n\t}\n\n/*\n\tOur default prev/next buttons use HTML entities like &lsaquo; &rsaquo; &laquo; &raquo;\n\tand we'll try to make them look good cross-browser.\n*/\n\n.fc-text-arrow {\n\tmargin: 0 .1em;\n\tfont-size: 2em;\n\tfont-family: \"Courier New\", Courier, monospace;\n\tvertical-align: baseline; /* for IE7 */\n\t}\n\n.fc-button-prev .fc-text-arrow,\n.fc-button-next .fc-text-arrow { /* for &lsaquo; &rsaquo; */\n\tfont-weight: bold;\n\t}\n\t\n/* icon (for jquery ui) */\n\t\n.fc-button .fc-icon-wrap {\n\tposition: relative;\n\tfloat: left;\n\ttop: 50%;\n\t}\n\t\n.fc-button .ui-icon {\n\tposition: relative;\n\tfloat: left;\n\tmargin-top: -50%;\n\t*margin-top: 0;\n\t*top: -50%;\n\t}\n\t\n/*\n  button states\n  borrowed from twitter bootstrap (http://twitter.github.com/bootstrap/)\n*/\n\n.fc-state-default {\n\tbackground-color: #f5f5f5;\n\tbackground-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n\tbackground-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n\tbackground-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n\tbackground-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n\tbackground-image: linear-gradient(to bottom, #ffffff, #e6e6e6);\n\tbackground-repeat: repeat-x;\n\tborder-color: #e6e6e6 #e6e6e6 #bfbfbf;\n\tborder-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n\tcolor: #333;\n\ttext-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);\n\tbox-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n\t}\n\n.fc-state-hover,\n.fc-state-down,\n.fc-state-active,\n.fc-state-disabled {\n\tcolor: #333333;\n\tbackground-color: #e6e6e6;\n\t}\n\n.fc-state-hover {\n\tcolor: #333333;\n\ttext-decoration: none;\n\tbackground-position: 0 -15px;\n\t-webkit-transition: background-position 0.1s linear;\n\t   -moz-transition: background-position 0.1s linear;\n\t     -o-transition: background-position 0.1s linear;\n\t        transition: background-position 0.1s linear;\n\t}\n\n.fc-state-down,\n.fc-state-active {\n\tbackground-color: #cccccc;\n\tbackground-image: none;\n\toutline: 0;\n\tbox-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);\n\t}\n\n.fc-state-disabled {\n\tcursor: default;\n\tbackground-image: none;\n\topacity: 0.65;\n\tfilter: alpha(opacity=65);\n\tbox-shadow: none;\n\t}\n\n\t\n\n/* Global Event Styles\n------------------------------------------------------------------------*/\n\n.fc-event-container > * {\n\tz-index: 8;\n\t}\n\n.fc-event-container > .ui-draggable-dragging,\n.fc-event-container > .ui-resizable-resizing {\n\tz-index: 9;\n\t}\n\t \n.fc-event {\n\tborder: 1px solid #3a87ad; /* default BORDER color */\n\tbackground-color: #3a87ad; /* default BACKGROUND color */\n\tcolor: #fff;               /* default TEXT color */\n\tfont-size: .85em;\n\tcursor: default;\n\t}\n\na.fc-event {\n\ttext-decoration: none;\n\t}\n\t\na.fc-event,\n.fc-event-draggable {\n\tcursor: pointer;\n\t}\n\t\n.fc-rtl .fc-event {\n\ttext-align: right;\n\t}\n\n.fc-event-inner {\n\twidth: 100%;\n\theight: 100%;\n\toverflow: hidden;\n\t}\n\t\n.fc-event-time,\n.fc-event-title {\n\tpadding: 0 1px;\n\t}\n\t\n.fc .ui-resizable-handle {\n\tdisplay: block;\n\tposition: absolute;\n\tz-index: 99999;\n\toverflow: hidden; /* hacky spaces (IE6/7) */\n\tfont-size: 300%;  /* */\n\tline-height: 50%; /* */\n\t}\n\t\n\t\n\t\n/* Horizontal Events\n------------------------------------------------------------------------*/\n\n.fc-event-hori {\n\tborder-width: 1px 0;\n\tmargin-bottom: 1px;\n\t}\n\n.fc-ltr .fc-event-hori.fc-event-start,\n.fc-rtl .fc-event-hori.fc-event-end {\n\tborder-left-width: 1px;\n\tborder-top-left-radius: 3px;\n\tborder-bottom-left-radius: 3px;\n\t}\n\n.fc-ltr .fc-event-hori.fc-event-end,\n.fc-rtl .fc-event-hori.fc-event-start {\n\tborder-right-width: 1px;\n\tborder-top-right-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n\t}\n\t\n/* resizable */\n\t\n.fc-event-hori .ui-resizable-e {\n\ttop: 0           !important; /* importants override pre jquery ui 1.7 styles */\n\tright: -3px      !important;\n\twidth: 7px       !important;\n\theight: 100%     !important;\n\tcursor: e-resize;\n\t}\n\t\n.fc-event-hori .ui-resizable-w {\n\ttop: 0           !important;\n\tleft: -3px       !important;\n\twidth: 7px       !important;\n\theight: 100%     !important;\n\tcursor: w-resize;\n\t}\n\t\n.fc-event-hori .ui-resizable-handle {\n\t_padding-bottom: 14px; /* IE6 had 0 height */\n\t}\n\t\n\t\n\t\n/* Reusable Separate-border Table\n------------------------------------------------------------*/\n\ntable.fc-border-separate {\n\tborder-collapse: separate;\n\t}\n\t\n.fc-border-separate th,\n.fc-border-separate td {\n\tborder-width: 1px 0 0 1px;\n\t}\n\t\n.fc-border-separate th.fc-last,\n.fc-border-separate td.fc-last {\n\tborder-right-width: 1px;\n\t}\n\t\n.fc-border-separate tr.fc-last th,\n.fc-border-separate tr.fc-last td {\n\tborder-bottom-width: 1px;\n\t}\n\t\n.fc-border-separate tbody tr.fc-first td,\n.fc-border-separate tbody tr.fc-first th {\n\tborder-top-width: 0;\n\t}\n\t\n\t\n\n/* Month View, Basic Week View, Basic Day View\n------------------------------------------------------------------------*/\n\n.fc-grid th {\n\ttext-align: center;\n\t}\n\n.fc .fc-week-number {\n\twidth: 22px;\n\ttext-align: center;\n\t}\n\n.fc .fc-week-number div {\n\tpadding: 0 2px;\n\t}\n\t\n.fc-grid .fc-day-number {\n\tfloat: right;\n\tpadding: 0 2px;\n\t}\n\t\n.fc-grid .fc-other-month .fc-day-number {\n\topacity: 0.3;\n\tfilter: alpha(opacity=30); /* for IE */\n\t/* opacity with small font can sometimes look too faded\n\t   might want to set the 'color' property instead\n\t   making day-numbers bold also fixes the problem */\n\t}\n\t\n.fc-grid .fc-day-content {\n\tclear: both;\n\tpadding: 2px 2px 1px; /* distance between events and day edges */\n\t}\n\t\n/* event styles */\n\t\n.fc-grid .fc-event-time {\n\tfont-weight: bold;\n\t}\n\t\n/* right-to-left */\n\t\n.fc-rtl .fc-grid .fc-day-number {\n\tfloat: left;\n\t}\n\t\n.fc-rtl .fc-grid .fc-event-time {\n\tfloat: right;\n\t}\n\t\n\t\n\n/* Agenda Week View, Agenda Day View\n------------------------------------------------------------------------*/\n\n.fc-agenda table {\n\tborder-collapse: separate;\n\t}\n\t\n.fc-agenda-days th {\n\ttext-align: center;\n\t}\n\t\n.fc-agenda .fc-agenda-axis {\n\twidth: 50px;\n\tpadding: 0 4px;\n\tvertical-align: middle;\n\ttext-align: right;\n\twhite-space: nowrap;\n\tfont-weight: normal;\n\t}\n\n.fc-agenda .fc-week-number {\n\tfont-weight: bold;\n\t}\n\t\n.fc-agenda .fc-day-content {\n\tpadding: 2px 2px 1px;\n\t}\n\t\n/* make axis border take precedence */\n\t\n.fc-agenda-days .fc-agenda-axis {\n\tborder-right-width: 1px;\n\t}\n\t\n.fc-agenda-days .fc-col0 {\n\tborder-left-width: 0;\n\t}\n\t\n/* all-day area */\n\t\n.fc-agenda-allday th {\n\tborder-width: 0 1px;\n\t}\n\t\n.fc-agenda-allday .fc-day-content {\n\tmin-height: 34px; /* TODO: doesnt work well in quirksmode */\n\t_height: 34px;\n\t}\n\t\n/* divider (between all-day and slots) */\n\t\n.fc-agenda-divider-inner {\n\theight: 2px;\n\toverflow: hidden;\n\t}\n\t\n.fc-widget-header .fc-agenda-divider-inner {\n\tbackground: #eee;\n\t}\n\t\n/* slot rows */\n\t\n.fc-agenda-slots th {\n\tborder-width: 1px 1px 0;\n\t}\n\t\n.fc-agenda-slots td {\n\tborder-width: 1px 0 0;\n\tbackground: none;\n\t}\n\t\n.fc-agenda-slots td div {\n\theight: 20px;\n\t}\n\t\n.fc-agenda-slots tr.fc-slot0 th,\n.fc-agenda-slots tr.fc-slot0 td {\n\tborder-top-width: 0;\n\t}\n\n.fc-agenda-slots tr.fc-minor th,\n.fc-agenda-slots tr.fc-minor td {\n\tborder-top-style: dotted;\n\t}\n\t\n.fc-agenda-slots tr.fc-minor th.ui-widget-header {\n\t*border-top-style: solid; /* doesn't work with background in IE6/7 */\n\t}\n\t\n\n\n/* Vertical Events\n------------------------------------------------------------------------*/\n\n.fc-event-vert {\n\tborder-width: 0 1px;\n\t}\n\n.fc-event-vert.fc-event-start {\n\tborder-top-width: 1px;\n\tborder-top-left-radius: 3px;\n\tborder-top-right-radius: 3px;\n\t}\n\n.fc-event-vert.fc-event-end {\n\tborder-bottom-width: 1px;\n\tborder-bottom-left-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n\t}\n\t\n.fc-event-vert .fc-event-time {\n\twhite-space: nowrap;\n\tfont-size: 10px;\n\t}\n\n.fc-event-vert .fc-event-inner {\n\tposition: relative;\n\tz-index: 2;\n\t}\n\t\n.fc-event-vert .fc-event-bg { /* makes the event lighter w/ a semi-transparent overlay  */\n\tposition: absolute;\n\tz-index: 1;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tbackground: #fff;\n\topacity: .25;\n\tfilter: alpha(opacity=25);\n\t}\n\t\n.fc .ui-draggable-dragging .fc-event-bg, /* TODO: something nicer like .fc-opacity */\n.fc-select-helper .fc-event-bg {\n\tdisplay: none\\9; /* for IE6/7/8. nested opacity filters while dragging don't work */\n\t}\n\t\n/* resizable */\n\t\n.fc-event-vert .ui-resizable-s {\n\tbottom: 0        !important; /* importants override pre jquery ui 1.7 styles */\n\twidth: 100%      !important;\n\theight: 8px      !important;\n\toverflow: hidden !important;\n\tline-height: 8px !important;\n\tfont-size: 11px  !important;\n\tfont-family: monospace;\n\ttext-align: center;\n\tcursor: s-resize;\n\t}\n\t\n.fc-agenda .ui-resizable-resizing { /* TODO: better selector */\n\t_overflow: hidden;\n\t}\n\t\n\t\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/css/jquery.gritter.css",
    "content": "/* the norm */\n#gritter-notice-wrapper {\n\tposition:fixed;\n\ttop:20px;\n\tright:20px;\n\twidth:301px;\n\tz-index:9999;\n}\n#gritter-notice-wrapper.top-left {\n    left: 20px;\n    right: auto;\n}\n#gritter-notice-wrapper.bottom-right {\n    top: auto;\n    left: auto;\n    bottom: 20px;\n    right: 20px;\n}\n#gritter-notice-wrapper.bottom-left {\n    top: auto;\n    right: auto;\n    bottom: 20px;\n    left: 20px;\n}\n.gritter-item-wrapper {\n\tposition:relative;\n\tmargin:0 0 10px 0;\n\tbackground:url('../images/ie-spacer.gif'); /* ie7/8 fix */ \n}\n.gritter-top {\n\tbackground:url(../images/gritter.png) no-repeat left -30px;\n\theight:10px;\n}\n.hover .gritter-top {\n\tbackground-position:right -30px;\n}\n.gritter-bottom {\n\tbackground:url(../images/gritter.png) no-repeat left bottom;\n\theight:8px;\n\tmargin:0;\n}\n.hover .gritter-bottom {\n\tbackground-position: bottom right;\n}\n.gritter-item {\n\tdisplay:block;\n\tbackground:url(../images/gritter.png) no-repeat left -40px;\n\tcolor:#eee;\n\tpadding:2px 11px 8px 11px;\n\tfont-size: 11px;\n\tfont-family:verdana;\n}\n.hover .gritter-item {\n\tbackground-position:right -40px;\n}\n.gritter-item p {\n\tpadding:0;\n\tmargin:0;\n\tword-wrap:break-word;\n}\n.gritter-close {\n\tdisplay:none;\n\tposition:absolute;\n\ttop:5px;\n\tleft:3px;\n\tbackground:url(../images/gritter.png) no-repeat left top;\n\tcursor:pointer;\n\twidth:30px;\n\theight:30px;\n}\n.gritter-title {\n\tfont-size:14px;\n\tfont-weight:bold;\n\tpadding:0 0 7px 0;\n\tdisplay:block;\n\ttext-shadow:1px 1px 0 #000; /* Not supported by IE :( */\n}\n.gritter-image {\n\twidth:48px;\n\theight:48px;\n\tfloat:left;\n}\n.gritter-with-image,\n.gritter-without-image {\n\tpadding:0;\n}\n.gritter-with-image {\n\twidth:220px;\n\tfloat:right;\n}\n/* for the light (white) version of the gritter notice */\n.gritter-light .gritter-item,\n.gritter-light .gritter-bottom,\n.gritter-light .gritter-top,\n.gritter-light .gritter-close {\n    background-image: url(../images/gritter-light.png);\n    color: #222;\n}\n.gritter-light .gritter-title {\n    text-shadow: none;\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/css/multiple-select.css",
    "content": "/**\n * @author zhixin wen <wenzhixin2010@gmail.com>\n */\n\n.ms-parent {\n    display: inline-block;\n    position: relative;\n    vertical-align: middle;\n}\n\n.ms-choice {\n    display: block;\n    width: 100%;\n    height: 26px;\n    padding: 0;\n    overflow: hidden;\n    cursor: pointer;\n    border: 1px solid #aaa;\n    text-align: left;\n    white-space: nowrap;\n    line-height: 26px;\n    color: #444;\n    text-decoration: none;\n    -webkit-border-radius: 4px;\n    -moz-border-radius: 4px;\n    border-radius: 4px;\n    background-color: #fff;\n}\n\n.ms-choice.disabled {\n    background-color: #f4f4f4;\n    background-image: none;\n    border: 1px solid #ddd;\n    cursor: default;\n}\n\n.ms-choice > span {\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 20px;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    display: block;\n    padding-left: 8px;\n}\n\n.ms-choice > span.placeholder {\n    color: #999;\n}\n\n.ms-choice > div {\n    position: absolute;\n    top: 0;\n    right: 0;\n    width: 20px;\n    height: 25px;\n    background: url('multiple-select.png') left top no-repeat;\n}\n\n.ms-choice > div.open {\n    background: url('multiple-select.png') right top no-repeat;\n}\n\n.ms-drop {\n    width: 100%;\n    overflow: hidden;\n    display: none;\n    margin-top: -1px;\n    padding: 0;\n    position: absolute;\n    z-index: 1000;\n    background: #fff;\n    color: #000;\n    border: 1px solid #aaa;\n    -webkit-border-radius: 4px;\n    -moz-border-radius: 4px;\n    border-radius: 4px;\n}\n\n.ms-drop.bottom {\n    top: 100%;\n    -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);\n    -moz-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);\n    box-shadow: 0 4px 5px rgba(0, 0, 0, .15);\n}\n\n.ms-drop.top {\n    bottom: 100%;\n    -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);\n    -moz-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);\n    box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);\n}\n\n.ms-search {\n    display: inline-block;\n    margin: 0;\n    min-height: 26px;\n    padding: 4px;\n    position: relative;\n    white-space: nowrap;\n    width: 100%;\n    z-index: 10000;\n}\n\n.ms-search input {\n    width: 100%;\n    height: auto !important;\n    min-height: 24px;\n    padding: 0 20px 0 5px;\n    margin: 0;\n    outline: 0;\n    font-family: sans-serif;\n    font-size: 1em;\n    border: 1px solid #aaa;\n    -webkit-border-radius: 0;\n    -moz-border-radius: 0;\n    border-radius: 0;\n    -webkit-box-shadow: none;\n    -moz-box-shadow: none;\n    box-shadow: none;\n    background: #fff url('multiple-select.png') no-repeat 100% -22px;\n    background: url('multiple-select.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));\n    background: url('multiple-select.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);\n    background: url('multiple-select.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);\n    background: url('multiple-select.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);\n    background: url('multiple-select.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%);\n    background: url('multiple-select.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%, #eeeeee 99%);\n}\n\n.ms-search, .ms-search input {\n    -webkit-box-sizing: border-box;\n    -khtml-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    -ms-box-sizing: border-box;\n    box-sizing: border-box;\n}\n\n.ms-drop ul {\n    overflow: auto;\n    margin: 0;\n    padding: 5px 8px;\n}\n\n.ms-drop ul > li {\n    list-style: none;\n    display: list-item;\n    background-image: none;\n    position: static;\n}\n\n.ms-drop ul > li .disabled {\n    opacity: .35;\n    filter: Alpha(Opacity=35);\n}\n\n.ms-drop ul > li.multiple {\n    display: block;\n    float: left;\n}\n\n.ms-drop ul > li.group {\n    clear: both;\n}\n\n.ms-drop ul > li.multiple label {\n    width: 100%;\n    display: block;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n}\n\n.ms-drop ul > li label {\n    font-weight: normal;\n    display: block;\n    white-space: nowrap;\n}\n\n.ms-drop ul > li label.optgroup {\n    font-weight: bold;\n}\n\n.ms-drop input[type=\"checkbox\"] {\n    vertical-align: middle;\n}\n\n.ms-drop .ms-no-results {\n    display: none;\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/css/select2.css",
    "content": "/*\nVersion: 3.4.2 Timestamp: Mon Aug 12 15:04:12 PDT 2013\n*/\n.select2-container {\n    margin: 0;\n    position: relative;\n    display: inline-block;\n    /* inline-block for ie7 */\n    zoom: 1;\n    *display: inline;\n    vertical-align: middle;\n}\n\n.select2-container,\n.select2-drop,\n.select2-search,\n.select2-search input {\n  /*\n    Force border-box so that % widths fit the parent\n    container without overlap because of margin/padding.\n\n    More Info : http://www.quirksmode.org/css/box.html\n  */\n  -webkit-box-sizing: border-box; /* webkit */\n     -moz-box-sizing: border-box; /* firefox */\n          box-sizing: border-box; /* css3 */\n}\n\n.select2-container .select2-choice {\n    display: block;\n    height: 26px;\n    padding: 0 0 0 8px;\n    overflow: hidden;\n    position: relative;\n\n    border: 1px solid #aaa;\n    white-space: nowrap;\n    line-height: 26px;\n    color: #444;\n    text-decoration: none;\n\n    border-radius: 4px;\n\n    background-clip: padding-box;\n\n    -webkit-touch-callout: none;\n      -webkit-user-select: none;\n       -khtml-user-select: none;\n         -moz-user-select: none;\n          -ms-user-select: none;\n              user-select: none;\n\n    background-color: #fff;\n    background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));\n    background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);\n    background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%);\n    background-image: -o-linear-gradient(bottom, #eee 0%, #fff 50%);\n    background-image: -ms-linear-gradient(top, #fff 0%, #eee 50%);\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);\n    background-image: linear-gradient(top, #fff 0%, #eee 50%);\n}\n\n.select2-container.select2-drop-above .select2-choice {\n    border-bottom-color: #aaa;\n\n    border-radius: 0 0 4px 4px;\n\n    background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff));\n    background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%);\n    background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%);\n    background-image: -o-linear-gradient(bottom, #eee 0%, #fff 90%);\n    background-image: -ms-linear-gradient(top, #eee 0%, #fff 90%);\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);\n    background-image: linear-gradient(top, #eee 0%, #fff 90%);\n}\n\n.select2-container.select2-allowclear .select2-choice .select2-chosen {\n    margin-right: 42px;\n}\n\n.select2-container .select2-choice > .select2-chosen {\n    margin-right: 26px;\n    display: block;\n    overflow: hidden;\n\n    white-space: nowrap;\n\n    text-overflow: ellipsis;\n}\n\n.select2-container .select2-choice abbr {\n    display: none;\n    width: 12px;\n    height: 12px;\n    position: absolute;\n    right: 24px;\n    top: 8px;\n\n    font-size: 1px;\n    text-decoration: none;\n\n    border: 0;\n    background: url('select2.png') right top no-repeat;\n    cursor: pointer;\n    outline: 0;\n}\n\n.select2-container.select2-allowclear .select2-choice abbr {\n    display: inline-block;\n}\n\n.select2-container .select2-choice abbr:hover {\n    background-position: right -11px;\n    cursor: pointer;\n}\n\n.select2-drop-mask {\n    border: 0;\n    margin: 0;\n    padding: 0;\n    position: fixed;\n    left: 0;\n    top: 0;\n    min-height: 100%;\n    min-width: 100%;\n    height: auto;\n    width: auto;\n    opacity: 0;\n    z-index: 9998;\n    /* styles required for IE to work */\n    background-color: #fff;\n    opacity: 0;\n    filter: alpha(opacity=0);\n}\n\n.select2-drop {\n    width: 100%;\n    margin-top: -1px;\n    position: absolute;\n    z-index: 9999;\n    top: 100%;\n\n    background: #fff;\n    color: #000;\n    border: 1px solid #aaa;\n    border-top: 0;\n\n    border-radius: 0 0 4px 4px;\n\n    -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);\n            box-shadow: 0 4px 5px rgba(0, 0, 0, .15);\n}\n\n.select2-drop-auto-width {\n    border-top: 1px solid #aaa;\n    width: auto;\n}\n\n.select2-drop-auto-width .select2-search {\n    padding-top: 4px;\n}\n\n.select2-drop.select2-drop-above {\n    margin-top: 1px;\n    border-top: 1px solid #aaa;\n    border-bottom: 0;\n\n    border-radius: 4px 4px 0 0;\n\n    -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);\n            box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);\n}\n\n.select2-drop-active {\n    border: 1px solid #5897fb;\n    border-top: none;\n}\n\n.select2-drop.select2-drop-above.select2-drop-active {\n    border-top: 1px solid #5897fb;\n}\n\n.select2-container .select2-choice .select2-arrow {\n    display: inline-block;\n    width: 18px;\n    height: 100%;\n    position: absolute;\n    right: 0;\n    top: 0;\n\n    border-left: 1px solid #aaa;\n    border-radius: 0 4px 4px 0;\n\n    background-clip: padding-box;\n\n    background: #ccc;\n    background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));\n    background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);\n    background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);\n    background-image: -o-linear-gradient(bottom, #ccc 0%, #eee 60%);\n    background-image: -ms-linear-gradient(top, #ccc 0%, #eee 60%);\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0);\n    background-image: linear-gradient(top, #ccc 0%, #eee 60%);\n}\n\n.select2-container .select2-choice .select2-arrow b {\n    display: block;\n    width: 100%;\n    height: 100%;\n    background: url('select2.png') no-repeat 0 1px;\n}\n\n.select2-search {\n    display: inline-block;\n    width: 100%;\n    min-height: 26px;\n    margin: 0;\n    padding-left: 4px;\n    padding-right: 4px;\n\n    position: relative;\n    z-index: 10000;\n\n    white-space: nowrap;\n}\n\n.select2-search input {\n    width: 100%;\n    height: auto !important;\n    min-height: 26px;\n    padding: 4px 20px 4px 5px;\n    margin: 0;\n\n    outline: 0;\n    font-family: sans-serif;\n    font-size: 1em;\n\n    border: 1px solid #aaa;\n    border-radius: 0;\n\n    -webkit-box-shadow: none;\n            box-shadow: none;\n\n    background: #fff url('select2.png') no-repeat 100% -22px;\n    background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));\n    background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);\n    background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);\n    background: url('select2.png') no-repeat 100% -22px, -o-linear-gradient(bottom, #fff 85%, #eee 99%);\n    background: url('select2.png') no-repeat 100% -22px, -ms-linear-gradient(top, #fff 85%, #eee 99%);\n    background: url('select2.png') no-repeat 100% -22px, linear-gradient(top, #fff 85%, #eee 99%);\n}\n\n.select2-drop.select2-drop-above .select2-search input {\n    margin-top: 4px;\n}\n\n.select2-search input.select2-active {\n    background: #fff url('select2-spinner.gif') no-repeat 100%;\n    background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));\n    background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);\n    background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);\n    background: url('select2-spinner.gif') no-repeat 100%, -o-linear-gradient(bottom, #fff 85%, #eee 99%);\n    background: url('select2-spinner.gif') no-repeat 100%, -ms-linear-gradient(top, #fff 85%, #eee 99%);\n    background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(top, #fff 85%, #eee 99%);\n}\n\n.select2-container-active .select2-choice,\n.select2-container-active .select2-choices {\n    border: 1px solid #5897fb;\n    outline: none;\n\n    -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);\n            box-shadow: 0 0 5px rgba(0, 0, 0, .3);\n}\n\n.select2-dropdown-open .select2-choice {\n    border-bottom-color: transparent;\n    -webkit-box-shadow: 0 1px 0 #fff inset;\n            box-shadow: 0 1px 0 #fff inset;\n\n    border-bottom-left-radius: 0;\n    border-bottom-right-radius: 0;\n\n    background-color: #eee;\n    background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee));\n    background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%);\n    background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%);\n    background-image: -o-linear-gradient(bottom, #fff 0%, #eee 50%);\n    background-image: -ms-linear-gradient(top, #fff 0%, #eee 50%);\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);\n    background-image: linear-gradient(top, #fff 0%, #eee 50%);\n}\n\n.select2-dropdown-open.select2-drop-above .select2-choice,\n.select2-dropdown-open.select2-drop-above .select2-choices {\n    border: 1px solid #5897fb;\n    border-top-color: transparent;\n\n    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee));\n    background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%);\n    background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%);\n    background-image: -o-linear-gradient(top, #fff 0%, #eee 50%);\n    background-image: -ms-linear-gradient(bottom, #fff 0%, #eee 50%);\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);\n    background-image: linear-gradient(bottom, #fff 0%, #eee 50%);\n}\n\n.select2-dropdown-open .select2-choice .select2-arrow {\n    background: transparent;\n    border-left: none;\n    filter: none;\n}\n.select2-dropdown-open .select2-choice .select2-arrow b {\n    background-position: -18px 1px;\n}\n\n/* results */\n.select2-results {\n    max-height: 200px;\n    padding: 0 0 0 4px;\n    margin: 4px 4px 4px 0;\n    position: relative;\n    overflow-x: hidden;\n    overflow-y: auto;\n    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\n.select2-results ul.select2-result-sub {\n    margin: 0;\n    padding-left: 0;\n}\n\n.select2-results ul.select2-result-sub > li .select2-result-label { padding-left: 20px }\n.select2-results ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 40px }\n.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 60px }\n.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 80px }\n.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 100px }\n.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 110px }\n.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 120px }\n\n.select2-results li {\n    list-style: none;\n    display: list-item;\n    background-image: none;\n}\n\n.select2-results li.select2-result-with-children > .select2-result-label {\n    font-weight: bold;\n}\n\n.select2-results .select2-result-label {\n    padding: 3px 7px 4px;\n    margin: 0;\n    cursor: pointer;\n\n    min-height: 1em;\n\n    -webkit-touch-callout: none;\n      -webkit-user-select: none;\n       -khtml-user-select: none;\n         -moz-user-select: none;\n          -ms-user-select: none;\n              user-select: none;\n}\n\n.select2-results .select2-highlighted {\n    background: #3875d7;\n    color: #fff;\n}\n\n.select2-results li em {\n    background: #feffde;\n    font-style: normal;\n}\n\n.select2-results .select2-highlighted em {\n    background: transparent;\n}\n\n.select2-results .select2-highlighted ul {\n    background: #fff;\n    color: #000;\n}\n\n\n.select2-results .select2-no-results,\n.select2-results .select2-searching,\n.select2-results .select2-selection-limit {\n    background: #f4f4f4;\n    display: list-item;\n}\n\n/*\ndisabled look for disabled choices in the results dropdown\n*/\n.select2-results .select2-disabled.select2-highlighted {\n    color: #666;\n    background: #f4f4f4;\n    display: list-item;\n    cursor: default;\n}\n.select2-results .select2-disabled {\n  background: #f4f4f4;\n  display: list-item;\n  cursor: default;\n}\n\n.select2-results .select2-selected {\n    display: none;\n}\n\n.select2-more-results.select2-active {\n    background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%;\n}\n\n.select2-more-results {\n    background: #f4f4f4;\n    display: list-item;\n}\n\n/* disabled styles */\n\n.select2-container.select2-container-disabled .select2-choice {\n    background-color: #f4f4f4;\n    background-image: none;\n    border: 1px solid #ddd;\n    cursor: default;\n}\n\n.select2-container.select2-container-disabled .select2-choice .select2-arrow {\n    background-color: #f4f4f4;\n    background-image: none;\n    border-left: 0;\n}\n\n.select2-container.select2-container-disabled .select2-choice abbr {\n    display: none;\n}\n\n\n/* multiselect */\n\n.select2-container-multi .select2-choices {\n    height: auto !important;\n    height: 1%;\n    margin: 0;\n    padding: 0;\n    position: relative;\n\n    border: 1px solid #aaa;\n    cursor: text;\n    overflow: hidden;\n\n    background-color: #fff;\n    background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff));\n    background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%);\n    background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%);\n    background-image: -o-linear-gradient(top, #eee 1%, #fff 15%);\n    background-image: -ms-linear-gradient(top, #eee 1%, #fff 15%);\n    background-image: linear-gradient(top, #eee 1%, #fff 15%);\n}\n\n.select2-locked {\n  padding: 3px 5px 3px 5px !important;\n}\n\n.select2-container-multi .select2-choices {\n    min-height: 26px;\n}\n\n.select2-container-multi.select2-container-active .select2-choices {\n    border: 1px solid #5897fb;\n    outline: none;\n\n    -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);\n            box-shadow: 0 0 5px rgba(0, 0, 0, .3);\n}\n.select2-container-multi .select2-choices li {\n    float: left;\n    list-style: none;\n}\n.select2-container-multi .select2-choices .select2-search-field {\n    margin: 0;\n    padding: 0;\n    white-space: nowrap;\n}\n\n.select2-container-multi .select2-choices .select2-search-field input {\n    padding: 5px;\n    margin: 1px 0;\n\n    font-family: sans-serif;\n    font-size: 100%;\n    color: #666;\n    outline: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n    background: transparent !important;\n}\n\n.select2-container-multi .select2-choices .select2-search-field input.select2-active {\n    background: #fff url('select2-spinner.gif') no-repeat 100% !important;\n}\n\n.select2-default {\n    color: #999 !important;\n}\n\n.select2-container-multi .select2-choices .select2-search-choice {\n    padding: 3px 5px 3px 18px;\n    margin: 3px 0 3px 5px;\n    position: relative;\n\n    line-height: 13px;\n    color: #333;\n    cursor: default;\n    border: 1px solid #aaaaaa;\n\n    border-radius: 3px;\n\n    -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);\n            box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);\n\n    background-clip: padding-box;\n\n    -webkit-touch-callout: none;\n      -webkit-user-select: none;\n       -khtml-user-select: none;\n         -moz-user-select: none;\n          -ms-user-select: none;\n              user-select: none;\n\n    background-color: #e4e4e4;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);\n    background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee));\n    background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);\n    background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);\n    background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);\n    background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);\n    background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);\n}\n.select2-container-multi .select2-choices .select2-search-choice .select2-chosen {\n    cursor: default;\n}\n.select2-container-multi .select2-choices .select2-search-choice-focus {\n    background: #d4d4d4;\n}\n\n.select2-search-choice-close {\n    display: block;\n    width: 12px;\n    height: 13px;\n    position: absolute;\n    right: 3px;\n    top: 4px;\n\n    font-size: 1px;\n    outline: none;\n    background: url('select2.png') right top no-repeat;\n}\n\n.select2-container-multi .select2-search-choice-close {\n    left: 3px;\n}\n\n.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {\n  background-position: right -11px;\n}\n.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {\n    background-position: right -11px;\n}\n\n/* disabled styles */\n.select2-container-multi.select2-container-disabled .select2-choices {\n    background-color: #f4f4f4;\n    background-image: none;\n    border: 1px solid #ddd;\n    cursor: default;\n}\n\n.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {\n    padding: 3px 5px 3px 5px;\n    border: 1px solid #ddd;\n    background-image: none;\n    background-color: #f4f4f4;\n}\n\n.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close {    display: none;\n    background: none;\n}\n/* end multiselect */\n\n\n.select2-result-selectable .select2-match,\n.select2-result-unselectable .select2-match {\n    text-decoration: underline;\n}\n\n.select2-offscreen, .select2-offscreen:focus {\n    clip: rect(0 0 0 0) !important;\n    width: 1px !important;\n    height: 1px !important;\n    border: 0 !important;\n    margin: 0 !important;\n    padding: 0 !important;\n    overflow: hidden !important;\n    position: absolute !important;\n    outline: 0 !important;\n    left: 0px !important;\n    top: 0px !important;\n}\n\n.select2-display-none {\n    display: none;\n}\n\n.select2-measure-scrollbar {\n    position: absolute;\n    top: -10000px;\n    left: -10000px;\n    width: 100px;\n    height: 100px;\n    overflow: scroll;\n}\n/* Retina-ize icons */\n\n@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 144dpi)  {\n  .select2-search input, .select2-search-choice-close, .select2-container .select2-choice abbr, .select2-container .select2-choice .select2-arrow b {\n      background-image: url('select2x2.png') !important;\n      background-repeat: no-repeat !important;\n      background-size: 60px 40px !important;\n  }\n  .select2-search input {\n      background-position: 100% -21px !important;\n  }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/css/ui.jqgrid.css",
    "content": "/*Grid*/\n.ui-jqgrid {position: relative;}\n.ui-jqgrid .ui-jqgrid-view {position: relative;left:0; top: 0; padding: 0; font-size:11px;}\n/* caption*/\n.ui-jqgrid .ui-jqgrid-titlebar {padding: .3em .2em .2em .3em; position: relative; border-left: 0 none;border-right: 0 none; border-top: 0 none;}\n.ui-jqgrid .ui-jqgrid-title { float: left; margin: .1em 0 .2em; }\n.ui-jqgrid .ui-jqgrid-titlebar-close { position: absolute;top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height:18px;}.ui-jqgrid .ui-jqgrid-titlebar-close span { display: block; margin: 1px; }\n.ui-jqgrid .ui-jqgrid-titlebar-close:hover { padding: 0; }\n/* header*/\n.ui-jqgrid .ui-jqgrid-hdiv {position: relative; margin: 0;padding: 0; overflow-x: hidden; border-left: 0 none !important; border-top : 0 none !important; border-right : 0 none !important;}\n.ui-jqgrid .ui-jqgrid-hbox {float: left; padding-right: 20px;}\n.ui-jqgrid .ui-jqgrid-htable {table-layout:fixed;margin:0;}\n.ui-jqgrid .ui-jqgrid-htable th {height:22px;padding: 0 2px 0 2px;}\n.ui-jqgrid .ui-jqgrid-htable th div {overflow: hidden; position:relative; height:17px;}\n.ui-th-column, .ui-jqgrid .ui-jqgrid-htable th.ui-th-column {overflow: hidden;white-space: nowrap;text-align:center;border-top : 0 none;border-bottom : 0 none;}\n.ui-th-ltr, .ui-jqgrid .ui-jqgrid-htable th.ui-th-ltr {border-left : 0 none;}\n.ui-th-rtl, .ui-jqgrid .ui-jqgrid-htable th.ui-th-rtl {border-right : 0 none;}\n.ui-first-th-ltr {border-right: 1px solid; }\n.ui-first-th-rtl {border-left: 1px solid; }\n.ui-jqgrid .ui-th-div-ie {white-space: nowrap; zoom :1; height:17px;}\n.ui-jqgrid .ui-jqgrid-resize {height:20px !important;position: relative; cursor :e-resize;display: inline;overflow: hidden;}\n.ui-jqgrid .ui-grid-ico-sort {overflow:hidden;position:absolute;display:inline; cursor: pointer !important;}\n.ui-jqgrid .ui-icon-asc {margin-top:-3px; height:12px;}\n.ui-jqgrid .ui-icon-desc {margin-top:3px;height:12px;}\n.ui-jqgrid .ui-i-asc {margin-top:0;height:16px;}\n.ui-jqgrid .ui-i-desc {margin-top:0;margin-left:13px;height:16px;}\n.ui-jqgrid .ui-jqgrid-sortable {cursor:pointer;}\n.ui-jqgrid tr.ui-search-toolbar th { border-top-width: 1px !important; border-top-color: inherit !important; border-top-style: ridge !important }\ntr.ui-search-toolbar input {margin: 1px 0 0 0}\ntr.ui-search-toolbar select {margin: 1px 0 0 0}\n/* body */ \n.ui-jqgrid .ui-jqgrid-bdiv {position: relative; margin: 0; padding:0; overflow: auto; text-align:left;}\n.ui-jqgrid .ui-jqgrid-btable {table-layout:fixed; margin:0; outline-style: none; }\n.ui-jqgrid tr.jqgrow { outline-style: none; }\n.ui-jqgrid tr.jqgroup { outline-style: none; }\n.ui-jqgrid tr.jqgrow td {font-weight: normal; overflow: hidden; white-space: pre; height: 22px;padding: 0 2px 0 2px;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}\n.ui-jqgrid tr.jqgfirstrow td {padding: 0 2px 0 2px;border-right-width: 1px; border-right-style: solid;}\n.ui-jqgrid tr.jqgroup td {font-weight: normal; overflow: hidden; white-space: pre; height: 22px;padding: 0 2px 0 2px;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}\n.ui-jqgrid tr.jqfoot td {font-weight: bold; overflow: hidden; white-space: pre; height: 22px;padding: 0 2px 0 2px;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}\n.ui-jqgrid tr.ui-row-ltr td {text-align:left;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;}\n.ui-jqgrid tr.ui-row-rtl td {text-align:right;border-left-width: 1px; border-left-color: inherit; border-left-style: solid;}\n.ui-jqgrid td.jqgrid-rownum { padding: 0 2px 0 2px; margin: 0; border: 0 none;}\n.ui-jqgrid .ui-jqgrid-resize-mark { width:2px; left:0; background-color:#777; cursor: e-resize; cursor: col-resize; position:absolute; top:0; height:100px; overflow:hidden; display:none; border:0 none; z-index: 99999;}\n/* footer */\n.ui-jqgrid .ui-jqgrid-sdiv {position: relative; margin: 0;padding: 0; overflow: hidden; border-left: 0 none !important; border-top : 0 none !important; border-right : 0 none !important;}\n.ui-jqgrid .ui-jqgrid-ftable {table-layout:fixed; margin-bottom:0;}\n.ui-jqgrid tr.footrow td {font-weight: bold; overflow: hidden; white-space:nowrap; height: 21px;padding: 0 2px 0 2px;border-top-width: 1px; border-top-color: inherit; border-top-style: solid;}\n.ui-jqgrid tr.footrow-ltr td {text-align:left;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;}\n.ui-jqgrid tr.footrow-rtl td {text-align:right;border-left-width: 1px; border-left-color: inherit; border-left-style: solid;}\n/* Pager*/\n.ui-jqgrid .ui-jqgrid-pager { border-left: 0 none !important;border-right: 0 none !important; border-bottom: 0 none !important; margin: 0 !important; padding: 0 !important; position: relative; height: 25px;white-space: nowrap;overflow: hidden;font-size:11px;}\n.ui-jqgrid .ui-pager-control {position: relative;}\n.ui-jqgrid .ui-pg-table {position: relative; padding-bottom:2px; width:auto; margin: 0;}\n.ui-jqgrid .ui-pg-table td {font-weight:normal; vertical-align:middle; padding:1px;}\n.ui-jqgrid .ui-pg-button  { height:19px !important;}\n.ui-jqgrid .ui-pg-button span { display: block; margin: 1px; float:left;}\n.ui-jqgrid .ui-pg-button:hover { padding: 0; }\n.ui-jqgrid .ui-state-disabled:hover {padding:1px;}\n.ui-jqgrid .ui-pg-input { height:13px;font-size:.8em; margin: 0;}\n.ui-jqgrid .ui-pg-selbox {font-size:.8em; line-height:18px; display:block; height:18px; margin: 0;}\n.ui-jqgrid .ui-separator {height: 18px; border-left: 1px solid #ccc ; border-right: 1px solid #ccc ; margin: 1px; float: right;}\n.ui-jqgrid .ui-paging-info {font-weight: normal;height:19px; margin-top:3px;margin-right:4px;}\n.ui-jqgrid .ui-jqgrid-pager .ui-pg-div {padding:1px 0;float:left;position:relative;}\n.ui-jqgrid .ui-jqgrid-pager .ui-pg-button { cursor:pointer; }\n.ui-jqgrid .ui-jqgrid-pager .ui-pg-div  span.ui-icon {float:left;margin:0 2px;}\n.ui-jqgrid td input, .ui-jqgrid td select .ui-jqgrid td textarea { margin: 0;}\n.ui-jqgrid td textarea {width:auto;height:auto;}\n.ui-jqgrid .ui-jqgrid-toppager {border-left: 0 none !important;border-right: 0 none !important; border-top: 0 none !important; margin: 0 !important; padding: 0 !important; position: relative; height: 25px !important;white-space: nowrap;overflow: hidden;}\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div {padding:1px 0;float:left;position:relative;}\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-button { cursor:pointer; }\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div  span.ui-icon {float:left;margin:0 2px;}\n/*subgrid*/\n.ui-jqgrid .ui-jqgrid-btable .ui-sgcollapsed span {display: block;}\n.ui-jqgrid .ui-subgrid {margin:0;padding:0; width:100%;}\n.ui-jqgrid .ui-subgrid table {table-layout: fixed;}\n.ui-jqgrid .ui-subgrid tr.ui-subtblcell td {height:18px;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}\n.ui-jqgrid .ui-subgrid td.subgrid-data {border-top:  0 none !important;}\n.ui-jqgrid .ui-subgrid td.subgrid-cell {border-width: 0 0 1px 0;}\n.ui-jqgrid .ui-th-subgrid {height:20px;}\n/* loading */\n.ui-jqgrid .loading {position: absolute; top: 45%;left: 45%;width: auto;z-index:101;padding: 6px; margin: 5px;text-align: center;font-weight: bold;display: none;border-width: 2px !important; font-size:11px;}\n.ui-jqgrid .jqgrid-overlay {display:none;z-index:100;}\n* html .jqgrid-overlay {width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}\n* .jqgrid-overlay iframe {position:absolute;top:0;left:0;z-index:-1;width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}\n/* end loading div */\n/* toolbar */\n.ui-jqgrid .ui-userdata {border-left: 0 none;    border-right: 0 none;\theight : 21px;overflow: hidden;\t}\n/*Modal Window */\n.ui-jqdialog { display: none; width: 300px; position: absolute; padding: .2em; font-size:11px; overflow:visible;}\n.ui-jqdialog .ui-jqdialog-titlebar { padding: .3em .2em; position: relative;  }\n.ui-jqdialog .ui-jqdialog-title { margin: .1em 0 .2em; } \n.ui-jqdialog .ui-jqdialog-titlebar-close { position: absolute;  top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }\n\n.ui-jqdialog .ui-jqdialog-titlebar-close span { display: block; margin: 1px; }\n.ui-jqdialog .ui-jqdialog-titlebar-close:hover, .ui-jqdialog .ui-jqdialog-titlebar-close:focus { padding: 0; }\n.ui-jqdialog-content, .ui-jqdialog .ui-jqdialog-content { border: 0; padding: .3em .2em; background: none; height:auto;}\n.ui-jqdialog .ui-jqconfirm {padding: .4em 1em; border-width:3px;position:absolute;bottom:10px;right:10px;overflow:visible;display:none;height:80px;width:220px;text-align:center;}\n.ui-jqdialog>.ui-resizable-se { bottom: -3px; right: -3px}\n/* end Modal window*/\n/* Form edit */\n.ui-jqdialog-content .FormGrid {margin: 0;}\n.ui-jqdialog-content .EditTable { width: 100%; margin-bottom:0;}\n.ui-jqdialog-content .DelTable { width: 100%; margin-bottom:0;}\n.EditTable td input, .EditTable td select, .EditTable td textarea {margin: 0;}\n.EditTable td textarea { width:auto; height:auto;}\n.ui-jqdialog-content td.EditButton {text-align: right;border-top: 0 none;border-left: 0 none;border-right: 0 none; padding-bottom:5px; padding-top:5px;}\n.ui-jqdialog-content td.navButton {text-align: center; border-left: 0 none;border-top: 0 none;border-right: 0 none; padding-bottom:5px; padding-top:5px;}\n.ui-jqdialog-content input.FormElement {padding:.3em}\n.ui-jqdialog-content select.FormElement {padding:.3em}\n.ui-jqdialog-content .data-line {padding-top:.1em;border: 0 none;}\n\n.ui-jqdialog-content .CaptionTD {vertical-align: middle;border: 0 none; padding: 2px;white-space: nowrap;}\n.ui-jqdialog-content .DataTD {padding: 2px; border: 0 none; vertical-align: top;}\n.ui-jqdialog-content .form-view-data {white-space:pre}\n.fm-button { display: inline-block; margin:0 4px 0 0; padding: .4em .5em; text-decoration:none !important; cursor:pointer; position: relative; text-align: center; zoom: 1; }\n.fm-button-icon-left { padding-left: 1.9em; }\n.fm-button-icon-right { padding-right: 1.9em; }\n.fm-button-icon-left .ui-icon { right: auto; left: .2em; margin-left: 0; position: absolute; top: 50%; margin-top: -8px; }\n.fm-button-icon-right .ui-icon { left: auto; right: .2em; margin-left: 0; position: absolute; top: 50%; margin-top: -8px;}\n#nData, #pData { float: left; margin:3px;padding: 0; width: 15px; }\n/* End Eorm edit */\n/*.ui-jqgrid .edit-cell {}*/\n.ui-jqgrid .selected-row, div.ui-jqgrid .selected-row td {font-style : normal;border-left: 0 none;}\n/* inline edit actions button*/\n.ui-inline-del.ui-state-hover span, .ui-inline-edit.ui-state-hover span,\n.ui-inline-save.ui-state-hover span, .ui-inline-cancel.ui-state-hover span {\n    margin: -1px;\n}\n/* Tree Grid */\n.ui-jqgrid .tree-wrap {float: left; position: relative;height: 18px;white-space: nowrap;overflow: hidden;}\n.ui-jqgrid .tree-minus {position: absolute; height: 18px; width: 18px; overflow: hidden;}\n.ui-jqgrid .tree-plus {position: absolute;\theight: 18px; width: 18px;\toverflow: hidden;}\n.ui-jqgrid .tree-leaf {position: absolute;\theight: 18px; width: 18px;overflow: hidden;}\n.ui-jqgrid .treeclick {cursor: pointer;}\n/* moda dialog */\n* iframe.jqm {position:absolute;top:0;left:0;z-index:-1;width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}\n.ui-jqgrid-dnd tr td {border-right-width: 1px; border-right-color: inherit; border-right-style: solid; height:20px}\n/* RTL Support */\n.ui-jqgrid .ui-jqgrid-title-rtl {float:right;margin: .1em 0 .2em; }\n.ui-jqgrid .ui-jqgrid-hbox-rtl {float: right; padding-left: 20px;}\n.ui-jqgrid .ui-jqgrid-resize-ltr {float: right;margin: -2px -2px -2px 0;}\n.ui-jqgrid .ui-jqgrid-resize-rtl {float: left;margin: -2px 0 -1px -3px;}\n.ui-jqgrid .ui-sort-rtl {left:0;}\n.ui-jqgrid .tree-wrap-ltr {float: left;}\n.ui-jqgrid .tree-wrap-rtl {float: right;}\n.ui-jqgrid .ui-ellipsis {text-overflow:ellipsis;}\n\n/* Toolbar Search Menu */\n.ui-search-menu { position: absolute; padding: 2px 5px;}\n.ui-jqgrid .ui-search-table { padding: 0px 0px; border: 0px none; height:20px; width:100%;}\n.ui-jqgrid .ui-search-table .ui-search-oper { width:20px; }"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/font/fonts.googleapis.com.css",
    "content": "@font-face {\n  font-family: 'Open Sans';\n  font-style: normal;\n  font-weight: 300;\n  src: local('Open Sans Light'), local('OpenSans-Light'), url(DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woff) format('woff');\n}\n@font-face {\n  font-family: 'Open Sans';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Open Sans'), local('OpenSans'), url(cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff) format('woff');\n}"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/js/fuelux/data/fuelux.tree-sampledata.js",
    "content": "var DataSourceTree = function(options) {\n\tthis._data \t= options.data;\n\tthis._delay = options.delay;\n}\n\nDataSourceTree.prototype.data = function(options, callback) {\n\tvar self = this;\n\tvar $data = null;\n\n\tif(!(\"name\" in options) && !(\"type\" in options)){\n\t\t$data = this._data;//the root tree\n\t\tcallback({ data: $data });\n\t\treturn;\n\t}\n\telse if(\"type\" in options && options.type == \"folder\") {\n\t\tif(\"additionalParameters\" in options && \"children\" in options.additionalParameters)\n\t\t\t$data = options.additionalParameters.children;\n\t\telse $data = {}//no data\n\t}\n\t\n\tif($data != null)//this setTimeout is only for mimicking some random delay\n\t\tsetTimeout(function(){callback({ data: $data });} , parseInt(Math.random() * 500) + 200);\n\n\t//we have used static data here\n\t//but you can retrieve your data dynamically from a server using ajax call\n\t//checkout examples/treeview.html and examples/treeview.js for more info\n};\n\nvar tree_data = {\n\t'for-sale' : {name: 'For Sale', type: 'folder'}\t,\n\t'vehicles' : {name: 'Vehicles', type: 'folder'}\t,\n\t'rentals' : {name: 'Rentals', type: 'folder'}\t,\n\t'real-estate' : {name: 'Real Estate', type: 'folder'}\t,\n\t'pets' : {name: 'Pets', type: 'folder'}\t,\n\t'tickets' : {name: 'Tickets', type: 'item'}\t,\n\t'services' : {name: 'Services', type: 'item'}\t,\n\t'personals' : {name: 'Personals', type: 'item'}\n}\ntree_data['for-sale']['additionalParameters'] = {\n\t'children' : {\n\t\t'appliances' : {name: 'Appliances', type: 'item'},\n\t\t'arts-crafts' : {name: 'Arts & Crafts', type: 'item'},\n\t\t'clothing' : {name: 'Clothing', type: 'item'},\n\t\t'computers' : {name: 'Computers', type: 'item'},\n\t\t'jewelry' : {name: 'Jewelry', type: 'item'},\n\t\t'office-business' : {name: 'Office & Business', type: 'item'},\n\t\t'sports-fitness' : {name: 'Sports & Fitness', type: 'item'}\n\t}\n}\ntree_data['vehicles']['additionalParameters'] = {\n\t'children' : {\n\t\t'cars' : {name: 'Cars', type: 'folder'},\n\t\t'motorcycles' : {name: 'Motorcycles', type: 'item'},\n\t\t'boats' : {name: 'Boats', type: 'item'}\n\t}\n}\ntree_data['vehicles']['additionalParameters']['children']['cars']['additionalParameters'] = {\n\t'children' : {\n\t\t'classics' : {name: 'Classics', type: 'item'},\n\t\t'convertibles' : {name: 'Convertibles', type: 'item'},\n\t\t'coupes' : {name: 'Coupes', type: 'item'},\n\t\t'hatchbacks' : {name: 'Hatchbacks', type: 'item'},\n\t\t'hybrids' : {name: 'Hybrids', type: 'item'},\n\t\t'suvs' : {name: 'SUVs', type: 'item'},\n\t\t'sedans' : {name: 'Sedans', type: 'item'},\n\t\t'trucks' : {name: 'Trucks', type: 'item'}\n\t}\n}\n\ntree_data['rentals']['additionalParameters'] = {\n\t'children' : {\n\t\t'apartments-rentals' : {name: 'Apartments', type: 'item'},\n\t\t'office-space-rentals' : {name: 'Office Space', type: 'item'},\n\t\t'vacation-rentals' : {name: 'Vacation Rentals', type: 'item'}\n\t}\n}\ntree_data['real-estate']['additionalParameters'] = {\n\t'children' : {\n\t\t'apartments' : {name: 'Apartments', type: 'item'},\n\t\t'villas' : {name: 'Villas', type: 'item'},\n\t\t'plots' : {name: 'Plots', type: 'item'}\n\t}\n}\ntree_data['pets']['additionalParameters'] = {\n\t'children' : {\n\t\t'cats' : {name: 'Cats', type: 'item'},\n\t\t'dogs' : {name: 'Dogs', type: 'item'},\n\t\t'horses' : {name: 'Horses', type: 'item'},\n\t\t'reptiles' : {name: 'Reptiles', type: 'item'}\n\t}\n}\n\nvar treeDataSource = new DataSourceTree({data: tree_data});\n\n\n\n\n\n\n\n\n\n\n\nvar tree_data_2 = {\n\t'pictures' : {name: 'Pictures', type: 'folder', 'icon-class':'red'}\t,\n\t'music' : {name: 'Music', type: 'folder', 'icon-class':'orange'}\t,\n\t'video' : {name: 'Video', type: 'folder', 'icon-class':'blue'}\t,\n\t'documents' : {name: 'Documents', type: 'folder', 'icon-class':'green'}\t,\n\t'backup' : {name: 'Backup', type: 'folder'}\t,\n\t'readme' : {name: '<i class=\"icon-file-text grey\"></i> ReadMe.txt', type: 'item'},\n\t'manual' : {name: '<i class=\"icon-book blue\"></i> Manual.html', type: 'item'}\n}\ntree_data_2['music']['additionalParameters'] = {\n\t'children' : [\n\t\t{name: '<i class=\"icon-music blue\"></i> song1.ogg', type: 'item'},\n\t\t{name: '<i class=\"icon-music blue\"></i> song2.ogg', type: 'item'},\n\t\t{name: '<i class=\"icon-music blue\"></i> song3.ogg', type: 'item'},\n\t\t{name: '<i class=\"icon-music blue\"></i> song4.ogg', type: 'item'},\n\t\t{name: '<i class=\"icon-music blue\"></i> song5.ogg', type: 'item'}\n\t]\n}\ntree_data_2['video']['additionalParameters'] = {\n\t'children' : [\n\t\t{name: '<i class=\"icon-film blue\"></i> movie1.avi', type: 'item'},\n\t\t{name: '<i class=\"icon-film blue\"></i> movie2.avi', type: 'item'},\n\t\t{name: '<i class=\"icon-film blue\"></i> movie3.avi', type: 'item'},\n\t\t{name: '<i class=\"icon-film blue\"></i> movie4.avi', type: 'item'},\n\t\t{name: '<i class=\"icon-film blue\"></i> movie5.avi', type: 'item'}\n\t]\n}\ntree_data_2['pictures']['additionalParameters'] = {\n\t'children' : {\n\t\t'wallpapers' : {name: 'Wallpapers', type: 'folder', 'icon-class':'pink'},\n\t\t'camera' : {name: 'Camera', type: 'folder', 'icon-class':'pink'}\n\t}\n}\ntree_data_2['pictures']['additionalParameters']['children']['wallpapers']['additionalParameters'] = {\n\t'children' : [\n\t\t{name: '<i class=\"icon-picture green\"></i> wallpaper1.jpg', type: 'item'},\n\t\t{name: '<i class=\"icon-picture green\"></i> wallpaper2.jpg', type: 'item'},\n\t\t{name: '<i class=\"icon-picture green\"></i> wallpaper3.jpg', type: 'item'},\n\t\t{name: '<i class=\"icon-picture green\"></i> wallpaper4.jpg', type: 'item'}\n\t]\n}\ntree_data_2['pictures']['additionalParameters']['children']['camera']['additionalParameters'] = {\n\t'children' : [\n\t\t{name: '<i class=\"icon-picture green\"></i> photo1.jpg', type: 'item'},\n\t\t{name: '<i class=\"icon-picture green\"></i> photo2.jpg', type: 'item'},\n\t\t{name: '<i class=\"icon-picture green\"></i> photo3.jpg', type: 'item'},\n\t\t{name: '<i class=\"icon-picture green\"></i> photo4.jpg', type: 'item'},\n\t\t{name: '<i class=\"icon-picture green\"></i> photo5.jpg', type: 'item'},\n\t\t{name: '<i class=\"icon-picture green\"></i> photo6.jpg', type: 'item'}\n\t]\n}\n\n\ntree_data_2['documents']['additionalParameters'] = {\n\t'children' : [\n\t\t{name: '<i class=\"icon-file-text red\"></i> document1.pdf', type: 'item'},\n\t\t{name: '<i class=\"icon-file-text grey\"></i> document2.doc', type: 'item'},\n\t\t{name: '<i class=\"icon-file-text grey\"></i> document3.doc', type: 'item'},\n\t\t{name: '<i class=\"icon-file-text red\"></i> document4.pdf', type: 'item'},\n\t\t{name: '<i class=\"icon-file-text grey\"></i> document5.doc', type: 'item'}\n\t]\n}\n\ntree_data_2['backup']['additionalParameters'] = {\n\t'children' : [\n\t\t{name: '<i class=\"icon-archive brown\"></i> backup1.zip', type: 'item'},\n\t\t{name: '<i class=\"icon-archive brown\"></i> backup2.zip', type: 'item'},\n\t\t{name: '<i class=\"icon-archive brown\"></i> backup3.zip', type: 'item'},\n\t\t{name: '<i class=\"icon-archive brown\"></i> backup4.zip', type: 'item'}\n\t]\n}\nvar treeDataSource2 = new DataSourceTree({data: tree_data_2});"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/js/html5shiv.js",
    "content": "/**\n* @preserve HTML5 Shiv tpl.6.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed\n*/\n;(function(window, document) {\n/*jshint evil:true */\n  /** version */\n  var version = '3.6.2';\n\n  /** Preset options */\n  var options = window.html5 || {};\n\n  /** Used to skip problem elements */\n  var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;\n\n  /** Not all elements can be cloned in IE **/\n  var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;\n\n  /** Detect whether the browser supports default html5 styles */\n  var supportsHtml5Styles;\n\n  /** Name of the expando, to work with multiple documents or to re-shiv one document */\n  var expando = '_html5shiv';\n\n  /** The id for the the documents expando */\n  var expanID = 0;\n\n  /** Cached data for each document */\n  var expandoData = {};\n\n  /** Detect whether the browser supports unknown elements */\n  var supportsUnknownElements;\n\n  (function() {\n    try {\n        var a = document.createElement('a');\n        a.innerHTML = '<xyz></xyz>';\n        //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles\n        supportsHtml5Styles = ('hidden' in a);\n\n        supportsUnknownElements = a.childNodes.length == 1 || (function() {\n          // assign a false positive if unable to shiv\n          (document.createElement)('a');\n          var frag = document.createDocumentFragment();\n          return (\n            typeof frag.cloneNode == 'undefined' ||\n            typeof frag.createDocumentFragment == 'undefined' ||\n            typeof frag.createElement == 'undefined'\n          );\n        }());\n    } catch(e) {\n      // assign a false positive if detection fails => unable to shiv\n      supportsHtml5Styles = true;\n      supportsUnknownElements = true;\n    }\n\n  }());\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Creates a style sheet with the given CSS text and adds it to the document.\n   * @private\n   * @param {Document} ownerDocument The document.\n   * @param {String} cssText The CSS text.\n   * @returns {StyleSheet} The style element.\n   */\n  function addStyleSheet(ownerDocument, cssText) {\n    var p = ownerDocument.createElement('p'),\n        parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;\n\n    p.innerHTML = 'x<style>' + cssText + '</style>';\n    return parent.insertBefore(p.lastChild, parent.firstChild);\n  }\n\n  /**\n   * Returns the value of `html5.elements` as an array.\n   * @private\n   * @returns {Array} An array of shived element node names.\n   */\n  function getElements() {\n    var elements = html5.elements;\n    return typeof elements == 'string' ? elements.split(' ') : elements;\n  }\n\n    /**\n   * Returns the data associated to the given document\n   * @private\n   * @param {Document} ownerDocument The document.\n   * @returns {Object} An object of data.\n   */\n  function getExpandoData(ownerDocument) {\n    var data = expandoData[ownerDocument[expando]];\n    if (!data) {\n        data = {};\n        expanID++;\n        ownerDocument[expando] = expanID;\n        expandoData[expanID] = data;\n    }\n    return data;\n  }\n\n  /**\n   * returns a shived element for the given nodeName and document\n   * @memberOf html5\n   * @param {String} nodeName name of the element\n   * @param {Document} ownerDocument The context document.\n   * @returns {Object} The shived element.\n   */\n  function createElement(nodeName, ownerDocument, data){\n    if (!ownerDocument) {\n        ownerDocument = document;\n    }\n    if(supportsUnknownElements){\n        return ownerDocument.createElement(nodeName);\n    }\n    if (!data) {\n        data = getExpandoData(ownerDocument);\n    }\n    var node;\n\n    if (data.cache[nodeName]) {\n        node = data.cache[nodeName].cloneNode();\n    } else if (saveClones.test(nodeName)) {\n        node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();\n    } else {\n        node = data.createElem(nodeName);\n    }\n\n    // Avoid adding some elements to fragments in IE < 9 because\n    // * Attributes like `name` or `type` cannot be set/changed once an element\n    //   is inserted into a document/fragment\n    // * Link elements with `src` attributes that are inaccessible, as with\n    //   a 403 response, will cause the tab/window to crash\n    // * Script elements appended to fragments will execute when their `src`\n    //   or `text` property is set\n    return node.canHaveChildren && !reSkip.test(nodeName) ? data.frag.appendChild(node) : node;\n  }\n\n  /**\n   * returns a shived DocumentFragment for the given document\n   * @memberOf html5\n   * @param {Document} ownerDocument The context document.\n   * @returns {Object} The shived DocumentFragment.\n   */\n  function createDocumentFragment(ownerDocument, data){\n    if (!ownerDocument) {\n        ownerDocument = document;\n    }\n    if(supportsUnknownElements){\n        return ownerDocument.createDocumentFragment();\n    }\n    data = data || getExpandoData(ownerDocument);\n    var clone = data.frag.cloneNode(),\n        i = 0,\n        elems = getElements(),\n        l = elems.length;\n    for(;i<l;i++){\n        clone.createElement(elems[i]);\n    }\n    return clone;\n  }\n\n  /**\n   * Shivs the `createElement` and `createDocumentFragment` methods of the document.\n   * @private\n   * @param {Document|DocumentFragment} ownerDocument The document.\n   * @param {Object} data of the document.\n   */\n  function shivMethods(ownerDocument, data) {\n    if (!data.cache) {\n        data.cache = {};\n        data.createElem = ownerDocument.createElement;\n        data.createFrag = ownerDocument.createDocumentFragment;\n        data.frag = data.createFrag();\n    }\n\n\n    ownerDocument.createElement = function(nodeName) {\n      //abort shiv\n      if (!html5.shivMethods) {\n          return data.createElem(nodeName);\n      }\n      return createElement(nodeName, ownerDocument, data);\n    };\n\n    ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +\n      'var n=f.cloneNode(),c=n.createElement;' +\n      'h.shivMethods&&(' +\n        // unroll the `createElement` calls\n        getElements().join().replace(/[\\w\\-]+/g, function(nodeName) {\n          data.createElem(nodeName);\n          data.frag.createElement(nodeName);\n          return 'c(\"' + nodeName + '\")';\n        }) +\n      ');return n}'\n    )(html5, data.frag);\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Shivs the given document.\n   * @memberOf html5\n   * @param {Document} ownerDocument The document to shiv.\n   * @returns {Document} The shived document.\n   */\n  function shivDocument(ownerDocument) {\n    if (!ownerDocument) {\n        ownerDocument = document;\n    }\n    var data = getExpandoData(ownerDocument);\n\n    if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {\n      data.hasCSS = !!addStyleSheet(ownerDocument,\n        // corrects block display not defined in IE6/7/8/9\n        'article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}' +\n        // adds styling not present in IE6/7/8/9\n        'mark{background:#FF0;color:#000}' +\n        // hides non-rendered elements\n        'tpl{display:none}'\n      );\n    }\n    if (!supportsUnknownElements) {\n      shivMethods(ownerDocument, data);\n    }\n    return ownerDocument;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * The `html5` object is exposed so that more elements can be shived and\n   * existing shiving can be detected on iframes.\n   * @type Object\n   * @example\n   *\n   * // options can be changed before the script is included\n   * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };\n   */\n  var html5 = {\n\n    /**\n     * An array or space separated string of node names of the elements to shiv.\n     * @memberOf html5\n     * @type Array|String\n     */\n    'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary tpl time video',\n\n    /**\n     * current version of html5shiv\n     */\n    'version': version,\n\n    /**\n     * A flag to indicate that the HTML5 style sheet should be inserted.\n     * @memberOf html5\n     * @type Boolean\n     */\n    'shivCSS': (options.shivCSS !== false),\n\n    /**\n     * Is equal to true if a browser supports creating unknown/HTML5 elements\n     * @memberOf html5\n     * @type boolean\n     */\n    'supportsUnknownElements': supportsUnknownElements,\n\n    /**\n     * A flag to indicate that the document's `createElement` and `createDocumentFragment`\n     * methods should be overwritten.\n     * @memberOf html5\n     * @type Boolean\n     */\n    'shivMethods': (options.shivMethods !== false),\n\n    /**\n     * A string to describe the type of `html5` object (\"default\" or \"default print\").\n     * @memberOf html5\n     * @type String\n     */\n    'type': 'default',\n\n    // shivs the document according to the specified `html5` object options\n    'shivDocument': shivDocument,\n\n    //creates a shived element\n    createElement: createElement,\n\n    //creates a shived documentFragment\n    createDocumentFragment: createDocumentFragment\n  };\n\n  /*--------------------------------------------------------------------------*/\n\n  // expose html5\n  window.html5 = html5;\n\n  // shiv the document\n  shivDocument(document);\n\n}(this, document));\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/js/jqGrid/i18n/grid.locale-en.js",
    "content": ";(function($){\n/**\n * jqGrid English Translation\n * Tony Tomov tony@trirand.com\n * http://trirand.com/blog/ \n * Dual licensed under the MIT and GPL licenses:\n * http://www.opensource.org/licenses/mit-license.php\n * http://www.gnu.org/licenses/gpl.html\n**/\n$.jgrid = $.jgrid || {};\n$.extend($.jgrid,{\n\tdefaults : {\n\t\trecordtext: \"View {0} - {1} of {2}\",\n\t\temptyrecords: \"No records to view\",\n\t\tloadtext: \"Loading...\",\n\t\tpgtext : \"Page {0} of {1}\"\n\t},\n\tsearch : {\n\t\tcaption: \"Search...\",\n\t\tFind: \"Find\",\n\t\tReset: \"Reset\",\n\t\todata: [{ oper:'eq', text:'equal'},{ oper:'ne', text:'not equal'},{ oper:'lt', text:'less'},{ oper:'le', text:'less or equal'},{ oper:'gt', text:'greater'},{ oper:'ge', text:'greater or equal'},{ oper:'bw', text:'begins with'},{ oper:'bn', text:'does not begin with'},{ oper:'in', text:'is in'},{ oper:'ni', text:'is not in'},{ oper:'ew', text:'ends with'},{ oper:'en', text:'does not end with'},{ oper:'cn', text:'contains'},{ oper:'nc', text:'does not contain'}],\n\t\tgroupOps: [\t{ op: \"AND\", text: \"all\" },\t{ op: \"OR\",  text: \"any\" }\t]\n\t},\n\tedit : {\n\t\taddCaption: \"Add Record\",\n\t\teditCaption: \"Edit Record\",\n\t\tbSubmit: \"Submit\",\n\t\tbCancel: \"Cancel\",\n\t\tbClose: \"Close\",\n\t\tsaveData: \"Data has been changed! Save changes?\",\n\t\tbYes : \"Yes\",\n\t\tbNo : \"No\",\n\t\tbExit : \"Cancel\",\n\t\tmsg: {\n\t\t\trequired:\"Field is required\",\n\t\t\tnumber:\"Please, enter valid number\",\n\t\t\tminValue:\"value must be greater than or equal to \",\n\t\t\tmaxValue:\"value must be less than or equal to\",\n\t\t\temail: \"is not a valid e-mail\",\n\t\t\tinteger: \"Please, enter valid integer value\",\n\t\t\tdate: \"Please, enter valid date value\",\n\t\t\turl: \"is not a valid URL. Prefix required ('http://' or 'https://')\",\n\t\t\tnodefined : \" is not defined!\",\n\t\t\tnovalue : \" return value is required!\",\n\t\t\tcustomarray : \"Custom function should return array!\",\n\t\t\tcustomfcheck : \"Custom function should be present in case of custom checking!\"\n\t\t\t\n\t\t}\n\t},\n\tview : {\n\t\tcaption: \"View Record\",\n\t\tbClose: \"Close\"\n\t},\n\tdel : {\n\t\tcaption: \"Delete\",\n\t\tmsg: \"Delete selected record(s)?\",\n\t\tbSubmit: \"Delete\",\n\t\tbCancel: \"Cancel\"\n\t},\n\tnav : {\n\t\tedittext: \"\",\n\t\tedittitle: \"Edit selected row\",\n\t\taddtext:\"\",\n\t\taddtitle: \"Add new row\",\n\t\tdeltext: \"\",\n\t\tdeltitle: \"Delete selected row\",\n\t\tsearchtext: \"\",\n\t\tsearchtitle: \"Find records\",\n\t\trefreshtext: \"\",\n\t\trefreshtitle: \"Reload Grid\",\n\t\talertcap: \"Warning\",\n\t\talerttext: \"Please, select row\",\n\t\tviewtext: \"\",\n\t\tviewtitle: \"View selected row\"\n\t},\n\tcol : {\n\t\tcaption: \"Select columns\",\n\t\tbSubmit: \"Ok\",\n\t\tbCancel: \"Cancel\"\n\t},\n\terrors : {\n\t\terrcap : \"Error\",\n\t\tnourl : \"No url is set\",\n\t\tnorecords: \"No records to process\",\n\t\tmodel : \"Length of colNames <> colModel!\"\n\t},\n\tformatter : {\n\t\tinteger : {thousandsSeparator: \",\", defaultValue: '0'},\n\t\tnumber : {decimalSeparator:\".\", thousandsSeparator: \",\", decimalPlaces: 2, defaultValue: '0.00'},\n\t\tcurrency : {decimalSeparator:\".\", thousandsSeparator: \",\", decimalPlaces: 2, prefix: \"\", suffix:\"\", defaultValue: '0.00'},\n\t\tdate : {\n\t\t\tdayNames:   [\n\t\t\t\t\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thr\", \"Fri\", \"Sat\",\n\t\t\t\t\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"\n\t\t\t],\n\t\t\tmonthNames: [\n\t\t\t\t\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\",\n\t\t\t\t\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\n\t\t\t],\n\t\t\tAmPm : [\"am\",\"pm\",\"AM\",\"PM\"],\n\t\t\tS: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th';},\n\t\t\tsrcformat: 'Y-m-d',\n\t\t\tnewformat: 'n/j/Y',\n\t\t\tparseRe : /[Tt\\\\\\/:_;.,\\t\\s-]/,\n\t\t\tmasks : {\n\t\t\t\t// see http://php.net/manual/en/function.date.php for PHP format used in jqGrid\n\t\t\t\t// and see http://docs.jquery.com/UI/Datepicker/formatDate\n\t\t\t\t// and https://github.com/jquery/globalize#dates for alternative formats used frequently\n\t\t\t\t// one can find on https://github.com/jquery/globalize/tree/master/lib/cultures many\n\t\t\t\t// information about date, time, numbers and currency formats used in different countries\n\t\t\t\t// one should just convert the information in PHP format\n\t\t\t\tISO8601Long:\"Y-m-d H:i:s\",\n\t\t\t\tISO8601Short:\"Y-m-d\",\n\t\t\t\t// short date:\n\t\t\t\t//    n - Numeric representation of a month, without leading zeros\n\t\t\t\t//    j - Day of the month without leading zeros\n\t\t\t\t//    Y - A full numeric representation of a year, 4 digits\n\t\t\t\t// example: 3/1/2012 which means 1 March 2012\n\t\t\t\tShortDate: \"n/j/Y\", // in jQuery UI Datepicker: \"M/d/yyyy\"\n\t\t\t\t// long date:\n\t\t\t\t//    l - A full textual representation of the day of the week\n\t\t\t\t//    F - A full textual representation of a month\n\t\t\t\t//    d - Day of the month, 2 digits with leading zeros\n\t\t\t\t//    Y - A full numeric representation of a year, 4 digits\n\t\t\t\tLongDate: \"l, F d, Y\", // in jQuery UI Datepicker: \"dddd, MMMM dd, yyyy\"\n\t\t\t\t// long date with long time:\n\t\t\t\t//    l - A full textual representation of the day of the week\n\t\t\t\t//    F - A full textual representation of a month\n\t\t\t\t//    d - Day of the month, 2 digits with leading zeros\n\t\t\t\t//    Y - A full numeric representation of a year, 4 digits\n\t\t\t\t//    g - 12-hour format of an hour without leading zeros\n\t\t\t\t//    i - Minutes with leading zeros\n\t\t\t\t//    s - Seconds, with leading zeros\n\t\t\t\t//    A - Uppercase Ante meridiem and Post meridiem (AM or PM)\n\t\t\t\tFullDateTime: \"l, F d, Y g:i:s A\", // in jQuery UI Datepicker: \"dddd, MMMM dd, yyyy h:mm:ss tt\"\n\t\t\t\t// month day:\n\t\t\t\t//    F - A full textual representation of a month\n\t\t\t\t//    d - Day of the month, 2 digits with leading zeros\n\t\t\t\tMonthDay: \"F d\", // in jQuery UI Datepicker: \"MMMM dd\"\n\t\t\t\t// short time (without seconds)\n\t\t\t\t//    g - 12-hour format of an hour without leading zeros\n\t\t\t\t//    i - Minutes with leading zeros\n\t\t\t\t//    A - Uppercase Ante meridiem and Post meridiem (AM or PM)\n\t\t\t\tShortTime: \"g:i A\", // in jQuery UI Datepicker: \"h:mm tt\"\n\t\t\t\t// long time (with seconds)\n\t\t\t\t//    g - 12-hour format of an hour without leading zeros\n\t\t\t\t//    i - Minutes with leading zeros\n\t\t\t\t//    s - Seconds, with leading zeros\n\t\t\t\t//    A - Uppercase Ante meridiem and Post meridiem (AM or PM)\n\t\t\t\tLongTime: \"g:i:s A\", // in jQuery UI Datepicker: \"h:mm:ss tt\"\n\t\t\t\tSortableDateTime: \"Y-m-d\\\\TH:i:s\",\n\t\t\t\tUniversalSortableDateTime: \"Y-m-d H:i:sO\",\n\t\t\t\t// month with year\n\t\t\t\t//    Y - A full numeric representation of a year, 4 digits\n\t\t\t\t//    F - A full textual representation of a month\n\t\t\t\tYearMonth: \"F, Y\" // in jQuery UI Datepicker: \"MMMM, yyyy\"\n\t\t\t},\n\t\t\treformatAfterEdit : false\n\t\t},\n\t\tbaseLinkUrl: '',\n\t\tshowAction: '',\n\t\ttarget: '',\n\t\tcheckbox : {disabled:true},\n\t\tidName : 'id'\n\t}\n});\n})(jQuery);"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/js/jqGrid/jquery.jqGrid.src.js",
    "content": "// ==ClosureCompiler==\n// @compilation_level SIMPLE_OPTIMIZATIONS\n\n/**\n * @license jqGrid  4.5.2 - jQuery Grid\n * Copyright (c) 2008, Tony Tomov, tony@trirand.com\n * Dual licensed under the MIT and GPL licenses\n * http://www.opensource.org/licenses/mit-license.php\n * http://www.gnu.org/licenses/gpl-2.0.html\n * Date: 2013-05-21\n */\n//jsHint options\n/*jshint evil:true, eqeqeq:false, eqnull:true, devel:true */\n/*global jQuery */\n\n(function ($) {\n\"use strict\";\n$.jgrid = $.jgrid || {};\n$.extend($.jgrid,{\n\tversion : \"4.5.2\",\n\thtmlDecode : function(value){\n\t\tif(value && (value==='&nbsp;' || value==='&#160;' || (value.length===1 && value.charCodeAt(0)===160))) { return \"\";}\n\t\treturn !value ? value : String(value).replace(/&gt;/g, \">\").replace(/&lt;/g, \"<\").replace(/&quot;/g, '\"').replace(/&amp;/g, \"&\");\t\t\n\t},\n\thtmlEncode : function (value){\n\t\treturn !value ? value : String(value).replace(/&/g, \"&amp;\").replace(/\\\"/g, \"&quot;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n\t},\n\tformat : function(format){ //jqgformat\n\t\tvar args = $.makeArray(arguments).slice(1);\n\t\tif(format==null) { format = \"\"; }\n\t\treturn format.replace(/\\{(\\d+)\\}/g, function(m, i){\n\t\t\treturn args[i];\n\t\t});\n\t},\n\tmsie : navigator.appName === 'Microsoft Internet Explorer',\n\tmsiever : function () {\n\t\tvar rv = -1;\n\t\tvar ua = navigator.userAgent;\n\t\tvar re  = new RegExp(\"MSIE ([0-9]{1,}[\\.0-9]{0,})\");\n\t\tif (re.exec(ua) != null) {\n\t\t\trv = parseFloat( RegExp.$1 );\n\t\t}\n\t\treturn rv;\n\t},\n\tgetCellIndex : function (cell) {\n\t\tvar c = $(cell);\n\t\tif (c.is('tr')) { return -1; }\n\t\tc = (!c.is('td') && !c.is('th') ? c.closest(\"td,th\") : c)[0];\n\t\tif ($.jgrid.msie) { return $.inArray(c, c.parentNode.cells); }\n\t\treturn c.cellIndex;\n\t},\n\tstripHtml : function(v) {\n\t\tv = String(v);\n\t\tvar regexp = /<(\"[^\"]*\"|'[^']*'|[^'\">])*>/gi;\n\t\tif (v) {\n\t\t\tv = v.replace(regexp,\"\");\n\t\t\treturn (v && v !== '&nbsp;' && v !== '&#160;') ? v.replace(/\\\"/g,\"'\") : \"\";\n\t\t} \n\t\t\treturn v;\n\t},\n\tstripPref : function (pref, id) {\n\t\tvar obj = $.type( pref );\n\t\tif( obj === \"string\" || obj === \"number\") {\n\t\t\tpref =  String(pref);\n\t\t\tid = pref !== \"\" ? String(id).replace(String(pref), \"\") : id;\n\t\t}\n\t\treturn id;\n\t},\n\tparse : function(jsonString) {\n\t\tvar js = jsonString;\n\t\tif (js.substr(0,9) === \"while(1);\") { js = js.substr(9); }\n\t\tif (js.substr(0,2) === \"/*\") { js = js.substr(2,js.length-4); }\n\t\tif(!js) { js = \"{}\"; }\n\t\treturn ($.jgrid.useJSON===true && typeof JSON === 'object' && typeof JSON.parse === 'function') ?\n\t\t\tJSON.parse(js) :\n\t\t\teval('(' + js + ')');\n\t},\n\tparseDate : function(format, date, newformat, opts) {\n\t\tvar\ttoken = /\\\\.|[dDjlNSwzWFmMntLoYyaABgGhHisueIOPTZcrU]/g,\n\t\ttimezone = /\\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\\d{4})?)\\b/g,\n\t\ttimezoneClip = /[^-+\\dA-Z]/g,\n\t\tmsDateRegExp = new RegExp(\"^\\/Date\\\\((([-+])?[0-9]+)(([-+])([0-9]{2})([0-9]{2}))?\\\\)\\/$\"),\n\t\tmsMatch = ((typeof date === 'string') ? date.match(msDateRegExp): null),\n\t\tpad = function (value, length) {\n\t\t\tvalue = String(value);\n\t\t\tlength = parseInt(length,10) || 2;\n\t\t\twhile (value.length < length)  { value = '0' + value; }\n\t\t\treturn value;\n\t\t},\n\t\tts = {m : 1, d : 1, y : 1970, h : 0, i : 0, s : 0, u:0},\n\t\ttimestamp=0, dM, k,hl,\n\t\th12to24 = function(ampm, h){\n\t\t\tif (ampm === 0){ if (h === 12) { h = 0;} }\n\t\t\telse { if (h !== 12) { h += 12; } }\n\t\t\treturn h;\n\t\t};\n\t\tif(opts === undefined) {\n\t\t\topts = $.jgrid.formatter.date;\n\t\t}\n\t\t// old lang files\n\t\tif(opts.parseRe === undefined ) {\n\t\t\topts.parseRe = /[Tt\\\\\\/:_;.,\\t\\s-]/;\n\t\t}\n\t\tif( opts.masks.hasOwnProperty(format) ) { format = opts.masks[format]; }\n\t\tif(date && date != null) {\n\t\t\tif( !isNaN( date - 0 ) && String(format).toLowerCase() === \"u\") {\n\t\t\t\t//Unix timestamp\n\t\t\t\ttimestamp = new Date( parseFloat(date)*1000 );\n\t\t\t} else if(date.constructor === Date) {\n\t\t\t\ttimestamp = date;\n\t\t\t\t// Microsoft date format support\n\t\t\t} else if( msMatch !== null ) {\n\t\t\t\ttimestamp = new Date(parseInt(msMatch[1], 10));\n\t\t\t\tif (msMatch[3]) {\n\t\t\t\t\tvar offset = Number(msMatch[5]) * 60 + Number(msMatch[6]);\n\t\t\t\t\toffset *= ((msMatch[4] === '-') ? 1 : -1);\n\t\t\t\t\toffset -= timestamp.getTimezoneOffset();\n\t\t\t\t\ttimestamp.setTime(Number(Number(timestamp) + (offset * 60 * 1000)));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdate = String(date).replace(/\\\\T/g,\"T\").replace(/\\\\t/,\"t\").split(opts.parseRe);\n\t\t\t\tformat = format.replace(/\\\\T/g,\"T\").replace(/\\\\t/,\"t\").split(opts.parseRe);\n\t\t\t\t// parsing for month names\n\t\t\t\tfor(k=0,hl=format.length;k<hl;k++){\n\t\t\t\t\tif(format[k] === 'M') {\n\t\t\t\t\t\tdM = $.inArray(date[k],opts.monthNames);\n\t\t\t\t\t\tif(dM !== -1 && dM < 12){date[k] = dM+1; ts.m = date[k];}\n\t\t\t\t\t}\n\t\t\t\t\tif(format[k] === 'F') {\n\t\t\t\t\t\tdM = $.inArray(date[k],opts.monthNames,12);\n\t\t\t\t\t\tif(dM !== -1 && dM > 11){date[k] = dM+1-12; ts.m = date[k];}\n\t\t\t\t\t}\n\t\t\t\t\tif(format[k] === 'a') {\n\t\t\t\t\t\tdM = $.inArray(date[k],opts.AmPm);\n\t\t\t\t\t\tif(dM !== -1 && dM < 2 && date[k] === opts.AmPm[dM]){\n\t\t\t\t\t\t\tdate[k] = dM;\n\t\t\t\t\t\t\tts.h = h12to24(date[k], ts.h);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(format[k] === 'A') {\n\t\t\t\t\t\tdM = $.inArray(date[k],opts.AmPm);\n\t\t\t\t\t\tif(dM !== -1 && dM > 1 && date[k] === opts.AmPm[dM]){\n\t\t\t\t\t\t\tdate[k] = dM-2;\n\t\t\t\t\t\t\tts.h = h12to24(date[k], ts.h);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (format[k] === 'g') {\n\t\t\t\t\t\tts.h = parseInt(date[k], 10);\n\t\t\t\t\t}\n\t\t\t\t\tif(date[k] !== undefined) {\n\t\t\t\t\t\tts[format[k].toLowerCase()] = parseInt(date[k],10);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(ts.f) {ts.m = ts.f;}\n\t\t\t\tif( ts.m === 0 && ts.y === 0 && ts.d === 0) {\n\t\t\t\t\treturn \"&#160;\" ;\n\t\t\t\t}\n\t\t\t\tts.m = parseInt(ts.m,10)-1;\n\t\t\t\tvar ty = ts.y;\n\t\t\t\tif (ty >= 70 && ty <= 99) {ts.y = 1900+ts.y;}\n\t\t\t\telse if (ty >=0 && ty <=69) {ts.y= 2000+ts.y;}\n\t\t\t\ttimestamp = new Date(ts.y, ts.m, ts.d, ts.h, ts.i, ts.s, ts.u);\n\t\t\t}\n\t\t} else {\n\t\t\ttimestamp = new Date(ts.y, ts.m, ts.d, ts.h, ts.i, ts.s, ts.u);\n\t\t}\n\t\tif( newformat === undefined ) {\n\t\t\treturn timestamp;\n\t\t}\n\t\tif( opts.masks.hasOwnProperty(newformat) )  {\n\t\t\tnewformat = opts.masks[newformat];\n\t\t} else if ( !newformat ) {\n\t\t\tnewformat = 'Y-m-d';\n\t\t}\n\t\tvar \n\t\t\tG = timestamp.getHours(),\n\t\t\ti = timestamp.getMinutes(),\n\t\t\tj = timestamp.getDate(),\n\t\t\tn = timestamp.getMonth() + 1,\n\t\t\to = timestamp.getTimezoneOffset(),\n\t\t\ts = timestamp.getSeconds(),\n\t\t\tu = timestamp.getMilliseconds(),\n\t\t\tw = timestamp.getDay(),\n\t\t\tY = timestamp.getFullYear(),\n\t\t\tN = (w + 6) % 7 + 1,\n\t\t\tz = (new Date(Y, n - 1, j) - new Date(Y, 0, 1)) / 86400000,\n\t\t\tflags = {\n\t\t\t\t// Day\n\t\t\t\td: pad(j),\n\t\t\t\tD: opts.dayNames[w],\n\t\t\t\tj: j,\n\t\t\t\tl: opts.dayNames[w + 7],\n\t\t\t\tN: N,\n\t\t\t\tS: opts.S(j),\n\t\t\t\t//j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th',\n\t\t\t\tw: w,\n\t\t\t\tz: z,\n\t\t\t\t// Week\n\t\t\t\tW: N < 5 ? Math.floor((z + N - 1) / 7) + 1 : Math.floor((z + N - 1) / 7) || ((new Date(Y - 1, 0, 1).getDay() + 6) % 7 < 4 ? 53 : 52),\n\t\t\t\t// Month\n\t\t\t\tF: opts.monthNames[n - 1 + 12],\n\t\t\t\tm: pad(n),\n\t\t\t\tM: opts.monthNames[n - 1],\n\t\t\t\tn: n,\n\t\t\t\tt: '?',\n\t\t\t\t// Year\n\t\t\t\tL: '?',\n\t\t\t\to: '?',\n\t\t\t\tY: Y,\n\t\t\t\ty: String(Y).substring(2),\n\t\t\t\t// Time\n\t\t\t\ta: G < 12 ? opts.AmPm[0] : opts.AmPm[1],\n\t\t\t\tA: G < 12 ? opts.AmPm[2] : opts.AmPm[3],\n\t\t\t\tB: '?',\n\t\t\t\tg: G % 12 || 12,\n\t\t\t\tG: G,\n\t\t\t\th: pad(G % 12 || 12),\n\t\t\t\tH: pad(G),\n\t\t\t\ti: pad(i),\n\t\t\t\ts: pad(s),\n\t\t\t\tu: u,\n\t\t\t\t// Timezone\n\t\t\t\te: '?',\n\t\t\t\tI: '?',\n\t\t\t\tO: (o > 0 ? \"-\" : \"+\") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),\n\t\t\t\tP: '?',\n\t\t\t\tT: (String(timestamp).match(timezone) || [\"\"]).pop().replace(timezoneClip, \"\"),\n\t\t\t\tZ: '?',\n\t\t\t\t// Full Date/Time\n\t\t\t\tc: '?',\n\t\t\t\tr: '?',\n\t\t\t\tU: Math.floor(timestamp / 1000)\n\t\t\t};\n\t\treturn newformat.replace(token, function ($0) {\n\t\t\treturn flags.hasOwnProperty($0) ? flags[$0] : $0.substring(1);\n\t\t});\n\t},\n\tjqID : function(sid){\n\t\treturn String(sid).replace(/[!\"#$%&'()*+,.\\/:; <=>?@\\[\\\\\\]\\^`{|}~]/g,\"\\\\$&\");\n\t},\n\tguid : 1,\n\tuidPref: 'jqg',\n\trandId : function( prefix )\t{\n\t\treturn (prefix || $.jgrid.uidPref) + ($.jgrid.guid++);\n\t},\n\tgetAccessor : function(obj, expr) {\n\t\tvar ret,p,prm = [], i;\n\t\tif( typeof expr === 'function') { return expr(obj); }\n\t\tret = obj[expr];\n\t\tif(ret===undefined) {\n\t\t\ttry {\n\t\t\t\tif ( typeof expr === 'string' ) {\n\t\t\t\t\tprm = expr.split('.');\n\t\t\t\t}\n\t\t\t\ti = prm.length;\n\t\t\t\tif( i ) {\n\t\t\t\t\tret = obj;\n\t\t\t\t\twhile (ret && i--) {\n\t\t\t\t\t\tp = prm.shift();\n\t\t\t\t\t\tret = ret[p];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\t\t}\n\t\treturn ret;\n\t},\n\tgetXmlData: function (obj, expr, returnObj) {\n\t\tvar ret, m = typeof expr === 'string' ? expr.match(/^(.*)\\[(\\w+)\\]$/) : null;\n\t\tif (typeof expr === 'function') { return expr(obj); }\n\t\tif (m && m[2]) {\n\t\t\t// m[2] is the attribute selector\n\t\t\t// m[1] is an optional element selector\n\t\t\t// examples: \"[id]\", \"rows[page]\"\n\t\t\treturn m[1] ? $(m[1], obj).attr(m[2]) : $(obj).attr(m[2]);\n\t\t}\n\t\t\tret = $(expr, obj);\n\t\t\tif (returnObj) { return ret; }\n\t\t\t//$(expr, obj).filter(':last'); // we use ':last' to be more compatible with old version of jqGrid\n\t\t\treturn ret.length > 0 ? $(ret).text() : undefined;\n\t},\n\tcellWidth : function () {\n\t\tvar $testDiv = $(\"<div class='ui-jqgrid' style='left:10000px'><table class='ui-jqgrid-btable' style='width:5px;'><tr class='jqgrow'><td style='width:5px;'></td></tr></table></div>\"),\n\t\ttestCell = $testDiv.appendTo(\"body\")\n\t\t\t.find(\"td\")\n\t\t\t.width();\n\t\t$testDiv.remove();\n\t\treturn testCell !== 5;\n\t},\n\tcell_width : true,\n\tajaxOptions: {},\n\tfrom : function(source){\n\t\t// Original Author Hugo Bonacci\n\t\t// License MIT http://jlinq.codeplex.com/license\n\t\tvar QueryObject=function(d,q){\n\t\tif(typeof d===\"string\"){\n\t\t\td=$.data(d);\n\t\t}\n\t\tvar self=this,\n\t\t_data=d,\n\t\t_usecase=true,\n\t\t_trim=false,\n\t\t_query=q,\n\t\t_stripNum = /[\\$,%]/g,\n\t\t_lastCommand=null,\n\t\t_lastField=null,\n\t\t_orDepth=0,\n\t\t_negate=false,\n\t\t_queuedOperator=\"\",\n\t\t_sorting=[],\n\t\t_useProperties=true;\n\t\tif(typeof d===\"object\"&&d.push) {\n\t\t\tif(d.length>0){\n\t\t\t\tif(typeof d[0]!==\"object\"){\n\t\t\t\t\t_useProperties=false;\n\t\t\t\t}else{\n\t\t\t\t\t_useProperties=true;\n\t\t\t\t}\n\t\t\t}\n\t\t}else{\n\t\t\tthrow \"data provides is not an array\";\n\t\t}\n\t\tthis._hasData=function(){\n\t\t\treturn _data===null?false:_data.length===0?false:true;\n\t\t};\n\t\tthis._getStr=function(s){\n\t\t\tvar phrase=[];\n\t\t\tif(_trim){\n\t\t\t\tphrase.push(\"jQuery.trim(\");\n\t\t\t}\n\t\t\tphrase.push(\"String(\"+s+\")\");\n\t\t\tif(_trim){\n\t\t\t\tphrase.push(\")\");\n\t\t\t}\n\t\t\tif(!_usecase){\n\t\t\t\tphrase.push(\".toLowerCase()\");\n\t\t\t}\n\t\t\treturn phrase.join(\"\");\n\t\t};\n\t\tthis._strComp=function(val){\n\t\t\tif(typeof val===\"string\"){\n\t\t\t\treturn\".toString()\";\n\t\t\t}\n\t\t\treturn\"\";\n\t\t};\n\t\tthis._group=function(f,u){\n\t\t\treturn({field:f.toString(),unique:u,items:[]});\n\t\t};\n\t\tthis._toStr=function(phrase){\n\t\t\tif(_trim){\n\t\t\t\tphrase=$.trim(phrase);\n\t\t\t}\n\t\t\tphrase=phrase.toString().replace(/\\\\/g,'\\\\\\\\').replace(/\\\"/g,'\\\\\"');\n\t\t\treturn _usecase ? phrase : phrase.toLowerCase();\n\t\t};\n\t\tthis._funcLoop=function(func){\n\t\t\tvar results=[];\n\t\t\t$.each(_data,function(i,v){\n\t\t\t\tresults.push(func(v));\n\t\t\t});\n\t\t\treturn results;\n\t\t};\n\t\tthis._append=function(s){\n\t\t\tvar i;\n\t\t\tif(_query===null){\n\t\t\t\t_query=\"\";\n\t\t\t} else {\n\t\t\t\t_query+=_queuedOperator === \"\" ? \" && \" :_queuedOperator;\n\t\t\t}\n\t\t\tfor (i=0;i<_orDepth;i++){\n\t\t\t\t_query+=\"(\";\n\t\t\t}\n\t\t\tif(_negate){\n\t\t\t\t_query+=\"!\";\n\t\t\t}\n\t\t\t_query+=\"(\"+s+\")\";\n\t\t\t_negate=false;\n\t\t\t_queuedOperator=\"\";\n\t\t\t_orDepth=0;\n\t\t};\n\t\tthis._setCommand=function(f,c){\n\t\t\t_lastCommand=f;\n\t\t\t_lastField=c;\n\t\t};\n\t\tthis._resetNegate=function(){\n\t\t\t_negate=false;\n\t\t};\n\t\tthis._repeatCommand=function(f,v){\n\t\t\tif(_lastCommand===null){\n\t\t\t\treturn self;\n\t\t\t}\n\t\t\tif(f!==null&&v!==null){\n\t\t\t\treturn _lastCommand(f,v);\n\t\t\t}\n\t\t\tif(_lastField===null){\n\t\t\t\treturn _lastCommand(f);\n\t\t\t}\n\t\t\tif(!_useProperties){\n\t\t\t\treturn _lastCommand(f);\n\t\t\t}\n\t\t\treturn _lastCommand(_lastField,f);\n\t\t};\n\t\tthis._equals=function(a,b){\n\t\t\treturn(self._compare(a,b,1)===0);\n\t\t};\n\t\tthis._compare=function(a,b,d){\n\t\t\tvar toString = Object.prototype.toString;\n\t\t\tif( d === undefined) { d = 1; }\n\t\t\tif(a===undefined) { a = null; }\n\t\t\tif(b===undefined) { b = null; }\n\t\t\tif(a===null && b===null){\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif(a===null&&b!==null){\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif(a!==null&&b===null){\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (toString.call(a) === '[object Date]' && toString.call(b) === '[object Date]') {\n\t\t\t\tif (a < b) { return -d; }\n\t\t\t\tif (a > b) { return d; }\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif(!_usecase && typeof a !== \"number\" && typeof b !== \"number\" ) {\n\t\t\t\ta=String(a);\n\t\t\t\tb=String(b);\n\t\t\t}\n\t\t\tif(a<b){return -d;}\n\t\t\tif(a>b){return d;}\n\t\t\treturn 0;\n\t\t};\n\t\tthis._performSort=function(){\n\t\t\tif(_sorting.length===0){return;}\n\t\t\t_data=self._doSort(_data,0);\n\t\t};\n\t\tthis._doSort=function(d,q){\n\t\t\tvar by=_sorting[q].by,\n\t\t\tdir=_sorting[q].dir,\n\t\t\ttype = _sorting[q].type,\n\t\t\tdfmt = _sorting[q].datefmt;\n\t\t\tif(q===_sorting.length-1){\n\t\t\t\treturn self._getOrder(d, by, dir, type, dfmt);\n\t\t\t}\n\t\t\tq++;\n\t\t\tvar values=self._getGroup(d,by,dir,type,dfmt), results=[], i, j, sorted;\n\t\t\tfor(i=0;i<values.length;i++){\n\t\t\t\tsorted=self._doSort(values[i].items,q);\n\t\t\t\tfor(j=0;j<sorted.length;j++){\n\t\t\t\t\tresults.push(sorted[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\t\tthis._getOrder=function(data,by,dir,type, dfmt){\n\t\t\tvar sortData=[],_sortData=[], newDir = dir===\"a\" ? 1 : -1, i,ab,j,\n\t\t\tfindSortKey;\n\n\t\t\tif(type === undefined ) { type = \"text\"; }\n\t\t\tif (type === 'float' || type=== 'number' || type=== 'currency' || type=== 'numeric') {\n\t\t\t\tfindSortKey = function($cell) {\n\t\t\t\t\tvar key = parseFloat( String($cell).replace(_stripNum, ''));\n\t\t\t\t\treturn isNaN(key) ? 0.00 : key;\n\t\t\t\t};\n\t\t\t} else if (type==='int' || type==='integer') {\n\t\t\t\tfindSortKey = function($cell) {\n\t\t\t\t\treturn $cell ? parseFloat(String($cell).replace(_stripNum, '')) : 0;\n\t\t\t\t};\n\t\t\t} else if(type === 'date' || type === 'datetime') {\n\t\t\t\tfindSortKey = function($cell) {\n\t\t\t\t\treturn $.jgrid.parseDate(dfmt,$cell).getTime();\n\t\t\t\t};\n\t\t\t} else if($.isFunction(type)) {\n\t\t\t\tfindSortKey = type;\n\t\t\t} else {\n\t\t\t\tfindSortKey = function($cell) {\n\t\t\t\t\t$cell = $cell ? $.trim(String($cell)) : \"\";\n\t\t\t\t\treturn _usecase ? $cell : $cell.toLowerCase();\n\t\t\t\t};\n\t\t\t}\n\t\t\t$.each(data,function(i,v){\n\t\t\t\tab = by!==\"\" ? $.jgrid.getAccessor(v,by) : v;\n\t\t\t\tif(ab === undefined) { ab = \"\"; }\n\t\t\t\tab = findSortKey(ab, v);\n\t\t\t\t_sortData.push({ 'vSort': ab,'index':i});\n\t\t\t});\n\n\t\t\t_sortData.sort(function(a,b){\n\t\t\t\ta = a.vSort;\n\t\t\t\tb = b.vSort;\n\t\t\t\treturn self._compare(a,b,newDir);\n\t\t\t});\n\t\t\tj=0;\n\t\t\tvar nrec= data.length;\n\t\t\t// overhead, but we do not change the original data.\n\t\t\twhile(j<nrec) {\n\t\t\t\ti = _sortData[j].index;\n\t\t\t\tsortData.push(data[i]);\n\t\t\t\tj++;\n\t\t\t}\n\t\t\treturn sortData;\n\t\t};\n\t\tthis._getGroup=function(data,by,dir,type, dfmt){\n\t\t\tvar results=[],\n\t\t\tgroup=null,\n\t\t\tlast=null, val;\n\t\t\t$.each(self._getOrder(data,by,dir,type, dfmt),function(i,v){\n\t\t\t\tval = $.jgrid.getAccessor(v, by);\n\t\t\t\tif(val == null) { val = \"\"; }\n\t\t\t\tif(!self._equals(last,val)){\n\t\t\t\t\tlast=val;\n\t\t\t\t\tif(group !== null){\n\t\t\t\t\t\tresults.push(group);\n\t\t\t\t\t}\n\t\t\t\t\tgroup=self._group(by,val);\n\t\t\t\t}\n\t\t\t\tgroup.items.push(v);\n\t\t\t});\n\t\t\tif(group !== null){\n\t\t\t\tresults.push(group);\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\t\tthis.ignoreCase=function(){\n\t\t\t_usecase=false;\n\t\t\treturn self;\n\t\t};\n\t\tthis.useCase=function(){\n\t\t\t_usecase=true;\n\t\t\treturn self;\n\t\t};\n\t\tthis.trim=function(){\n\t\t\t_trim=true;\n\t\t\treturn self;\n\t\t};\n\t\tthis.noTrim=function(){\n\t\t\t_trim=false;\n\t\t\treturn self;\n\t\t};\n\t\tthis.execute=function(){\n\t\t\tvar match=_query, results=[];\n\t\t\tif(match === null){\n\t\t\t\treturn self;\n\t\t\t}\n\t\t\t$.each(_data,function(){\n\t\t\t\tif(eval(match)){results.push(this);}\n\t\t\t});\n\t\t\t_data=results;\n\t\t\treturn self;\n\t\t};\n\t\tthis.data=function(){\n\t\t\treturn _data;\n\t\t};\n\t\tthis.select=function(f){\n\t\t\tself._performSort();\n\t\t\tif(!self._hasData()){ return[]; }\n\t\t\tself.execute();\n\t\t\tif($.isFunction(f)){\n\t\t\t\tvar results=[];\n\t\t\t\t$.each(_data,function(i,v){\n\t\t\t\t\tresults.push(f(v));\n\t\t\t\t});\n\t\t\t\treturn results;\n\t\t\t}\n\t\t\treturn _data;\n\t\t};\n\t\tthis.hasMatch=function(){\n\t\t\tif(!self._hasData()) { return false; }\n\t\t\tself.execute();\n\t\t\treturn _data.length>0;\n\t\t};\n\t\tthis.andNot=function(f,v,x){\n\t\t\t_negate=!_negate;\n\t\t\treturn self.and(f,v,x);\n\t\t};\n\t\tthis.orNot=function(f,v,x){\n\t\t\t_negate=!_negate;\n\t\t\treturn self.or(f,v,x);\n\t\t};\n\t\tthis.not=function(f,v,x){\n\t\t\treturn self.andNot(f,v,x);\n\t\t};\n\t\tthis.and=function(f,v,x){\n\t\t\t_queuedOperator=\" && \";\n\t\t\tif(f===undefined){\n\t\t\t\treturn self;\n\t\t\t}\n\t\t\treturn self._repeatCommand(f,v,x);\n\t\t};\n\t\tthis.or=function(f,v,x){\n\t\t\t_queuedOperator=\" || \";\n\t\t\tif(f===undefined) { return self; }\n\t\t\treturn self._repeatCommand(f,v,x);\n\t\t};\n\t\tthis.orBegin=function(){\n\t\t\t_orDepth++;\n\t\t\treturn self;\n\t\t};\n\t\tthis.orEnd=function(){\n\t\t\tif (_query !== null){\n\t\t\t\t_query+=\")\";\n\t\t\t}\n\t\t\treturn self;\n\t\t};\n\t\tthis.isNot=function(f){\n\t\t\t_negate=!_negate;\n\t\t\treturn self.is(f);\n\t\t};\n\t\tthis.is=function(f){\n\t\t\tself._append('this.'+f);\n\t\t\tself._resetNegate();\n\t\t\treturn self;\n\t\t};\n\t\tthis._compareValues=function(func,f,v,how,t){\n\t\t\tvar fld;\n\t\t\tif(_useProperties){\n\t\t\t\tfld='jQuery.jgrid.getAccessor(this,\\''+f+'\\')';\n\t\t\t}else{\n\t\t\t\tfld='this';\n\t\t\t}\n\t\t\tif(v===undefined) { v = null; }\n\t\t\t//var val=v===null?f:v,\n\t\t\tvar val =v,\n\t\t\tswst = t.stype === undefined ? \"text\" : t.stype;\n\t\t\tif(v !== null) {\n\t\t\tswitch(swst) {\n\t\t\t\tcase 'int':\n\t\t\t\tcase 'integer':\n\t\t\t\t\tval = (isNaN(Number(val)) || val===\"\") ? '0' : val; // To be fixed with more inteligent code\n\t\t\t\t\tfld = 'parseInt('+fld+',10)';\n\t\t\t\t\tval = 'parseInt('+val+',10)';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'float':\n\t\t\t\tcase 'number':\n\t\t\t\tcase 'numeric':\n\t\t\t\t\tval = String(val).replace(_stripNum, '');\n\t\t\t\t\tval = (isNaN(Number(val)) || val===\"\") ? '0' : val; // To be fixed with more inteligent code\n\t\t\t\t\tfld = 'parseFloat('+fld+')';\n\t\t\t\t\tval = 'parseFloat('+val+')';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'date':\n\t\t\t\tcase 'datetime':\n\t\t\t\t\tval = String($.jgrid.parseDate(t.newfmt || 'Y-m-d',val).getTime());\n\t\t\t\t\tfld = 'jQuery.jgrid.parseDate(\"'+t.srcfmt+'\",'+fld+').getTime()';\n\t\t\t\t\tbreak;\n\t\t\t\tdefault :\n\t\t\t\t\tfld=self._getStr(fld);\n\t\t\t\t\tval=self._getStr('\"'+self._toStr(val)+'\"');\n\t\t\t}\n\t\t\t}\n\t\t\tself._append(fld+' '+how+' '+val);\n\t\t\tself._setCommand(func,f);\n\t\t\tself._resetNegate();\n\t\t\treturn self;\n\t\t};\n\t\tthis.equals=function(f,v,t){\n\t\t\treturn self._compareValues(self.equals,f,v,\"==\",t);\n\t\t};\n\t\tthis.notEquals=function(f,v,t){\n\t\t\treturn self._compareValues(self.equals,f,v,\"!==\",t);\n\t\t};\n\t\tthis.isNull = function(f,v,t){\n\t\t\treturn self._compareValues(self.equals,f,null,\"===\",t);\n\t\t};\n\t\tthis.greater=function(f,v,t){\n\t\t\treturn self._compareValues(self.greater,f,v,\">\",t);\n\t\t};\n\t\tthis.less=function(f,v,t){\n\t\t\treturn self._compareValues(self.less,f,v,\"<\",t);\n\t\t};\n\t\tthis.greaterOrEquals=function(f,v,t){\n\t\t\treturn self._compareValues(self.greaterOrEquals,f,v,\">=\",t);\n\t\t};\n\t\tthis.lessOrEquals=function(f,v,t){\n\t\t\treturn self._compareValues(self.lessOrEquals,f,v,\"<=\",t);\n\t\t};\n\t\tthis.startsWith=function(f,v){\n\t\t\tvar val = (v==null) ? f: v,\n\t\t\tlength=_trim ? $.trim(val.toString()).length : val.toString().length;\n\t\t\tif(_useProperties){\n\t\t\t\tself._append(self._getStr('jQuery.jgrid.getAccessor(this,\\''+f+'\\')')+'.substr(0,'+length+') == '+self._getStr('\"'+self._toStr(v)+'\"'));\n\t\t\t}else{\n\t\t\t\tlength=_trim?$.trim(v.toString()).length:v.toString().length;\n\t\t\t\tself._append(self._getStr('this')+'.substr(0,'+length+') == '+self._getStr('\"'+self._toStr(f)+'\"'));\n\t\t\t}\n\t\t\tself._setCommand(self.startsWith,f);\n\t\t\tself._resetNegate();\n\t\t\treturn self;\n\t\t};\n\t\tthis.endsWith=function(f,v){\n\t\t\tvar val = (v==null) ? f: v,\n\t\t\tlength=_trim ? $.trim(val.toString()).length:val.toString().length;\n\t\t\tif(_useProperties){\n\t\t\t\tself._append(self._getStr('jQuery.jgrid.getAccessor(this,\\''+f+'\\')')+'.substr('+self._getStr('jQuery.jgrid.getAccessor(this,\\''+f+'\\')')+'.length-'+length+','+length+') == \"'+self._toStr(v)+'\"');\n\t\t\t} else {\n\t\t\t\tself._append(self._getStr('this')+'.substr('+self._getStr('this')+'.length-\"'+self._toStr(f)+'\".length,\"'+self._toStr(f)+'\".length) == \"'+self._toStr(f)+'\"');\n\t\t\t}\n\t\t\tself._setCommand(self.endsWith,f);self._resetNegate();\n\t\t\treturn self;\n\t\t};\n\t\tthis.contains=function(f,v){\n\t\t\tif(_useProperties){\n\t\t\t\tself._append(self._getStr('jQuery.jgrid.getAccessor(this,\\''+f+'\\')')+'.indexOf(\"'+self._toStr(v)+'\",0) > -1');\n\t\t\t}else{\n\t\t\t\tself._append(self._getStr('this')+'.indexOf(\"'+self._toStr(f)+'\",0) > -1');\n\t\t\t}\n\t\t\tself._setCommand(self.contains,f);\n\t\t\tself._resetNegate();\n\t\t\treturn self;\n\t\t};\n\t\tthis.groupBy=function(by,dir,type, datefmt){\n\t\t\tif(!self._hasData()){\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn self._getGroup(_data,by,dir,type, datefmt);\n\t\t};\n\t\tthis.orderBy=function(by,dir,stype, dfmt){\n\t\t\tdir = dir == null ? \"a\" :$.trim(dir.toString().toLowerCase());\n\t\t\tif(stype == null) { stype = \"text\"; }\n\t\t\tif(dfmt == null) { dfmt = \"Y-m-d\"; }\n\t\t\tif(dir===\"desc\"||dir===\"descending\"){dir=\"d\";}\n\t\t\tif(dir===\"asc\"||dir===\"ascending\"){dir=\"a\";}\n\t\t\t_sorting.push({by:by,dir:dir,type:stype, datefmt: dfmt});\n\t\t\treturn self;\n\t\t};\n\t\treturn self;\n\t\t};\n\treturn new QueryObject(source,null);\n\t},\n\tgetMethod: function (name) {\n        return this.getAccessor($.fn.jqGrid, name);\n\t},\n\textend : function(methods) {\n\t\t$.extend($.fn.jqGrid,methods);\n\t\tif (!this.no_legacy_api) {\n\t\t\t$.fn.extend(methods);\n\t\t}\n\t}\n});\n\n$.fn.jqGrid = function( pin ) {\n\tif (typeof pin === 'string') {\n\t\tvar fn = $.jgrid.getMethod(pin);\n\t\tif (!fn) {\n\t\t\tthrow (\"jqGrid - No such method: \" + pin);\n\t\t}\n\t\tvar args = $.makeArray(arguments).slice(1);\n\t\treturn fn.apply(this,args);\n\t}\n\treturn this.each( function() {\n\t\tif(this.grid) {return;}\n\n\t\tvar p = $.extend(true,{\n\t\t\turl: \"\",\n\t\t\theight: 150,\n\t\t\tpage: 1,\n\t\t\trowNum: 20,\n\t\t\trowTotal : null,\n\t\t\trecords: 0,\n\t\t\tpager: \"\",\n\t\t\tpgbuttons: true,\n\t\t\tpginput: true,\n\t\t\tcolModel: [],\n\t\t\trowList: [],\n\t\t\tcolNames: [],\n\t\t\tsortorder: \"asc\",\n\t\t\tsortname: \"\",\n\t\t\tdatatype: \"xml\",\n\t\t\tmtype: \"GET\",\n\t\t\taltRows: false,\n\t\t\tselarrrow: [],\n\t\t\tsavedRow: [],\n\t\t\tshrinkToFit: true,\n\t\t\txmlReader: {},\n\t\t\tjsonReader: {},\n\t\t\tsubGrid: false,\n\t\t\tsubGridModel :[],\n\t\t\treccount: 0,\n\t\t\tlastpage: 0,\n\t\t\tlastsort: 0,\n\t\t\tselrow: null,\n\t\t\tbeforeSelectRow: null,\n\t\t\tonSelectRow: null,\n\t\t\tonSortCol: null,\n\t\t\tondblClickRow: null,\n\t\t\tonRightClickRow: null,\n\t\t\tonPaging: null,\n\t\t\tonSelectAll: null,\n\t\t\tonInitGrid : null,\n\t\t\tloadComplete: null,\n\t\t\tgridComplete: null,\n\t\t\tloadError: null,\n\t\t\tloadBeforeSend: null,\n\t\t\tafterInsertRow: null,\n\t\t\tbeforeRequest: null,\n\t\t\tbeforeProcessing : null,\n\t\t\tonHeaderClick: null,\n\t\t\tviewrecords: false,\n\t\t\tloadonce: false,\n\t\t\tmultiselect: false,\n\t\t\tmultikey: false,\n\t\t\tediturl: null,\n\t\t\tsearch: false,\n\t\t\tcaption: \"\",\n\t\t\thidegrid: true,\n\t\t\thiddengrid: false,\n\t\t\tpostData: {},\n\t\t\tuserData: {},\n\t\t\ttreeGrid : false,\n\t\t\ttreeGridModel : 'nested',\n\t\t\ttreeReader : {},\n\t\t\ttreeANode : -1,\n\t\t\tExpandColumn: null,\n\t\t\ttree_root_level : 0,\n\t\t\tprmNames: {page:\"page\",rows:\"rows\", sort: \"sidx\",order: \"sord\", search:\"_search\", nd:\"nd\", id:\"id\",oper:\"oper\",editoper:\"edit\",addoper:\"add\",deloper:\"del\", subgridid:\"id\", npage: null, totalrows:\"totalrows\"},\n\t\t\tforceFit : false,\n\t\t\tgridstate : \"visible\",\n\t\t\tcellEdit: false,\n\t\t\tcellsubmit: \"remote\",\n\t\t\tnv:0,\n\t\t\tloadui: \"enable\",\n\t\t\ttoolbar: [false,\"\"],\n\t\t\tscroll: false,\n\t\t\tmultiboxonly : false,\n\t\t\tdeselectAfterSort : true,\n\t\t\tscrollrows : false,\n\t\t\tautowidth: false,\n\t\t\tscrollOffset :18,\n\t\t\tcellLayout: 5,\n\t\t\tsubGridWidth: 20,\n\t\t\tmultiselectWidth: 20,\n\t\t\tgridview: false,\n\t\t\trownumWidth: 25,\n\t\t\trownumbers : false,\n\t\t\tpagerpos: 'center',\n\t\t\trecordpos: 'right',\n\t\t\tfooterrow : false,\n\t\t\tuserDataOnFooter : false,\n\t\t\thoverrows : true,\n\t\t\taltclass : 'ui-priority-secondary',\n\t\t\tviewsortcols : [false,'vertical',true],\n\t\t\tresizeclass : '',\n\t\t\tautoencode : false,\n\t\t\tremapColumns : [],\n\t\t\tajaxGridOptions :{},\n\t\t\tdirection : \"ltr\",\n\t\t\ttoppager: false,\n\t\t\theadertitles: false,\n\t\t\tscrollTimeout: 40,\n\t\t\tdata : [],\n\t\t\t_index : {},\n\t\t\tgrouping : false,\n\t\t\tgroupingView : {groupField:[],groupOrder:[], groupText:[],groupColumnShow:[],groupSummary:[], showSummaryOnHide: false, sortitems:[], sortnames:[], summary:[],summaryval:[], plusicon: 'ui-icon-circlesmall-plus', minusicon: 'ui-icon-circlesmall-minus', displayField: []},\n\t\t\tignoreCase : false,\n\t\t\tcmTemplate : {},\n\t\t\tidPrefix : \"\",\n\t\t\tmultiSort :  false\n\t\t}, $.jgrid.defaults, pin || {});\n\t\tvar ts= this, grid={\n\t\t\theaders:[],\n\t\t\tcols:[],\n\t\t\tfooters: [],\n\t\t\tdragStart: function(i,x,y) {\n\t\t\t\tthis.resizing = { idx: i, startX: x.clientX, sOL : y[0]};\n\t\t\t\tthis.hDiv.style.cursor = \"col-resize\";\n\t\t\t\tthis.curGbox = $(\"#rs_m\"+$.jgrid.jqID(p.id),\"#gbox_\"+$.jgrid.jqID(p.id));\n\t\t\t\tthis.curGbox.css({display:\"block\",left:y[0],top:y[1],height:y[2]});\n\t\t\t\t$(ts).triggerHandler(\"jqGridResizeStart\", [x, i]);\n\t\t\t\tif($.isFunction(p.resizeStart)) { p.resizeStart.call(ts,x,i); }\n\t\t\t\tdocument.onselectstart=function(){return false;};\n\t\t\t},\n\t\t\tdragMove: function(x) {\n\t\t\t\tif(this.resizing) {\n\t\t\t\t\tvar diff = x.clientX-this.resizing.startX,\n\t\t\t\t\th = this.headers[this.resizing.idx],\n\t\t\t\t\tnewWidth = p.direction === \"ltr\" ? h.width + diff : h.width - diff, hn, nWn;\n\t\t\t\t\tif(newWidth > 33) {\n\t\t\t\t\t\tthis.curGbox.css({left:this.resizing.sOL+diff});\n\t\t\t\t\t\tif(p.forceFit===true ){\n\t\t\t\t\t\t\thn = this.headers[this.resizing.idx+p.nv];\n\t\t\t\t\t\t\tnWn = p.direction === \"ltr\" ? hn.width - diff : hn.width + diff;\n\t\t\t\t\t\t\tif(nWn >33) {\n\t\t\t\t\t\t\t\th.newWidth = newWidth;\n\t\t\t\t\t\t\t\thn.newWidth = nWn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.newWidth = p.direction === \"ltr\" ? p.tblwidth+diff : p.tblwidth-diff;\n\t\t\t\t\t\t\th.newWidth = newWidth;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tdragEnd: function() {\n\t\t\t\tthis.hDiv.style.cursor = \"default\";\n\t\t\t\tif(this.resizing) {\n\t\t\t\t\tvar idx = this.resizing.idx,\n\t\t\t\t\tnw = this.headers[idx].newWidth || this.headers[idx].width;\n\t\t\t\t\tnw = parseInt(nw,10);\n\t\t\t\t\tthis.resizing = false;\n\t\t\t\t\t$(\"#rs_m\"+$.jgrid.jqID(p.id)).css(\"display\",\"none\");\n\t\t\t\t\tp.colModel[idx].width = nw;\n\t\t\t\t\tthis.headers[idx].width = nw;\n\t\t\t\t\tthis.headers[idx].el.style.width = nw + \"px\";\n\t\t\t\t\tthis.cols[idx].style.width = nw+\"px\";\n\t\t\t\t\tif(this.footers.length>0) {this.footers[idx].style.width = nw+\"px\";}\n\t\t\t\t\tif(p.forceFit===true){\n\t\t\t\t\t\tnw = this.headers[idx+p.nv].newWidth || this.headers[idx+p.nv].width;\n\t\t\t\t\t\tthis.headers[idx+p.nv].width = nw;\n\t\t\t\t\t\tthis.headers[idx+p.nv].el.style.width = nw + \"px\";\n\t\t\t\t\t\tthis.cols[idx+p.nv].style.width = nw+\"px\";\n\t\t\t\t\t\tif(this.footers.length>0) {this.footers[idx+p.nv].style.width = nw+\"px\";}\n\t\t\t\t\t\tp.colModel[idx+p.nv].width = nw;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tp.tblwidth = this.newWidth || p.tblwidth;\n\t\t\t\t\t\t$('table:first',this.bDiv).css(\"width\",p.tblwidth+\"px\");\n\t\t\t\t\t\t$('table:first',this.hDiv).css(\"width\",p.tblwidth+\"px\");\n\t\t\t\t\t\tthis.hDiv.scrollLeft = this.bDiv.scrollLeft;\n\t\t\t\t\t\tif(p.footerrow) {\n\t\t\t\t\t\t\t$('table:first',this.sDiv).css(\"width\",p.tblwidth+\"px\");\n\t\t\t\t\t\t\tthis.sDiv.scrollLeft = this.bDiv.scrollLeft;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$(ts).triggerHandler(\"jqGridResizeStop\", [nw, idx]);\n\t\t\t\t\tif($.isFunction(p.resizeStop)) { p.resizeStop.call(ts,nw,idx); }\n\t\t\t\t}\n\t\t\t\tthis.curGbox = null;\n\t\t\t\tdocument.onselectstart=function(){return true;};\n\t\t\t},\n\t\t\tpopulateVisible: function() {\n\t\t\t\tif (grid.timer) { clearTimeout(grid.timer); }\n\t\t\t\tgrid.timer = null;\n\t\t\t\tvar dh = $(grid.bDiv).height();\n\t\t\t\tif (!dh) { return; }\n\t\t\t\tvar table = $(\"table:first\", grid.bDiv);\n\t\t\t\tvar rows, rh;\n\t\t\t\tif(table[0].rows.length) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\trows = table[0].rows[1];\n\t\t\t\t\t\trh = rows ? $(rows).outerHeight() || grid.prevRowHeight : grid.prevRowHeight;\n\t\t\t\t\t} catch (pv) {\n\t\t\t\t\t\trh = grid.prevRowHeight;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!rh) { return; }\n\t\t\t\tgrid.prevRowHeight = rh;\n\t\t\t\tvar rn = p.rowNum;\n\t\t\t\tvar scrollTop = grid.scrollTop = grid.bDiv.scrollTop;\n\t\t\t\tvar ttop = Math.round(table.position().top) - scrollTop;\n\t\t\t\tvar tbot = ttop + table.height();\n\t\t\t\tvar div = rh * rn;\n\t\t\t\tvar page, npage, empty;\n\t\t\t\tif ( tbot < dh && ttop <= 0 &&\n\t\t\t\t\t(p.lastpage===undefined||parseInt((tbot + scrollTop + div - 1) / div,10) <= p.lastpage))\n\t\t\t\t{\n\t\t\t\t\tnpage = parseInt((dh - tbot + div - 1) / div,10);\n\t\t\t\t\tif (tbot >= 0 || npage < 2 || p.scroll === true) {\n\t\t\t\t\t\tpage = Math.round((tbot + scrollTop) / div) + 1;\n\t\t\t\t\t\tttop = -1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tttop = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (ttop > 0) {\n\t\t\t\t\tpage = parseInt(scrollTop / div,10) + 1;\n\t\t\t\t\tnpage = parseInt((scrollTop + dh) / div,10) + 2 - page;\n\t\t\t\t\tempty = true;\n\t\t\t\t}\n\t\t\t\tif (npage) {\n\t\t\t\t\tif (p.lastpage && (page > p.lastpage || p.lastpage===1 || (page === p.page && page===p.lastpage)) ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (grid.hDiv.loading) {\n\t\t\t\t\t\tgrid.timer = setTimeout(grid.populateVisible, p.scrollTimeout);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tp.page = page;\n\t\t\t\t\t\tif (empty) {\n\t\t\t\t\t\t\tgrid.selectionPreserver(table[0]);\n\t\t\t\t\t\t\tgrid.emptyRows.call(table[0], false, false);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tgrid.populate(npage);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tscrollGrid: function( e ) {\n\t\t\t\tif(p.scroll) {\n\t\t\t\t\tvar scrollTop = grid.bDiv.scrollTop;\n\t\t\t\t\tif(grid.scrollTop === undefined) { grid.scrollTop = 0; }\n\t\t\t\t\tif (scrollTop !== grid.scrollTop) {\n\t\t\t\t\t\tgrid.scrollTop = scrollTop;\n\t\t\t\t\t\tif (grid.timer) { clearTimeout(grid.timer); }\n\t\t\t\t\t\tgrid.timer = setTimeout(grid.populateVisible, p.scrollTimeout);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tgrid.hDiv.scrollLeft = grid.bDiv.scrollLeft;\n\t\t\t\tif(p.footerrow) {\n\t\t\t\t\tgrid.sDiv.scrollLeft = grid.bDiv.scrollLeft;\n\t\t\t\t}\n\t\t\t\tif( e ) { e.stopPropagation(); }\n\t\t\t},\n\t\t\tselectionPreserver : function(ts) {\n\t\t\t\tvar p = ts.p,\n\t\t\t\tsr = p.selrow, sra = p.selarrrow ? $.makeArray(p.selarrrow) : null,\n\t\t\t\tleft = ts.grid.bDiv.scrollLeft,\n\t\t\t\trestoreSelection = function() {\n\t\t\t\t\tvar i;\n\t\t\t\t\tp.selrow = null;\n\t\t\t\t\tp.selarrrow = [];\n\t\t\t\t\tif(p.multiselect && sra && sra.length>0) {\n\t\t\t\t\t\tfor(i=0;i<sra.length;i++){\n\t\t\t\t\t\t\tif (sra[i] !== sr) {\n\t\t\t\t\t\t\t\t$(ts).jqGrid(\"setSelection\",sra[i],false, null);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (sr) {\n\t\t\t\t\t\t$(ts).jqGrid(\"setSelection\",sr,false,null);\n\t\t\t\t\t}\n\t\t\t\t\tts.grid.bDiv.scrollLeft = left;\n\t\t\t\t\t$(ts).unbind('.selectionPreserver', restoreSelection);\n\t\t\t\t};\n\t\t\t\t$(ts).bind('jqGridGridComplete.selectionPreserver', restoreSelection);\t\t\t\t\n\t\t\t}\n\t\t};\n\t\tif(this.tagName.toUpperCase() !== 'TABLE') {\n\t\t\talert(\"Element is not a table\");\n\t\t\treturn;\n\t\t}\n\t\tif(document.documentMode !== undefined ) { // IE only\n\t\t\tif(document.documentMode <= 5) {\n\t\t\t\talert(\"Grid can not be used in this ('quirks') mode!\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t$(this).empty().attr(\"tabindex\",\"0\");\n\t\tthis.p = p ;\n\t\tthis.p.useProp = !!$.fn.prop;\n\t\tvar i, dir;\n\t\tif(this.p.colNames.length === 0) {\n\t\t\tfor (i=0;i<this.p.colModel.length;i++){\n\t\t\t\tthis.p.colNames[i] = this.p.colModel[i].label || this.p.colModel[i].name;\n\t\t\t}\n\t\t}\n\t\tif( this.p.colNames.length !== this.p.colModel.length ) {\n\t\t\talert($.jgrid.errors.model);\n\t\t\treturn;\n\t\t}\n\t\tvar gv = $(\"<div class='ui-jqgrid-view'></div>\"),\n\t\tisMSIE = $.jgrid.msie;\n\t\tts.p.direction = $.trim(ts.p.direction.toLowerCase());\n\t\tif($.inArray(ts.p.direction,[\"ltr\",\"rtl\"]) === -1) { ts.p.direction = \"ltr\"; }\n\t\tdir = ts.p.direction;\n\n\t\t$(gv).insertBefore(this);\n\t\t$(this).removeClass(\"scroll\").appendTo(gv);\n\t\tvar eg = $(\"<div class='ui-jqgrid ui-widget ui-widget-content ui-corner-all'></div>\");\n\t\t$(eg).attr({\"id\" : \"gbox_\"+this.id,\"dir\":dir}).insertBefore(gv);\n\t\t$(gv).attr(\"id\",\"gview_\"+this.id).appendTo(eg);\n\t\t$(\"<div class='ui-widget-overlay jqgrid-overlay' id='lui_\"+this.id+\"'></div>\").insertBefore(gv);\n\t\t$(\"<div class='loading ui-state-default ui-state-active' id='load_\"+this.id+\"'>\"+this.p.loadtext+\"</div>\").insertBefore(gv);\n\t\t$(this).attr({cellspacing:\"0\",cellpadding:\"0\",border:\"0\",\"role\":\"grid\",\"aria-multiselectable\":!!this.p.multiselect,\"aria-labelledby\":\"gbox_\"+this.id});\n\t\tvar sortkeys = [\"shiftKey\",\"altKey\",\"ctrlKey\"],\n\t\tintNum = function(val,defval) {\n\t\t\tval = parseInt(val,10);\n\t\t\tif (isNaN(val)) { return defval || 0;}\n\t\t\treturn val;\n\t\t},\n\t\tformatCol = function (pos, rowInd, tv, rawObject, rowId, rdata){\n\t\t\tvar cm = ts.p.colModel[pos],\n\t\t\tral = cm.align, result=\"style=\\\"\", clas = cm.classes, nm = cm.name, celp, acp=[];\n\t\t\tif(ral) { result += \"text-align:\"+ral+\";\"; }\n\t\t\tif(cm.hidden===true) { result += \"display:none;\"; }\n\t\t\tif(rowInd===0) {\n\t\t\t\tresult += \"width: \"+grid.headers[pos].width+\"px;\";\n\t\t\t} else if (cm.cellattr && $.isFunction(cm.cellattr))\n\t\t\t{\n\t\t\t\tcelp = cm.cellattr.call(ts, rowId, tv, rawObject, cm, rdata);\n\t\t\t\tif(celp && typeof celp === \"string\") {\n\t\t\t\t\tcelp = celp.replace(/style/i,'style').replace(/title/i,'title');\n\t\t\t\t\tif(celp.indexOf('title') > -1) { cm.title=false;}\n\t\t\t\t\tif(celp.indexOf('class') > -1) { clas = undefined;}\n\t\t\t\t\tacp = celp.split(/[^-]style/);\n\t\t\t\t\tif(acp.length === 2 ) {\n\t\t\t\t\t\tacp[1] =  $.trim(acp[1].replace(\"=\",\"\"));\n\t\t\t\t\t\tif(acp[1].indexOf(\"'\") === 0 || acp[1].indexOf('\"') === 0) {\n\t\t\t\t\t\t\tacp[1] = acp[1].substring(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult += acp[1].replace(/'/gi,'\"');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult += \"\\\"\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(!acp.length) { acp[0] = \"\"; result += \"\\\"\";}\n\t\t\tresult += (clas !== undefined ? (\" class=\\\"\"+clas+\"\\\"\") :\"\") + ((cm.title && tv) ? (\" title=\\\"\"+$.jgrid.stripHtml(tv)+\"\\\"\") :\"\");\n\t\t\tresult += \" aria-describedby=\\\"\"+ts.p.id+\"_\"+nm+\"\\\"\";\n\t\t\treturn result + acp[0];\n\t\t},\n\t\tcellVal =  function (val) {\n\t\t\treturn val == null || val === \"\" ? \"&#160;\" : (ts.p.autoencode ? $.jgrid.htmlEncode(val) : String(val));\n\t\t},\n\t\tformatter = function (rowId, cellval , colpos, rwdat, _act){\n\t\t\tvar cm = ts.p.colModel[colpos],v;\n\t\t\tif(cm.formatter !== undefined) {\n\t\t\t\trowId = String(ts.p.idPrefix) !== \"\" ? $.jgrid.stripPref(ts.p.idPrefix, rowId) : rowId;\n\t\t\t\tvar opts= {rowId: rowId, colModel:cm, gid:ts.p.id, pos:colpos };\n\t\t\t\tif($.isFunction( cm.formatter ) ) {\n\t\t\t\t\tv = cm.formatter.call(ts,cellval,opts,rwdat,_act);\n\t\t\t\t} else if($.fmatter){\n\t\t\t\t\tv = $.fn.fmatter.call(ts,cm.formatter,cellval,opts,rwdat,_act);\n\t\t\t\t} else {\n\t\t\t\t\tv = cellVal(cellval);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tv = cellVal(cellval);\n\t\t\t}\n\t\t\treturn v;\n\t\t},\n\t\taddCell = function(rowId,cell,pos,irow, srvr, rdata) {\n\t\t\tvar v,prp;\n\t\t\tv = formatter(rowId,cell,pos,srvr,'add');\n\t\t\tprp = formatCol( pos,irow, v, srvr, rowId, rdata);\n\t\t\treturn \"<td role=\\\"gridcell\\\" \"+prp+\">\"+v+\"</td>\";\n\t\t},\n\t\taddMulti = function(rowid,pos,irow,checked){\n\t\t\tvar\tv = \"<input role=\\\"checkbox\\\" type=\\\"checkbox\\\"\"+\" id=\\\"jqg_\"+ts.p.id+\"_\"+rowid+\"\\\" class=\\\"cbox\\\" name=\\\"jqg_\"+ts.p.id+\"_\"+rowid+\"\\\"\" + (checked ? \"checked=\\\"checked\\\"\" : \"\")+\"/>\",\n\t\t\tprp = formatCol( pos,irow,'',null, rowid, true);\n\t\t\treturn \"<td role=\\\"gridcell\\\" \"+prp+\">\"+v+\"</td>\";\n\t\t},\n\t\taddRowNum = function (pos,irow,pG,rN) {\n\t\t\tvar v =  (parseInt(pG,10)-1)*parseInt(rN,10)+1+irow,\n\t\t\tprp = formatCol( pos,irow,v, null, irow, true);\n\t\t\treturn \"<td role=\\\"gridcell\\\" class=\\\"ui-state-default jqgrid-rownum\\\" \"+prp+\">\"+v+\"</td>\";\n\t\t},\n\t\treader = function (datatype) {\n\t\t\tvar field, f=[], j=0, i;\n\t\t\tfor(i =0; i<ts.p.colModel.length; i++){\n\t\t\t\tfield = ts.p.colModel[i];\n\t\t\t\tif (field.name !== 'cb' && field.name !=='subgrid' && field.name !=='rn') {\n\t\t\t\t\tf[j]= datatype === \"local\" ?\n\t\t\t\t\tfield.name :\n\t\t\t\t\t( (datatype===\"xml\" || datatype === \"xmlstring\") ? field.xmlmap || field.name : field.jsonmap || field.name );\n\t\t\t\t\tj++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn f;\n\t\t},\n\t\torderedCols = function (offset) {\n\t\t\tvar order = ts.p.remapColumns;\n\t\t\tif (!order || !order.length) {\n\t\t\t\torder = $.map(ts.p.colModel, function(v,i) { return i; });\n\t\t\t}\n\t\t\tif (offset) {\n\t\t\t\torder = $.map(order, function(v) { return v<offset?null:v-offset; });\n\t\t\t}\n\t\t\treturn order;\n\t\t},\n\t\temptyRows = function (scroll, locdata) {\n\t\t\tvar firstrow;\n\t\t\tif (this.p.deepempty) {\n\t\t\t\t$(this.rows).slice(1).remove();\n\t\t\t} else {\n\t\t\t\tfirstrow = this.rows.length > 0 ? this.rows[0] : null;\n\t\t\t\t$(this.firstChild).empty().append(firstrow);\n\t\t\t}\n\t\t\tif (scroll && this.p.scroll) {\n\t\t\t\t$(this.grid.bDiv.firstChild).css({height: \"auto\"});\n\t\t\t\t$(this.grid.bDiv.firstChild.firstChild).css({height: 0, display: \"none\"});\n\t\t\t\tif (this.grid.bDiv.scrollTop !== 0) {\n\t\t\t\t\tthis.grid.bDiv.scrollTop = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(locdata === true && this.p.treeGrid) {\n\t\t\t\tthis.p.data = []; this.p._index = {};\n\t\t\t}\n\t\t},\n\t\trefreshIndex = function() {\n\t\t\tvar datalen = ts.p.data.length, idname, i, val,\n\t\t\tni = ts.p.rownumbers===true ? 1 :0,\n\t\t\tgi = ts.p.multiselect ===true ? 1 :0,\n\t\t\tsi = ts.p.subGrid===true ? 1 :0;\n\n\t\t\tif(ts.p.keyIndex === false || ts.p.loadonce === true) {\n\t\t\t\tidname = ts.p.localReader.id;\n\t\t\t} else {\n\t\t\t\tidname = ts.p.colModel[ts.p.keyIndex+gi+si+ni].name;\n\t\t\t}\n\t\t\tfor(i =0;i < datalen; i++) {\n\t\t\t\tval = $.jgrid.getAccessor(ts.p.data[i],idname);\n\t\t\t\tif (val === undefined) { val=String(i+1); }\n\t\t\t\tts.p._index[val] = i;\n\t\t\t}\n\t\t},\n\t\tconstructTr = function(id, hide, altClass, rd, cur, selected) {\n\t\t\tvar tabindex = '-1', restAttr = '', attrName, style = hide ? 'display:none;' : '',\n\t\t\t\tclasses = 'ui-widget-content jqgrow ui-row-' + ts.p.direction + (altClass ? ' ' + altClass : '') + (selected ? ' ui-state-highlight' : ''),\n\t\t\t\trowAttrObj = $(ts).triggerHandler(\"jqGridRowAttr\", [rd, cur, id]);\n\t\t\t\tif( typeof rowAttrObj !== \"object\" ) {\n\t\t\t\t\trowAttrObj =   $.isFunction(ts.p.rowattr) ? ts.p.rowattr.call(ts, rd, cur, id) :{};\n\t\t\t\t}\n\t\t\tif(!$.isEmptyObject( rowAttrObj )) {\n\t\t\t\tif (rowAttrObj.hasOwnProperty(\"id\")) {\n\t\t\t\t\tid = rowAttrObj.id;\n\t\t\t\t\tdelete rowAttrObj.id;\n\t\t\t\t}\n\t\t\t\tif (rowAttrObj.hasOwnProperty(\"tabindex\")) {\n\t\t\t\t\ttabindex = rowAttrObj.tabindex;\n\t\t\t\t\tdelete rowAttrObj.tabindex;\n\t\t\t\t}\n\t\t\t\tif (rowAttrObj.hasOwnProperty(\"style\")) {\n\t\t\t\t\tstyle += rowAttrObj.style;\n\t\t\t\t\tdelete rowAttrObj.style;\n\t\t\t\t}\n\t\t\t\tif (rowAttrObj.hasOwnProperty(\"class\")) {\n\t\t\t\t\tclasses += ' ' + rowAttrObj['class'];\n\t\t\t\t\tdelete rowAttrObj['class'];\n\t\t\t\t}\n\t\t\t\t// dot't allow to change role attribute\n\t\t\t\ttry { delete rowAttrObj.role; } catch(ra){}\n\t\t\t\tfor (attrName in rowAttrObj) {\n\t\t\t\t\tif (rowAttrObj.hasOwnProperty(attrName)) {\n\t\t\t\t\t\trestAttr += ' ' + attrName + '=' + rowAttrObj[attrName];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn '<tr role=\"row\" id=\"' + id + '\" tabindex=\"' + tabindex + '\" class=\"' + classes + '\"' +\n\t\t\t\t(style === '' ? '' : ' style=\"' + style + '\"') + restAttr + '>';\n\t\t},\n\t\taddXmlData = function (xml,t, rcnt, more, adjust) {\n\t\t\tvar startReq = new Date(),\n\t\t\tlocdata = (ts.p.datatype !== \"local\" && ts.p.loadonce) || ts.p.datatype === \"xmlstring\",\n\t\t\txmlid = \"_id_\", xmlRd = ts.p.xmlReader,\n\t\t\tfrd = ts.p.datatype === \"local\" ? \"local\" : \"xml\";\n\t\t\tif(locdata) {\n\t\t\t\tts.p.data = [];\n\t\t\t\tts.p._index = {};\n\t\t\t\tts.p.localReader.id = xmlid;\n\t\t\t}\n\t\t\tts.p.reccount = 0;\n\t\t\tif($.isXMLDoc(xml)) {\n\t\t\t\tif(ts.p.treeANode===-1 && !ts.p.scroll) {\n\t\t\t\t\temptyRows.call(ts, false, true);\n\t\t\t\t\trcnt=1;\n\t\t\t\t} else { rcnt = rcnt > 1 ? rcnt :1; }\n\t\t\t} else { return; }\n\t\t\tvar self= $(ts), i,fpos,ir=0,v,gi=ts.p.multiselect===true?1:0,si=0,addSubGridCell,ni=ts.p.rownumbers===true?1:0,idn, getId,f=[],F,rd ={}, xmlr,rid, rowData=[], cn=(ts.p.altRows === true) ? ts.p.altclass:\"\",cn1;\n\t\t\tif(ts.p.subGrid===true) {\n\t\t\t\tsi = 1;\n\t\t\t\taddSubGridCell = $.jgrid.getMethod(\"addSubGridCell\");\n\t\t\t}\n\t\t\tif(!xmlRd.repeatitems) {f = reader(frd);}\n\t\t\tif( ts.p.keyIndex===false) {\n\t\t\t\tidn = $.isFunction( xmlRd.id ) ?  xmlRd.id.call(ts, xml) : xmlRd.id;\n\t\t\t} else {\n\t\t\t\tidn = ts.p.keyIndex;\n\t\t\t}\n\t\t\tif(f.length>0 && !isNaN(idn)) {\n\t\t\t\tif (ts.p.remapColumns && ts.p.remapColumns.length) {\n\t\t\t\t\tidn = $.inArray(idn, ts.p.remapColumns);\n\t\t\t\t}\n\t\t\t\tidn=f[idn];\n\t\t\t}\n\t\t\tif( String(idn).indexOf(\"[\") === -1 ) {\n\t\t\t\tif (f.length) {\n\t\t\t\t\tgetId = function( trow, k) {return $(idn,trow).text() || k;};\n\t\t\t\t} else {\n\t\t\t\t\tgetId = function( trow, k) {return $(xmlRd.cell,trow).eq(idn).text() || k;};\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tgetId = function( trow, k) {return trow.getAttribute(idn.replace(/[\\[\\]]/g,\"\")) || k;};\n\t\t\t}\n\t\t\tts.p.userData = {};\n\t\t\tts.p.page = $.jgrid.getXmlData( xml,xmlRd.page ) || ts.p.page || 0;\n\t\t\tts.p.lastpage = $.jgrid.getXmlData( xml,xmlRd.total );\n\t\t\tif(ts.p.lastpage===undefined) { ts.p.lastpage=1; }\n\t\t\tts.p.records = $.jgrid.getXmlData( xml,xmlRd.records ) || 0;\n\t\t\tif($.isFunction(xmlRd.userdata)) {\n\t\t\t\tts.p.userData = xmlRd.userdata.call(ts, xml) || {};\n\t\t\t} else {\n\t\t\t\t$.jgrid.getXmlData(xml, xmlRd.userdata, true).each(function() {ts.p.userData[this.getAttribute(\"name\")]= $(this).text();});\n\t\t\t}\n\t\t\tvar gxml = $.jgrid.getXmlData( xml, xmlRd.root, true);\n\t\t\tgxml = $.jgrid.getXmlData( gxml, xmlRd.row, true);\n\t\t\tif (!gxml) { gxml = []; }\n\t\t\tvar gl = gxml.length, j=0, grpdata=[], rn = parseInt(ts.p.rowNum,10), br=ts.p.scroll?$.jgrid.randId():1, altr;\n\t\t\tif (gl > 0 &&  ts.p.page <= 0) { ts.p.page = 1; }\n\t\t\tif(gxml && gl){\n\t\t\tif (adjust) { rn *= adjust+1; }\n\t\t\tvar afterInsRow = $.isFunction(ts.p.afterInsertRow), hiderow=false, groupingPrepare;\n\t\t\tif(ts.p.grouping)  {\n\t\t\t\thiderow = ts.p.groupingView.groupCollapse === true;\n\t\t\t\tgroupingPrepare = $.jgrid.getMethod(\"groupingPrepare\");\n\t\t\t}\n\t\t\twhile (j<gl) {\n\t\t\t\txmlr = gxml[j];\n\t\t\t\trid = getId(xmlr,br+j);\n\t\t\t\trid  = ts.p.idPrefix + rid;\n\t\t\t\taltr = rcnt === 0 ? 0 : rcnt+1;\n\t\t\t\tcn1 = (altr+j)%2 === 1 ? cn : '';\n\t\t\t\tvar iStartTrTag = rowData.length;\n\t\t\t\trowData.push(\"\");\n\t\t\t\tif( ni ) {\n\t\t\t\t\trowData.push( addRowNum(0,j,ts.p.page,ts.p.rowNum) );\n\t\t\t\t}\n\t\t\t\tif( gi ) {\n\t\t\t\t\trowData.push( addMulti(rid,ni,j, false) );\n\t\t\t\t}\n\t\t\t\tif( si ) {\n\t\t\t\t\trowData.push( addSubGridCell.call(self,gi+ni,j+rcnt) );\n\t\t\t\t}\n\t\t\t\tif(xmlRd.repeatitems){\n\t\t\t\t\tif (!F) { F=orderedCols(gi+si+ni); }\n\t\t\t\t\tvar cells = $.jgrid.getXmlData( xmlr, xmlRd.cell, true);\n\t\t\t\t\t$.each(F, function (k) {\n\t\t\t\t\t\tvar cell = cells[this];\n\t\t\t\t\t\tif (!cell) { return false; }\n\t\t\t\t\t\tv = cell.textContent || cell.text;\n\t\t\t\t\t\trd[ts.p.colModel[k+gi+si+ni].name] = v;\n\t\t\t\t\t\trowData.push( addCell(rid,v,k+gi+si+ni,j+rcnt,xmlr, rd) );\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tfor(i = 0; i < f.length;i++) {\n\t\t\t\t\t\tv = $.jgrid.getXmlData( xmlr, f[i]);\n\t\t\t\t\t\trd[ts.p.colModel[i+gi+si+ni].name] = v;\n\t\t\t\t\t\trowData.push( addCell(rid, v, i+gi+si+ni, j+rcnt, xmlr, rd) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trowData[iStartTrTag] = constructTr(rid, hiderow, cn1, rd, xmlr, false);\n\t\t\t\trowData.push(\"</tr>\");\n\t\t\t\tif(ts.p.grouping) {\n\t\t\t\t\tgrpdata = groupingPrepare.call(self,rowData, grpdata, rd, j);\n\t\t\t\t\trowData = [];\n\t\t\t\t}\n\t\t\t\tif(locdata || ts.p.treeGrid === true) {\n\t\t\t\t\trd[xmlid] = $.jgrid.stripPref(ts.p.idPrefix, rid);\n\t\t\t\t\tts.p.data.push(rd);\n\t\t\t\t\tts.p._index[rd[xmlid]] = ts.p.data.length-1;\n\t\t\t\t}\n\t\t\t\tif(ts.p.gridview === false ) {\n\t\t\t\t\t$(\"tbody:first\",t).append(rowData.join(''));\n\t\t\t\t\tself.triggerHandler(\"jqGridAfterInsertRow\", [rid, rd, xmlr]);\n\t\t\t\t\tif(afterInsRow) {ts.p.afterInsertRow.call(ts,rid,rd,xmlr);}\n\t\t\t\t\trowData=[];\n\t\t\t\t}\n\t\t\t\trd={};\n\t\t\t\tir++;\n\t\t\t\tj++;\n\t\t\t\tif(ir===rn) {break;}\n\t\t\t}\n\t\t\t}\n\t\t\tif(ts.p.gridview === true) {\n\t\t\t\tfpos = ts.p.treeANode > -1 ? ts.p.treeANode: 0;\n\t\t\t\tif(ts.p.grouping) {\n\t\t\t\t\tself.jqGrid('groupingRender',grpdata,ts.p.colModel.length);\n\t\t\t\t\tgrpdata = null;\n\t\t\t\t} else if(ts.p.treeGrid === true && fpos > 0) {\n\t\t\t\t\t$(ts.rows[fpos]).after(rowData.join(''));\n\t\t\t\t} else {\n\t\t\t\t\t$(\"tbody:first\",t).append(rowData.join(''));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(ts.p.subGrid === true ) {\n\t\t\t\ttry {self.jqGrid(\"addSubGrid\",gi+ni);} catch (_){}\n\t\t\t}\n\t\t\tts.p.totaltime = new Date() - startReq;\n\t\t\tif(ir>0) { if(ts.p.records===0) { ts.p.records=gl;} }\n\t\t\trowData =null;\n\t\t\tif( ts.p.treeGrid === true) {\n\t\t\t\ttry {self.jqGrid(\"setTreeNode\", fpos+1, ir+fpos+1);} catch (e) {}\n\t\t\t}\n\t\t\tif(!ts.p.treeGrid && !ts.p.scroll) {ts.grid.bDiv.scrollTop = 0;}\n\t\t\tts.p.reccount=ir;\n\t\t\tts.p.treeANode = -1;\n\t\t\tif(ts.p.userDataOnFooter) { self.jqGrid(\"footerData\",\"set\",ts.p.userData,true); }\n\t\t\tif(locdata) {\n\t\t\t\tts.p.records = gl;\n\t\t\t\tts.p.lastpage = Math.ceil(gl/ rn);\n\t\t\t}\n\t\t\tif (!more) { ts.updatepager(false,true); }\n\t\t\tif(locdata) {\n\t\t\t\twhile (ir<gl) {\n\t\t\t\t\txmlr = gxml[ir];\n\t\t\t\t\trid = getId(xmlr,ir+br);\n\t\t\t\t\trid  = ts.p.idPrefix + rid;\n\t\t\t\t\tif(xmlRd.repeatitems){\n\t\t\t\t\t\tif (!F) { F=orderedCols(gi+si+ni); }\n\t\t\t\t\t\tvar cells2 = $.jgrid.getXmlData( xmlr, xmlRd.cell, true);\n\t\t\t\t\t\t$.each(F, function (k) {\n\t\t\t\t\t\t\tvar cell = cells2[this];\n\t\t\t\t\t\t\tif (!cell) { return false; }\n\t\t\t\t\t\t\tv = cell.textContent || cell.text;\n\t\t\t\t\t\t\trd[ts.p.colModel[k+gi+si+ni].name] = v;\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor(i = 0; i < f.length;i++) {\n\t\t\t\t\t\t\tv = $.jgrid.getXmlData( xmlr, f[i]);\n\t\t\t\t\t\t\trd[ts.p.colModel[i+gi+si+ni].name] = v;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\trd[xmlid] = $.jgrid.stripPref(ts.p.idPrefix, rid);\n\t\t\t\t\tts.p.data.push(rd);\n\t\t\t\t\tts.p._index[rd[xmlid]] = ts.p.data.length-1;\n\t\t\t\t\trd = {};\n\t\t\t\t\tir++;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\taddJSONData = function(data,t, rcnt, more, adjust) {\n\t\t\tvar startReq = new Date();\n\t\t\tif(data) {\n\t\t\t\tif(ts.p.treeANode === -1 && !ts.p.scroll) {\n\t\t\t\t\temptyRows.call(ts, false, true);\n\t\t\t\t\trcnt=1;\n\t\t\t\t} else { rcnt = rcnt > 1 ? rcnt :1; }\n\t\t\t} else { return; }\n\n\t\t\tvar dReader, locid = \"_id_\", frd,\n\t\t\tlocdata = (ts.p.datatype !== \"local\" && ts.p.loadonce) || ts.p.datatype === \"jsonstring\";\n\t\t\tif(locdata) { ts.p.data = []; ts.p._index = {}; ts.p.localReader.id = locid;}\n\t\t\tts.p.reccount = 0;\n\t\t\tif(ts.p.datatype === \"local\") {\n\t\t\t\tdReader =  ts.p.localReader;\n\t\t\t\tfrd= 'local';\n\t\t\t} else {\n\t\t\t\tdReader =  ts.p.jsonReader;\n\t\t\t\tfrd='json';\n\t\t\t}\n\t\t\tvar self = $(ts), ir=0,v,i,j,f=[],cur,gi=ts.p.multiselect?1:0,si=ts.p.subGrid===true?1:0,addSubGridCell,ni=ts.p.rownumbers===true?1:0,arrayReader=orderedCols(gi+si+ni),objectReader=reader(frd),rowReader,len,drows,idn,rd={}, fpos, idr,rowData=[],cn=(ts.p.altRows === true) ? ts.p.altclass:\"\",cn1,lp;\n\t\t\tts.p.page = $.jgrid.getAccessor(data,dReader.page) || ts.p.page || 0;\n\t\t\tlp = $.jgrid.getAccessor(data,dReader.total);\n\t\t\tif(si) {\n\t\t\t\taddSubGridCell = $.jgrid.getMethod(\"addSubGridCell\");\n\t\t\t}\n\t\t\tts.p.lastpage = lp === undefined ? 1 : lp;\n\t\t\tts.p.records = $.jgrid.getAccessor(data,dReader.records) || 0;\n\t\t\tts.p.userData = $.jgrid.getAccessor(data,dReader.userdata) || {};\n\t\t\tif( ts.p.keyIndex===false ) {\n\t\t\t\tidn = $.isFunction(dReader.id) ? dReader.id.call(ts, data) : dReader.id; \n\t\t\t} else {\n\t\t\t\tidn = ts.p.keyIndex;\n\t\t\t}\n\t\t\tif(!dReader.repeatitems) {\n\t\t\t\tf = objectReader;\n\t\t\t\tif(f.length>0 && !isNaN(idn)) {\n\t\t\t\t\tif (ts.p.remapColumns && ts.p.remapColumns.length) {\n\t\t\t\t\t\tidn = $.inArray(idn, ts.p.remapColumns);\n\t\t\t\t\t}\n\t\t\t\t\tidn=f[idn];\n\t\t\t\t}\n\t\t\t}\n\t\t\tdrows = $.jgrid.getAccessor(data,dReader.root);\n\t\t\tif (drows == null && $.isArray(data)) { drows = data; }\n\t\t\tif (!drows) { drows = []; }\n\t\t\tlen = drows.length; i=0;\n\t\t\tif (len > 0 && ts.p.page <= 0) { ts.p.page = 1; }\n\t\t\tvar rn = parseInt(ts.p.rowNum,10),br=ts.p.scroll?$.jgrid.randId():1, altr, selected=false, selr;\n\t\t\tif (adjust) { rn *= adjust+1; }\n\t\t\tif(ts.p.datatype === \"local\" && !ts.p.deselectAfterSort) {\n\t\t\t\tselected = true;\n\t\t\t}\n\t\t\tvar afterInsRow = $.isFunction(ts.p.afterInsertRow), grpdata=[],hiderow=false, groupingPrepare;\n\t\t\tif(ts.p.grouping)  {\n\t\t\t\thiderow = ts.p.groupingView.groupCollapse === true;\n\t\t\t\tgroupingPrepare = $.jgrid.getMethod(\"groupingPrepare\");\n\t\t\t}\n\t\t\twhile (i<len) {\n\t\t\t\tcur = drows[i];\n\t\t\t\tidr = $.jgrid.getAccessor(cur,idn);\n\t\t\t\tif(idr === undefined) {\n\t\t\t\t\tif (typeof idn === \"number\" && ts.p.colModel[idn+gi+si+ni] != null) {\n\t\t\t\t\t\t// reread id by name\n\t\t\t\t\t\tidr = $.jgrid.getAccessor(cur,ts.p.colModel[idn+gi+si+ni].name);\n\t\t\t\t\t}\n\t\t\t\t\tif(idr === undefined) {\n\t\t\t\t\t\tidr = br+i;\n\t\t\t\t\t\tif(f.length===0){\n\t\t\t\t\t\t\tif(dReader.cell){\n\t\t\t\t\t\t\t\tvar ccur = $.jgrid.getAccessor(cur,dReader.cell) || cur;\n\t\t\t\t\t\t\t\tidr = ccur != null && ccur[idn] !== undefined ? ccur[idn] : idr;\n\t\t\t\t\t\t\t\tccur=null;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tidr  = ts.p.idPrefix + idr;\n\t\t\t\taltr = rcnt === 1 ? 0 : rcnt;\n\t\t\t\tcn1 = (altr+i)%2 === 1 ? cn : '';\n\t\t\t\tif( selected) {\n\t\t\t\t\tif( ts.p.multiselect) {\n\t\t\t\t\t\tselr = ($.inArray(idr, ts.p.selarrrow) !== -1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tselr = (idr === ts.p.selrow);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvar iStartTrTag = rowData.length;\n\t\t\t\trowData.push(\"\");\n\t\t\t\tif( ni ) {\n\t\t\t\t\trowData.push( addRowNum(0,i,ts.p.page,ts.p.rowNum) );\n\t\t\t\t}\n\t\t\t\tif( gi ){\n\t\t\t\t\trowData.push( addMulti(idr,ni,i,selr) );\n\t\t\t\t}\n\t\t\t\tif( si ) {\n\t\t\t\t\trowData.push( addSubGridCell.call(self,gi+ni,i+rcnt) );\n\t\t\t\t}\n\t\t\t\trowReader=objectReader;\n\t\t\t\tif (dReader.repeatitems) {\n\t\t\t\t\tif(dReader.cell) {cur = $.jgrid.getAccessor(cur,dReader.cell) || cur;}\n\t\t\t\t\tif ($.isArray(cur)) { rowReader=arrayReader; }\n\t\t\t\t}\n\t\t\t\tfor (j=0;j<rowReader.length;j++) {\n\t\t\t\t\tv = $.jgrid.getAccessor(cur,rowReader[j]);\n\t\t\t\t\trd[ts.p.colModel[j+gi+si+ni].name] = v;\n\t\t\t\t\trowData.push( addCell(idr,v,j+gi+si+ni,i+rcnt,cur, rd) );\n\t\t\t\t}\n\t\t\t\trowData[iStartTrTag] = constructTr(idr, hiderow, cn1, rd, cur, selr);\n\t\t\t\trowData.push( \"</tr>\" );\n\t\t\t\tif(ts.p.grouping) {\n\t\t\t\t\tgrpdata = groupingPrepare.call(self,rowData, grpdata, rd, i);\n\t\t\t\t\trowData = [];\n\t\t\t\t}\n\t\t\t\tif(locdata || ts.p.treeGrid===true) {\n\t\t\t\t\trd[locid] = $.jgrid.stripPref(ts.p.idPrefix, idr);\n\t\t\t\t\tts.p.data.push(rd);\n\t\t\t\t\tts.p._index[rd[locid]] = ts.p.data.length-1;\n\t\t\t\t}\n\t\t\t\tif(ts.p.gridview === false ) {\n\t\t\t\t\t$(\"#\"+$.jgrid.jqID(ts.p.id)+\" tbody:first\").append(rowData.join(''));\n\t\t\t\t\tself.triggerHandler(\"jqGridAfterInsertRow\", [idr, rd, cur]);\n\t\t\t\t\tif(afterInsRow) {ts.p.afterInsertRow.call(ts,idr,rd,cur);}\n\t\t\t\t\trowData=[];//ari=0;\n\t\t\t\t}\n\t\t\t\trd={};\n\t\t\t\tir++;\n\t\t\t\ti++;\n\t\t\t\tif(ir===rn) { break; }\n\t\t\t}\n\t\t\tif(ts.p.gridview === true ) {\n\t\t\t\tfpos = ts.p.treeANode > -1 ? ts.p.treeANode: 0;\n\t\t\t\tif(ts.p.grouping) {\n\t\t\t\t\tself.jqGrid('groupingRender',grpdata,ts.p.colModel.length);\n\t\t\t\t\tgrpdata = null;\n\t\t\t\t} else if(ts.p.treeGrid === true && fpos > 0) {\n\t\t\t\t\t$(ts.rows[fpos]).after(rowData.join(''));\n\t\t\t\t} else {\n\t\t\t\t\t$(\"#\"+$.jgrid.jqID(ts.p.id)+\" tbody:first\").append(rowData.join(''));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(ts.p.subGrid === true ) {\n\t\t\t\ttry { self.jqGrid(\"addSubGrid\",gi+ni);} catch (_){}\n\t\t\t}\n\t\t\tts.p.totaltime = new Date() - startReq;\n\t\t\tif(ir>0) {\n\t\t\t\tif(ts.p.records===0) { ts.p.records=len; }\n\t\t\t}\n\t\t\trowData = null;\n\t\t\tif( ts.p.treeGrid === true) {\n\t\t\t\ttry {self.jqGrid(\"setTreeNode\", fpos+1, ir+fpos+1);} catch (e) {}\n\t\t\t}\n\t\t\tif(!ts.p.treeGrid && !ts.p.scroll) {ts.grid.bDiv.scrollTop = 0;}\n\t\t\tts.p.reccount=ir;\n\t\t\tts.p.treeANode = -1;\n\t\t\tif(ts.p.userDataOnFooter) { self.jqGrid(\"footerData\",\"set\",ts.p.userData,true); }\n\t\t\tif(locdata) {\n\t\t\t\tts.p.records = len;\n\t\t\t\tts.p.lastpage = Math.ceil(len/ rn);\n\t\t\t}\n\t\t\tif (!more) { ts.updatepager(false,true); }\n\t\t\tif(locdata) {\n\t\t\t\twhile (ir<len && drows[ir]) {\n\t\t\t\t\tcur = drows[ir];\n\t\t\t\t\tidr = $.jgrid.getAccessor(cur,idn);\n\t\t\t\t\tif(idr === undefined) {\n\t\t\t\t\t\tif (typeof idn === \"number\" && ts.p.colModel[idn+gi+si+ni] != null) {\n\t\t\t\t\t\t\t// reread id by name\n\t\t\t\t\t\t\tidr = $.jgrid.getAccessor(cur,ts.p.colModel[idn+gi+si+ni].name);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(idr === undefined) {\n\t\t\t\t\t\t\tidr = br+ir;\n\t\t\t\t\t\t\tif(f.length===0){\n\t\t\t\t\t\t\t\tif(dReader.cell){\n\t\t\t\t\t\t\t\t\tvar ccur2 = $.jgrid.getAccessor(cur,dReader.cell) || cur;\n\t\t\t\t\t\t\t\t\tidr = ccur2 != null && ccur2[idn] !== undefined ? ccur2[idn] : idr;\n\t\t\t\t\t\t\t\t\tccur2=null;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(cur) {\n\t\t\t\t\t\tidr  = ts.p.idPrefix + idr;\n\t\t\t\t\t\trowReader=objectReader;\n\t\t\t\t\t\tif (dReader.repeatitems) {\n\t\t\t\t\t\t\tif(dReader.cell) {cur = $.jgrid.getAccessor(cur,dReader.cell) || cur;}\n\t\t\t\t\t\t\tif ($.isArray(cur)) { rowReader=arrayReader; }\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (j=0;j<rowReader.length;j++) {\n\t\t\t\t\t\t\trd[ts.p.colModel[j+gi+si+ni].name] = $.jgrid.getAccessor(cur,rowReader[j]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\trd[locid] = $.jgrid.stripPref(ts.p.idPrefix, idr);\n\t\t\t\t\t\tts.p.data.push(rd);\n\t\t\t\t\t\tts.p._index[rd[locid]] = ts.p.data.length-1;\n\t\t\t\t\t\trd = {};\n\t\t\t\t\t}\n\t\t\t\t\tir++;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\taddLocalData = function() {\n\t\t\tvar st = ts.p.multiSort ? [] : \"\", sto=[], fndsort=false, cmtypes={}, grtypes=[], grindexes=[], srcformat, sorttype, newformat;\n\t\t\tif(!$.isArray(ts.p.data)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar grpview = ts.p.grouping ? ts.p.groupingView : false, lengrp, gin;\n\t\t\t$.each(ts.p.colModel,function(){\n\t\t\t\tsorttype = this.sorttype || \"text\";\n\t\t\t\tif(sorttype === \"date\" || sorttype === \"datetime\") {\n\t\t\t\t\tif(this.formatter && typeof this.formatter === 'string' && this.formatter === 'date') {\n\t\t\t\t\t\tif(this.formatoptions && this.formatoptions.srcformat) {\n\t\t\t\t\t\t\tsrcformat = this.formatoptions.srcformat;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsrcformat = $.jgrid.formatter.date.srcformat;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(this.formatoptions && this.formatoptions.newformat) {\n\t\t\t\t\t\t\tnewformat = this.formatoptions.newformat;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnewformat = $.jgrid.formatter.date.newformat;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsrcformat = newformat = this.datefmt || \"Y-m-d\";\n\t\t\t\t\t}\n\t\t\t\t\tcmtypes[this.name] = {\"stype\": sorttype, \"srcfmt\": srcformat,\"newfmt\":newformat};\n\t\t\t\t} else {\n\t\t\t\t\tcmtypes[this.name] = {\"stype\": sorttype, \"srcfmt\":'',\"newfmt\":''};\n\t\t\t\t}\n\t\t\t\tif(ts.p.grouping ) {\n\t\t\t\t\tfor(gin =0, lengrp = grpview.groupField.length; gin< lengrp; gin++) {\n\t\t\t\t\t\tif( this.name === grpview.groupField[gin]) {\n\t\t\t\t\t\t\tvar grindex = this.name;\n\t\t\t\t\t\t\tif (this.index) {\n\t\t\t\t\t\t\t\tgrindex = this.index;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tgrtypes[gin] = cmtypes[grindex];\n\t\t\t\t\t\t\tgrindexes[gin]= grindex;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(ts.p.multiSort) {\n\t\t\t\t\tif(this.lso) {\n\t\t\t\t\t\tst.push(this.name);\n\t\t\t\t\t\tvar tmplso= this.lso.split(\"-\");\n\t\t\t\t\t\tsto.push( tmplso[tmplso.length-1] );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif(!fndsort && (this.index === ts.p.sortname || this.name === ts.p.sortname)){\n\t\t\t\t\t\tst = this.name; // ???\n\t\t\t\t\t\tfndsort = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(ts.p.treeGrid) {\n\t\t\t\t$(ts).jqGrid(\"SortTree\", st, ts.p.sortorder, cmtypes[st].stype, cmtypes[st].srcfmt);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar compareFnMap = {\n\t\t\t\t'eq':function(queryObj) {return queryObj.equals;},\n\t\t\t\t'ne':function(queryObj) {return queryObj.notEquals;},\n\t\t\t\t'lt':function(queryObj) {return queryObj.less;},\n\t\t\t\t'le':function(queryObj) {return queryObj.lessOrEquals;},\n\t\t\t\t'gt':function(queryObj) {return queryObj.greater;},\n\t\t\t\t'ge':function(queryObj) {return queryObj.greaterOrEquals;},\n\t\t\t\t'cn':function(queryObj) {return queryObj.contains;},\n\t\t\t\t'nc':function(queryObj,op) {return op === \"OR\" ? queryObj.orNot().contains : queryObj.andNot().contains;},\n\t\t\t\t'bw':function(queryObj) {return queryObj.startsWith;},\n\t\t\t\t'bn':function(queryObj,op) {return op === \"OR\" ? queryObj.orNot().startsWith : queryObj.andNot().startsWith;},\n\t\t\t\t'en':function(queryObj,op) {return op === \"OR\" ? queryObj.orNot().endsWith : queryObj.andNot().endsWith;},\n\t\t\t\t'ew':function(queryObj) {return queryObj.endsWith;},\n\t\t\t\t'ni':function(queryObj,op) {return op === \"OR\" ? queryObj.orNot().equals : queryObj.andNot().equals;},\n\t\t\t\t'in':function(queryObj) {return queryObj.equals;},\n\t\t\t\t'nu':function(queryObj) {return queryObj.isNull;},\n\t\t\t\t'nn':function(queryObj,op) {return op === \"OR\" ? queryObj.orNot().isNull : queryObj.andNot().isNull;}\n\n\t\t\t},\n\t\t\tquery = $.jgrid.from(ts.p.data);\n\t\t\tif (ts.p.ignoreCase) { query = query.ignoreCase(); }\n\t\t\tfunction tojLinq ( group ) {\n\t\t\t\tvar s = 0, index, gor, ror, opr, rule;\n\t\t\t\tif (group.groups != null) {\n\t\t\t\t\tgor = group.groups.length && group.groupOp.toString().toUpperCase() === \"OR\";\n\t\t\t\t\tif (gor) {\n\t\t\t\t\t\tquery.orBegin();\n\t\t\t\t\t}\n\t\t\t\t\tfor (index = 0; index < group.groups.length; index++) {\n\t\t\t\t\t\tif (s > 0 && gor) {\n\t\t\t\t\t\t\tquery.or();\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\ttojLinq(group.groups[index]);\n\t\t\t\t\t\t} catch (e) {alert(e);}\n\t\t\t\t\t\ts++;\n\t\t\t\t\t}\n\t\t\t\t\tif (gor) {\n\t\t\t\t\t\tquery.orEnd();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (group.rules != null) {\n\t\t\t\t\t//if(s>0) {\n\t\t\t\t\t//\tvar result = query.select();\n\t\t\t\t\t//\tquery = $.jgrid.from( result);\n\t\t\t\t\t//\tif (ts.p.ignoreCase) { query = query.ignoreCase(); } \n\t\t\t\t\t//}\n\t\t\t\t\ttry{\n\t\t\t\t\t\tror = group.rules.length && group.groupOp.toString().toUpperCase() === \"OR\";\n\t\t\t\t\t\tif (ror) {\n\t\t\t\t\t\t\tquery.orBegin();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (index = 0; index < group.rules.length; index++) {\n\t\t\t\t\t\t\trule = group.rules[index];\n\t\t\t\t\t\t\topr = group.groupOp.toString().toUpperCase();\n\t\t\t\t\t\t\tif (compareFnMap[rule.op] && rule.field ) {\n\t\t\t\t\t\t\t\tif(s > 0 && opr && opr === \"OR\") {\n\t\t\t\t\t\t\t\t\tquery = query.or();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tquery = compareFnMap[rule.op](query, opr)(rule.field, rule.data, cmtypes[rule.field]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ts++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (ror) {\n\t\t\t\t\t\t\tquery.orEnd();\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (g) {alert(g);}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (ts.p.search === true) {\n\t\t\t\tvar srules = ts.p.postData.filters;\n\t\t\t\tif(srules) {\n\t\t\t\t\tif(typeof srules === \"string\") { srules = $.jgrid.parse(srules);}\n\t\t\t\t\ttojLinq( srules );\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tquery = compareFnMap[ts.p.postData.searchOper](query)(ts.p.postData.searchField, ts.p.postData.searchString,cmtypes[ts.p.postData.searchField]);\n\t\t\t\t\t} catch (se){}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(ts.p.grouping) {\n\t\t\t\tfor(gin=0; gin<lengrp;gin++) {\n\t\t\t\t\tquery.orderBy(grindexes[gin],grpview.groupOrder[gin],grtypes[gin].stype, grtypes[gin].srcfmt);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(ts.p.multiSort) {\n\t\t\t\t$.each(st,function(i){\n\t\t\t\t\tquery.orderBy(this, sto[i], cmtypes[this].stype, cmtypes[this].srcfmt);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tif (st && ts.p.sortorder && fndsort) {\n\t\t\t\t\tif(ts.p.sortorder.toUpperCase() === \"DESC\") {\n\t\t\t\t\t\tquery.orderBy(ts.p.sortname, \"d\", cmtypes[st].stype, cmtypes[st].srcfmt);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tquery.orderBy(ts.p.sortname, \"a\", cmtypes[st].stype, cmtypes[st].srcfmt);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar queryResults = query.select(),\n\t\t\trecordsperpage = parseInt(ts.p.rowNum,10),\n\t\t\ttotal = queryResults.length,\n\t\t\tpage = parseInt(ts.p.page,10),\n\t\t\ttotalpages = Math.ceil(total / recordsperpage),\n\t\t\tretresult = {};\n\t\t\tqueryResults = queryResults.slice( (page-1)*recordsperpage , page*recordsperpage );\n\t\t\tquery = null;\n\t\t\tcmtypes = null;\n\t\t\tretresult[ts.p.localReader.total] = totalpages;\n\t\t\tretresult[ts.p.localReader.page] = page;\n\t\t\tretresult[ts.p.localReader.records] = total;\n\t\t\tretresult[ts.p.localReader.root] = queryResults;\n\t\t\tretresult[ts.p.localReader.userdata] = ts.p.userData;\n\t\t\tqueryResults = null;\n\t\t\treturn  retresult;\n\t\t},\n\t\tupdatepager = function(rn, dnd) {\n\t\t\tvar cp, last, base, from,to,tot,fmt, pgboxes = \"\", sppg,\n\t\t\ttspg = ts.p.pager ? \"_\"+$.jgrid.jqID(ts.p.pager.substr(1)) : \"\",\n\t\t\ttspg_t = ts.p.toppager ? \"_\"+ts.p.toppager.substr(1) : \"\";\n\t\t\tbase = parseInt(ts.p.page,10)-1;\n\t\t\tif(base < 0) { base = 0; }\n\t\t\tbase = base*parseInt(ts.p.rowNum,10);\n\t\t\tto = base + ts.p.reccount;\n\t\t\tif (ts.p.scroll) {\n\t\t\t\tvar rows = $(\"tbody:first > tr:gt(0)\", ts.grid.bDiv);\n\t\t\t\tbase = to - rows.length;\n\t\t\t\tts.p.reccount = rows.length;\n\t\t\t\tvar rh = rows.outerHeight() || ts.grid.prevRowHeight;\n\t\t\t\tif (rh) {\n\t\t\t\t\tvar top = base * rh;\n\t\t\t\t\tvar height = parseInt(ts.p.records,10) * rh;\n\t\t\t\t\t$(\">div:first\",ts.grid.bDiv).css({height : height}).children(\"div:first\").css({height:top,display:top?\"\":\"none\"});\n\t\t\t\t\tif (ts.grid.bDiv.scrollTop == 0 && ts.p.page > 1) {\n\t\t\t\t\t\tts.grid.bDiv.scrollTop = ts.p.rowNum * (ts.p.page - 1) * rh;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tts.grid.bDiv.scrollLeft = ts.grid.hDiv.scrollLeft;\n\t\t\t}\n\t\t\tpgboxes = ts.p.pager || \"\";\n\t\t\tpgboxes += ts.p.toppager ?  (pgboxes ? \",\" + ts.p.toppager : ts.p.toppager) : \"\";\n\t\t\tif(pgboxes) {\n\t\t\t\tfmt = $.jgrid.formatter.integer || {};\n\t\t\t\tcp = intNum(ts.p.page);\n\t\t\t\tlast = intNum(ts.p.lastpage);\n\t\t\t\t$(\".selbox\",pgboxes)[ this.p.useProp ? 'prop' : 'attr' ](\"disabled\",false);\n\t\t\t\tif(ts.p.pginput===true) {\n\t\t\t\t\t$('.ui-pg-input',pgboxes).val(ts.p.page);\n\t\t\t\t\tsppg = ts.p.toppager ? '#sp_1'+tspg+\",#sp_1\"+tspg_t : '#sp_1'+tspg;\n\t\t\t\t\t$(sppg).html($.fmatter ? $.fmatter.util.NumberFormat(ts.p.lastpage,fmt):ts.p.lastpage);\n\n\t\t\t\t}\n\t\t\t\tif (ts.p.viewrecords){\n\t\t\t\t\tif(ts.p.reccount === 0) {\n\t\t\t\t\t\t$(\".ui-paging-info\",pgboxes).html(ts.p.emptyrecords);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfrom = base+1;\n\t\t\t\t\t\ttot=ts.p.records;\n\t\t\t\t\t\tif($.fmatter) {\n\t\t\t\t\t\t\tfrom = $.fmatter.util.NumberFormat(from,fmt);\n\t\t\t\t\t\t\tto = $.fmatter.util.NumberFormat(to,fmt);\n\t\t\t\t\t\t\ttot = $.fmatter.util.NumberFormat(tot,fmt);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$(\".ui-paging-info\",pgboxes).html($.jgrid.format(ts.p.recordtext,from,to,tot));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(ts.p.pgbuttons===true) {\n\t\t\t\t\tif(cp<=0) {cp = last = 0;}\n\t\t\t\t\tif(cp===1 || cp === 0) {\n\t\t\t\t\t\t$(\"#first\"+tspg+\", #prev\"+tspg).addClass('ui-state-disabled').removeClass('ui-state-hover');\n\t\t\t\t\t\tif(ts.p.toppager) { $(\"#first_t\"+tspg_t+\", #prev_t\"+tspg_t).addClass('ui-state-disabled').removeClass('ui-state-hover'); }\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$(\"#first\"+tspg+\", #prev\"+tspg).removeClass('ui-state-disabled');\n\t\t\t\t\t\tif(ts.p.toppager) { $(\"#first_t\"+tspg_t+\", #prev_t\"+tspg_t).removeClass('ui-state-disabled'); }\n\t\t\t\t\t}\n\t\t\t\t\tif(cp===last || cp === 0) {\n\t\t\t\t\t\t$(\"#next\"+tspg+\", #last\"+tspg).addClass('ui-state-disabled').removeClass('ui-state-hover');\n\t\t\t\t\t\tif(ts.p.toppager) { $(\"#next_t\"+tspg_t+\", #last_t\"+tspg_t).addClass('ui-state-disabled').removeClass('ui-state-hover'); }\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$(\"#next\"+tspg+\", #last\"+tspg).removeClass('ui-state-disabled');\n\t\t\t\t\t\tif(ts.p.toppager) { $(\"#next_t\"+tspg_t+\", #last_t\"+tspg_t).removeClass('ui-state-disabled'); }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(rn===true && ts.p.rownumbers === true) {\n\t\t\t\t$(\">td.jqgrid-rownum\",ts.rows).each(function(i){\n\t\t\t\t\t$(this).html(base+1+i);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif(dnd && ts.p.jqgdnd) { $(ts).jqGrid('gridDnD','updateDnD');}\n\t\t\t$(ts).triggerHandler(\"jqGridGridComplete\");\n\t\t\tif($.isFunction(ts.p.gridComplete)) {ts.p.gridComplete.call(ts);}\n\t\t\t$(ts).triggerHandler(\"jqGridAfterGridComplete\");\n\t\t},\n\t\tbeginReq = function() {\n\t\t\tts.grid.hDiv.loading = true;\n\t\t\tif(ts.p.hiddengrid) { return;}\n\t\t\tswitch(ts.p.loadui) {\n\t\t\t\tcase \"disable\":\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"enable\":\n\t\t\t\t\t$(\"#load_\"+$.jgrid.jqID(ts.p.id)).show();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"block\":\n\t\t\t\t\t$(\"#lui_\"+$.jgrid.jqID(ts.p.id)).show();\n\t\t\t\t\t$(\"#load_\"+$.jgrid.jqID(ts.p.id)).show();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\tendReq = function() {\n\t\t\tts.grid.hDiv.loading = false;\n\t\t\tswitch(ts.p.loadui) {\n\t\t\t\tcase \"disable\":\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"enable\":\n\t\t\t\t\t$(\"#load_\"+$.jgrid.jqID(ts.p.id)).hide();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"block\":\n\t\t\t\t\t$(\"#lui_\"+$.jgrid.jqID(ts.p.id)).hide();\n\t\t\t\t\t$(\"#load_\"+$.jgrid.jqID(ts.p.id)).hide();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\tpopulate = function (npage) {\n\t\t\tif(!ts.grid.hDiv.loading) {\n\t\t\t\tvar pvis = ts.p.scroll && npage === false,\n\t\t\t\tprm = {}, dt, dstr, pN=ts.p.prmNames;\n\t\t\t\tif(ts.p.page <=0) { ts.p.page = 1; }\n\t\t\t\tif(pN.search !== null) {prm[pN.search] = ts.p.search;} if(pN.nd !== null) {prm[pN.nd] = new Date().getTime();}\n\t\t\t\tif(pN.rows !== null) {prm[pN.rows]= ts.p.rowNum;} if(pN.page !== null) {prm[pN.page]= ts.p.page;}\n\t\t\t\tif(pN.sort !== null) {prm[pN.sort]= ts.p.sortname;} if(pN.order !== null) {prm[pN.order]= ts.p.sortorder;}\n\t\t\t\tif(ts.p.rowTotal !== null && pN.totalrows !== null) { prm[pN.totalrows]= ts.p.rowTotal; }\n\t\t\t\tvar lcf = $.isFunction(ts.p.loadComplete), lc = lcf ? ts.p.loadComplete : null;\n\t\t\t\tvar adjust = 0;\n\t\t\t\tnpage = npage || 1;\n\t\t\t\tif (npage > 1) {\n\t\t\t\t\tif(pN.npage !== null) {\n\t\t\t\t\t\tprm[pN.npage] = npage;\n\t\t\t\t\t\tadjust = npage - 1;\n\t\t\t\t\t\tnpage = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlc = function(req) {\n\t\t\t\t\t\t\tts.p.page++;\n\t\t\t\t\t\t\tts.grid.hDiv.loading = false;\n\t\t\t\t\t\t\tif (lcf) {\n\t\t\t\t\t\t\t\tts.p.loadComplete.call(ts,req);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tpopulate(npage-1);\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else if (pN.npage !== null) {\n\t\t\t\t\tdelete ts.p.postData[pN.npage];\n\t\t\t\t}\n\t\t\t\tif(ts.p.grouping) {\n\t\t\t\t\t$(ts).jqGrid('groupingSetup');\n\t\t\t\t\tvar grp = ts.p.groupingView, gi, gs=\"\";\n\t\t\t\t\tfor(gi=0;gi<grp.groupField.length;gi++) {\n\t\t\t\t\t\tvar index = grp.groupField[gi];\n\t\t\t\t\t\t$.each(ts.p.colModel, function(cmIndex, cmValue) {\n\t\t\t\t\t\t\tif (cmValue.name === index && cmValue.index){\n\t\t\t\t\t\t\t\tindex = cmValue.index;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tgs += index +\" \"+grp.groupOrder[gi]+\", \";\n\t\t\t\t\t}\n\t\t\t\t\tprm[pN.sort] = gs + prm[pN.sort];\n\t\t\t\t}\n\t\t\t\t$.extend(ts.p.postData,prm);\n\t\t\t\tvar rcnt = !ts.p.scroll ? 1 : ts.rows.length-1;\n\t\t\t\tvar bfr = $(ts).triggerHandler(\"jqGridBeforeRequest\");\n\t\t\t\tif (bfr === false || bfr === 'stop') { return; }\n\t\t\t\tif ($.isFunction(ts.p.datatype)) { ts.p.datatype.call(ts,ts.p.postData,\"load_\"+ts.p.id); return;}\n\t\t\t\tif ($.isFunction(ts.p.beforeRequest)) {\n\t\t\t\t\tbfr = ts.p.beforeRequest.call(ts);\n\t\t\t\t\tif(bfr === undefined) { bfr = true; }\n\t\t\t\t\tif ( bfr === false ) { return; }\n\t\t\t\t}\n\t\t\t\tdt = ts.p.datatype.toLowerCase();\n\t\t\t\tswitch(dt)\n\t\t\t\t{\n\t\t\t\tcase \"json\":\n\t\t\t\tcase \"jsonp\":\n\t\t\t\tcase \"xml\":\n\t\t\t\tcase \"script\":\n\t\t\t\t\t$.ajax($.extend({\n\t\t\t\t\t\turl:ts.p.url,\n\t\t\t\t\t\ttype:ts.p.mtype,\n\t\t\t\t\t\tdataType: dt ,\n\t\t\t\t\t\tdata: $.isFunction(ts.p.serializeGridData)? ts.p.serializeGridData.call(ts,ts.p.postData) : ts.p.postData,\n\t\t\t\t\t\tsuccess:function(data,st, xhr) {\n\t\t\t\t\t\t\tif ($.isFunction(ts.p.beforeProcessing)) {\n\t\t\t\t\t\t\t\tif (ts.p.beforeProcessing.call(ts, data, st, xhr) === false) {\n\t\t\t\t\t\t\t\t\tendReq();\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(dt === \"xml\") { addXmlData(data,ts.grid.bDiv,rcnt,npage>1,adjust); }\n\t\t\t\t\t\t\telse { addJSONData(data,ts.grid.bDiv,rcnt,npage>1,adjust); }\n\t\t\t\t\t\t\t$(ts).triggerHandler(\"jqGridLoadComplete\", [data]);\n\t\t\t\t\t\t\tif(lc) { lc.call(ts,data); }\n\t\t\t\t\t\t\t$(ts).triggerHandler(\"jqGridAfterLoadComplete\", [data]);\n\t\t\t\t\t\t\tif (pvis) { ts.grid.populateVisible(); }\n\t\t\t\t\t\t\tif( ts.p.loadonce || ts.p.treeGrid) {ts.p.datatype = \"local\";}\n\t\t\t\t\t\t\tdata=null;\n\t\t\t\t\t\t\tif (npage === 1) { endReq(); }\n\t\t\t\t\t\t},\n\t\t\t\t\t\terror:function(xhr,st,err){\n\t\t\t\t\t\t\tif($.isFunction(ts.p.loadError)) { ts.p.loadError.call(ts,xhr,st,err); }\n\t\t\t\t\t\t\tif (npage === 1) { endReq(); }\n\t\t\t\t\t\t\txhr=null;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbeforeSend: function(xhr, settings ){\n\t\t\t\t\t\t\tvar gotoreq = true;\n\t\t\t\t\t\t\tif($.isFunction(ts.p.loadBeforeSend)) {\n\t\t\t\t\t\t\t\tgotoreq = ts.p.loadBeforeSend.call(ts,xhr, settings); \n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(gotoreq === undefined) { gotoreq = true; }\n\t\t\t\t\t\t\tif(gotoreq === false) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbeginReq();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t},$.jgrid.ajaxOptions, ts.p.ajaxGridOptions));\n\t\t\t\tbreak;\n\t\t\t\tcase \"xmlstring\":\n\t\t\t\t\tbeginReq();\n\t\t\t\t\tdstr = typeof ts.p.datastr !== 'string' ? ts.p.datastr : $.parseXML(ts.p.datastr);\n\t\t\t\t\taddXmlData(dstr,ts.grid.bDiv);\n\t\t\t\t\t$(ts).triggerHandler(\"jqGridLoadComplete\", [dstr]);\n\t\t\t\t\tif(lcf) {ts.p.loadComplete.call(ts,dstr);}\n\t\t\t\t\t$(ts).triggerHandler(\"jqGridAfterLoadComplete\", [dstr]);\n\t\t\t\t\tts.p.datatype = \"local\";\n\t\t\t\t\tts.p.datastr = null;\n\t\t\t\t\tendReq();\n\t\t\t\tbreak;\n\t\t\t\tcase \"jsonstring\":\n\t\t\t\t\tbeginReq();\n\t\t\t\t\tif(typeof ts.p.datastr === 'string') { dstr = $.jgrid.parse(ts.p.datastr); }\n\t\t\t\t\telse { dstr = ts.p.datastr; }\n\t\t\t\t\taddJSONData(dstr,ts.grid.bDiv);\n\t\t\t\t\t$(ts).triggerHandler(\"jqGridLoadComplete\", [dstr]);\n\t\t\t\t\tif(lcf) {ts.p.loadComplete.call(ts,dstr);}\n\t\t\t\t\t$(ts).triggerHandler(\"jqGridAfterLoadComplete\", [dstr]);\n\t\t\t\t\tts.p.datatype = \"local\";\n\t\t\t\t\tts.p.datastr = null;\n\t\t\t\t\tendReq();\n\t\t\t\tbreak;\n\t\t\t\tcase \"local\":\n\t\t\t\tcase \"clientside\":\n\t\t\t\t\tbeginReq();\n\t\t\t\t\tts.p.datatype = \"local\";\n\t\t\t\t\tvar req = addLocalData();\n\t\t\t\t\taddJSONData(req,ts.grid.bDiv,rcnt,npage>1,adjust);\n\t\t\t\t\t$(ts).triggerHandler(\"jqGridLoadComplete\", [req]);\n\t\t\t\t\tif(lc) { lc.call(ts,req); }\n\t\t\t\t\t$(ts).triggerHandler(\"jqGridAfterLoadComplete\", [req]);\n\t\t\t\t\tif (pvis) { ts.grid.populateVisible(); }\n\t\t\t\t\tendReq();\n\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tsetHeadCheckBox = function ( checked ) {\n\t\t\t$('#cb_'+$.jgrid.jqID(ts.p.id),ts.grid.hDiv)[ts.p.useProp ? 'prop': 'attr'](\"checked\", checked);\n\t\t\tvar fid = ts.p.frozenColumns ? ts.p.id+\"_frozen\" : \"\";\n\t\t\tif(fid) {\n\t\t\t\t$('#cb_'+$.jgrid.jqID(ts.p.id),ts.grid.fhDiv)[ts.p.useProp ? 'prop': 'attr'](\"checked\", checked);\n\t\t\t}\n\t\t},\n\t\tsetPager = function (pgid, tp){\n\t\t\t// TBD - consider escaping pgid with pgid = $.jgrid.jqID(pgid);\n\t\t\tvar sep = \"<td class='ui-pg-button ui-state-disabled' style='width:4px;'><span class='ui-separator'></span></td>\",\n\t\t\tpginp = \"\",\n\t\t\tpgl=\"<table cellspacing='0' cellpadding='0' border='0' style='table-layout:auto;' class='ui-pg-table'><tbody><tr>\",\n\t\t\tstr=\"\", pgcnt, lft, cent, rgt, twd, tdw, i,\n\t\t\tclearVals = function(onpaging){\n\t\t\t\tvar ret;\n\t\t\t\tif ($.isFunction(ts.p.onPaging) ) { ret = ts.p.onPaging.call(ts,onpaging); }\n\t\t\t\tts.p.selrow = null;\n\t\t\t\tif(ts.p.multiselect) {ts.p.selarrrow =[]; setHeadCheckBox( false );}\n\t\t\t\tts.p.savedRow = [];\n\t\t\t\tif(ret==='stop') {return false;}\n\t\t\t\treturn true;\n\t\t\t};\n\t\t\tpgid = pgid.substr(1);\n\t\t\ttp += \"_\" + pgid;\n\t\t\tpgcnt = \"pg_\"+pgid;\n\t\t\tlft = pgid+\"_left\"; cent = pgid+\"_center\"; rgt = pgid+\"_right\";\n\t\t\t$(\"#\"+$.jgrid.jqID(pgid) )\n\t\t\t.append(\"<div id='\"+pgcnt+\"' class='ui-pager-control' role='group'><table cellspacing='0' cellpadding='0' border='0' class='ui-pg-table' style='width:100%;table-layout:fixed;height:100%;' role='row'><tbody><tr><td id='\"+lft+\"' align='left'></td><td id='\"+cent+\"' align='center' style='white-space:pre;'></td><td id='\"+rgt+\"' align='right'></td></tr></tbody></table></div>\")\n\t\t\t.attr(\"dir\",\"ltr\"); //explicit setting\n\t\t\tif(ts.p.rowList.length >0){\n\t\t\t\tstr = \"<td dir='\"+dir+\"'>\";\n\t\t\t\tstr +=\"<select class='ui-pg-selbox' role='listbox'>\";\n\t\t\t\tfor(i=0;i<ts.p.rowList.length;i++){\n\t\t\t\t\tstr +=\"<option role=\\\"option\\\" value=\\\"\"+ts.p.rowList[i]+\"\\\"\"+((ts.p.rowNum === ts.p.rowList[i])?\" selected=\\\"selected\\\"\":\"\")+\">\"+ts.p.rowList[i]+\"</option>\";\n\t\t\t\t}\n\t\t\t\tstr +=\"</select></td>\";\n\t\t\t}\n\t\t\tif(dir===\"rtl\") { pgl += str; }\n\t\t\tif(ts.p.pginput===true) { pginp= \"<td dir='\"+dir+\"'>\"+$.jgrid.format(ts.p.pgtext || \"\",\"<input class='ui-pg-input' type='text' size='2' maxlength='7' value='0' role='textbox'/>\",\"<span id='sp_1_\"+$.jgrid.jqID(pgid)+\"'></span>\")+\"</td>\";}\n\t\t\tif(ts.p.pgbuttons===true) {\n\t\t\t\tvar po=[\"first\"+tp,\"prev\"+tp, \"next\"+tp,\"last\"+tp]; if(dir===\"rtl\") { po.reverse(); }\n\t\t\t\tpgl += \"<td id='\"+po[0]+\"' class='ui-pg-button ui-corner-all'><span class='ui-icon ui-icon-seek-first'></span></td>\";\n\t\t\t\tpgl += \"<td id='\"+po[1]+\"' class='ui-pg-button ui-corner-all'><span class='ui-icon ui-icon-seek-prev'></span></td>\";\n\t\t\t\tpgl += pginp !== \"\" ? sep+pginp+sep:\"\";\n\t\t\t\tpgl += \"<td id='\"+po[2]+\"' class='ui-pg-button ui-corner-all'><span class='ui-icon ui-icon-seek-next'></span></td>\";\n\t\t\t\tpgl += \"<td id='\"+po[3]+\"' class='ui-pg-button ui-corner-all'><span class='ui-icon ui-icon-seek-end'></span></td>\";\n\t\t\t} else if (pginp !== \"\") { pgl += pginp; }\n\t\t\tif(dir===\"ltr\") { pgl += str; }\n\t\t\tpgl += \"</tr></tbody></table>\";\n\t\t\tif(ts.p.viewrecords===true) {$(\"td#\"+pgid+\"_\"+ts.p.recordpos,\"#\"+pgcnt).append(\"<div dir='\"+dir+\"' style='text-align:\"+ts.p.recordpos+\"' class='ui-paging-info'></div>\");}\n\t\t\t$(\"td#\"+pgid+\"_\"+ts.p.pagerpos,\"#\"+pgcnt).append(pgl);\n\t\t\ttdw = $(\".ui-jqgrid\").css(\"font-size\") || \"11px\";\n\t\t\t$(document.body).append(\"<div id='testpg' class='ui-jqgrid ui-widget ui-widget-content' style='font-size:\"+tdw+\";visibility:hidden;' ></div>\");\n\t\t\ttwd = $(pgl).clone().appendTo(\"#testpg\").width();\n\t\t\t$(\"#testpg\").remove();\n\t\t\tif(twd > 0) {\n\t\t\t\tif(pginp !== \"\") { twd += 50; } //should be param\n\t\t\t\t$(\"td#\"+pgid+\"_\"+ts.p.pagerpos,\"#\"+pgcnt).width(twd);\n\t\t\t}\n\t\t\tts.p._nvtd = [];\n\t\t\tts.p._nvtd[0] = twd ? Math.floor((ts.p.width - twd)/2) : Math.floor(ts.p.width/3);\n\t\t\tts.p._nvtd[1] = 0;\n\t\t\tpgl=null;\n\t\t\t$('.ui-pg-selbox',\"#\"+pgcnt).bind('change',function() {\n\t\t\t\tif(!clearVals('records')) { return false; }\n\t\t\t\tts.p.page = Math.round(ts.p.rowNum*(ts.p.page-1)/this.value-0.5)+1;\n\t\t\t\tts.p.rowNum = this.value;\n\t\t\t\tif(ts.p.pager) { $('.ui-pg-selbox',ts.p.pager).val(this.value); }\n\t\t\t\tif(ts.p.toppager) { $('.ui-pg-selbox',ts.p.toppager).val(this.value); }\n\t\t\t\tpopulate();\n\t\t\t\treturn false;\n\t\t\t});\n\t\t\tif(ts.p.pgbuttons===true) {\n\t\t\t$(\".ui-pg-button\",\"#\"+pgcnt).hover(function(){\n\t\t\t\tif($(this).hasClass('ui-state-disabled')) {\n\t\t\t\t\tthis.style.cursor='default';\n\t\t\t\t} else {\n\t\t\t\t\t$(this).addClass('ui-state-hover');\n\t\t\t\t\tthis.style.cursor='pointer';\n\t\t\t\t}\n\t\t\t},function() {\n\t\t\t\tif(!$(this).hasClass('ui-state-disabled')) {\n\t\t\t\t\t$(this).removeClass('ui-state-hover');\n\t\t\t\t\tthis.style.cursor= \"default\";\n\t\t\t\t}\n\t\t\t});\n\t\t\t$(\"#first\"+$.jgrid.jqID(tp)+\", #prev\"+$.jgrid.jqID(tp)+\", #next\"+$.jgrid.jqID(tp)+\", #last\"+$.jgrid.jqID(tp)).click( function() {\n\t\t\t\tvar cp = intNum(ts.p.page,1),\n\t\t\t\tlast = intNum(ts.p.lastpage,1), selclick = false,\n\t\t\t\tfp=true, pp=true, np=true,lp=true;\n\t\t\t\tif(last ===0 || last===1) {fp=false;pp=false;np=false;lp=false; }\n\t\t\t\telse if( last>1 && cp >=1) {\n\t\t\t\t\tif( cp === 1) { fp=false; pp=false; }\n\t\t\t\t\t//else if( cp>1 && cp <last){ }\n\t\t\t\t\telse if( cp===last){ np=false;lp=false; }\n\t\t\t\t} else if( last>1 && cp===0 ) { np=false;lp=false; cp=last-1;}\n\t\t\t\tif(!clearVals(this.id)) { return false; }\n\t\t\t\tif( this.id === 'first'+tp && fp ) { ts.p.page=1; selclick=true;}\n\t\t\t\tif( this.id === 'prev'+tp && pp) { ts.p.page=(cp-1); selclick=true;}\n\t\t\t\tif( this.id === 'next'+tp && np) { ts.p.page=(cp+1); selclick=true;}\n\t\t\t\tif( this.id === 'last'+tp && lp) { ts.p.page=last; selclick=true;}\n\t\t\t\tif(selclick) {\n\t\t\t\t\tpopulate();\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\t\t\t}\n\t\t\tif(ts.p.pginput===true) {\n\t\t\t$('input.ui-pg-input',\"#\"+pgcnt).keypress( function(e) {\n\t\t\t\tvar key = e.charCode || e.keyCode || 0;\n\t\t\t\tif(key === 13) {\n\t\t\t\t\tif(!clearVals('user')) { return false; }\n\t\t\t\t\t$(this).val( intNum( $(this).val(), 1));\n\t\t\t\t\tts.p.page = ($(this).val()>0) ? $(this).val():ts.p.page;\n\t\t\t\t\tpopulate();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t});\n\t\t\t}\n\t\t},\n\t\tmultiSort = function(iCol, obj ) {\n\t\t\tvar splas, sort=\"\", cm = ts.p.colModel, fs=false, ls, \n\t\t\t\t\tselTh = ts.p.frozenColumns ?  obj : ts.grid.headers[iCol].el, so=\"\";\n\t\t\t$(\"span.ui-grid-ico-sort\",selTh).addClass('ui-state-disabled');\n\t\t\t$(selTh).attr(\"aria-selected\",\"false\");\n\n\t\t\tif(cm[iCol].lso) {\n\t\t\t\tif(cm[iCol].lso===\"asc\") {\n\t\t\t\t\tcm[iCol].lso += \"-desc\";\n\t\t\t\t\tso = \"desc\";\n\t\t\t\t} else if(cm[iCol].lso===\"desc\") {\n\t\t\t\t\tcm[iCol].lso += \"-asc\";\n\t\t\t\t\tso = \"asc\";\n\t\t\t\t} else if(cm[iCol].lso===\"asc-desc\" || cm[iCol].lso===\"desc-asc\") {\n\t\t\t\t\tcm[iCol].lso=\"\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcm[iCol].lso = so = cm.firstsortorder || 'asc';\n\t\t\t}\n\t\t\tif( so ) {\n\t\t\t\t$(\"span.s-ico\",selTh).show();\n\t\t\t\t$(\"span.ui-icon-\"+so,selTh).removeClass('ui-state-disabled');\n\t\t\t\t$(selTh).attr(\"aria-selected\",\"true\");\n\t\t\t} else {\n\t\t\t\tif(!ts.p.viewsortcols[0]) {\n\t\t\t\t\t$(\"span.s-ico\",selTh).hide();\n\t\t\t\t}\n\t\t\t}\n\t\t\tts.p.sortorder = \"\";\n\t\t\t$.each(cm, function(i){\n\t\t\t\tif(this.lso) {\n\t\t\t\t\tif(i>0 && fs) {\n\t\t\t\t\t\tsort += \", \";\n\t\t\t\t\t}\n\t\t\t\t\tsplas = this.lso.split(\"-\");\n\t\t\t\t\tsort += cm[i].index || cm[i].name;\n\t\t\t\t\tsort += \" \"+splas[splas.length-1];\n\t\t\t\t\tfs = true;\n\t\t\t\t\tts.p.sortorder = splas[splas.length-1];\n\t\t\t\t}\n\t\t\t});\n\t\t\tls = sort.lastIndexOf(ts.p.sortorder);\n\t\t\tsort = sort.substring(0, ls);\n\t\t\tts.p.sortname = sort;\n\t\t},\n\t\tsortData = function (index, idxcol,reload,sor, obj){\n\t\t\tif(!ts.p.colModel[idxcol].sortable) { return; }\n\t\t\tvar so;\n\t\t\tif(ts.p.savedRow.length > 0) {return;}\n\t\t\tif(!reload) {\n\t\t\t\tif( ts.p.lastsort === idxcol ) {\n\t\t\t\t\tif( ts.p.sortorder === 'asc') {\n\t\t\t\t\t\tts.p.sortorder = 'desc';\n\t\t\t\t\t} else if(ts.p.sortorder === 'desc') { ts.p.sortorder = 'asc';}\n\t\t\t\t} else { ts.p.sortorder = ts.p.colModel[idxcol].firstsortorder || 'asc'; }\n\t\t\t\tts.p.page = 1;\n\t\t\t}\n\t\t\tif(ts.p.multiSort) {\n\t\t\t\tmultiSort( idxcol, obj);\n\t\t\t} else {\n\t\t\t\tif(sor) {\n\t\t\t\t\tif(ts.p.lastsort === idxcol && ts.p.sortorder === sor && !reload) { return; }\n\t\t\t\t\tts.p.sortorder = sor;\n\t\t\t\t}\n\t\t\t\tvar previousSelectedTh = ts.grid.headers[ts.p.lastsort].el, newSelectedTh = ts.p.frozenColumns ?  obj : ts.grid.headers[idxcol].el;\n\n\t\t\t\t$(\"span.ui-grid-ico-sort\",previousSelectedTh).addClass('ui-state-disabled');\n\t\t\t\t$(previousSelectedTh).attr(\"aria-selected\",\"false\");\n\t\t\t\tif(ts.p.frozenColumns) {\n\t\t\t\t\tts.grid.fhDiv.find(\"span.ui-grid-ico-sort\").addClass('ui-state-disabled');\n\t\t\t\t\tts.grid.fhDiv.find(\"th\").attr(\"aria-selected\",\"false\");\n\t\t\t\t}\n\t\t\t\t$(\"span.ui-icon-\"+ts.p.sortorder,newSelectedTh).removeClass('ui-state-disabled');\n\t\t\t\t$(newSelectedTh).attr(\"aria-selected\",\"true\");\n\t\t\t\tif(!ts.p.viewsortcols[0]) {\n\t\t\t\t\tif(ts.p.lastsort !== idxcol) {\n\t\t\t\t\t\tif(ts.p.frozenColumns){\n\t\t\t\t\t\t\tts.grid.fhDiv.find(\"span.s-ico\").hide();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$(\"span.s-ico\",previousSelectedTh).hide();\n\t\t\t\t\t\t$(\"span.s-ico\",newSelectedTh).show();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tindex = index.substring(5 + ts.p.id.length + 1); // bad to be changed!?!\n\t\t\t\tts.p.sortname = ts.p.colModel[idxcol].index || index;\n\t\t\t\tso = ts.p.sortorder;\n\t\t\t}\n\t\t\tif ($(ts).triggerHandler(\"jqGridSortCol\", [index, idxcol, so]) === 'stop') {\n\t\t\t\tts.p.lastsort = idxcol;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif($.isFunction(ts.p.onSortCol)) {if (ts.p.onSortCol.call(ts,index,idxcol,so)==='stop') {ts.p.lastsort = idxcol; return;}}\n\t\t\tif(ts.p.datatype === \"local\") {\n\t\t\t\tif(ts.p.deselectAfterSort) {$(ts).jqGrid(\"resetSelection\");}\n\t\t\t} else {\n\t\t\t\tts.p.selrow = null;\n\t\t\t\tif(ts.p.multiselect){setHeadCheckBox( false );}\n\t\t\t\tts.p.selarrrow =[];\n\t\t\t\tts.p.savedRow =[];\n\t\t\t}\n\t\t\tif(ts.p.scroll) {\n\t\t\t\tvar sscroll = ts.grid.bDiv.scrollLeft;\n\t\t\t\temptyRows.call(ts, true, false);\n\t\t\t\tts.grid.hDiv.scrollLeft = sscroll;\n\t\t\t}\n\t\t\tif(ts.p.subGrid && ts.p.datatype === 'local') {\n\t\t\t\t$(\"td.sgexpanded\",\"#\"+$.jgrid.jqID(ts.p.id)).each(function(){\n\t\t\t\t\t$(this).trigger(\"click\");\n\t\t\t\t});\n\t\t\t}\n\t\t\tpopulate();\n\t\t\tts.p.lastsort = idxcol;\n\t\t\tif(ts.p.sortname !== index && idxcol) {ts.p.lastsort = idxcol;}\n\t\t},\n\t\tsetColWidth = function () {\n\t\t\tvar initwidth = 0, brd=$.jgrid.cell_width? 0: intNum(ts.p.cellLayout,0), vc=0, lvc, scw=intNum(ts.p.scrollOffset,0),cw,hs=false,aw,gw=0,cr;\n\t\t\t$.each(ts.p.colModel, function() {\n\t\t\t\tif(this.hidden === undefined) {this.hidden=false;}\n\t\t\t\tif(ts.p.grouping && ts.p.autowidth) {\n\t\t\t\t\tvar ind = $.inArray(this.name, ts.p.groupingView.groupField);\n\t\t\t\t\tif(ind >= 0 && ts.p.groupingView.groupColumnShow.length > ind) {\n\t\t\t\t\t\tthis.hidden = !ts.p.groupingView.groupColumnShow[ind];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.widthOrg = cw = intNum(this.width,0);\n\t\t\t\tif(this.hidden===false){\n\t\t\t\t\tinitwidth += cw+brd;\n\t\t\t\t\tif(this.fixed) {\n\t\t\t\t\t\tgw += cw+brd;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvc++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(isNaN(ts.p.width)) {\n\t\t\t\tts.p.width  = initwidth + ((ts.p.shrinkToFit ===false && !isNaN(ts.p.height)) ? scw : 0);\n\t\t\t}\n\t\t\tgrid.width = ts.p.width;\n\t\t\tts.p.tblwidth = initwidth;\n\t\t\tif(ts.p.shrinkToFit ===false && ts.p.forceFit === true) {ts.p.forceFit=false;}\n\t\t\tif(ts.p.shrinkToFit===true && vc > 0) {\n\t\t\t\taw = grid.width-brd*vc-gw;\n\t\t\t\tif(!isNaN(ts.p.height)) {\n\t\t\t\t\taw -= scw;\n\t\t\t\t\ths = true;\n\t\t\t\t}\n\t\t\t\tinitwidth =0;\n\t\t\t\t$.each(ts.p.colModel, function(i) {\n\t\t\t\t\tif(this.hidden === false && !this.fixed){\n\t\t\t\t\t\tcw = Math.round(aw*this.width/(ts.p.tblwidth-brd*vc-gw));\n\t\t\t\t\t\tthis.width =cw;\n\t\t\t\t\t\tinitwidth += cw;\n\t\t\t\t\t\tlvc = i;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tcr =0;\n\t\t\t\tif (hs) {\n\t\t\t\t\tif(grid.width-gw-(initwidth+brd*vc) !== scw){\n\t\t\t\t\t\tcr = grid.width-gw-(initwidth+brd*vc)-scw;\n\t\t\t\t\t}\n\t\t\t\t} else if(!hs && Math.abs(grid.width-gw-(initwidth+brd*vc)) !== 1) {\n\t\t\t\t\tcr = grid.width-gw-(initwidth+brd*vc);\n\t\t\t\t}\n\t\t\t\tts.p.colModel[lvc].width += cr;\n\t\t\t\tts.p.tblwidth = initwidth+cr+brd*vc+gw;\n\t\t\t\tif(ts.p.tblwidth > ts.p.width) {\n\t\t\t\t\tts.p.colModel[lvc].width -= (ts.p.tblwidth - parseInt(ts.p.width,10));\n\t\t\t\t\tts.p.tblwidth = ts.p.width;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tnextVisible= function(iCol) {\n\t\t\tvar ret = iCol, j=iCol, i;\n\t\t\tfor (i = iCol+1;i<ts.p.colModel.length;i++){\n\t\t\t\tif(ts.p.colModel[i].hidden !== true ) {\n\t\t\t\t\tj=i; break;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn j-ret;\n\t\t},\n\t\tgetOffset = function (iCol) {\n\t\t\tvar $th = $(ts.grid.headers[iCol].el), ret = [$th.position().left + $th.outerWidth()];\n\t\t\tif(ts.p.direction===\"rtl\") { ret[0] = ts.p.width - ret[0]; }\n\t\t\tret[0] -= ts.grid.bDiv.scrollLeft;\n\t\t\tret.push($(ts.grid.hDiv).position().top);\n\t\t\tret.push($(ts.grid.bDiv).offset().top - $(ts.grid.hDiv).offset().top + $(ts.grid.bDiv).height());\n\t\t\treturn ret;\n\t\t},\n\t\tgetColumnHeaderIndex = function (th) {\n\t\t\tvar i, headers = ts.grid.headers, ci = $.jgrid.getCellIndex(th);\n\t\t\tfor (i = 0; i < headers.length; i++) {\n\t\t\t\tif (th === headers[i].el) {\n\t\t\t\t\tci = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn ci;\n\t\t};\n\t\tthis.p.id = this.id;\n\t\tif ($.inArray(ts.p.multikey,sortkeys) === -1 ) {ts.p.multikey = false;}\n\t\tts.p.keyIndex=false;\n\t\tfor (i=0; i<ts.p.colModel.length;i++) {\n\t\t\tts.p.colModel[i] = $.extend(true, {}, ts.p.cmTemplate, ts.p.colModel[i].template || {}, ts.p.colModel[i]);\n\t\t\tif (ts.p.keyIndex === false && ts.p.colModel[i].key===true) {\n\t\t\t\tts.p.keyIndex = i;\n\t\t\t}\n\t\t}\n\t\tts.p.sortorder = ts.p.sortorder.toLowerCase();\n\t\t$.jgrid.cell_width = $.jgrid.cellWidth();\n\t\tif(ts.p.grouping===true) {\n\t\t\tts.p.scroll = false;\n\t\t\tts.p.rownumbers = false;\n\t\t\t//ts.p.subGrid = false; expiremental\n\t\t\tts.p.treeGrid = false;\n\t\t\tts.p.gridview = true;\n\t\t}\n\t\tif(this.p.treeGrid === true) {\n\t\t\ttry { $(this).jqGrid(\"setTreeGrid\");} catch (_) {}\n\t\t\tif(ts.p.datatype !== \"local\") { ts.p.localReader = {id: \"_id_\"};\t}\n\t\t}\n\t\tif(this.p.subGrid) {\n\t\t\ttry { $(ts).jqGrid(\"setSubGrid\");} catch (s){}\n\t\t}\n\t\tif(this.p.multiselect) {\n\t\t\tthis.p.colNames.unshift(\"<input role='checkbox' id='cb_\"+this.p.id+\"' class='cbox' type='checkbox'/>\");\n\t\t\tthis.p.colModel.unshift({name:'cb',width:$.jgrid.cell_width ? ts.p.multiselectWidth+ts.p.cellLayout : ts.p.multiselectWidth,sortable:false,resizable:false,hidedlg:true,search:false,align:'center',fixed:true});\n\t\t}\n\t\tif(this.p.rownumbers) {\n\t\t\tthis.p.colNames.unshift(\"\");\n\t\t\tthis.p.colModel.unshift({name:'rn',width:ts.p.rownumWidth,sortable:false,resizable:false,hidedlg:true,search:false,align:'center',fixed:true});\n\t\t}\n\t\tts.p.xmlReader = $.extend(true,{\n\t\t\troot: \"rows\",\n\t\t\trow: \"row\",\n\t\t\tpage: \"rows>page\",\n\t\t\ttotal: \"rows>total\",\n\t\t\trecords : \"rows>records\",\n\t\t\trepeatitems: true,\n\t\t\tcell: \"cell\",\n\t\t\tid: \"[id]\",\n\t\t\tuserdata: \"userdata\",\n\t\t\tsubgrid: {root:\"rows\", row: \"row\", repeatitems: true, cell:\"cell\"}\n\t\t}, ts.p.xmlReader);\n\t\tts.p.jsonReader = $.extend(true,{\n\t\t\troot: \"rows\",\n\t\t\tpage: \"page\",\n\t\t\ttotal: \"total\",\n\t\t\trecords: \"records\",\n\t\t\trepeatitems: true,\n\t\t\tcell: \"cell\",\n\t\t\tid: \"id\",\n\t\t\tuserdata: \"userdata\",\n\t\t\tsubgrid: {root:\"rows\", repeatitems: true, cell:\"cell\"}\n\t\t},ts.p.jsonReader);\n\t\tts.p.localReader = $.extend(true,{\n\t\t\troot: \"rows\",\n\t\t\tpage: \"page\",\n\t\t\ttotal: \"total\",\n\t\t\trecords: \"records\",\n\t\t\trepeatitems: false,\n\t\t\tcell: \"cell\",\n\t\t\tid: \"id\",\n\t\t\tuserdata: \"userdata\",\n\t\t\tsubgrid: {root:\"rows\", repeatitems: true, cell:\"cell\"}\n\t\t},ts.p.localReader);\n\t\tif(ts.p.scroll){\n\t\t\tts.p.pgbuttons = false; ts.p.pginput=false; ts.p.rowList=[];\n\t\t}\n\t\tif(ts.p.data.length) { refreshIndex(); }\n\t\tvar thead = \"<thead><tr class='ui-jqgrid-labels' role='rowheader'>\",\n\t\ttdc, idn, w, res, sort,\n\t\ttd, ptr, tbody, imgs,iac=\"\",idc=\"\",sortarr=[], sortord=[], sotmp=[];\n\t\tif(ts.p.shrinkToFit===true && ts.p.forceFit===true) {\n\t\t\tfor (i=ts.p.colModel.length-1;i>=0;i--){\n\t\t\t\tif(!ts.p.colModel[i].hidden) {\n\t\t\t\t\tts.p.colModel[i].resizable=false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(ts.p.viewsortcols[1] === 'horizontal') {iac=\" ui-i-asc\";idc=\" ui-i-desc\";}\n\t\ttdc = isMSIE ?  \"class='ui-th-div-ie'\" :\"\";\n\t\timgs = \"<span class='s-ico' style='display:none'><span sort='asc' class='ui-grid-ico-sort ui-icon-asc\"+iac+\" ui-state-disabled ui-icon ui-icon-triangle-1-n ui-sort-\"+dir+\"'></span>\";\n\t\timgs += \"<span sort='desc' class='ui-grid-ico-sort ui-icon-desc\"+idc+\" ui-state-disabled ui-icon ui-icon-triangle-1-s ui-sort-\"+dir+\"'></span></span>\";\n\t\tif(ts.p.multiSort) {\n\t\t\tsortarr = ts.p.sortname.split(\",\");\n\t\t\tfor (i=0; i<sortarr.length; i++) {\n\t\t\t\tsotmp = $.trim(sortarr[i]).split(\" \");\n\t\t\t\tsortarr[i] = $.trim(sotmp[0]);\n\t\t\t\tsortord[i] = sotmp[1] ? $.trim(sotmp[1]) : ts.p.sortorder || \"asc\";\n\t\t\t}\n\t\t}\n\t\tfor(i=0;i<this.p.colNames.length;i++){\n\t\t\tvar tooltip = ts.p.headertitles ? (\" title=\\\"\"+$.jgrid.stripHtml(ts.p.colNames[i])+\"\\\"\") :\"\";\n\t\t\tthead += \"<th id='\"+ts.p.id+\"_\"+ts.p.colModel[i].name+\"' role='columnheader' class='ui-state-default ui-th-column ui-th-\"+dir+\"'\"+ tooltip+\">\";\n\t\t\tidn = ts.p.colModel[i].index || ts.p.colModel[i].name;\n\t\t\tthead += \"<div id='jqgh_\"+ts.p.id+\"_\"+ts.p.colModel[i].name+\"' \"+tdc+\">\"+ts.p.colNames[i];\n\t\t\tif(!ts.p.colModel[i].width)  { ts.p.colModel[i].width = 150; }\n\t\t\telse { ts.p.colModel[i].width = parseInt(ts.p.colModel[i].width,10); }\n\t\t\tif(typeof ts.p.colModel[i].title !== \"boolean\") { ts.p.colModel[i].title = true; }\n\t\t\tts.p.colModel[i].lso = \"\";\n\t\t\tif (idn === ts.p.sortname) {\n\t\t\t\tts.p.lastsort = i;\n\t\t\t}\n\t\t\tif(ts.p.multiSort) {\n\t\t\t\tsotmp = $.inArray(idn,sortarr);\n\t\t\t\tif( sotmp !== -1 ) {\n\t\t\t\t\tts.p.colModel[i].lso = sortord[sotmp];\n\t\t\t\t}\n\t\t\t}\n\t\t\tthead += imgs+\"</div></th>\";\n\t\t}\n\t\tthead += \"</tr></thead>\";\n\t\timgs = null;\n\t\t$(this).append(thead);\n\t\t$(\"thead tr:first th\",this).hover(function(){$(this).addClass('ui-state-hover');},function(){$(this).removeClass('ui-state-hover');});\n\t\tif(this.p.multiselect) {\n\t\t\tvar emp=[], chk;\n\t\t\t$('#cb_'+$.jgrid.jqID(ts.p.id),this).bind('click',function(){\n\t\t\t\tts.p.selarrrow = [];\n\t\t\t\tvar froz = ts.p.frozenColumns === true ? ts.p.id + \"_frozen\" : \"\";\n\t\t\t\tif (this.checked) {\n\t\t\t\t\t$(ts.rows).each(function(i) {\n\t\t\t\t\t\tif (i>0) {\n\t\t\t\t\t\t\tif(!$(this).hasClass(\"ui-subgrid\") && !$(this).hasClass(\"jqgroup\") && !$(this).hasClass('ui-state-disabled')){\n\t\t\t\t\t\t\t\t$(\"#jqg_\"+$.jgrid.jqID(ts.p.id)+\"_\"+$.jgrid.jqID(this.id) )[ts.p.useProp ? 'prop': 'attr'](\"checked\",true);\n\t\t\t\t\t\t\t\t$(this).addClass(\"ui-state-highlight\").attr(\"aria-selected\",\"true\");  \n\t\t\t\t\t\t\t\tts.p.selarrrow.push(this.id);\n\t\t\t\t\t\t\t\tts.p.selrow = this.id;\n\t\t\t\t\t\t\t\tif(froz) {\n\t\t\t\t\t\t\t\t\t$(\"#jqg_\"+$.jgrid.jqID(ts.p.id)+\"_\"+$.jgrid.jqID(this.id), ts.grid.fbDiv )[ts.p.useProp ? 'prop': 'attr'](\"checked\",true);\n\t\t\t\t\t\t\t\t\t$(\"#\"+$.jgrid.jqID(this.id), ts.grid.fbDiv).addClass(\"ui-state-highlight\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tchk=true;\n\t\t\t\t\temp=[];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t$(ts.rows).each(function(i) {\n\t\t\t\t\t\tif(i>0) {\n\t\t\t\t\t\t\tif(!$(this).hasClass(\"ui-subgrid\") && !$(this).hasClass('ui-state-disabled')){\n\t\t\t\t\t\t\t\t$(\"#jqg_\"+$.jgrid.jqID(ts.p.id)+\"_\"+$.jgrid.jqID(this.id) )[ts.p.useProp ? 'prop': 'attr'](\"checked\", false);\n\t\t\t\t\t\t\t\t$(this).removeClass(\"ui-state-highlight\").attr(\"aria-selected\",\"false\");\n\t\t\t\t\t\t\t\temp.push(this.id);\n\t\t\t\t\t\t\t\tif(froz) {\n\t\t\t\t\t\t\t\t\t$(\"#jqg_\"+$.jgrid.jqID(ts.p.id)+\"_\"+$.jgrid.jqID(this.id), ts.grid.fbDiv )[ts.p.useProp ? 'prop': 'attr'](\"checked\",false);\n\t\t\t\t\t\t\t\t\t$(\"#\"+$.jgrid.jqID(this.id), ts.grid.fbDiv).removeClass(\"ui-state-highlight\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tts.p.selrow = null;\n\t\t\t\t\tchk=false;\n\t\t\t\t}\n\t\t\t\t$(ts).triggerHandler(\"jqGridSelectAll\", [chk ? ts.p.selarrrow : emp, chk]);\n\t\t\t\tif($.isFunction(ts.p.onSelectAll)) {ts.p.onSelectAll.call(ts, chk ? ts.p.selarrrow : emp,chk);}\n\t\t\t});\n\t\t}\n\n\t\tif(ts.p.autowidth===true) {\n\t\t\tvar pw = $(eg).innerWidth();\n\t\t\tts.p.width = pw > 0?  pw: 'nw';\n\t\t}\n\t\tsetColWidth();\n\t\t$(eg).css(\"width\",grid.width+\"px\").append(\"<div class='ui-jqgrid-resize-mark' id='rs_m\"+ts.p.id+\"'>&#160;</div>\");\n\t\t$(gv).css(\"width\",grid.width+\"px\");\n\t\tthead = $(\"thead:first\",ts).get(0);\n\t\tvar\ttfoot = \"\";\n\t\tif(ts.p.footerrow) { tfoot += \"<table role='grid' style='width:\"+ts.p.tblwidth+\"px' class='ui-jqgrid-ftable' cellspacing='0' cellpadding='0' border='0'><tbody><tr role='row' class='ui-widget-content footrow footrow-\"+dir+\"'>\"; }\n\t\tvar thr = $(\"tr:first\",thead),\n\t\tfirstr = \"<tr class='jqgfirstrow' role='row' style='height:auto'>\";\n\t\tts.p.disableClick=false;\n\t\t$(\"th\",thr).each(function ( j ) {\n\t\t\tw = ts.p.colModel[j].width;\n\t\t\tif(ts.p.colModel[j].resizable === undefined) {ts.p.colModel[j].resizable = true;}\n\t\t\tif(ts.p.colModel[j].resizable){\n\t\t\t\tres = document.createElement(\"span\");\n\t\t\t\t$(res).html(\"&#160;\").addClass('ui-jqgrid-resize ui-jqgrid-resize-'+dir)\n\t\t\t\t.css(\"cursor\",\"col-resize\");\n\t\t\t\t$(this).addClass(ts.p.resizeclass);\n\t\t\t} else {\n\t\t\t\tres = \"\";\n\t\t\t}\n\t\t\t$(this).css(\"width\",w+\"px\").prepend(res);\n\t\t\tvar hdcol = \"\";\n\t\t\tif( ts.p.colModel[j].hidden ) {\n\t\t\t\t$(this).css(\"display\",\"none\");\n\t\t\t\thdcol = \"display:none;\";\n\t\t\t}\n\t\t\tfirstr += \"<td role='gridcell' style='height:0px;width:\"+w+\"px;\"+hdcol+\"'></td>\";\n\t\t\tgrid.headers[j] = { width: w, el: this };\n\t\t\tsort = ts.p.colModel[j].sortable;\n\t\t\tif( typeof sort !== 'boolean') {ts.p.colModel[j].sortable =  true; sort=true;}\n\t\t\tvar nm = ts.p.colModel[j].name;\n\t\t\tif( !(nm === 'cb' || nm==='subgrid' || nm==='rn') ) {\n\t\t\t\tif(ts.p.viewsortcols[2]){\n\t\t\t\t\t$(\">div\",this).addClass('ui-jqgrid-sortable');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(sort) {\n\t\t\t\tif(ts.p.multiSort) {\n\t\t\t\t\tif(ts.p.viewsortcols[0]) {\n\t\t\t\t\t\t$(\"div span.s-ico\",this).show(); \n\t\t\t\t\t\tif(ts.p.colModel[j].lso){ \n\t\t\t\t\t\t\t$(\"div span.ui-icon-\"+ts.p.colModel[j].lso,this).removeClass(\"ui-state-disabled\");\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if( ts.p.colModel[j].lso) {\n\t\t\t\t\t\t$(\"div span.s-ico\",this).show();\n\t\t\t\t\t\t$(\"div span.ui-icon-\"+ts.p.colModel[j].lso,this).removeClass(\"ui-state-disabled\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif(ts.p.viewsortcols[0]) {$(\"div span.s-ico\",this).show(); if(j===ts.p.lastsort){ $(\"div span.ui-icon-\"+ts.p.sortorder,this).removeClass(\"ui-state-disabled\");}}\n\t\t\t\t\telse if( j === ts.p.lastsort) {$(\"div span.s-ico\",this).show();$(\"div span.ui-icon-\"+ts.p.sortorder,this).removeClass(\"ui-state-disabled\");}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(ts.p.footerrow) { tfoot += \"<td role='gridcell' \"+formatCol(j,0,'', null, '', false)+\">&#160;</td>\"; }\n\t\t}).mousedown(function(e) {\n\t\t\tif ($(e.target).closest(\"th>span.ui-jqgrid-resize\").length !== 1) { return; }\n\t\t\tvar ci = getColumnHeaderIndex(this);\n\t\t\tif(ts.p.forceFit===true) {ts.p.nv= nextVisible(ci);}\n\t\t\tgrid.dragStart(ci, e, getOffset(ci));\n\t\t\treturn false;\n\t\t}).click(function(e) {\n\t\t\tif (ts.p.disableClick) {\n\t\t\t\tts.p.disableClick = false;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar s = \"th>div.ui-jqgrid-sortable\",r,d;\n\t\t\tif (!ts.p.viewsortcols[2]) { s = \"th>div>span>span.ui-grid-ico-sort\"; }\n\t\t\tvar t = $(e.target).closest(s);\n\t\t\tif (t.length !== 1) { return; }\n\t\t\tvar ci;\n\t\t\tif(ts.p.frozenColumns) {\n\t\t\t\tvar tid =  $(this)[0].id.substring(5);\n\t\t\t\t$(ts.p.colModel).each(function(i){\n\t\t\t\t\tif (this.name === tid) {\n\t\t\t\t\t\tci = i;return false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tci = getColumnHeaderIndex(this);\n\t\t\t}\n\t\t\tif (!ts.p.viewsortcols[2]) { r=true;d=t.attr(\"sort\"); }\n\t\t\tif(ci != null){\n\t\t\t\tsortData( $('div',this)[0].id, ci, r, d, this);\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\tif (ts.p.sortable && $.fn.sortable) {\n\t\t\ttry {\n\t\t\t\t$(ts).jqGrid(\"sortableColumns\", thr);\n\t\t\t} catch (e){}\n\t\t}\n\t\tif(ts.p.footerrow) { tfoot += \"</tr></tbody></table>\"; }\n\t\tfirstr += \"</tr>\";\n\t\ttbody = document.createElement(\"tbody\");\n\t\tthis.appendChild(tbody);\n\t\t$(this).addClass('ui-jqgrid-btable').append(firstr);\n\t\tfirstr = null;\n\t\tvar hTable = $(\"<table class='ui-jqgrid-htable' style='width:\"+ts.p.tblwidth+\"px' role='grid' aria-labelledby='gbox_\"+this.id+\"' cellspacing='0' cellpadding='0' border='0'></table>\").append(thead),\n\t\thg = (ts.p.caption && ts.p.hiddengrid===true) ? true : false,\n\t\thb = $(\"<div class='ui-jqgrid-hbox\" + (dir===\"rtl\" ? \"-rtl\" : \"\" )+\"'></div>\");\n\t\tthead = null;\n\t\tgrid.hDiv = document.createElement(\"div\");\n\t\t$(grid.hDiv)\n\t\t\t.css({ width: grid.width+\"px\"})\n\t\t\t.addClass(\"ui-state-default ui-jqgrid-hdiv\")\n\t\t\t.append(hb);\n\t\t$(hb).append(hTable);\n\t\thTable = null;\n\t\tif(hg) { $(grid.hDiv).hide(); }\n\t\tif(ts.p.pager){\n\t\t\t// TBD -- escape ts.p.pager here?\n\t\t\tif(typeof ts.p.pager === \"string\") {if(ts.p.pager.substr(0,1) !== \"#\") { ts.p.pager = \"#\"+ts.p.pager;} }\n\t\t\telse { ts.p.pager = \"#\"+ $(ts.p.pager).attr(\"id\");}\n\t\t\t$(ts.p.pager).css({width: grid.width+\"px\"}).addClass('ui-state-default ui-jqgrid-pager ui-corner-bottom').appendTo(eg);\n\t\t\tif(hg) {$(ts.p.pager).hide();}\n\t\t\tsetPager(ts.p.pager,'');\n\t\t}\n\t\tif( ts.p.cellEdit === false && ts.p.hoverrows === true) {\n\t\t$(ts).bind('mouseover',function(e) {\n\t\t\tptr = $(e.target).closest(\"tr.jqgrow\");\n\t\t\tif($(ptr).attr(\"class\") !== \"ui-subgrid\") {\n\t\t\t\t$(ptr).addClass(\"ui-state-hover\");\n\t\t\t}\n\t\t}).bind('mouseout',function(e) {\n\t\t\tptr = $(e.target).closest(\"tr.jqgrow\");\n\t\t\t$(ptr).removeClass(\"ui-state-hover\");\n\t\t});\n\t\t}\n\t\tvar ri,ci, tdHtml;\n\t\t$(ts).before(grid.hDiv).click(function(e) {\n\t\t\ttd = e.target;\n\t\t\tptr = $(td,ts.rows).closest(\"tr.jqgrow\");\n\t\t\tif($(ptr).length === 0 || ptr[0].className.indexOf( 'ui-state-disabled' ) > -1 || ($(td,ts).closest(\"table.ui-jqgrid-btable\").attr('id') || '').replace(\"_frozen\",\"\") !== ts.id ) {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tvar scb = $(td).hasClass(\"cbox\"),\n\t\t\tcSel = $(ts).triggerHandler(\"jqGridBeforeSelectRow\", [ptr[0].id, e]);\n\t\t\tcSel = (cSel === false || cSel === 'stop') ? false : true;\n\t\t\tif(cSel && $.isFunction(ts.p.beforeSelectRow)) { cSel = ts.p.beforeSelectRow.call(ts,ptr[0].id, e); }\n\t\t\tif (td.tagName === 'A' || ((td.tagName === 'INPUT' || td.tagName === 'TEXTAREA' || td.tagName === 'OPTION' || td.tagName === 'SELECT' ) && !scb) ) { return; }\n\t\t\tif(cSel === true) {\n\t\t\t\tri = ptr[0].id;\n\t\t\t\tci = $.jgrid.getCellIndex(td);\n\t\t\t\ttdHtml = $(td).closest(\"td,th\").html();\n\t\t\t\t$(ts).triggerHandler(\"jqGridCellSelect\", [ri,ci,tdHtml,e]);\n\t\t\t\tif($.isFunction(ts.p.onCellSelect)) {\n\t\t\t\t\tts.p.onCellSelect.call(ts,ri,ci,tdHtml,e);\n\t\t\t\t}\n\t\t\t\tif(ts.p.cellEdit === true) {\n\t\t\t\t\tif(ts.p.multiselect && scb){\n\t\t\t\t\t\t$(ts).jqGrid(\"setSelection\", ri ,true,e);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tri = ptr[0].rowIndex;\n\t\t\t\t\t\ttry {$(ts).jqGrid(\"editCell\",ri,ci,true);} catch (_) {}\n\t\t\t\t\t}\n\t\t\t\t} else if ( !ts.p.multikey ) {\n\t\t\t\t\tif(ts.p.multiselect && ts.p.multiboxonly) {\n\t\t\t\t\t\tif(scb){$(ts).jqGrid(\"setSelection\",ri,true,e);}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tvar frz = ts.p.frozenColumns ? ts.p.id+\"_frozen\" : \"\";\n\t\t\t\t\t\t\t$(ts.p.selarrrow).each(function(i,n){\n\t\t\t\t\t\t\t\tvar ind = ts.rows.namedItem(n);\n\t\t\t\t\t\t\t\t$(ind).removeClass(\"ui-state-highlight\");\n\t\t\t\t\t\t\t\t$(\"#jqg_\"+$.jgrid.jqID(ts.p.id)+\"_\"+$.jgrid.jqID(n))[ts.p.useProp ? 'prop': 'attr'](\"checked\", false);\n\t\t\t\t\t\t\t\tif(frz) {\n\t\t\t\t\t\t\t\t\t$(\"#\"+$.jgrid.jqID(n), \"#\"+$.jgrid.jqID(frz)).removeClass(\"ui-state-highlight\");\n\t\t\t\t\t\t\t\t\t$(\"#jqg_\"+$.jgrid.jqID(ts.p.id)+\"_\"+$.jgrid.jqID(n), \"#\"+$.jgrid.jqID(frz))[ts.p.useProp ? 'prop': 'attr'](\"checked\", false);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tts.p.selarrrow = [];\n\t\t\t\t\t\t\t$(ts).jqGrid(\"setSelection\",ri,true,e);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$(ts).jqGrid(\"setSelection\",ri,true,e);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif(e[ts.p.multikey]) {\n\t\t\t\t\t\t$(ts).jqGrid(\"setSelection\",ri,true,e);\n\t\t\t\t\t} else if(ts.p.multiselect && scb) {\n\t\t\t\t\t\tscb = $(\"#jqg_\"+$.jgrid.jqID(ts.p.id)+\"_\"+ri).is(\":checked\");\n\t\t\t\t\t\t$(\"#jqg_\"+$.jgrid.jqID(ts.p.id)+\"_\"+ri)[ts.p.useProp ? 'prop' : 'attr'](\"checked\", scb);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}).bind('reloadGrid', function(e,opts) {\n\t\t\tif(ts.p.treeGrid ===true) {\tts.p.datatype = ts.p.treedatatype;}\n\t\t\tif (opts && opts.current) {\n\t\t\t\tts.grid.selectionPreserver(ts);\n\t\t\t}\n\t\t\tif(ts.p.datatype===\"local\"){ $(ts).jqGrid(\"resetSelection\");  if(ts.p.data.length) { refreshIndex();} }\n\t\t\telse if(!ts.p.treeGrid) {\n\t\t\t\tts.p.selrow=null;\n\t\t\t\tif(ts.p.multiselect) {ts.p.selarrrow =[];setHeadCheckBox(false);}\n\t\t\t\tts.p.savedRow = [];\n\t\t\t}\n\t\t\tif(ts.p.scroll) {emptyRows.call(ts, true, false);}\n\t\t\tif (opts && opts.page) {\n\t\t\t\tvar page = opts.page;\n\t\t\t\tif (page > ts.p.lastpage) { page = ts.p.lastpage; }\n\t\t\t\tif (page < 1) { page = 1; }\n\t\t\t\tts.p.page = page;\n\t\t\t\tif (ts.grid.prevRowHeight) {\n\t\t\t\t\tts.grid.bDiv.scrollTop = (page - 1) * ts.grid.prevRowHeight * ts.p.rowNum;\n\t\t\t\t} else {\n\t\t\t\t\tts.grid.bDiv.scrollTop = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ts.grid.prevRowHeight && ts.p.scroll) {\n\t\t\t\tdelete ts.p.lastpage;\n\t\t\t\tts.grid.populateVisible();\n\t\t\t} else {\n\t\t\t\tts.grid.populate();\n\t\t\t}\n\t\t\tif(ts.p._inlinenav===true) {$(ts).jqGrid('showAddEditButtons');}\n\t\t\treturn false;\n\t\t})\n\t\t.dblclick(function(e) {\n\t\t\ttd = e.target;\n\t\t\tptr = $(td,ts.rows).closest(\"tr.jqgrow\");\n\t\t\tif($(ptr).length === 0 ){return;}\n\t\t\tri = ptr[0].rowIndex;\n\t\t\tci = $.jgrid.getCellIndex(td);\n\t\t\t$(ts).triggerHandler(\"jqGridDblClickRow\", [$(ptr).attr(\"id\"),ri,ci,e]);\n\t\t\tif ($.isFunction(ts.p.ondblClickRow)) { ts.p.ondblClickRow.call(ts,$(ptr).attr(\"id\"),ri,ci, e); }\n\t\t})\n\t\t.bind('contextmenu', function(e) {\n\t\t\ttd = e.target;\n\t\t\tptr = $(td,ts.rows).closest(\"tr.jqgrow\");\n\t\t\tif($(ptr).length === 0 ){return;}\n\t\t\tif(!ts.p.multiselect) {\t$(ts).jqGrid(\"setSelection\",ptr[0].id,true,e);\t}\n\t\t\tri = ptr[0].rowIndex;\n\t\t\tci = $.jgrid.getCellIndex(td);\n\t\t\t$(ts).triggerHandler(\"jqGridRightClickRow\", [$(ptr).attr(\"id\"),ri,ci,e]);\n\t\t\tif ($.isFunction(ts.p.onRightClickRow)) { ts.p.onRightClickRow.call(ts,$(ptr).attr(\"id\"),ri,ci, e); }\n\t\t});\n\t\tgrid.bDiv = document.createElement(\"div\");\n\t\tif(isMSIE) { if(String(ts.p.height).toLowerCase() === \"auto\") { ts.p.height = \"100%\"; } }\n\t\t$(grid.bDiv)\n\t\t\t.append($('<div style=\"position:relative;'+(isMSIE && $.jgrid.msiever() < 8 ? \"height:0.01%;\" : \"\")+'\"></div>').append('<div></div>').append(this))\n\t\t\t.addClass(\"ui-jqgrid-bdiv\")\n\t\t\t.css({ height: ts.p.height+(isNaN(ts.p.height)?\"\":\"px\"), width: (grid.width)+\"px\"})\n\t\t\t.scroll(grid.scrollGrid);\n\t\t$(\"table:first\",grid.bDiv).css({width:ts.p.tblwidth+\"px\"});\n\t\tif( !$.support.tbody ) { //IE\n\t\t\tif( $(\"tbody\",this).length === 2 ) { $(\"tbody:gt(0)\",this).remove();}\n\t\t}\n\t\tif(ts.p.multikey){\n\t\t\tif( $.jgrid.msie) {\n\t\t\t\t$(grid.bDiv).bind(\"selectstart\",function(){return false;});\n\t\t\t} else {\n\t\t\t\t$(grid.bDiv).bind(\"mousedown\",function(){return false;});\n\t\t\t}\n\t\t}\n\t\tif(hg) {$(grid.bDiv).hide();}\n\t\tgrid.cDiv = document.createElement(\"div\");\n\t\tvar arf = ts.p.hidegrid===true ? $(\"<a role='link' href='javascript:void(0)'/>\").addClass('ui-jqgrid-titlebar-close HeaderButton').hover(\n\t\t\tfunction(){ arf.addClass('ui-state-hover');},\n\t\t\tfunction() {arf.removeClass('ui-state-hover');})\n\t\t.append(\"<span class='ui-icon ui-icon-circle-triangle-n'></span>\").css((dir===\"rtl\"?\"left\":\"right\"),\"0px\") : \"\";\n\t\t$(grid.cDiv).append(arf).append(\"<span class='ui-jqgrid-title\"+(dir===\"rtl\" ? \"-rtl\" :\"\" )+\"'>\"+ts.p.caption+\"</span>\")\n\t\t.addClass(\"ui-jqgrid-titlebar ui-widget-header ui-corner-top ui-helper-clearfix\");\n\t\t$(grid.cDiv).insertBefore(grid.hDiv);\n\t\tif( ts.p.toolbar[0] ) {\n\t\t\tgrid.uDiv = document.createElement(\"div\");\n\t\t\tif(ts.p.toolbar[1] === \"top\") {$(grid.uDiv).insertBefore(grid.hDiv);}\n\t\t\telse if (ts.p.toolbar[1]===\"bottom\" ) {$(grid.uDiv).insertAfter(grid.hDiv);}\n\t\t\tif(ts.p.toolbar[1]===\"both\") {\n\t\t\t\tgrid.ubDiv = document.createElement(\"div\");\n\t\t\t\t$(grid.uDiv).addClass(\"ui-userdata ui-state-default\").attr(\"id\",\"t_\"+this.id).insertBefore(grid.hDiv);\n\t\t\t\t$(grid.ubDiv).addClass(\"ui-userdata ui-state-default\").attr(\"id\",\"tb_\"+this.id).insertAfter(grid.hDiv);\n\t\t\t\tif(hg)  {$(grid.ubDiv).hide();}\n\t\t\t} else {\n\t\t\t\t$(grid.uDiv).width(grid.width).addClass(\"ui-userdata ui-state-default\").attr(\"id\",\"t_\"+this.id);\n\t\t\t}\n\t\t\tif(hg) {$(grid.uDiv).hide();}\n\t\t}\n\t\tif(ts.p.toppager) {\n\t\t\tts.p.toppager = $.jgrid.jqID(ts.p.id)+\"_toppager\";\n\t\t\tgrid.topDiv = $(\"<div id='\"+ts.p.toppager+\"'></div>\")[0];\n\t\t\tts.p.toppager = \"#\"+ts.p.toppager;\n\t\t\t$(grid.topDiv).addClass('ui-state-default ui-jqgrid-toppager').width(grid.width).insertBefore(grid.hDiv);\n\t\t\tsetPager(ts.p.toppager,'_t');\n\t\t}\n\t\tif(ts.p.footerrow) {\n\t\t\tgrid.sDiv = $(\"<div class='ui-jqgrid-sdiv'></div>\")[0];\n\t\t\thb = $(\"<div class='ui-jqgrid-hbox\"+(dir===\"rtl\"?\"-rtl\":\"\")+\"'></div>\");\n\t\t\t$(grid.sDiv).append(hb).width(grid.width).insertAfter(grid.hDiv);\n\t\t\t$(hb).append(tfoot);\n\t\t\tgrid.footers = $(\".ui-jqgrid-ftable\",grid.sDiv)[0].rows[0].cells;\n\t\t\tif(ts.p.rownumbers) { grid.footers[0].className = 'ui-state-default jqgrid-rownum'; }\n\t\t\tif(hg) {$(grid.sDiv).hide();}\n\t\t}\n\t\thb = null;\n\t\tif(ts.p.caption) {\n\t\t\tvar tdt = ts.p.datatype;\n\t\t\tif(ts.p.hidegrid===true) {\n\t\t\t\t$(\".ui-jqgrid-titlebar-close\",grid.cDiv).click( function(e){\n\t\t\t\t\tvar onHdCl = $.isFunction(ts.p.onHeaderClick),\n\t\t\t\t\telems = \".ui-jqgrid-bdiv, .ui-jqgrid-hdiv, .ui-jqgrid-pager, .ui-jqgrid-sdiv\",\n\t\t\t\t\tcounter, self = this;\n\t\t\t\t\tif(ts.p.toolbar[0]===true) {\n\t\t\t\t\t\tif( ts.p.toolbar[1]==='both') {\n\t\t\t\t\t\t\telems += ', #' + $(grid.ubDiv).attr('id');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telems += ', #' + $(grid.uDiv).attr('id');\n\t\t\t\t\t}\n\t\t\t\t\tcounter = $(elems,\"#gview_\"+$.jgrid.jqID(ts.p.id)).length;\n\n\t\t\t\t\tif(ts.p.gridstate === 'visible') {\n\t\t\t\t\t\t$(elems,\"#gbox_\"+$.jgrid.jqID(ts.p.id)).slideUp(\"fast\", function() {\n\t\t\t\t\t\t\tcounter--;\n\t\t\t\t\t\t\tif (counter === 0) {\n\t\t\t\t\t\t\t\t$(\"span\",self).removeClass(\"ui-icon-circle-triangle-n\").addClass(\"ui-icon-circle-triangle-s\");\n\t\t\t\t\t\t\t\tts.p.gridstate = 'hidden';\n\t\t\t\t\t\t\t\tif($(\"#gbox_\"+$.jgrid.jqID(ts.p.id)).hasClass(\"ui-resizable\")) { $(\".ui-resizable-handle\",\"#gbox_\"+$.jgrid.jqID(ts.p.id)).hide(); }\n\t\t\t\t\t\t\t\t$(ts).triggerHandler(\"jqGridHeaderClick\", [ts.p.gridstate,e]);\n\t\t\t\t\t\t\t\tif(onHdCl) {if(!hg) {ts.p.onHeaderClick.call(ts,ts.p.gridstate,e);}}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if(ts.p.gridstate === 'hidden'){\n\t\t\t\t\t\t$(elems,\"#gbox_\"+$.jgrid.jqID(ts.p.id)).slideDown(\"fast\", function() {\n\t\t\t\t\t\t\tcounter--;\n\t\t\t\t\t\t\tif (counter === 0) {\n\t\t\t\t\t\t\t\t$(\"span\",self).removeClass(\"ui-icon-circle-triangle-s\").addClass(\"ui-icon-circle-triangle-n\");\n\t\t\t\t\t\t\t\tif(hg) {ts.p.datatype = tdt;populate();hg=false;}\n\t\t\t\t\t\t\t\tts.p.gridstate = 'visible';\n\t\t\t\t\t\t\t\tif($(\"#gbox_\"+$.jgrid.jqID(ts.p.id)).hasClass(\"ui-resizable\")) { $(\".ui-resizable-handle\",\"#gbox_\"+$.jgrid.jqID(ts.p.id)).show(); }\n\t\t\t\t\t\t\t\t$(ts).triggerHandler(\"jqGridHeaderClick\", [ts.p.gridstate,e]);\n\t\t\t\t\t\t\t\tif(onHdCl) {if(!hg) {ts.p.onHeaderClick.call(ts,ts.p.gridstate,e);}}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t\tif(hg) {ts.p.datatype=\"local\"; $(\".ui-jqgrid-titlebar-close\",grid.cDiv).trigger(\"click\");}\n\t\t\t}\n\t\t} else {$(grid.cDiv).hide();}\n\t\t$(grid.hDiv).after(grid.bDiv)\n\t\t.mousemove(function (e) {\n\t\t\tif(grid.resizing){grid.dragMove(e);return false;}\n\t\t});\n\t\t$(\".ui-jqgrid-labels\",grid.hDiv).bind(\"selectstart\", function () { return false; });\n\t\t$(document).mouseup(function () {\n\t\t\tif(grid.resizing) {\tgrid.dragEnd(); return false;}\n\t\t\treturn true;\n\t\t});\n\t\tts.formatCol = formatCol;\n\t\tts.sortData = sortData;\n\t\tts.updatepager = updatepager;\n\t\tts.refreshIndex = refreshIndex;\n\t\tts.setHeadCheckBox = setHeadCheckBox;\n\t\tts.constructTr = constructTr;\n\t\tts.formatter = function ( rowId, cellval , colpos, rwdat, act){return formatter(rowId, cellval , colpos, rwdat, act);};\n\t\t$.extend(grid,{populate : populate, emptyRows: emptyRows});\n\t\tthis.grid = grid;\n\t\tts.addXmlData = function(d) {addXmlData(d,ts.grid.bDiv);};\n\t\tts.addJSONData = function(d) {addJSONData(d,ts.grid.bDiv);};\n\t\tthis.grid.cols = this.rows[0].cells;\n\t\t$(ts).triggerHandler(\"jqGridInitGrid\");\n\t\tif ($.isFunction( ts.p.onInitGrid )) { ts.p.onInitGrid.call(ts); }\n\n\t\tpopulate();ts.p.hiddengrid=false;\n\t});\n};\n$.jgrid.extend({\n\tgetGridParam : function(pName) {\n\t\tvar $t = this[0];\n\t\tif (!$t || !$t.grid) {return;}\n\t\tif (!pName) { return $t.p; }\n\t\treturn $t.p[pName] !== undefined ? $t.p[pName] : null;\n\t},\n\tsetGridParam : function (newParams){\n\t\treturn this.each(function(){\n\t\t\tif (this.grid && typeof newParams === 'object') {$.extend(true,this.p,newParams);}\n\t\t});\n\t},\n\tgetDataIDs : function () {\n\t\tvar ids=[], i=0, len, j=0;\n\t\tthis.each(function(){\n\t\t\tlen = this.rows.length;\n\t\t\tif(len && len>0){\n\t\t\t\twhile(i<len) {\n\t\t\t\t\tif($(this.rows[i]).hasClass('jqgrow')) {\n\t\t\t\t\t\tids[j] = this.rows[i].id;\n\t\t\t\t\t\tj++;\n\t\t\t\t\t}\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn ids;\n\t},\n\tsetSelection : function(selection,onsr, e) {\n\t\treturn this.each(function(){\n\t\t\tvar $t = this, stat,pt, ner, ia, tpsr, fid;\n\t\t\tif(selection === undefined) { return; }\n\t\t\tonsr = onsr === false ? false : true;\n\t\t\tpt=$t.rows.namedItem(String(selection));\n\t\t\tif(!pt || !pt.className || pt.className.indexOf( 'ui-state-disabled' ) > -1 ) { return; }\n\t\t\tfunction scrGrid(iR){\n\t\t\t\tvar ch = $($t.grid.bDiv)[0].clientHeight,\n\t\t\t\tst = $($t.grid.bDiv)[0].scrollTop,\n\t\t\t\trpos = $($t.rows[iR]).position().top,\n\t\t\t\trh = $t.rows[iR].clientHeight;\n\t\t\t\tif(rpos+rh >= ch+st) { $($t.grid.bDiv)[0].scrollTop = rpos-(ch+st)+rh+st; }\n\t\t\t\telse if(rpos < ch+st) {\n\t\t\t\t\tif(rpos < st) {\n\t\t\t\t\t\t$($t.grid.bDiv)[0].scrollTop = rpos;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif($t.p.scrollrows===true) {\n\t\t\t\tner = $t.rows.namedItem(selection).rowIndex;\n\t\t\t\tif(ner >=0 ){\n\t\t\t\t\tscrGrid(ner);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif($t.p.frozenColumns === true ) {\n\t\t\t\tfid = $t.p.id+\"_frozen\";\n\t\t\t}\n\t\t\tif(!$t.p.multiselect) {\t\n\t\t\t\tif(pt.className !== \"ui-subgrid\") {\n\t\t\t\t\tif( $t.p.selrow !== pt.id) {\n\t\t\t\t\t\t$($t.rows.namedItem($t.p.selrow)).removeClass(\"ui-state-highlight\").attr({\"aria-selected\":\"false\", \"tabindex\" : \"-1\"});\n\t\t\t\t\t\t$(pt).addClass(\"ui-state-highlight\").attr({\"aria-selected\":\"true\", \"tabindex\" : \"0\"});//.focus();\n\t\t\t\t\t\tif(fid) {\n\t\t\t\t\t\t\t$(\"#\"+$.jgrid.jqID($t.p.selrow), \"#\"+$.jgrid.jqID(fid)).removeClass(\"ui-state-highlight\");\n\t\t\t\t\t\t\t$(\"#\"+$.jgrid.jqID(selection), \"#\"+$.jgrid.jqID(fid)).addClass(\"ui-state-highlight\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstat = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstat = false;\n\t\t\t\t\t}\n\t\t\t\t\t$t.p.selrow = pt.id;\n\t\t\t\t\tif( onsr ) { \n\t\t\t\t\t\t$($t).triggerHandler(\"jqGridSelectRow\", [pt.id, stat, e]);\n\t\t\t\t\t\tif( $t.p.onSelectRow) { $t.p.onSelectRow.call($t, pt.id, stat, e); }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t//unselect selectall checkbox when deselecting a specific row\n\t\t\t\t$t.setHeadCheckBox( false );\n\t\t\t\t$t.p.selrow = pt.id;\n\t\t\t\tia = $.inArray($t.p.selrow,$t.p.selarrrow);\n\t\t\t\tif (  ia === -1 ){\n\t\t\t\t\tif(pt.className !== \"ui-subgrid\") { $(pt).addClass(\"ui-state-highlight\").attr(\"aria-selected\",\"true\");}\n\t\t\t\t\tstat = true;\n\t\t\t\t\t$t.p.selarrrow.push($t.p.selrow);\n\t\t\t\t} else {\n\t\t\t\t\tif(pt.className !== \"ui-subgrid\") { $(pt).removeClass(\"ui-state-highlight\").attr(\"aria-selected\",\"false\");}\n\t\t\t\t\tstat = false;\n\t\t\t\t\t$t.p.selarrrow.splice(ia,1);\n\t\t\t\t\ttpsr = $t.p.selarrrow[0];\n\t\t\t\t\t$t.p.selrow = (tpsr === undefined) ? null : tpsr;\n\t\t\t\t}\n\t\t\t\t$(\"#jqg_\"+$.jgrid.jqID($t.p.id)+\"_\"+$.jgrid.jqID(pt.id))[$t.p.useProp ? 'prop': 'attr'](\"checked\",stat);\n\t\t\t\tif(fid) {\n\t\t\t\t\tif(ia === -1) {\n\t\t\t\t\t\t$(\"#\"+$.jgrid.jqID(selection), \"#\"+$.jgrid.jqID(fid)).addClass(\"ui-state-highlight\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$(\"#\"+$.jgrid.jqID(selection), \"#\"+$.jgrid.jqID(fid)).removeClass(\"ui-state-highlight\");\n\t\t\t\t\t}\n\t\t\t\t\t$(\"#jqg_\"+$.jgrid.jqID($t.p.id)+\"_\"+$.jgrid.jqID(selection), \"#\"+$.jgrid.jqID(fid))[$t.p.useProp ? 'prop': 'attr'](\"checked\",stat);\n\t\t\t\t}\n\t\t\t\tif( onsr ) {\n\t\t\t\t\t$($t).triggerHandler(\"jqGridSelectRow\", [pt.id, stat, e]);\n\t\t\t\t\tif( $t.p.onSelectRow) { $t.p.onSelectRow.call($t, pt.id , stat, e); }\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\tresetSelection : function( rowid ){\n\t\treturn this.each(function(){\n\t\t\tvar t = this, ind, sr, fid;\n\t\t\tif( t.p.frozenColumns === true ) {\n\t\t\t\tfid = t.p.id+\"_frozen\";\n\t\t\t}\n\t\t\tif(rowid !== undefined ) {\n\t\t\t\tsr = rowid === t.p.selrow ? t.p.selrow : rowid;\n\t\t\t\t$(\"#\"+$.jgrid.jqID(t.p.id)+\" tbody:first tr#\"+$.jgrid.jqID(sr)).removeClass(\"ui-state-highlight\").attr(\"aria-selected\",\"false\");\n\t\t\t\tif (fid) { $(\"#\"+$.jgrid.jqID(sr), \"#\"+$.jgrid.jqID(fid)).removeClass(\"ui-state-highlight\"); }\n\t\t\t\tif(t.p.multiselect) {\n\t\t\t\t\t$(\"#jqg_\"+$.jgrid.jqID(t.p.id)+\"_\"+$.jgrid.jqID(sr), \"#\"+$.jgrid.jqID(t.p.id))[t.p.useProp ? 'prop': 'attr'](\"checked\",false);\n\t\t\t\t\tif(fid) { $(\"#jqg_\"+$.jgrid.jqID(t.p.id)+\"_\"+$.jgrid.jqID(sr), \"#\"+$.jgrid.jqID(fid))[t.p.useProp ? 'prop': 'attr'](\"checked\",false); }\n\t\t\t\t\tt.setHeadCheckBox( false);\n\t\t\t\t}\n\t\t\t\tsr = null;\n\t\t\t} else if(!t.p.multiselect) {\n\t\t\t\tif(t.p.selrow) {\n\t\t\t\t\t$(\"#\"+$.jgrid.jqID(t.p.id)+\" tbody:first tr#\"+$.jgrid.jqID(t.p.selrow)).removeClass(\"ui-state-highlight\").attr(\"aria-selected\",\"false\");\n\t\t\t\t\tif(fid) { $(\"#\"+$.jgrid.jqID(t.p.selrow), \"#\"+$.jgrid.jqID(fid)).removeClass(\"ui-state-highlight\"); }\n\t\t\t\t\tt.p.selrow = null;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$(t.p.selarrrow).each(function(i,n){\n\t\t\t\t\tind = t.rows.namedItem(n);\n\t\t\t\t\t$(ind).removeClass(\"ui-state-highlight\").attr(\"aria-selected\",\"false\");\n\t\t\t\t\t$(\"#jqg_\"+$.jgrid.jqID(t.p.id)+\"_\"+$.jgrid.jqID(n))[t.p.useProp ? 'prop': 'attr'](\"checked\",false);\n\t\t\t\t\tif(fid) { \n\t\t\t\t\t\t$(\"#\"+$.jgrid.jqID(n), \"#\"+$.jgrid.jqID(fid)).removeClass(\"ui-state-highlight\"); \n\t\t\t\t\t\t$(\"#jqg_\"+$.jgrid.jqID(t.p.id)+\"_\"+$.jgrid.jqID(n), \"#\"+$.jgrid.jqID(fid))[t.p.useProp ? 'prop': 'attr'](\"checked\",false);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tt.setHeadCheckBox( false );\n\t\t\t\tt.p.selarrrow = [];\n\t\t\t}\n\t\t\tif(t.p.cellEdit === true) {\n\t\t\t\tif(parseInt(t.p.iCol,10)>=0  && parseInt(t.p.iRow,10)>=0) {\n\t\t\t\t\t$(\"td:eq(\"+t.p.iCol+\")\",t.rows[t.p.iRow]).removeClass(\"edit-cell ui-state-highlight\");\n\t\t\t\t\t$(t.rows[t.p.iRow]).removeClass(\"selected-row ui-state-hover\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tt.p.savedRow = [];\n\t\t});\n\t},\n\tgetRowData : function( rowid ) {\n\t\tvar res = {}, resall, getall=false, len, j=0;\n\t\tthis.each(function(){\n\t\t\tvar $t = this,nm,ind;\n\t\t\tif(rowid === undefined) {\n\t\t\t\tgetall = true;\n\t\t\t\tresall = [];\n\t\t\t\tlen = $t.rows.length;\n\t\t\t} else {\n\t\t\t\tind = $t.rows.namedItem(rowid);\n\t\t\t\tif(!ind) { return res; }\n\t\t\t\tlen = 2;\n\t\t\t}\n\t\t\twhile(j<len){\n\t\t\t\tif(getall) { ind = $t.rows[j]; }\n\t\t\t\tif( $(ind).hasClass('jqgrow') ) {\n\t\t\t\t\t$('td[role=\"gridcell\"]',ind).each( function(i) {\n\t\t\t\t\t\tnm = $t.p.colModel[i].name;\n\t\t\t\t\t\tif ( nm !== 'cb' && nm !== 'subgrid' && nm !== 'rn') {\n\t\t\t\t\t\t\tif($t.p.treeGrid===true && nm === $t.p.ExpandColumn) {\n\t\t\t\t\t\t\t\tres[nm] = $.jgrid.htmlDecode($(\"span:first\",this).html());\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tres[nm] = $.unformat.call($t,this,{rowId:ind.id, colModel:$t.p.colModel[i]},i);\n\t\t\t\t\t\t\t\t} catch (e){\n\t\t\t\t\t\t\t\t\tres[nm] = $.jgrid.htmlDecode($(this).html());\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tif(getall) { resall.push(res); res={}; }\n\t\t\t\t}\n\t\t\t\tj++;\n\t\t\t}\n\t\t});\n\t\treturn resall || res;\n\t},\n\tdelRowData : function(rowid) {\n\t\tvar success = false, rowInd, ia;\n\t\tthis.each(function() {\n\t\t\tvar $t = this;\n\t\t\trowInd = $t.rows.namedItem(rowid);\n\t\t\tif(!rowInd) {return false;}\n\t\t\t\t$(rowInd).remove();\n\t\t\t\t$t.p.records--;\n\t\t\t\t$t.p.reccount--;\n\t\t\t\t$t.updatepager(true,false);\n\t\t\t\tsuccess=true;\n\t\t\t\tif($t.p.multiselect) {\n\t\t\t\t\tia = $.inArray(rowid,$t.p.selarrrow);\n\t\t\t\t\tif(ia !== -1) { $t.p.selarrrow.splice(ia,1);}\n\t\t\t\t}\n\t\t\t\tif ($t.p.multiselect && $t.p.selarrrow.length > 0) {\n\t\t\t\t\t$t.p.selrow = $t.p.selarrrow[$t.p.selarrrow.length-1];\n\t\t\t\t} else {\n\t\t\t\t\t$t.p.selrow = null;\n\t\t\t\t}\n\t\t\tif($t.p.datatype === 'local') {\n\t\t\t\tvar id = $.jgrid.stripPref($t.p.idPrefix, rowid),\n\t\t\t\tpos = $t.p._index[id];\n\t\t\t\tif(pos !== undefined) {\n\t\t\t\t\t$t.p.data.splice(pos,1);\n\t\t\t\t\t$t.refreshIndex();\n\t\t\t\t}\n\t\t\t}\n\t\t\tif( $t.p.altRows === true && success ) {\n\t\t\t\tvar cn = $t.p.altclass;\n\t\t\t\t$($t.rows).each(function(i){\n\t\t\t\t\tif(i % 2 === 1) { $(this).addClass(cn); }\n\t\t\t\t\telse { $(this).removeClass(cn); }\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\treturn success;\n\t},\n\tsetRowData : function(rowid, data, cssp) {\n\t\tvar nm, success=true, title;\n\t\tthis.each(function(){\n\t\t\tif(!this.grid) {return false;}\n\t\t\tvar t = this, vl, ind, cp = typeof cssp, lcdata={};\n\t\t\tind = t.rows.namedItem(rowid);\n\t\t\tif(!ind) { return false; }\n\t\t\tif( data ) {\n\t\t\t\ttry {\n\t\t\t\t\t$(this.p.colModel).each(function(i){\n\t\t\t\t\t\tnm = this.name;\n\t\t\t\t\t\tvar dval =$.jgrid.getAccessor(data,nm);\n\t\t\t\t\t\tif( dval !== undefined) {\n\t\t\t\t\t\t\tlcdata[nm] = this.formatter && typeof this.formatter === 'string' && this.formatter === 'date' ? $.unformat.date.call(t,dval,this) : dval;\n\t\t\t\t\t\t\tvl = t.formatter( rowid, dval, i, data, 'edit');\n\t\t\t\t\t\t\ttitle = this.title ? {\"title\":$.jgrid.stripHtml(vl)} : {};\n\t\t\t\t\t\t\tif(t.p.treeGrid===true && nm === t.p.ExpandColumn) {\n\t\t\t\t\t\t\t\t$(\"td[role='gridcell']:eq(\"+i+\") > span:first\",ind).html(vl).attr(title);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$(\"td[role='gridcell']:eq(\"+i+\")\",ind).html(vl).attr(title);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tif(t.p.datatype === 'local') {\n\t\t\t\t\t\tvar id = $.jgrid.stripPref(t.p.idPrefix, rowid),\n\t\t\t\t\t\tpos = t.p._index[id], key;\n\t\t\t\t\t\tif(t.p.treeGrid) {\n\t\t\t\t\t\t\tfor(key in t.p.treeReader){\n\t\t\t\t\t\t\t\tif(t.p.treeReader.hasOwnProperty(key)) {\n\t\t\t\t\t\t\t\t\tdelete lcdata[t.p.treeReader[key]];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(pos !== undefined) {\n\t\t\t\t\t\t\tt.p.data[pos] = $.extend(true, t.p.data[pos], lcdata);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlcdata = null;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tsuccess = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(success) {\n\t\t\t\tif(cp === 'string') {$(ind).addClass(cssp);} else if(cp === 'object') {$(ind).css(cssp);}\n\t\t\t\t$(t).triggerHandler(\"jqGridAfterGridComplete\");\n\t\t\t}\n\t\t});\n\t\treturn success;\n\t},\n\taddRowData : function(rowid,rdata,pos,src) {\n\t\tif(!pos) {pos = \"last\";}\n\t\tvar success = false, nm, row, gi, si, ni,sind, i, v, prp=\"\", aradd, cnm, cn, data, cm, id;\n\t\tif(rdata) {\n\t\t\tif($.isArray(rdata)) {\n\t\t\t\taradd=true;\n\t\t\t\tpos = \"last\";\n\t\t\t\tcnm = rowid;\n\t\t\t} else {\n\t\t\t\trdata = [rdata];\n\t\t\t\taradd = false;\n\t\t\t}\n\t\t\tthis.each(function() {\n\t\t\t\tvar t = this, datalen = rdata.length;\n\t\t\t\tni = t.p.rownumbers===true ? 1 :0;\n\t\t\t\tgi = t.p.multiselect ===true ? 1 :0;\n\t\t\t\tsi = t.p.subGrid===true ? 1 :0;\n\t\t\t\tif(!aradd) {\n\t\t\t\t\tif(rowid !== undefined) { rowid = String(rowid);}\n\t\t\t\t\telse {\n\t\t\t\t\t\trowid = $.jgrid.randId();\n\t\t\t\t\t\tif(t.p.keyIndex !== false) {\n\t\t\t\t\t\t\tcnm = t.p.colModel[t.p.keyIndex+gi+si+ni].name;\n\t\t\t\t\t\t\tif(rdata[0][cnm] !== undefined) { rowid = rdata[0][cnm]; }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcn = t.p.altclass;\n\t\t\t\tvar k = 0, cna =\"\", lcdata = {},\n\t\t\t\tair = $.isFunction(t.p.afterInsertRow) ? true : false;\n\t\t\t\twhile(k < datalen) {\n\t\t\t\t\tdata = rdata[k];\n\t\t\t\t\trow=[];\n\t\t\t\t\tif(aradd) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\trowid = data[cnm];\n\t\t\t\t\t\t\tif(rowid===undefined) {\n\t\t\t\t\t\t\t\trowid = $.jgrid.randId();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch (e) {rowid = $.jgrid.randId();}\n\t\t\t\t\t\tcna = t.p.altRows === true ?  (t.rows.length-1)%2 === 0 ? cn : \"\" : \"\";\n\t\t\t\t\t}\n\t\t\t\t\tid = rowid;\n\t\t\t\t\trowid  = t.p.idPrefix + rowid;\n\t\t\t\t\tif(ni){\n\t\t\t\t\t\tprp = t.formatCol(0,1,'',null,rowid, true);\n\t\t\t\t\t\trow[row.length] = \"<td role=\\\"gridcell\\\" class=\\\"ui-state-default jqgrid-rownum\\\" \"+prp+\">0</td>\";\n\t\t\t\t\t}\n\t\t\t\t\tif(gi) {\n\t\t\t\t\t\tv = \"<input role=\\\"checkbox\\\" type=\\\"checkbox\\\"\"+\" id=\\\"jqg_\"+t.p.id+\"_\"+rowid+\"\\\" class=\\\"cbox\\\"/>\";\n\t\t\t\t\t\tprp = t.formatCol(ni,1,'', null, rowid, true);\n\t\t\t\t\t\trow[row.length] = \"<td role=\\\"gridcell\\\" \"+prp+\">\"+v+\"</td>\";\n\t\t\t\t\t}\n\t\t\t\t\tif(si) {\n\t\t\t\t\t\trow[row.length] = $(t).jqGrid(\"addSubGridCell\",gi+ni,1);\n\t\t\t\t\t}\n\t\t\t\t\tfor(i = gi+si+ni; i < t.p.colModel.length;i++){\n\t\t\t\t\t\tcm = t.p.colModel[i];\n\t\t\t\t\t\tnm = cm.name;\n\t\t\t\t\t\tlcdata[nm] = data[nm];\n\t\t\t\t\t\tv = t.formatter( rowid, $.jgrid.getAccessor(data,nm), i, data );\n\t\t\t\t\t\tprp = t.formatCol(i,1,v, data, rowid, lcdata);\n\t\t\t\t\t\trow[row.length] = \"<td role=\\\"gridcell\\\" \"+prp+\">\"+v+\"</td>\";\n\t\t\t\t\t}\n\t\t\t\t\trow.unshift( t.constructTr(rowid, false, cna, lcdata, data, false ) );\n\t\t\t\t\trow[row.length] = \"</tr>\";\n\t\t\t\t\tif(t.rows.length === 0){\n\t\t\t\t\t\t$(\"table:first\",t.grid.bDiv).append(row.join(''));\n\t\t\t\t\t} else {\n\t\t\t\t\tswitch (pos) {\n\t\t\t\t\t\tcase 'last':\n\t\t\t\t\t\t\t$(t.rows[t.rows.length-1]).after(row.join(''));\n\t\t\t\t\t\t\tsind = t.rows.length-1;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'first':\n\t\t\t\t\t\t\t$(t.rows[0]).after(row.join(''));\n\t\t\t\t\t\t\tsind = 1;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'after':\n\t\t\t\t\t\t\tsind = t.rows.namedItem(src);\n\t\t\t\t\t\t\tif (sind) {\n\t\t\t\t\t\t\t\tif($(t.rows[sind.rowIndex+1]).hasClass(\"ui-subgrid\")) { $(t.rows[sind.rowIndex+1]).after(row); }\n\t\t\t\t\t\t\t\telse { $(sind).after(row.join('')); }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsind++;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'before':\n\t\t\t\t\t\t\tsind = t.rows.namedItem(src);\n\t\t\t\t\t\t\tif(sind) {$(sind).before(row.join(''));sind=sind.rowIndex;}\n\t\t\t\t\t\t\tsind--;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(t.p.subGrid===true) {\n\t\t\t\t\t\t$(t).jqGrid(\"addSubGrid\",gi+ni, sind);\n\t\t\t\t\t}\n\t\t\t\t\tt.p.records++;\n\t\t\t\t\tt.p.reccount++;\n\t\t\t\t\t$(t).triggerHandler(\"jqGridAfterInsertRow\", [rowid,data,data]);\n\t\t\t\t\tif(air) { t.p.afterInsertRow.call(t,rowid,data,data); }\n\t\t\t\t\tk++;\n\t\t\t\t\tif(t.p.datatype === 'local') {\n\t\t\t\t\t\tlcdata[t.p.localReader.id] = id;\n\t\t\t\t\t\tt.p._index[id] = t.p.data.length;\n\t\t\t\t\t\tt.p.data.push(lcdata);\n\t\t\t\t\t\tlcdata = {};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif( t.p.altRows === true && !aradd) {\n\t\t\t\t\tif (pos === \"last\") {\n\t\t\t\t\t\tif ((t.rows.length-1)%2 === 1)  {$(t.rows[t.rows.length-1]).addClass(cn);}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$(t.rows).each(function(i){\n\t\t\t\t\t\t\tif(i % 2 ===1) { $(this).addClass(cn); }\n\t\t\t\t\t\t\telse { $(this).removeClass(cn); }\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tt.updatepager(true,true);\n\t\t\t\tsuccess = true;\n\t\t\t});\n\t\t}\n\t\treturn success;\n\t},\n\tfooterData : function(action,data, format) {\n\t\tvar nm, success=false, res={}, title;\n\t\tfunction isEmpty(obj) {\n\t\t\tvar i;\n\t\t\tfor(i in obj) {\n\t\t\t\tif (obj.hasOwnProperty(i)) { return false; }\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tif(action === undefined) { action = \"get\"; }\n\t\tif(typeof format !== \"boolean\") { format  = true; }\n\t\taction = action.toLowerCase();\n\t\tthis.each(function(){\n\t\t\tvar t = this, vl;\n\t\t\tif(!t.grid || !t.p.footerrow) {return false;}\n\t\t\tif(action === \"set\") { if(isEmpty(data)) { return false; } }\n\t\t\tsuccess=true;\n\t\t\t$(this.p.colModel).each(function(i){\n\t\t\t\tnm = this.name;\n\t\t\t\tif(action === \"set\") {\n\t\t\t\t\tif( data[nm] !== undefined) {\n\t\t\t\t\t\tvl = format ? t.formatter( \"\", data[nm], i, data, 'edit') : data[nm];\n\t\t\t\t\t\ttitle = this.title ? {\"title\":$.jgrid.stripHtml(vl)} : {};\n\t\t\t\t\t\t$(\"tr.footrow td:eq(\"+i+\")\",t.grid.sDiv).html(vl).attr(title);\n\t\t\t\t\t\tsuccess = true;\n\t\t\t\t\t}\n\t\t\t\t} else if(action === \"get\") {\n\t\t\t\t\tres[nm] = $(\"tr.footrow td:eq(\"+i+\")\",t.grid.sDiv).html();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\treturn action === \"get\" ? res : success;\n\t},\n\tshowHideCol : function(colname,show) {\n\t\treturn this.each(function() {\n\t\t\tvar $t = this, fndh=false, brd=$.jgrid.cell_width ? 0: $t.p.cellLayout, cw;\n\t\t\tif (!$t.grid ) {return;}\n\t\t\tif( typeof colname === 'string') {colname=[colname];}\n\t\t\tshow = show !== \"none\" ? \"\" : \"none\";\n\t\t\tvar sw = show === \"\" ? true :false,\n\t\t\tgh = $t.p.groupHeader && (typeof $t.p.groupHeader === 'object' || $.isFunction($t.p.groupHeader) );\n\t\t\tif(gh) { $($t).jqGrid('destroyGroupHeader', false); }\n\t\t\t$(this.p.colModel).each(function(i) {\n\t\t\t\tif ($.inArray(this.name,colname) !== -1 && this.hidden === sw) {\n\t\t\t\t\tif($t.p.frozenColumns === true && this.frozen === true) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\t$(\"tr\",$t.grid.hDiv).each(function(){\n\t\t\t\t\t\t$(this.cells[i]).css(\"display\", show);\n\t\t\t\t\t});\n\t\t\t\t\t$($t.rows).each(function(){\n\t\t\t\t\t\tif (!$(this).hasClass(\"jqgroup\")) {\n\t\t\t\t\t\t\t$(this.cells[i]).css(\"display\", show);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tif($t.p.footerrow) { $(\"tr.footrow td:eq(\"+i+\")\", $t.grid.sDiv).css(\"display\", show); }\n\t\t\t\t\tcw =  parseInt(this.width,10);\n\t\t\t\t\tif(show === \"none\") {\n\t\t\t\t\t\t$t.p.tblwidth -= cw+brd;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$t.p.tblwidth += cw+brd;\n\t\t\t\t\t}\n\t\t\t\t\tthis.hidden = !sw;\n\t\t\t\t\tfndh=true;\n\t\t\t\t\t$($t).triggerHandler(\"jqGridShowHideCol\", [sw,this.name,i]);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(fndh===true) {\n\t\t\t\tif($t.p.shrinkToFit === true && !isNaN($t.p.height)) { $t.p.tblwidth += parseInt($t.p.scrollOffset,10);}\n\t\t\t\t$($t).jqGrid(\"setGridWidth\",$t.p.shrinkToFit === true ? $t.p.tblwidth : $t.p.width );\n\t\t\t}\n\t\t\tif( gh )  {\n\t\t\t\t$($t).jqGrid('setGroupHeaders',$t.p.groupHeader);\n\t\t\t}\n\t\t});\n\t},\n\thideCol : function (colname) {\n\t\treturn this.each(function(){$(this).jqGrid(\"showHideCol\",colname,\"none\");});\n\t},\n\tshowCol : function(colname) {\n\t\treturn this.each(function(){$(this).jqGrid(\"showHideCol\",colname,\"\");});\n\t},\n\tremapColumns : function(permutation, updateCells, keepHeader)\n\t{\n\t\tfunction resortArray(a) {\n\t\t\tvar ac;\n\t\t\tif (a.length) {\n\t\t\t\tac = $.makeArray(a);\n\t\t\t} else {\n\t\t\t\tac = $.extend({}, a);\n\t\t\t}\n\t\t\t$.each(permutation, function(i) {\n\t\t\t\ta[i] = ac[this];\n\t\t\t});\n\t\t}\n\t\tvar ts = this.get(0);\n\t\tfunction resortRows(parent, clobj) {\n\t\t\t$(\">tr\"+(clobj||\"\"), parent).each(function() {\n\t\t\t\tvar row = this;\n\t\t\t\tvar elems = $.makeArray(row.cells);\n\t\t\t\t$.each(permutation, function() {\n\t\t\t\t\tvar e = elems[this];\n\t\t\t\t\tif (e) {\n\t\t\t\t\t\trow.appendChild(e);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\tresortArray(ts.p.colModel);\n\t\tresortArray(ts.p.colNames);\n\t\tresortArray(ts.grid.headers);\n\t\tresortRows($(\"thead:first\", ts.grid.hDiv), keepHeader && \":not(.ui-jqgrid-labels)\");\n\t\tif (updateCells) {\n\t\t\tresortRows($(\"#\"+$.jgrid.jqID(ts.p.id)+\" tbody:first\"), \".jqgfirstrow, tr.jqgrow, tr.jqfoot\");\n\t\t}\n\t\tif (ts.p.footerrow) {\n\t\t\tresortRows($(\"tbody:first\", ts.grid.sDiv));\n\t\t}\n\t\tif (ts.p.remapColumns) {\n\t\t\tif (!ts.p.remapColumns.length){\n\t\t\t\tts.p.remapColumns = $.makeArray(permutation);\n\t\t\t} else {\n\t\t\t\tresortArray(ts.p.remapColumns);\n\t\t\t}\n\t\t}\n\t\tts.p.lastsort = $.inArray(ts.p.lastsort, permutation);\n\t\tif(ts.p.treeGrid) { ts.p.expColInd = $.inArray(ts.p.expColInd, permutation); }\n\t\t$(ts).triggerHandler(\"jqGridRemapColumns\", [permutation, updateCells, keepHeader]);\n\t},\n\tsetGridWidth : function(nwidth, shrink) {\n\t\treturn this.each(function(){\n\t\t\tif (!this.grid ) {return;}\n\t\t\tvar $t = this, cw,\n\t\t\tinitwidth = 0, brd=$.jgrid.cell_width ? 0: $t.p.cellLayout, lvc, vc=0, hs=false, scw=$t.p.scrollOffset, aw, gw=0, cr;\n\t\t\tif(typeof shrink !== 'boolean') {\n\t\t\t\tshrink=$t.p.shrinkToFit;\n\t\t\t}\n\t\t\tif(isNaN(nwidth)) {return;}\n\t\t\tnwidth = parseInt(nwidth,10); \n\t\t\t$t.grid.width = $t.p.width = nwidth;\n\t\t\t$(\"#gbox_\"+$.jgrid.jqID($t.p.id)).css(\"width\",nwidth+\"px\");\n\t\t\t$(\"#gview_\"+$.jgrid.jqID($t.p.id)).css(\"width\",nwidth+\"px\");\n\t\t\t$($t.grid.bDiv).css(\"width\",nwidth+\"px\");\n\t\t\t$($t.grid.hDiv).css(\"width\",nwidth+\"px\");\n\t\t\tif($t.p.pager ) {$($t.p.pager).css(\"width\",nwidth+\"px\");}\n\t\t\tif($t.p.toppager ) {$($t.p.toppager).css(\"width\",nwidth+\"px\");}\n\t\t\tif($t.p.toolbar[0] === true){\n\t\t\t\t$($t.grid.uDiv).css(\"width\",nwidth+\"px\");\n\t\t\t\tif($t.p.toolbar[1]===\"both\") {$($t.grid.ubDiv).css(\"width\",nwidth+\"px\");}\n\t\t\t}\n\t\t\tif($t.p.footerrow) { $($t.grid.sDiv).css(\"width\",nwidth+\"px\"); }\n\t\t\tif(shrink ===false && $t.p.forceFit === true) {$t.p.forceFit=false;}\n\t\t\tif(shrink===true) {\n\t\t\t\t$.each($t.p.colModel, function() {\n\t\t\t\t\tif(this.hidden===false){\n\t\t\t\t\t\tcw = this.widthOrg;\n\t\t\t\t\t\tinitwidth += cw+brd;\n\t\t\t\t\t\tif(this.fixed) {\n\t\t\t\t\t\t\tgw += cw+brd;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvc++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(vc  === 0) { return; }\n\t\t\t\t$t.p.tblwidth = initwidth;\n\t\t\t\taw = nwidth-brd*vc-gw;\n\t\t\t\tif(!isNaN($t.p.height)) {\n\t\t\t\t\tif($($t.grid.bDiv)[0].clientHeight < $($t.grid.bDiv)[0].scrollHeight || $t.rows.length === 1){\n\t\t\t\t\t\ths = true;\n\t\t\t\t\t\taw -= scw;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tinitwidth =0;\n\t\t\t\tvar cle = $t.grid.cols.length >0;\n\t\t\t\t$.each($t.p.colModel, function(i) {\n\t\t\t\t\tif(this.hidden === false && !this.fixed){\n\t\t\t\t\t\tcw = this.widthOrg;\n\t\t\t\t\t\tcw = Math.round(aw*cw/($t.p.tblwidth-brd*vc-gw));\n\t\t\t\t\t\tif (cw < 0) { return; }\n\t\t\t\t\t\tthis.width =cw;\n\t\t\t\t\t\tinitwidth += cw;\n\t\t\t\t\t\t$t.grid.headers[i].width=cw;\n\t\t\t\t\t\t$t.grid.headers[i].el.style.width=cw+\"px\";\n\t\t\t\t\t\tif($t.p.footerrow) { $t.grid.footers[i].style.width = cw+\"px\"; }\n\t\t\t\t\t\tif(cle) { $t.grid.cols[i].style.width = cw+\"px\"; }\n\t\t\t\t\t\tlvc = i;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (!lvc) { return; }\n\n\t\t\t\tcr =0;\n\t\t\t\tif (hs) {\n\t\t\t\t\tif(nwidth-gw-(initwidth+brd*vc) !== scw){\n\t\t\t\t\t\tcr = nwidth-gw-(initwidth+brd*vc)-scw;\n\t\t\t\t\t}\n\t\t\t\t} else if( Math.abs(nwidth-gw-(initwidth+brd*vc)) !== 1) {\n\t\t\t\t\tcr = nwidth-gw-(initwidth+brd*vc);\n\t\t\t\t}\n\t\t\t\t$t.p.colModel[lvc].width += cr;\n\t\t\t\t$t.p.tblwidth = initwidth+cr+brd*vc+gw;\n\t\t\t\tif($t.p.tblwidth > nwidth) {\n\t\t\t\t\tvar delta = $t.p.tblwidth - parseInt(nwidth,10);\n\t\t\t\t\t$t.p.tblwidth = nwidth;\n\t\t\t\t\tcw = $t.p.colModel[lvc].width = $t.p.colModel[lvc].width-delta;\n\t\t\t\t} else {\n\t\t\t\t\tcw= $t.p.colModel[lvc].width;\n\t\t\t\t}\n\t\t\t\t$t.grid.headers[lvc].width = cw;\n\t\t\t\t$t.grid.headers[lvc].el.style.width=cw+\"px\";\n\t\t\t\tif(cle) { $t.grid.cols[lvc].style.width = cw+\"px\"; }\n\t\t\t\tif($t.p.footerrow) {\n\t\t\t\t\t$t.grid.footers[lvc].style.width = cw+\"px\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif($t.p.tblwidth) {\n\t\t\t\t$('table:first',$t.grid.bDiv).css(\"width\",$t.p.tblwidth+\"px\");\n\t\t\t\t$('table:first',$t.grid.hDiv).css(\"width\",$t.p.tblwidth+\"px\");\n\t\t\t\t$t.grid.hDiv.scrollLeft = $t.grid.bDiv.scrollLeft;\n\t\t\t\tif($t.p.footerrow) {\n\t\t\t\t\t$('table:first',$t.grid.sDiv).css(\"width\",$t.p.tblwidth+\"px\");\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\tsetGridHeight : function (nh) {\n\t\treturn this.each(function (){\n\t\t\tvar $t = this;\n\t\t\tif(!$t.grid) {return;}\n\t\t\tvar bDiv = $($t.grid.bDiv);\n\t\t\tbDiv.css({height: nh+(isNaN(nh)?\"\":\"px\")});\n\t\t\tif($t.p.frozenColumns === true){\n\t\t\t\t//follow the original set height to use 16, better scrollbar width detection\n\t\t\t\t$('#'+$.jgrid.jqID($t.p.id)+\"_frozen\").parent().height(bDiv.height() - 16);\n\t\t\t}\n\t\t\t$t.p.height = nh;\n\t\t\tif ($t.p.scroll) { $t.grid.populateVisible(); }\n\t\t});\n\t},\n\tsetCaption : function (newcap){\n\t\treturn this.each(function(){\n\t\t\tthis.p.caption=newcap;\n\t\t\t$(\"span.ui-jqgrid-title, span.ui-jqgrid-title-rtl\",this.grid.cDiv).html(newcap);\n\t\t\t$(this.grid.cDiv).show();\n\t\t});\n\t},\n\tsetLabel : function(colname, nData, prop, attrp ){\n\t\treturn this.each(function(){\n\t\t\tvar $t = this, pos=-1;\n\t\t\tif(!$t.grid) {return;}\n\t\t\tif(colname !== undefined) {\n\t\t\t\t$($t.p.colModel).each(function(i){\n\t\t\t\t\tif (this.name === colname) {\n\t\t\t\t\t\tpos = i;return false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else { return; }\n\t\t\tif(pos>=0) {\n\t\t\t\tvar thecol = $(\"tr.ui-jqgrid-labels th:eq(\"+pos+\")\",$t.grid.hDiv);\n\t\t\t\tif (nData){\n\t\t\t\t\tvar ico = $(\".s-ico\",thecol);\n\t\t\t\t\t$(\"[id^=jqgh_]\",thecol).empty().html(nData).append(ico);\n\t\t\t\t\t$t.p.colNames[pos] = nData;\n\t\t\t\t}\n\t\t\t\tif (prop) {\n\t\t\t\t\tif(typeof prop === 'string') {$(thecol).addClass(prop);} else {$(thecol).css(prop);}\n\t\t\t\t}\n\t\t\t\tif(typeof attrp === 'object') {$(thecol).attr(attrp);}\n\t\t\t}\n\t\t});\n\t},\n\tsetCell : function(rowid,colname,nData,cssp,attrp, forceupd) {\n\t\treturn this.each(function(){\n\t\t\tvar $t = this, pos =-1,v, title;\n\t\t\tif(!$t.grid) {return;}\n\t\t\tif(isNaN(colname)) {\n\t\t\t\t$($t.p.colModel).each(function(i){\n\t\t\t\t\tif (this.name === colname) {\n\t\t\t\t\t\tpos = i;return false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {pos = parseInt(colname,10);}\n\t\t\tif(pos>=0) {\n\t\t\t\tvar ind = $t.rows.namedItem(rowid);\n\t\t\t\tif (ind){\n\t\t\t\t\tvar tcell = $(\"td:eq(\"+pos+\")\",ind);\n\t\t\t\t\tif(nData !== \"\" || forceupd === true) {\n\t\t\t\t\t\tv = $t.formatter(rowid, nData, pos,ind,'edit');\n\t\t\t\t\t\ttitle = $t.p.colModel[pos].title ? {\"title\":$.jgrid.stripHtml(v)} : {};\n\t\t\t\t\t\tif($t.p.treeGrid && $(\".tree-wrap\",$(tcell)).length>0) {\n\t\t\t\t\t\t\t$(\"span\",$(tcell)).html(v).attr(title);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$(tcell).html(v).attr(title);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif($t.p.datatype === \"local\") {\n\t\t\t\t\t\t\tvar cm = $t.p.colModel[pos], index;\n\t\t\t\t\t\t\tnData = cm.formatter && typeof cm.formatter === 'string' && cm.formatter === 'date' ? $.unformat.date.call($t,nData,cm) : nData;\n\t\t\t\t\t\t\tindex = $t.p._index[$.jgrid.stripPref($t.p.idPrefix, rowid)];\n\t\t\t\t\t\t\tif(index !== undefined) {\n\t\t\t\t\t\t\t\t$t.p.data[index][cm.name] = nData;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(typeof cssp === 'string'){\n\t\t\t\t\t\t$(tcell).addClass(cssp);\n\t\t\t\t\t} else if(cssp) {\n\t\t\t\t\t\t$(tcell).css(cssp);\n\t\t\t\t\t}\n\t\t\t\t\tif(typeof attrp === 'object') {$(tcell).attr(attrp);}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\tgetCell : function(rowid,col) {\n\t\tvar ret = false;\n\t\tthis.each(function(){\n\t\t\tvar $t=this, pos=-1;\n\t\t\tif(!$t.grid) {return;}\n\t\t\tif(isNaN(col)) {\n\t\t\t\t$($t.p.colModel).each(function(i){\n\t\t\t\t\tif (this.name === col) {\n\t\t\t\t\t\tpos = i;return false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {pos = parseInt(col,10);}\n\t\t\tif(pos>=0) {\n\t\t\t\tvar ind = $t.rows.namedItem(rowid);\n\t\t\t\tif(ind) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tret = $.unformat.call($t,$(\"td:eq(\"+pos+\")\",ind),{rowId:ind.id, colModel:$t.p.colModel[pos]},pos);\n\t\t\t\t\t} catch (e){\n\t\t\t\t\t\tret = $.jgrid.htmlDecode($(\"td:eq(\"+pos+\")\",ind).html());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn ret;\n\t},\n\tgetCol : function (col, obj, mathopr) {\n\t\tvar ret = [], val, sum=0, min, max, v;\n\t\tobj = typeof obj !== 'boolean' ? false : obj;\n\t\tif(mathopr === undefined) { mathopr = false; }\n\t\tthis.each(function(){\n\t\t\tvar $t=this, pos=-1;\n\t\t\tif(!$t.grid) {return;}\n\t\t\tif(isNaN(col)) {\n\t\t\t\t$($t.p.colModel).each(function(i){\n\t\t\t\t\tif (this.name === col) {\n\t\t\t\t\t\tpos = i;return false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {pos = parseInt(col,10);}\n\t\t\tif(pos>=0) {\n\t\t\t\tvar ln = $t.rows.length, i =0;\n\t\t\t\tif (ln && ln>0){\n\t\t\t\t\twhile(i<ln){\n\t\t\t\t\t\tif($($t.rows[i]).hasClass('jqgrow')) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tval = $.unformat.call($t,$($t.rows[i].cells[pos]),{rowId:$t.rows[i].id, colModel:$t.p.colModel[pos]},pos);\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\tval = $.jgrid.htmlDecode($t.rows[i].cells[pos].innerHTML);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(mathopr) {\n\t\t\t\t\t\t\t\tv = parseFloat(val);\n\t\t\t\t\t\t\t\tsum += v;\n\t\t\t\t\t\t\t\tif (max === undefined) {max = min = v;}\n\t\t\t\t\t\t\t\tmin = Math.min(min, v);\n\t\t\t\t\t\t\t\tmax = Math.max(max, v);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if(obj) { ret.push( {id:$t.rows[i].id,value:val} ); }\n\t\t\t\t\t\t\telse { ret.push( val ); }\n\t\t\t\t\t\t}\n\t\t\t\t\t\ti++;\n\t\t\t\t\t}\n\t\t\t\t\tif(mathopr) {\n\t\t\t\t\t\tswitch(mathopr.toLowerCase()){\n\t\t\t\t\t\t\tcase 'sum': ret =sum; break;\n\t\t\t\t\t\t\tcase 'avg': ret = sum/ln; break;\n\t\t\t\t\t\t\tcase 'count': ret = ln; break;\n\t\t\t\t\t\t\tcase 'min': ret = min; break;\n\t\t\t\t\t\t\tcase 'max': ret = max; break;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn ret;\n\t},\n\tclearGridData : function(clearfooter) {\n\t\treturn this.each(function(){\n\t\t\tvar $t = this;\n\t\t\tif(!$t.grid) {return;}\n\t\t\tif(typeof clearfooter !== 'boolean') { clearfooter = false; }\n\t\t\tif($t.p.deepempty) {$(\"#\"+$.jgrid.jqID($t.p.id)+\" tbody:first tr:gt(0)\").remove();}\n\t\t\telse {\n\t\t\t\tvar trf = $(\"#\"+$.jgrid.jqID($t.p.id)+\" tbody:first tr:first\")[0];\n\t\t\t\t$(\"#\"+$.jgrid.jqID($t.p.id)+\" tbody:first\").empty().append(trf);\n\t\t\t}\n\t\t\tif($t.p.footerrow && clearfooter) { $(\".ui-jqgrid-ftable td\",$t.grid.sDiv).html(\"&#160;\"); }\n\t\t\t$t.p.selrow = null; $t.p.selarrrow= []; $t.p.savedRow = [];\n\t\t\t$t.p.records = 0;$t.p.page=1;$t.p.lastpage=0;$t.p.reccount=0;\n\t\t\t$t.p.data = []; $t.p._index = {};\n\t\t\t$t.updatepager(true,false);\n\t\t});\n\t},\n\tgetInd : function(rowid,rc){\n\t\tvar ret =false,rw;\n\t\tthis.each(function(){\n\t\t\trw = this.rows.namedItem(rowid);\n\t\t\tif(rw) {\n\t\t\t\tret = rc===true ? rw: rw.rowIndex;\n\t\t\t}\n\t\t});\n\t\treturn ret;\n\t},\n\tbindKeys : function( settings ){\n\t\tvar o = $.extend({\n\t\t\tonEnter: null,\n\t\t\tonSpace: null,\n\t\t\tonLeftKey: null,\n\t\t\tonRightKey: null,\n\t\t\tscrollingRows : true\n\t\t},settings || {});\n\t\treturn this.each(function(){\n\t\t\tvar $t = this;\n\t\t\tif( !$('body').is('[role]') ){$('body').attr('role','application');}\n\t\t\t$t.p.scrollrows = o.scrollingRows;\n\t\t\t$($t).keydown(function(event){\n\t\t\t\tvar target = $($t).find('tr[tabindex=0]')[0], id, r, mind,\n\t\t\t\texpanded = $t.p.treeReader.expanded_field;\n\t\t\t\t//check for arrow keys\n\t\t\t\tif(target) {\n\t\t\t\t\tmind = $t.p._index[$.jgrid.stripPref($t.p.idPrefix, target.id)];\n\t\t\t\t\tif(event.keyCode === 37 || event.keyCode === 38 || event.keyCode === 39 || event.keyCode === 40){\n\t\t\t\t\t\t// up key\n\t\t\t\t\t\tif(event.keyCode === 38 ){\n\t\t\t\t\t\t\tr = target.previousSibling;\n\t\t\t\t\t\t\tid = \"\";\n\t\t\t\t\t\t\tif(r) {\n\t\t\t\t\t\t\t\tif($(r).is(\":hidden\")) {\n\t\t\t\t\t\t\t\t\twhile(r) {\n\t\t\t\t\t\t\t\t\t\tr = r.previousSibling;\n\t\t\t\t\t\t\t\t\t\tif(!$(r).is(\":hidden\") && $(r).hasClass('jqgrow')) {id = r.id;break;}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tid = r.id;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$($t).jqGrid('setSelection', id, true, event);\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//if key is down arrow\n\t\t\t\t\t\tif(event.keyCode === 40){\n\t\t\t\t\t\t\tr = target.nextSibling;\n\t\t\t\t\t\t\tid =\"\";\n\t\t\t\t\t\t\tif(r) {\n\t\t\t\t\t\t\t\tif($(r).is(\":hidden\")) {\n\t\t\t\t\t\t\t\t\twhile(r) {\n\t\t\t\t\t\t\t\t\t\tr = r.nextSibling;\n\t\t\t\t\t\t\t\t\t\tif(!$(r).is(\":hidden\") && $(r).hasClass('jqgrow') ) {id = r.id;break;}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tid = r.id;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$($t).jqGrid('setSelection', id, true, event);\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// left\n\t\t\t\t\t\tif(event.keyCode === 37 ){\n\t\t\t\t\t\t\tif($t.p.treeGrid && $t.p.data[mind][expanded]) {\n\t\t\t\t\t\t\t\t$(target).find(\"div.treeclick\").trigger('click');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$($t).triggerHandler(\"jqGridKeyLeft\", [$t.p.selrow]);\n\t\t\t\t\t\t\tif($.isFunction(o.onLeftKey)) {\n\t\t\t\t\t\t\t\to.onLeftKey.call($t, $t.p.selrow);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// right\n\t\t\t\t\t\tif(event.keyCode === 39 ){\n\t\t\t\t\t\t\tif($t.p.treeGrid && !$t.p.data[mind][expanded]) {\n\t\t\t\t\t\t\t\t$(target).find(\"div.treeclick\").trigger('click');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$($t).triggerHandler(\"jqGridKeyRight\", [$t.p.selrow]);\n\t\t\t\t\t\t\tif($.isFunction(o.onRightKey)) {\n\t\t\t\t\t\t\t\to.onRightKey.call($t, $t.p.selrow);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t//check if enter was pressed on a grid or treegrid node\n\t\t\t\t\telse if( event.keyCode === 13 ){\n\t\t\t\t\t\t$($t).triggerHandler(\"jqGridKeyEnter\", [$t.p.selrow]);\n\t\t\t\t\t\tif($.isFunction(o.onEnter)) {\n\t\t\t\t\t\t\to.onEnter.call($t, $t.p.selrow);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if(event.keyCode === 32) {\n\t\t\t\t\t\t$($t).triggerHandler(\"jqGridKeySpace\", [$t.p.selrow]);\n\t\t\t\t\t\tif($.isFunction(o.onSpace)) {\n\t\t\t\t\t\t\to.onSpace.call($t, $t.p.selrow);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t},\n\tunbindKeys : function(){\n\t\treturn this.each(function(){\n\t\t\t$(this).unbind('keydown');\n\t\t});\n\t},\n\tgetLocalRow : function (rowid) {\n\t\tvar ret = false, ind;\n\t\tthis.each(function(){\n\t\t\tif(rowid !== undefined) {\n\t\t\t\tind = this.p._index[$.jgrid.stripPref(this.p.idPrefix, rowid)];\n\t\t\t\tif(ind >= 0 ) {\n\t\t\t\t\tret = this.p.data[ind];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn ret;\n\t}\n});\n})(jQuery);\n/*jshint eqeqeq:false */\n/*global jQuery */\n(function($){\n/**\n * jqGrid extension for custom methods\n * Tony Tomov tony@trirand.com\n * http://trirand.com/blog/ \n * \n * Wildraid wildraid@mail.ru\n * Oleg Kiriljuk oleg.kiriljuk@ok-soft-gmbh.com\n * Dual licensed under the MIT and GPL licenses:\n * http://www.opensource.org/licenses/mit-license.php\n * http://www.gnu.org/licenses/gpl-2.0.html\n**/\n\"use strict\";\n$.jgrid.extend({\n\tgetColProp : function(colname){\n\t\tvar ret ={}, $t = this[0];\n\t\tif ( !$t.grid ) { return false; }\n\t\tvar cM = $t.p.colModel, i;\n\t\tfor ( i=0;i<cM.length;i++ ) {\n\t\t\tif ( cM[i].name === colname ) {\n\t\t\t\tret = cM[i];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn ret;\n\t},\n\tsetColProp : function(colname, obj){\n\t\t//do not set width will not work\n\t\treturn this.each(function(){\n\t\t\tif ( this.grid ) {\n\t\t\t\tif ( obj ) {\n\t\t\t\t\tvar cM = this.p.colModel, i;\n\t\t\t\t\tfor ( i=0;i<cM.length;i++ ) {\n\t\t\t\t\t\tif ( cM[i].name === colname ) {\n\t\t\t\t\t\t\t$.extend(true, this.p.colModel[i],obj);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\tsortGrid : function(colname,reload, sor){\n\t\treturn this.each(function(){\n\t\t\tvar $t=this,idx=-1,i;\n\t\t\tif ( !$t.grid ) { return;}\n\t\t\tif ( !colname ) { colname = $t.p.sortname; }\n\t\t\tfor ( i=0;i<$t.p.colModel.length;i++ ) {\n\t\t\t\tif ( $t.p.colModel[i].index === colname || $t.p.colModel[i].name === colname ) {\n\t\t\t\t\tidx = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( idx !== -1 ){\n\t\t\t\tvar sort = $t.p.colModel[idx].sortable;\n\t\t\t\tif ( typeof sort !== 'boolean' ) { sort =  true; }\n\t\t\t\tif ( typeof reload !=='boolean' ) { reload = false; }\n\t\t\t\tif ( sort ) { $t.sortData(\"jqgh_\"+$t.p.id+\"_\" + colname, idx, reload, sor); }\n\t\t\t}\n\t\t});\n\t},\n\tclearBeforeUnload : function () {\n\t\treturn this.each(function(){\n\t\t\tvar grid = this.grid;\n\t\t\tgrid.emptyRows.call(this, true, true); // this work quick enough and reduce the size of memory leaks if we have someone\n\n\t\t\t//$(document).unbind(\"mouseup\"); // TODO add namespace\n\t\t\t$(grid.hDiv).unbind(\"mousemove\"); // TODO add namespace\n\t\t\t$(this).unbind();\n\n\t\t\tgrid.dragEnd = null;\n\t\t\tgrid.dragMove = null;\n\t\t\tgrid.dragStart = null;\n\t\t\tgrid.emptyRows = null;\n\t\t\tgrid.populate = null;\n\t\t\tgrid.populateVisible = null;\n\t\t\tgrid.scrollGrid = null;\n\t\t\tgrid.selectionPreserver = null;\n\n\t\t\tgrid.bDiv = null;\n\t\t\tgrid.cDiv = null;\n\t\t\tgrid.hDiv = null;\n\t\t\tgrid.cols = null;\n\t\t\tvar i, l = grid.headers.length;\n\t\t\tfor (i = 0; i < l; i++) {\n\t\t\t\tgrid.headers[i].el = null;\n\t\t\t}\n\n\t\t\tthis.formatCol = null;\n\t\t\tthis.sortData = null;\n\t\t\tthis.updatepager = null;\n\t\t\tthis.refreshIndex = null;\n\t\t\tthis.setHeadCheckBox = null;\n\t\t\tthis.constructTr = null;\n\t\t\tthis.formatter = null;\n\t\t\tthis.addXmlData = null;\n\t\t\tthis.addJSONData = null;\n\t\t});\n\t},\n\tGridDestroy : function () {\n\t\treturn this.each(function(){\n\t\t\tif ( this.grid ) { \n\t\t\t\tif ( this.p.pager ) { // if not part of grid\n\t\t\t\t\t$(this.p.pager).remove();\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\t$(this).jqGrid('clearBeforeUnload');\n\t\t\t\t\t$(\"#gbox_\"+$.jgrid.jqID(this.id)).remove();\n\t\t\t\t} catch (_) {}\n\t\t\t}\n\t\t});\n\t},\n\tGridUnload : function(){\n\t\treturn this.each(function(){\n\t\t\tif ( !this.grid ) {return;}\n\t\t\tvar defgrid = {id: $(this).attr('id'),cl: $(this).attr('class')};\n\t\t\tif (this.p.pager) {\n\t\t\t\t$(this.p.pager).empty().removeClass(\"ui-state-default ui-jqgrid-pager corner-bottom\");\n\t\t\t}\n\t\t\tvar newtable = document.createElement('table');\n\t\t\t$(newtable).attr({id:defgrid.id});\n\t\t\tnewtable.className = defgrid.cl;\n\t\t\tvar gid = $.jgrid.jqID(this.id);\n\t\t\t$(newtable).removeClass(\"ui-jqgrid-btable\");\n\t\t\tif( $(this.p.pager).parents(\"#gbox_\"+gid).length === 1 ) {\n\t\t\t\t$(newtable).insertBefore(\"#gbox_\"+gid).show();\n\t\t\t\t$(this.p.pager).insertBefore(\"#gbox_\"+gid);\n\t\t\t} else {\n\t\t\t\t$(newtable).insertBefore(\"#gbox_\"+gid).show();\n\t\t\t}\n\t\t\t$(this).jqGrid('clearBeforeUnload');\n\t\t\t$(\"#gbox_\"+gid).remove();\n\t\t});\n\t},\n\tsetGridState : function(state) {\n\t\treturn this.each(function(){\n\t\t\tif ( !this.grid ) {return;}\n\t\t\tvar $t = this;\n\t\t\tif(state === 'hidden'){\n\t\t\t\t$(\".ui-jqgrid-bdiv, .ui-jqgrid-hdiv\",\"#gview_\"+$.jgrid.jqID($t.p.id)).slideUp(\"fast\");\n\t\t\t\tif($t.p.pager) {$($t.p.pager).slideUp(\"fast\");}\n\t\t\t\tif($t.p.toppager) {$($t.p.toppager).slideUp(\"fast\");}\n\t\t\t\tif($t.p.toolbar[0]===true) {\n\t\t\t\t\tif( $t.p.toolbar[1] === 'both') {\n\t\t\t\t\t\t$($t.grid.ubDiv).slideUp(\"fast\");\n\t\t\t\t\t}\n\t\t\t\t\t$($t.grid.uDiv).slideUp(\"fast\");\n\t\t\t\t}\n\t\t\t\tif($t.p.footerrow) { $(\".ui-jqgrid-sdiv\",\"#gbox_\"+$.jgrid.jqID($t.p.id)).slideUp(\"fast\"); }\n\t\t\t\t$(\".ui-jqgrid-titlebar-close span\",$t.grid.cDiv).removeClass(\"ui-icon-circle-triangle-n\").addClass(\"ui-icon-circle-triangle-s\");\n\t\t\t\t$t.p.gridstate = 'hidden';\n\t\t\t} else if(state === 'visible') {\n\t\t\t\t$(\".ui-jqgrid-hdiv, .ui-jqgrid-bdiv\",\"#gview_\"+$.jgrid.jqID($t.p.id)).slideDown(\"fast\");\n\t\t\t\tif($t.p.pager) {$($t.p.pager).slideDown(\"fast\");}\n\t\t\t\tif($t.p.toppager) {$($t.p.toppager).slideDown(\"fast\");}\n\t\t\t\tif($t.p.toolbar[0]===true) {\n\t\t\t\t\tif( $t.p.toolbar[1] === 'both') {\n\t\t\t\t\t\t$($t.grid.ubDiv).slideDown(\"fast\");\n\t\t\t\t\t}\n\t\t\t\t\t$($t.grid.uDiv).slideDown(\"fast\");\n\t\t\t\t}\n\t\t\t\tif($t.p.footerrow) { $(\".ui-jqgrid-sdiv\",\"#gbox_\"+$.jgrid.jqID($t.p.id)).slideDown(\"fast\"); }\n\t\t\t\t$(\".ui-jqgrid-titlebar-close span\",$t.grid.cDiv).removeClass(\"ui-icon-circle-triangle-s\").addClass(\"ui-icon-circle-triangle-n\");\n\t\t\t\t$t.p.gridstate = 'visible';\n\t\t\t}\n\n\t\t});\n\t},\n\tfilterToolbar : function(p){\n\t\tp = $.extend({\n\t\t\tautosearch: true,\n\t\t\tsearchOnEnter : true,\n\t\t\tbeforeSearch: null,\n\t\t\tafterSearch: null,\n\t\t\tbeforeClear: null,\n\t\t\tafterClear: null,\n\t\t\tsearchurl : '',\n\t\t\tstringResult: false,\n\t\t\tgroupOp: 'AND',\n\t\t\tdefaultSearch : \"bw\",\n\t\t\tsearchOperators : false,\n\t\t\toperandTitle : \"Click to select search operation.\",\n\t\t\toperands : { \"eq\" :\"==\", \"ne\":\"!\",\"lt\":\"<\",\"le\":\"<=\",\"gt\":\">\",\"ge\":\">=\",\"bw\":\"^\",\"bn\":\"!^\",\"in\":\"=\",\"ni\":\"!=\",\"ew\":\"|\",\"en\":\"!@\",\"cn\":\"~\",\"nc\":\"!~\",\"nu\":\"#\",\"nn\":\"!#\"}\n\t\t}, $.jgrid.search , p  || {});\n\t\treturn this.each(function(){\n\t\t\tvar $t = this;\n\t\t\tif(this.ftoolbar) { return; }\n\t\t\tvar triggerToolbar = function() {\n\t\t\t\tvar sdata={}, j=0, v, nm, sopt={},so;\n\t\t\t\t$.each($t.p.colModel,function(){\n\t\t\t\t\tvar $elem = $(\"#gs_\"+$.jgrid.jqID(this.name), (this.frozen===true && $t.p.frozenColumns === true) ?  $t.grid.fhDiv : $t.grid.hDiv);\n\t\t\t\t\tnm = this.index || this.name;\n\t\t\t\t\tif(p.searchOperators ) {\n\t\t\t\t\t\tso = $elem.parent().prev().children(\"a\").attr(\"soper\") || p.defaultSearch;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tso  = (this.searchoptions && this.searchoptions.sopt) ? this.searchoptions.sopt[0] : this.stype==='select'?  'eq' : p.defaultSearch;\n\t\t\t\t\t}\n\t\t\t\t\tv = this.stype === \"custom\" && $.isFunction(this.searchoptions.custom_value) && $elem.length > 0 && $elem[0].nodeName.toUpperCase() === \"SPAN\" ?\n\t\t\t\t\t\tthis.searchoptions.custom_value.call($t, $elem.children(\".customelement:first\"), \"get\") :\n\t\t\t\t\t\t$elem.val();\n\t\t\t\t\tif(v || so===\"nu\" || so===\"nn\") {\n\t\t\t\t\t\tsdata[nm] = v;\n\t\t\t\t\t\tsopt[nm] = so;\n\t\t\t\t\t\tj++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tdelete $t.p.postData[nm];\n\t\t\t\t\t\t} catch (z) {}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tvar sd =  j>0 ? true : false;\n\t\t\t\tif(p.stringResult === true || $t.p.datatype === \"local\") {\n\t\t\t\t\tvar ruleGroup = \"{\\\"groupOp\\\":\\\"\" + p.groupOp + \"\\\",\\\"rules\\\":[\";\n\t\t\t\t\tvar gi=0;\n\t\t\t\t\t$.each(sdata,function(i,n){\n\t\t\t\t\t\tif (gi > 0) {ruleGroup += \",\";}\n\t\t\t\t\t\truleGroup += \"{\\\"field\\\":\\\"\" + i + \"\\\",\";\n\t\t\t\t\t\truleGroup += \"\\\"op\\\":\\\"\" + sopt[i] + \"\\\",\";\n\t\t\t\t\t\tn+=\"\";\n\t\t\t\t\t\truleGroup += \"\\\"data\\\":\\\"\" + n.replace(/\\\\/g,'\\\\\\\\').replace(/\\\"/g,'\\\\\"') + \"\\\"}\";\n\t\t\t\t\t\tgi++;\n\t\t\t\t\t});\n\t\t\t\t\truleGroup += \"]}\";\n\t\t\t\t\t$.extend($t.p.postData,{filters:ruleGroup});\n\t\t\t\t\t$.each(['searchField', 'searchString', 'searchOper'], function(i, n){\n\t\t\t\t\t\tif($t.p.postData.hasOwnProperty(n)) { delete $t.p.postData[n];}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t$.extend($t.p.postData,sdata);\n\t\t\t\t}\n\t\t\t\tvar saveurl;\n\t\t\t\tif($t.p.searchurl) {\n\t\t\t\t\tsaveurl = $t.p.url;\n\t\t\t\t\t$($t).jqGrid(\"setGridParam\",{url:$t.p.searchurl});\n\t\t\t\t}\n\t\t\t\tvar bsr = $($t).triggerHandler(\"jqGridToolbarBeforeSearch\") === 'stop' ? true : false;\n\t\t\t\tif(!bsr && $.isFunction(p.beforeSearch)){bsr = p.beforeSearch.call($t);}\n\t\t\t\tif(!bsr) { $($t).jqGrid(\"setGridParam\",{search:sd}).trigger(\"reloadGrid\",[{page:1}]); }\n\t\t\t\tif(saveurl) {$($t).jqGrid(\"setGridParam\",{url:saveurl});}\n\t\t\t\t$($t).triggerHandler(\"jqGridToolbarAfterSearch\");\n\t\t\t\tif($.isFunction(p.afterSearch)){p.afterSearch.call($t);}\n\t\t\t},\n\t\t\tclearToolbar = function(trigger){\n\t\t\t\tvar sdata={}, j=0, nm;\n\t\t\t\ttrigger = (typeof trigger !== 'boolean') ? true : trigger;\n\t\t\t\t$.each($t.p.colModel,function(){\n\t\t\t\t\tvar v, $elem = $(\"#gs_\"+$.jgrid.jqID(this.name),(this.frozen===true && $t.p.frozenColumns === true) ?  $t.grid.fhDiv : $t.grid.hDiv);\n\t\t\t\t\tif(this.searchoptions && this.searchoptions.defaultValue !== undefined) { v = this.searchoptions.defaultValue; }\n\t\t\t\t\tnm = this.index || this.name;\n\t\t\t\t\tswitch (this.stype) {\n\t\t\t\t\t\tcase 'select' :\n\t\t\t\t\t\t\t$elem.find(\"option\").each(function (i){\n\t\t\t\t\t\t\t\tif(i===0) { this.selected = true; }\n\t\t\t\t\t\t\t\tif ($(this).val() === v) {\n\t\t\t\t\t\t\t\t\tthis.selected = true;\n\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif ( v !== undefined ) {\n\t\t\t\t\t\t\t\t// post the key and not the text\n\t\t\t\t\t\t\t\tsdata[nm] = v;\n\t\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tdelete $t.p.postData[nm];\n\t\t\t\t\t\t\t\t} catch(e) {}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'text':\n\t\t\t\t\t\t\t$elem.val(v);\n\t\t\t\t\t\t\tif(v !== undefined) {\n\t\t\t\t\t\t\t\tsdata[nm] = v;\n\t\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tdelete $t.p.postData[nm];\n\t\t\t\t\t\t\t\t} catch (y){}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'custom':\n\t\t\t\t\t\t\tif ($.isFunction(this.searchoptions.custom_value) && $elem.length > 0 && $elem[0].nodeName.toUpperCase() === \"SPAN\") {\n\t\t\t\t\t\t\t\tthis.searchoptions.custom_value.call($t, $elem.children(\".customelement:first\"), \"set\", v);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tvar sd =  j>0 ? true : false;\n\t\t\t\tif(p.stringResult === true || $t.p.datatype === \"local\") {\n\t\t\t\t\tvar ruleGroup = \"{\\\"groupOp\\\":\\\"\" + p.groupOp + \"\\\",\\\"rules\\\":[\";\n\t\t\t\t\tvar gi=0;\n\t\t\t\t\t$.each(sdata,function(i,n){\n\t\t\t\t\t\tif (gi > 0) {ruleGroup += \",\";}\n\t\t\t\t\t\truleGroup += \"{\\\"field\\\":\\\"\" + i + \"\\\",\";\n\t\t\t\t\t\truleGroup += \"\\\"op\\\":\\\"\" + \"eq\" + \"\\\",\";\n\t\t\t\t\t\tn+=\"\";\n\t\t\t\t\t\truleGroup += \"\\\"data\\\":\\\"\" + n.replace(/\\\\/g,'\\\\\\\\').replace(/\\\"/g,'\\\\\"') + \"\\\"}\";\n\t\t\t\t\t\tgi++;\n\t\t\t\t\t});\n\t\t\t\t\truleGroup += \"]}\";\n\t\t\t\t\t$.extend($t.p.postData,{filters:ruleGroup});\n\t\t\t\t\t$.each(['searchField', 'searchString', 'searchOper'], function(i, n){\n\t\t\t\t\t\tif($t.p.postData.hasOwnProperty(n)) { delete $t.p.postData[n];}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t$.extend($t.p.postData,sdata);\n\t\t\t\t}\n\t\t\t\tvar saveurl;\n\t\t\t\tif($t.p.searchurl) {\n\t\t\t\t\tsaveurl = $t.p.url;\n\t\t\t\t\t$($t).jqGrid(\"setGridParam\",{url:$t.p.searchurl});\n\t\t\t\t}\n\t\t\t\tvar bcv = $($t).triggerHandler(\"jqGridToolbarBeforeClear\") === 'stop' ? true : false;\n\t\t\t\tif(!bcv && $.isFunction(p.beforeClear)){bcv = p.beforeClear.call($t);}\n\t\t\t\tif(!bcv) {\n\t\t\t\t\tif(trigger) {\n\t\t\t\t\t\t$($t).jqGrid(\"setGridParam\",{search:sd}).trigger(\"reloadGrid\",[{page:1}]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(saveurl) {$($t).jqGrid(\"setGridParam\",{url:saveurl});}\n\t\t\t\t$($t).triggerHandler(\"jqGridToolbarAfterClear\");\n\t\t\t\tif($.isFunction(p.afterClear)){p.afterClear();}\n\t\t\t},\n\t\t\ttoggleToolbar = function(){\n\t\t\t\tvar trow = $(\"tr.ui-search-toolbar\",$t.grid.hDiv),\n\t\t\t\ttrow2 = $t.p.frozenColumns === true ?  $(\"tr.ui-search-toolbar\",$t.grid.fhDiv) : false;\n\t\t\t\tif(trow.css(\"display\") === 'none') {\n\t\t\t\t\ttrow.show(); \n\t\t\t\t\tif(trow2) {\n\t\t\t\t\t\ttrow2.show();\n\t\t\t\t\t}\n\t\t\t\t} else { \n\t\t\t\t\ttrow.hide(); \n\t\t\t\t\tif(trow2) {\n\t\t\t\t\t\ttrow2.hide();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tbuildRuleMenu = function( elem, left, top ){\n\t\t\t\t$(\"#sopt_menu\").remove();\n\n\t\t\t\tleft=parseInt(left,10);\n\t\t\t\ttop=parseInt(top,10) + 18;\n\n\t\t\t\tvar fs =  $('.ui-jqgrid-view').css('font-size') || '11px';\n\t\t\t\tvar str = '<ul id=\"sopt_menu\" class=\"ui-search-menu\" role=\"menu\" tabindex=\"0\" style=\"font-size:'+fs+';left:'+left+'px;top:'+top+'px;\">',\n\t\t\t\tselected = $(elem).attr(\"soper\"), selclass,\n\t\t\t\taoprs = [], ina;\n\t\t\t\tvar i=0, nm =$(elem).attr(\"colname\"),len = $t.p.colModel.length;\n\t\t\t\twhile(i<len) {\n\t\t\t\t\tif($t.p.colModel[i].name === nm) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t\tvar cm = $t.p.colModel[i], options = $.extend({}, cm.searchoptions);\n\t\t\t\tif(!options.sopt) {\n\t\t\t\t\toptions.sopt = [];\n\t\t\t\t\toptions.sopt[0]= cm.stype==='select' ?  'eq' : p.defaultSearch;\n\t\t\t\t}\n\t\t\t\t$.each(p.odata, function() { aoprs.push(this.oper); });\n\t\t\t\tfor ( i = 0 ; i < options.sopt.length; i++) {\n\t\t\t\t\tina = $.inArray(options.sopt[i],aoprs);\n\t\t\t\t\tif(ina !== -1) {\n\t\t\t\t\t\tselclass = selected === p.odata[ina].oper ? \"ui-state-highlight\" : \"\";\n\t\t\t\t\t\tstr += '<li class=\"ui-menu-item '+selclass+'\" role=\"presentation\"><a class=\"ui-corner-all g-menu-item\" tabindex=\"0\" role=\"menuitem\" value=\"'+p.odata[ina].oper+'\" oper=\"'+p.operands[p.odata[ina].oper]+'\"><table cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tr><td width=\"25px\">'+p.operands[p.odata[ina].oper]+'</td><td>'+ p.odata[ina].text+'</td></tr></table></a></li>';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstr += \"</ul>\";\n\t\t\t\t$('body').append(str);\n\t\t\t\t$(\"#sopt_menu\").addClass(\"ui-menu ui-widget ui-widget-content ui-corner-all\");\n\t\t\t\t$(\"#sopt_menu > li > a\").hover(\n\t\t\t\t\tfunction(){ $(this).addClass(\"ui-state-hover\"); },\n\t\t\t\t\tfunction(){ $(this).removeClass(\"ui-state-hover\"); }\n\t\t\t\t).click(function( e ){\n\t\t\t\t\tvar v = $(this).attr(\"value\"),\n\t\t\t\t\toper = $(this).attr(\"oper\");\n\t\t\t\t\t$($t).triggerHandler(\"jqGridToolbarSelectOper\", [v, oper, elem]);\n\t\t\t\t\t$(\"#sopt_menu\").hide();\n\t\t\t\t\t$(elem).text(oper).attr(\"soper\",v);\n\t\t\t\t\tif(p.autosearch===true){\n\t\t\t\t\t\tvar inpelm = $(elem).parent().next().children()[0];\n\t\t\t\t\t\tif( $(inpelm).val() || v===\"nu\" || v ===\"nn\") {\n\t\t\t\t\t\t\ttriggerToolbar();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t\t// create the row\n\t\t\tvar tr = $(\"<tr class='ui-search-toolbar' role='rowheader'></tr>\");\n\t\t\tvar timeoutHnd;\n\t\t\t$.each($t.p.colModel,function(){\n\t\t\t\tvar cm=this, soptions, surl, self, select = \"\", sot=\"=\", so, i,\n\t\t\t\tth = $(\"<th role='columnheader' class='ui-state-default ui-th-column ui-th-\"+$t.p.direction+\"'></th>\"),\n\t\t\t\tthd = $(\"<div style='position:relative;height:100%;padding-right:0.3em;padding-left:0.3em;'></div>\"),\n\t\t\t\tstbl = $(\"<table class='ui-search-table' cellspacing='0'><tr><td class='ui-search-oper'></td><td class='ui-search-input'></td></tr></table>\");\n\t\t\t\tif(this.hidden===true) { $(th).css(\"display\",\"none\");}\n\t\t\t\tthis.search = this.search === false ? false : true;\n\t\t\t\tif(this.stype === undefined) {this.stype='text';}\n\t\t\t\tsoptions = $.extend({},this.searchoptions || {});\n\t\t\t\tif(this.search){\n\t\t\t\t\tif(p.searchOperators) {\n\t\t\t\t\t\tso  = (soptions.sopt) ? soptions.sopt[0] : cm.stype==='select' ?  'eq' : p.defaultSearch;\n\t\t\t\t\t\tfor(i = 0;i<p.odata.length;i++) {\n\t\t\t\t\t\t\tif(p.odata[i].oper === so) {\n\t\t\t\t\t\t\t\tsot = p.operands[so] || \"\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar st = soptions.searchtitle != null ? soptions.searchtitle : p.operandTitle;\n\t\t\t\t\t\tselect = \"<a title='\"+st+\"' style='padding-right: 0.5em;' soper='\"+so+\"' class='soptclass' colname='\"+this.name+\"'>\"+sot+\"</a>\";\n\t\t\t\t\t}\n\t\t\t\t\t$(\"td:eq(0)\",stbl).append(select);\n\t\t\t\t\tswitch (this.stype)\n\t\t\t\t\t{\n\t\t\t\t\tcase \"select\":\n\t\t\t\t\t\tsurl = this.surl || soptions.dataUrl;\n\t\t\t\t\t\tif(surl) {\n\t\t\t\t\t\t\t// data returned should have already constructed html select\n\t\t\t\t\t\t\t// primitive jQuery load\n\t\t\t\t\t\t\tself = thd;\n\t\t\t\t\t\t\t$.ajax($.extend({\n\t\t\t\t\t\t\t\turl: surl,\n\t\t\t\t\t\t\t\tdataType: \"html\",\n\t\t\t\t\t\t\t\tsuccess: function(res) {\n\t\t\t\t\t\t\t\t\tif(soptions.buildSelect !== undefined) {\n\t\t\t\t\t\t\t\t\t\tvar d = soptions.buildSelect(res);\n\t\t\t\t\t\t\t\t\t\tif (d) {\n\t\t\t\t\t\t\t\t\t\t\t$(\"td:eq(1)\",stbl).append(d);\n\t\t\t\t\t\t\t\t\t\t\t$(self).append(stbl);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t$(\"td:eq(1)\",stbl).append(res);\n\t\t\t\t\t\t\t\t\t\t$(self).append(stbl);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif(soptions.defaultValue !== undefined) { $(\"select\",self).val(soptions.defaultValue); }\n\t\t\t\t\t\t\t\t\t$(\"select\",self).attr({name:cm.index || cm.name, id: \"gs_\"+cm.name});\n\t\t\t\t\t\t\t\t\tif(soptions.attr) {$(\"select\",self).attr(soptions.attr);}\n\t\t\t\t\t\t\t\t\t$(\"select\",self).css({width: \"100%\"});\n\t\t\t\t\t\t\t\t\t// preserve autoserch\n\t\t\t\t\t\t\t\t\t$.jgrid.bindEv.call($t, $(\"select\",self)[0], soptions);\n\t\t\t\t\t\t\t\t\tif(p.autosearch===true){\n\t\t\t\t\t\t\t\t\t\t$(\"select\",self).change(function(){\n\t\t\t\t\t\t\t\t\t\t\ttriggerToolbar();\n\t\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tres=null;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, $.jgrid.ajaxOptions, $t.p.ajaxSelectOptions || {} ));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar oSv, sep, delim;\n\t\t\t\t\t\t\tif(cm.searchoptions) {\n\t\t\t\t\t\t\t\toSv = cm.searchoptions.value === undefined ? \"\" : cm.searchoptions.value;\n\t\t\t\t\t\t\t\tsep = cm.searchoptions.separator === undefined ? \":\" : cm.searchoptions.separator;\n\t\t\t\t\t\t\t\tdelim = cm.searchoptions.delimiter === undefined ? \";\" : cm.searchoptions.delimiter;\n\t\t\t\t\t\t\t} else if(cm.editoptions) {\n\t\t\t\t\t\t\t\toSv = cm.editoptions.value === undefined ? \"\" : cm.editoptions.value;\n\t\t\t\t\t\t\t\tsep = cm.editoptions.separator === undefined ? \":\" : cm.editoptions.separator;\n\t\t\t\t\t\t\t\tdelim = cm.editoptions.delimiter === undefined ? \";\" : cm.editoptions.delimiter;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (oSv) {\t\n\t\t\t\t\t\t\t\tvar elem = document.createElement(\"select\");\n\t\t\t\t\t\t\t\telem.style.width = \"100%\";\n\t\t\t\t\t\t\t\t$(elem).attr({name:cm.index || cm.name, id: \"gs_\"+cm.name});\n\t\t\t\t\t\t\t\tvar sv, ov, key, k;\n\t\t\t\t\t\t\t\tif(typeof oSv === \"string\") {\n\t\t\t\t\t\t\t\t\tso = oSv.split(delim);\n\t\t\t\t\t\t\t\t\tfor(k=0; k<so.length;k++){\n\t\t\t\t\t\t\t\t\t\tsv = so[k].split(sep);\n\t\t\t\t\t\t\t\t\t\tov = document.createElement(\"option\");\n\t\t\t\t\t\t\t\t\t\tov.value = sv[0]; ov.innerHTML = sv[1];\n\t\t\t\t\t\t\t\t\t\telem.appendChild(ov);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if(typeof oSv === \"object\" ) {\n\t\t\t\t\t\t\t\t\tfor (key in oSv) {\n\t\t\t\t\t\t\t\t\t\tif(oSv.hasOwnProperty(key)) {\n\t\t\t\t\t\t\t\t\t\t\tov = document.createElement(\"option\");\n\t\t\t\t\t\t\t\t\t\t\tov.value = key; ov.innerHTML = oSv[key];\n\t\t\t\t\t\t\t\t\t\t\telem.appendChild(ov);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif(soptions.defaultValue !== undefined) { $(elem).val(soptions.defaultValue); }\n\t\t\t\t\t\t\t\tif(soptions.attr) {$(elem).attr(soptions.attr);}\n\t\t\t\t\t\t\t\t$.jgrid.bindEv.call($t, elem , soptions);\n\t\t\t\t\t\t\t\t$(\"td:eq(1)\",stbl).append( elem );\n\t\t\t\t\t\t\t\t$(thd).append(stbl);\n\t\t\t\t\t\t\t\tif(p.autosearch===true){\n\t\t\t\t\t\t\t\t\t$(elem).change(function(){\n\t\t\t\t\t\t\t\t\t\ttriggerToolbar();\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"text\":\n\t\t\t\t\t\tvar df = soptions.defaultValue !== undefined ? soptions.defaultValue: \"\";\n\n\t\t\t\t\t\t$(\"td:eq(1)\",stbl).append(\"<input type='text' style='width:100%;padding:0px;' name='\"+(cm.index || cm.name)+\"' id='gs_\"+cm.name+\"' value='\"+df+\"'/>\");\n\t\t\t\t\t\t$(thd).append(stbl);\n\n\t\t\t\t\t\tif(soptions.attr) {$(\"input\",thd).attr(soptions.attr);}\n\t\t\t\t\t\t$.jgrid.bindEv.call($t, $(\"input\",thd)[0], soptions);\n\t\t\t\t\t\tif(p.autosearch===true){\n\t\t\t\t\t\t\tif(p.searchOnEnter) {\n\t\t\t\t\t\t\t\t$(\"input\",thd).keypress(function(e){\n\t\t\t\t\t\t\t\t\tvar key = e.charCode || e.keyCode || 0;\n\t\t\t\t\t\t\t\t\tif(key === 13){\n\t\t\t\t\t\t\t\t\t\ttriggerToolbar();\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn this;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$(\"input\",thd).keydown(function(e){\n\t\t\t\t\t\t\t\t\tvar key = e.which;\n\t\t\t\t\t\t\t\t\tswitch (key) {\n\t\t\t\t\t\t\t\t\t\tcase 13:\n\t\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t\tcase 9 :\n\t\t\t\t\t\t\t\t\t\tcase 16:\n\t\t\t\t\t\t\t\t\t\tcase 37:\n\t\t\t\t\t\t\t\t\t\tcase 38:\n\t\t\t\t\t\t\t\t\t\tcase 39:\n\t\t\t\t\t\t\t\t\t\tcase 40:\n\t\t\t\t\t\t\t\t\t\tcase 27:\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tdefault :\n\t\t\t\t\t\t\t\t\t\t\tif(timeoutHnd) { clearTimeout(timeoutHnd); }\n\t\t\t\t\t\t\t\t\t\t\ttimeoutHnd = setTimeout(function(){triggerToolbar();},500);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"custom\":\n\t\t\t\t\t\t$(\"td:eq(1)\",stbl).append(\"<span style='width:95%;padding:0px;' name='\"+(cm.index || cm.name)+\"' id='gs_\"+cm.name+\"'/>\");\n\t\t\t\t\t\t$(thd).append(stbl);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tif($.isFunction(soptions.custom_element)) {\n\t\t\t\t\t\t\t\tvar celm = soptions.custom_element.call($t,soptions.defaultValue !== undefined ? soptions.defaultValue: \"\",soptions);\n\t\t\t\t\t\t\t\tif(celm) {\n\t\t\t\t\t\t\t\t\tcelm = $(celm).addClass(\"customelement\");\n\t\t\t\t\t\t\t\t\t$(thd).find(\">span\").append(celm);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tthrow \"e2\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthrow \"e1\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tif (e === \"e1\") { $.jgrid.info_dialog($.jgrid.errors.errcap,\"function 'custom_element' \"+$.jgrid.edit.msg.nodefined,$.jgrid.edit.bClose);}\n\t\t\t\t\t\t\tif (e === \"e2\") { $.jgrid.info_dialog($.jgrid.errors.errcap,\"function 'custom_element' \"+$.jgrid.edit.msg.novalue,$.jgrid.edit.bClose);}\n\t\t\t\t\t\t\telse { $.jgrid.info_dialog($.jgrid.errors.errcap,typeof e===\"string\"?e:e.message,$.jgrid.edit.bClose); }\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$(th).append(thd);\n\t\t\t\t$(tr).append(th);\n\t\t\t\tif(!p.searchOperators) {\n\t\t\t\t\t$(\"td:eq(0)\",stbl).hide();\n\t\t\t\t}\n\t\t\t});\n\t\t\t$(\"table thead\",$t.grid.hDiv).append(tr);\n\t\t\tif(p.searchOperators) {\n\t\t\t\t$(\".soptclass\").click(function(e){\n\t\t\t\t\tvar offset = $(this).offset(),\n\t\t\t\t\tleft = ( offset.left ),\n\t\t\t\t\ttop = ( offset.top);\n\t\t\t\t\tbuildRuleMenu(this, left, top );\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t});\n\t\t\t\t$(\"body\").on('click', function(e){\n\t\t\t\t\tif(e.target.className !== \"soptclass\") {\n\t\t\t\t\t\t$(\"#sopt_menu\").hide();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.ftoolbar = true;\n\t\t\tthis.triggerToolbar = triggerToolbar;\n\t\t\tthis.clearToolbar = clearToolbar;\n\t\t\tthis.toggleToolbar = toggleToolbar;\n\t\t});\n\t},\n\tdestroyFilterToolbar: function () {\n\t\treturn this.each(function () {\n\t\t\tif (!this.ftoolbar) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.triggerToolbar = null;\n\t\t\tthis.clearToolbar = null;\n\t\t\tthis.toggleToolbar = null;\n\t\t\tthis.ftoolbar = false;\n\t\t\t$(this.grid.hDiv).find(\"table thead tr.ui-search-toolbar\").remove();\n\t\t});\n\t},\n\tdestroyGroupHeader : function(nullHeader)\n\t{\n\t\tif(nullHeader === undefined) {\n\t\t\tnullHeader = true;\n\t\t}\n\t\treturn this.each(function()\n\t\t{\n\t\t\tvar $t = this, $tr, i, l, headers, $th, $resizing, grid = $t.grid,\n\t\t\tthead = $(\"table.ui-jqgrid-htable thead\", grid.hDiv), cm = $t.p.colModel, hc;\n\t\t\tif(!grid) { return; }\n\n\t\t\t$(this).unbind('.setGroupHeaders');\n\t\t\t$tr = $(\"<tr>\", {role: \"rowheader\"}).addClass(\"ui-jqgrid-labels\");\n\t\t\theaders = grid.headers;\n\t\t\tfor (i = 0, l = headers.length; i < l; i++) {\n\t\t\t\thc = cm[i].hidden ? \"none\" : \"\";\n\t\t\t\t$th = $(headers[i].el)\n\t\t\t\t\t.width(headers[i].width)\n\t\t\t\t\t.css('display',hc);\n\t\t\t\ttry {\n\t\t\t\t\t$th.removeAttr(\"rowSpan\");\n\t\t\t\t} catch (rs) {\n\t\t\t\t\t//IE 6/7\n\t\t\t\t\t$th.attr(\"rowSpan\",1);\n\t\t\t\t}\n\t\t\t\t$tr.append($th);\n\t\t\t\t$resizing = $th.children(\"span.ui-jqgrid-resize\");\n\t\t\t\tif ($resizing.length>0) {// resizable column\n\t\t\t\t\t$resizing[0].style.height = \"\";\n\t\t\t\t}\n\t\t\t\t$th.children(\"div\")[0].style.top = \"\";\n\t\t\t}\n\t\t\t$(thead).children('tr.ui-jqgrid-labels').remove();\n\t\t\t$(thead).prepend($tr);\n\n\t\t\tif(nullHeader === true) {\n\t\t\t\t$($t).jqGrid('setGridParam',{ 'groupHeader': null});\n\t\t\t}\n\t\t});\n\t},\n\tsetGroupHeaders : function ( o ) {\n\t\to = $.extend({\n\t\t\tuseColSpanStyle :  false,\n\t\t\tgroupHeaders: []\n\t\t},o  || {});\n\t\treturn this.each(function(){\n\t\t\tthis.p.groupHeader = o;\n\t\t\tvar ts = this,\n\t\t\ti, cmi, skip = 0, $tr, $colHeader, th, $th, thStyle,\n\t\t\tiCol,\n\t\t\tcghi,\n\t\t\t//startColumnName,\n\t\t\tnumberOfColumns,\n\t\t\ttitleText,\n\t\t\tcVisibleColumns,\n\t\t\tcolModel = ts.p.colModel,\n\t\t\tcml = colModel.length,\n\t\t\tths = ts.grid.headers,\n\t\t\t$htable = $(\"table.ui-jqgrid-htable\", ts.grid.hDiv),\n\t\t\t$trLabels = $htable.children(\"thead\").children(\"tr.ui-jqgrid-labels:last\").addClass(\"jqg-second-row-header\"),\n\t\t\t$thead = $htable.children(\"thead\"),\n\t\t\t$theadInTable,\n\t\t\t$firstHeaderRow = $htable.find(\".jqg-first-row-header\");\n\t\t\tif($firstHeaderRow[0] === undefined) {\n\t\t\t\t$firstHeaderRow = $('<tr>', {role: \"row\", \"aria-hidden\": \"true\"}).addClass(\"jqg-first-row-header\").css(\"height\", \"auto\");\n\t\t\t} else {\n\t\t\t\t$firstHeaderRow.empty();\n\t\t\t}\n\t\t\tvar $firstRow,\n\t\t\tinColumnHeader = function (text, columnHeaders) {\n\t\t\t\tvar length = columnHeaders.length, i;\n\t\t\t\tfor (i = 0; i < length; i++) {\n\t\t\t\t\tif (columnHeaders[i].startColumnName === text) {\n\t\t\t\t\t\treturn i;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn -1;\n\t\t\t};\n\n\t\t\t$(ts).prepend($thead);\n\t\t\t$tr = $('<tr>', {role: \"rowheader\"}).addClass(\"ui-jqgrid-labels jqg-third-row-header\");\n\t\t\tfor (i = 0; i < cml; i++) {\n\t\t\t\tth = ths[i].el;\n\t\t\t\t$th = $(th);\n\t\t\t\tcmi = colModel[i];\n\t\t\t\t// build the next cell for the first header row\n\t\t\t\tthStyle = { height: '0px', width: ths[i].width + 'px', display: (cmi.hidden ? 'none' : '')};\n\t\t\t\t$(\"<th>\", {role: 'gridcell'}).css(thStyle).addClass(\"ui-first-th-\"+ts.p.direction).appendTo($firstHeaderRow);\n\n\t\t\t\tth.style.width = \"\"; // remove unneeded style\n\t\t\t\tiCol = inColumnHeader(cmi.name, o.groupHeaders);\n\t\t\t\tif (iCol >= 0) {\n\t\t\t\t\tcghi = o.groupHeaders[iCol];\n\t\t\t\t\tnumberOfColumns = cghi.numberOfColumns;\n\t\t\t\t\ttitleText = cghi.titleText;\n\n\t\t\t\t\t// caclulate the number of visible columns from the next numberOfColumns columns\n\t\t\t\t\tfor (cVisibleColumns = 0, iCol = 0; iCol < numberOfColumns && (i + iCol < cml); iCol++) {\n\t\t\t\t\t\tif (!colModel[i + iCol].hidden) {\n\t\t\t\t\t\t\tcVisibleColumns++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// The next numberOfColumns headers will be moved in the next row\n\t\t\t\t\t// in the current row will be placed the new column header with the titleText.\n\t\t\t\t\t// The text will be over the cVisibleColumns columns\n\t\t\t\t\t$colHeader = $('<th>').attr({role: \"columnheader\"})\n\t\t\t\t\t\t.addClass(\"ui-state-default ui-th-column-header ui-th-\"+ts.p.direction)\n\t\t\t\t\t\t.css({'height':'22px', 'border-top': '0px none'})\n\t\t\t\t\t\t.html(titleText);\n\t\t\t\t\tif(cVisibleColumns > 0) {\n\t\t\t\t\t\t$colHeader.attr(\"colspan\", String(cVisibleColumns));\n\t\t\t\t\t}\n\t\t\t\t\tif (ts.p.headertitles) {\n\t\t\t\t\t\t$colHeader.attr(\"title\", $colHeader.text());\n\t\t\t\t\t}\n\t\t\t\t\t// hide if not a visible cols\n\t\t\t\t\tif( cVisibleColumns === 0) {\n\t\t\t\t\t\t$colHeader.hide();\n\t\t\t\t\t}\n\n\t\t\t\t\t$th.before($colHeader); // insert new column header before the current\n\t\t\t\t\t$tr.append(th);         // move the current header in the next row\n\n\t\t\t\t\t// set the coumter of headers which will be moved in the next row\n\t\t\t\t\tskip = numberOfColumns - 1;\n\t\t\t\t} else {\n\t\t\t\t\tif (skip === 0) {\n\t\t\t\t\t\tif (o.useColSpanStyle) {\n\t\t\t\t\t\t\t// expand the header height to two rows\n\t\t\t\t\t\t\t$th.attr(\"rowspan\", \"2\");\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$('<th>', {role: \"columnheader\"})\n\t\t\t\t\t\t\t\t.addClass(\"ui-state-default ui-th-column-header ui-th-\"+ts.p.direction)\n\t\t\t\t\t\t\t\t.css({\"display\": cmi.hidden ? 'none' : '', 'border-top': '0px none'})\n\t\t\t\t\t\t\t\t.insertBefore($th);\n\t\t\t\t\t\t\t$tr.append(th);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// move the header to the next row\n\t\t\t\t\t\t//$th.css({\"padding-top\": \"2px\", height: \"19px\"});\n\t\t\t\t\t\t$tr.append(th);\n\t\t\t\t\t\tskip--;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t$theadInTable = $(ts).children(\"thead\");\n\t\t\t$theadInTable.prepend($firstHeaderRow);\n\t\t\t$tr.insertAfter($trLabels);\n\t\t\t$htable.append($theadInTable);\n\n\t\t\tif (o.useColSpanStyle) {\n\t\t\t\t// Increase the height of resizing span of visible headers\n\t\t\t\t$htable.find(\"span.ui-jqgrid-resize\").each(function () {\n\t\t\t\t\tvar $parent = $(this).parent();\n\t\t\t\t\tif ($parent.is(\":visible\")) {\n\t\t\t\t\t\tthis.style.cssText = 'height: ' + $parent.height() + 'px !important; cursor: col-resize;';\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Set position of the sortable div (the main lable)\n\t\t\t\t// with the column header text to the middle of the cell.\n\t\t\t\t// One should not do this for hidden headers.\n\t\t\t\t$htable.find(\"div.ui-jqgrid-sortable\").each(function () {\n\t\t\t\t\tvar $ts = $(this), $parent = $ts.parent();\n\t\t\t\t\tif ($parent.is(\":visible\") && $parent.is(\":has(span.ui-jqgrid-resize)\")) {\n\t\t\t\t\t\t$ts.css('top', ($parent.height() - $ts.outerHeight()) / 2 + 'px');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t$firstRow = $theadInTable.find(\"tr.jqg-first-row-header\");\n\t\t\t$(ts).bind('jqGridResizeStop.setGroupHeaders', function (e, nw, idx) {\n\t\t\t\t$firstRow.find('th').eq(idx).width(nw);\n\t\t\t});\n\t\t});\t\t\t\t\n\t},\n\tsetFrozenColumns : function () {\n\t\treturn this.each(function() {\n\t\t\tif ( !this.grid ) {return;}\n\t\t\tvar $t = this, cm = $t.p.colModel,i=0, len = cm.length, maxfrozen = -1, frozen= false;\n\t\t\t// TODO treeGrid and grouping  Support\n\t\t\tif($t.p.subGrid === true || $t.p.treeGrid === true || $t.p.cellEdit === true || $t.p.sortable || $t.p.scroll || $t.p.grouping )\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif($t.p.rownumbers) { i++; }\n\t\t\tif($t.p.multiselect) { i++; }\n\t\t\t\n\t\t\t// get the max index of frozen col\n\t\t\twhile(i<len)\n\t\t\t{\n\t\t\t\t// from left, no breaking frozen\n\t\t\t\tif(cm[i].frozen === true)\n\t\t\t\t{\n\t\t\t\t\tfrozen = true;\n\t\t\t\t\tmaxfrozen = i;\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tif( maxfrozen>=0 && frozen) {\n\t\t\t\tvar top = $t.p.caption ? $($t.grid.cDiv).outerHeight() : 0,\n\t\t\t\thth = $(\".ui-jqgrid-htable\",\"#gview_\"+$.jgrid.jqID($t.p.id)).height();\n\t\t\t\t//headers\n\t\t\t\tif($t.p.toppager) {\n\t\t\t\t\ttop = top + $($t.grid.topDiv).outerHeight();\n\t\t\t\t}\n\t\t\t\tif($t.p.toolbar[0] === true) {\n\t\t\t\t\tif($t.p.toolbar[1] !== \"bottom\") {\n\t\t\t\t\t\ttop = top + $($t.grid.uDiv).outerHeight();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$t.grid.fhDiv = $('<div style=\"position:absolute;left:0px;top:'+top+'px;height:'+hth+'px;\" class=\"frozen-div ui-state-default ui-jqgrid-hdiv\"></div>');\n\t\t\t\t$t.grid.fbDiv = $('<div style=\"position:absolute;left:0px;top:'+(parseInt(top,10)+parseInt(hth,10) + 1)+'px;overflow-y:hidden\" class=\"frozen-bdiv ui-jqgrid-bdiv\"></div>');\n\t\t\t\t$(\"#gview_\"+$.jgrid.jqID($t.p.id)).append($t.grid.fhDiv);\n\t\t\t\tvar htbl = $(\".ui-jqgrid-htable\",\"#gview_\"+$.jgrid.jqID($t.p.id)).clone(true);\n\t\t\t\t// groupheader support - only if useColSpanstyle is false\n\t\t\t\tif($t.p.groupHeader) {\n\t\t\t\t\t$(\"tr.jqg-first-row-header, tr.jqg-third-row-header\", htbl).each(function(){\n\t\t\t\t\t\t$(\"th:gt(\"+maxfrozen+\")\",this).remove();\n\t\t\t\t\t});\n\t\t\t\t\tvar swapfroz = -1, fdel = -1, cs, rs;\n\t\t\t\t\t$(\"tr.jqg-second-row-header th\", htbl).each(function(){\n\t\t\t\t\t\tcs= parseInt($(this).attr(\"colspan\"),10);\n\t\t\t\t\t\trs= parseInt($(this).attr(\"rowspan\"),10);\n\t\t\t\t\t\tif(rs) {\n\t\t\t\t\t\t\tswapfroz++;\n\t\t\t\t\t\t\tfdel++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(cs) {\n\t\t\t\t\t\t\tswapfroz = swapfroz+cs;\n\t\t\t\t\t\t\tfdel++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(swapfroz === maxfrozen) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tif(swapfroz !== maxfrozen) {\n\t\t\t\t\t\tfdel = maxfrozen;\n\t\t\t\t\t}\n\t\t\t\t\t$(\"tr.jqg-second-row-header\", htbl).each(function(){\n\t\t\t\t\t\t$(\"th:gt(\"+fdel+\")\",this).remove();\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t$(\"tr\",htbl).each(function(){\n\t\t\t\t\t\t$(\"th:gt(\"+maxfrozen+\")\",this).remove();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t$(htbl).width(1);\n\t\t\t\t// resizing stuff\n\t\t\t\t$($t.grid.fhDiv).append(htbl)\n\t\t\t\t.mousemove(function (e) {\n\t\t\t\t\tif($t.grid.resizing){ $t.grid.dragMove(e);return false; }\n\t\t\t\t});\n\t\t\t\t$($t).bind('jqGridResizeStop.setFrozenColumns', function (e, w, index) {\n\t\t\t\t\tvar rhth = $(\".ui-jqgrid-htable\",$t.grid.fhDiv);\n\t\t\t\t\t$(\"th:eq(\"+index+\")\",rhth).width( w ); \n\t\t\t\t\tvar btd = $(\".ui-jqgrid-btable\",$t.grid.fbDiv);\n\t\t\t\t\t$(\"tr:first td:eq(\"+index+\")\",btd).width( w ); \n\t\t\t\t});\n\t\t\t\t// sorting stuff\n\t\t\t\t$($t).bind('jqGridOnSortCol.setFrozenColumns', function (e, index, idxcol) {\n\n\t\t\t\t\tvar previousSelectedTh = $(\"tr.ui-jqgrid-labels:last th:eq(\"+$t.p.lastsort+\")\",$t.grid.fhDiv), newSelectedTh = $(\"tr.ui-jqgrid-labels:last th:eq(\"+idxcol+\")\",$t.grid.fhDiv);\n\n\t\t\t\t\t$(\"span.ui-grid-ico-sort\",previousSelectedTh).addClass('ui-state-disabled');\n\t\t\t\t\t$(previousSelectedTh).attr(\"aria-selected\",\"false\");\n\t\t\t\t\t$(\"span.ui-icon-\"+$t.p.sortorder,newSelectedTh).removeClass('ui-state-disabled');\n\t\t\t\t\t$(newSelectedTh).attr(\"aria-selected\",\"true\");\n\t\t\t\t\tif(!$t.p.viewsortcols[0]) {\n\t\t\t\t\t\tif($t.p.lastsort !== idxcol) {\n\t\t\t\t\t\t\t$(\"span.s-ico\",previousSelectedTh).hide();\n\t\t\t\t\t\t\t$(\"span.s-ico\",newSelectedTh).show();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t// data stuff\n\t\t\t\t//TODO support for setRowData\n\t\t\t\t$(\"#gview_\"+$.jgrid.jqID($t.p.id)).append($t.grid.fbDiv);\n\t\t\t\t$($t.grid.bDiv).scroll(function () {\n\t\t\t\t\t$($t.grid.fbDiv).scrollTop($(this).scrollTop());\n\t\t\t\t});\n\t\t\t\tif($t.p.hoverrows === true) {\n\t\t\t\t\t$(\"#\"+$.jgrid.jqID($t.p.id)).unbind('mouseover').unbind('mouseout');\n\t\t\t\t}\n\t\t\t\t$($t).bind('jqGridAfterGridComplete.setFrozenColumns', function () {\n\t\t\t\t\t$(\"#\"+$.jgrid.jqID($t.p.id)+\"_frozen\").remove();\n\t\t\t\t\t$($t.grid.fbDiv).height($($t.grid.bDiv).height()-16);\n\t\t\t\t\tvar btbl = $(\"#\"+$.jgrid.jqID($t.p.id)).clone(true);\n\t\t\t\t\t$(\"tr\",btbl).each(function(){\n\t\t\t\t\t\t$(\"td:gt(\"+maxfrozen+\")\",this).remove();\n\t\t\t\t\t});\n\n\t\t\t\t\t$(btbl).width(1).attr(\"id\",$t.p.id+\"_frozen\");\n\t\t\t\t\t$($t.grid.fbDiv).append(btbl);\n\t\t\t\t\tif($t.p.hoverrows === true) {\n\t\t\t\t\t\t$(\"tr.jqgrow\", btbl).hover(\n\t\t\t\t\t\t\tfunction(){ $(this).addClass(\"ui-state-hover\"); $(\"#\"+$.jgrid.jqID(this.id), \"#\"+$.jgrid.jqID($t.p.id)).addClass(\"ui-state-hover\"); },\n\t\t\t\t\t\t\tfunction(){ $(this).removeClass(\"ui-state-hover\"); $(\"#\"+$.jgrid.jqID(this.id), \"#\"+$.jgrid.jqID($t.p.id)).removeClass(\"ui-state-hover\"); }\n\t\t\t\t\t\t);\n\t\t\t\t\t\t$(\"tr.jqgrow\", \"#\"+$.jgrid.jqID($t.p.id)).hover(\n\t\t\t\t\t\t\tfunction(){ $(this).addClass(\"ui-state-hover\"); $(\"#\"+$.jgrid.jqID(this.id), \"#\"+$.jgrid.jqID($t.p.id)+\"_frozen\").addClass(\"ui-state-hover\");},\n\t\t\t\t\t\t\tfunction(){ $(this).removeClass(\"ui-state-hover\"); $(\"#\"+$.jgrid.jqID(this.id), \"#\"+$.jgrid.jqID($t.p.id)+\"_frozen\").removeClass(\"ui-state-hover\"); }\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbtbl=null;\n\t\t\t\t});\n\t\t\t\t$t.p.frozenColumns = true;\n\t\t\t}\n\t\t});\n\t},\n\tdestroyFrozenColumns :  function() {\n\t\treturn this.each(function() {\n\t\t\tif ( !this.grid ) {return;}\n\t\t\tif(this.p.frozenColumns === true) {\n\t\t\t\tvar $t = this;\n\t\t\t\t$($t.grid.fhDiv).remove();\n\t\t\t\t$($t.grid.fbDiv).remove();\n\t\t\t\t$t.grid.fhDiv = null; $t.grid.fbDiv=null;\n\t\t\t\t$(this).unbind('.setFrozenColumns');\n\t\t\t\tif($t.p.hoverrows === true) {\n\t\t\t\t\tvar ptr;\n\t\t\t\t\t$(\"#\"+$.jgrid.jqID($t.p.id)).bind('mouseover',function(e) {\n\t\t\t\t\t\tptr = $(e.target).closest(\"tr.jqgrow\");\n\t\t\t\t\t\tif($(ptr).attr(\"class\") !== \"ui-subgrid\") {\n\t\t\t\t\t\t$(ptr).addClass(\"ui-state-hover\");\n\t\t\t\t\t}\n\t\t\t\t\t}).bind('mouseout',function(e) {\n\t\t\t\t\t\tptr = $(e.target).closest(\"tr.jqgrow\");\n\t\t\t\t\t\t$(ptr).removeClass(\"ui-state-hover\");\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis.p.frozenColumns = false;\n\t\t\t}\n\t\t});\n\t}\n});\n})(jQuery);\n/*\n * jqModal - Minimalist Modaling with jQuery\n *   (http://dev.iceburg.net/jquery/jqmodal/)\n *\n * Copyright (c) 2007,2008 Brice Burgess <bhb@iceburg.net>\n * Dual licensed under the MIT and GPL licenses:\n *   http://www.opensource.org/licenses/mit-license.php\n *   http://www.gnu.org/licenses/gpl.html\n * \n * $Version: 07/06/2008 +r13\n */\n(function($) {\n$.fn.jqm=function(o){\nvar p={\noverlay: 50,\ncloseoverlay : true,\noverlayClass: 'jqmOverlay',\ncloseClass: 'jqmClose',\ntrigger: '.jqModal',\najax: F,\najaxText: '',\ntarget: F,\nmodal: F,\ntoTop: F,\nonShow: F,\nonHide: F,\nonLoad: F\n};\nreturn this.each(function(){if(this._jqm)return H[this._jqm].c=$.extend({},H[this._jqm].c,o);s++;this._jqm=s;\nH[s]={c:$.extend(p,$.jqm.params,o),a:F,w:$(this).addClass('jqmID'+s),s:s};\nif(p.trigger)$(this).jqmAddTrigger(p.trigger);\n});};\n\n$.fn.jqmAddClose=function(e){return hs(this,e,'jqmHide');};\n$.fn.jqmAddTrigger=function(e){return hs(this,e,'jqmShow');};\n$.fn.jqmShow=function(t){return this.each(function(){$.jqm.open(this._jqm,t);});};\n$.fn.jqmHide=function(t){return this.each(function(){$.jqm.close(this._jqm,t)});};\n\n$.jqm = {\nhash:{},\nopen:function(s,t){var h=H[s],c=h.c,cc='.'+c.closeClass,z=(parseInt(h.w.css('z-index')));z=(z>0)?z:3000;var o=$('<div></div>').css({height:'100%',width:'100%',position:'fixed',left:0,top:0,'z-index':z-1,opacity:c.overlay/100});if(h.a)return F;h.t=t;h.a=true;h.w.css('z-index',z);\n if(c.modal) {if(!A[0])setTimeout(function(){L('bind');},1);A.push(s);}\n else if(c.overlay > 0) {if(c.closeoverlay) h.w.jqmAddClose(o);}\n else o=F;\n\n h.o=(o)?o.addClass(c.overlayClass).prependTo('body'):F;\n\n if(c.ajax) {var r=c.target||h.w,u=c.ajax;r=(typeof r == 'string')?$(r,h.w):$(r);u=(u.substr(0,1) == '@')?$(t).attr(u.substring(1)):u;\n  r.html(c.ajaxText).load(u,function(){if(c.onLoad)c.onLoad.call(this,h);if(cc)h.w.jqmAddClose($(cc,h.w));e(h);});}\n else if(cc)h.w.jqmAddClose($(cc,h.w));\n\n if(c.toTop&&h.o)h.w.before('<span id=\"jqmP'+h.w[0]._jqm+'\"></span>').insertAfter(h.o);\t\n (c.onShow)?c.onShow(h):h.w.show();e(h);return F;\n},\nclose:function(s){var h=H[s];if(!h.a)return F;h.a=F;\n if(A[0]){A.pop();if(!A[0])L('unbind');}\n if(h.c.toTop&&h.o)$('#jqmP'+h.w[0]._jqm).after(h.w).remove();\n if(h.c.onHide)h.c.onHide(h);else{h.w.hide();if(h.o)h.o.remove();} return F;\n},\nparams:{}};\nvar s=0,H=$.jqm.hash,A=[],F=false,\ne=function(h){f(h);},\nf=function(h){try{$(':input:visible',h.w)[0].focus();}catch(_){}},\nL=function(t){$(document)[t](\"keypress\",m)[t](\"keydown\",m)[t](\"mousedown\",m);},\nm=function(e){var h=H[A[A.length-1]],r=(!$(e.target).parents('.jqmID'+h.s)[0]);if(r){$('.jqmID'+h.s).each(function(){var $self=$(this),offset=$self.offset();if(offset.top<=e.pageY && e.pageY<=offset.top+$self.height() && offset.left<=e.pageX && e.pageX<=offset.left+$self.width()){r=false;return false;}});f(h);}return !r;},\nhs=function(w,t,c){return w.each(function(){var s=this._jqm;$(t).each(function() {\n if(!this[c]){this[c]=[];$(this).click(function(){for(var i in {jqmShow:1,jqmHide:1})for(var s in this[i])if(H[this[i][s]])H[this[i][s]].w[i](this);return F;});}this[c].push(s);});});};\n})(jQuery);/*\n * jqDnR - Minimalistic Drag'n'Resize for jQuery.\n *\n * Copyright (c) 2007 Brice Burgess <bhb@iceburg.net>, http://www.iceburg.net\n * Licensed under the MIT License:\n * http://www.opensource.org/licenses/mit-license.php\n * \n * $Version: 2007.08.19 +r2\n */\n\n(function($){\n$.fn.jqDrag=function(h){return i(this,h,'d');};\n$.fn.jqResize=function(h,ar){return i(this,h,'r',ar);};\n$.jqDnR={\n\tdnr:{},\n\te:0,\n\tdrag:function(v){\n\t\tif(M.k == 'd'){E.css({left:M.X+v.pageX-M.pX,top:M.Y+v.pageY-M.pY});}\n\t\telse {\n\t\t\tE.css({width:Math.max(v.pageX-M.pX+M.W,0),height:Math.max(v.pageY-M.pY+M.H,0)});\n\t\t\tif(M1){E1.css({width:Math.max(v.pageX-M1.pX+M1.W,0),height:Math.max(v.pageY-M1.pY+M1.H,0)});}\n\t\t}\n\t\treturn false;\n\t},\n\tstop:function(){\n\t\t//E.css('opacity',M.o);\n\t\t$(document).unbind('mousemove',J.drag).unbind('mouseup',J.stop);\n\t}\n};\nvar J=$.jqDnR,M=J.dnr,E=J.e,E1,M1,\ni=function(e,h,k,aR){\n\treturn e.each(function(){\n\t\th=(h)?$(h,e):e;\n\t\th.bind('mousedown',{e:e,k:k},function(v){\n\t\t\tvar d=v.data,p={};E=d.e;E1 = aR ? $(aR) : false;\n\t\t\t// attempt utilization of dimensions plugin to fix IE issues\n\t\t\tif(E.css('position') != 'relative'){try{E.position(p);}catch(e){}}\n\t\t\tM={\n\t\t\t\tX:p.left||f('left')||0,\n\t\t\t\tY:p.top||f('top')||0,\n\t\t\t\tW:f('width')||E[0].scrollWidth||0,\n\t\t\t\tH:f('height')||E[0].scrollHeight||0,\n\t\t\t\tpX:v.pageX,\n\t\t\t\tpY:v.pageY,\n\t\t\t\tk:d.k\n\t\t\t\t//o:E.css('opacity')\n\t\t\t};\n\t\t\t// also resize\n\t\t\tif(E1 && d.k != 'd'){\n\t\t\t\tM1={\n\t\t\t\t\tX:p.left||f1('left')||0,\n\t\t\t\t\tY:p.top||f1('top')||0,\n\t\t\t\t\tW:E1[0].offsetWidth||f1('width')||0,\n\t\t\t\t\tH:E1[0].offsetHeight||f1('height')||0,\n\t\t\t\t\tpX:v.pageX,\n\t\t\t\t\tpY:v.pageY,\n\t\t\t\t\tk:d.k\n\t\t\t\t};\n\t\t\t} else {M1 = false;}\t\t\t\n\t\t\t//E.css({opacity:0.8});\n\t\t\tif($(\"input.hasDatepicker\",E[0])[0]) {\n\t\t\ttry {$(\"input.hasDatepicker\",E[0]).datepicker('hide');}catch (dpe){}\n\t\t\t}\n\t\t\t$(document).mousemove($.jqDnR.drag).mouseup($.jqDnR.stop);\n\t\t\treturn false;\n\t\t});\n\t});\n},\nf=function(k){return parseInt(E.css(k),10)||false;},\nf1=function(k){return parseInt(E1.css(k),10)||false;};\n})(jQuery);/*\n\tThe below work is licensed under Creative Commons GNU LGPL License.\n\n\tOriginal work:\n\n\tLicense:     http://creativecommons.org/licenses/LGPL/2.1/\n\tAuthor:      Stefan Goessner/2006\n\tWeb:         http://goessner.net/ \n\n\tModifications made:\n\n\tVersion:     0.9-p5\n\tDescription: Restructured code, JSLint validated (no strict whitespaces),\n\t             added handling of empty arrays, empty strings, and int/floats values.\n\tAuthor:      Michael Schøler/2008-01-29\n\tWeb:         http://michael.hinnerup.net/blog/2008/01/26/converting-json-to-xml-and-xml-to-json/\n\t\n\tDescription: json2xml added support to convert functions as CDATA\n\t             so it will be easy to write characters that cause some problems when convert\n\tAuthor:      Tony Tomov\n*/\n\n/*global alert */\nvar xmlJsonClass = {\n\t// Param \"xml\": Element or document DOM node.\n\t// Param \"tab\": Tab or indent string for pretty output formatting omit or use empty string \"\" to supress.\n\t// Returns:     JSON string\n\txml2json: function(xml, tab) {\n\t\tif (xml.nodeType === 9) {\n\t\t\t// document node\n\t\t\txml = xml.documentElement;\n\t\t}\n\t\tvar nws = this.removeWhite(xml);\n\t\tvar obj = this.toObj(nws);\n\t\tvar json = this.toJson(obj, xml.nodeName, \"\\t\");\n\t\treturn \"{\\n\" + tab + (tab ? json.replace(/\\t/g, tab) : json.replace(/\\t|\\n/g, \"\")) + \"\\n}\";\n\t},\n\n\t// Param \"o\":   JavaScript object\n\t// Param \"tab\": tab or indent string for pretty output formatting omit or use empty string \"\" to supress.\n\t// Returns:     XML string\n\tjson2xml: function(o, tab) {\n\t\tvar toXml = function(v, name, ind) {\n\t\t\tvar xml = \"\";\n\t\t\tvar i, n;\n\t\t\tif (v instanceof Array) {\n\t\t\t\tif (v.length === 0) {\n\t\t\t\t\txml += ind + \"<\"+name+\">__EMPTY_ARRAY_</\"+name+\">\\n\";\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfor (i = 0, n = v.length; i < n; i += 1) {\n\t\t\t\t\t\tvar sXml = ind + toXml(v[i], name, ind+\"\\t\") + \"\\n\";\n\t\t\t\t\t\txml += sXml;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (typeof(v) === \"object\") {\n\t\t\t\tvar hasChild = false;\n\t\t\t\txml += ind + \"<\" + name;\n\t\t\t\tvar m;\n\t\t\t\tfor (m in v) if (v.hasOwnProperty(m)) {\n\t\t\t\t\tif (m.charAt(0) === \"@\") {\n\t\t\t\t\t\txml += \" \" + m.substr(1) + \"=\\\"\" + v[m].toString() + \"\\\"\";\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\thasChild = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\txml += hasChild ? \">\" : \"/>\";\n\t\t\t\tif (hasChild) {\n\t\t\t\t\tfor (m in v) if (v.hasOwnProperty(m)) {\n\t\t\t\t\t\tif (m === \"#text\") {\n\t\t\t\t\t\t\txml += v[m];\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (m === \"#cdata\") {\n\t\t\t\t\t\t\txml += \"<![CDATA[\" + v[m] + \"]]>\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (m.charAt(0) !== \"@\") {\n\t\t\t\t\t\t\txml += toXml(v[m], m, ind+\"\\t\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\txml += (xml.charAt(xml.length - 1) === \"\\n\" ? ind : \"\") + \"</\" + name + \">\";\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (typeof(v) === \"function\") {\n\t\t\t\txml += ind + \"<\" + name + \">\" + \"<![CDATA[\" + v + \"]]>\" + \"</\" + name + \">\";\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (v === undefined ) { v = \"\"; }\n\t\t\t\tif (v.toString() === \"\\\"\\\"\" || v.toString().length === 0) {\n\t\t\t\t\txml += ind + \"<\" + name + \">__EMPTY_STRING_</\" + name + \">\";\n\t\t\t\t} \n\t\t\t\telse {\n\t\t\t\t\txml += ind + \"<\" + name + \">\" + v.toString() + \"</\" + name + \">\";\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn xml;\n\t\t};\n\t\tvar xml = \"\";\n\t\tvar m;\n\t\tfor (m in o) if (o.hasOwnProperty(m)) {\n\t\t\txml += toXml(o[m], m, \"\");\n\t\t}\n\t\treturn tab ? xml.replace(/\\t/g, tab) : xml.replace(/\\t|\\n/g, \"\");\n\t},\n\t// Internal methods\n\ttoObj: function(xml) {\n\t\tvar o = {};\n\t\tvar FuncTest = /function/i;\n\t\tif (xml.nodeType === 1) {\n\t\t\t// element node ..\n\t\t\tif (xml.attributes.length) {\n\t\t\t\t// element with attributes ..\n\t\t\t\tvar i;\n\t\t\t\tfor (i = 0; i < xml.attributes.length; i += 1) {\n\t\t\t\t\to[\"@\" + xml.attributes[i].nodeName] = (xml.attributes[i].nodeValue || \"\").toString();\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (xml.firstChild) {\n\t\t\t\t// element has child nodes ..\n\t\t\t\tvar textChild = 0, cdataChild = 0, hasElementChild = false;\n\t\t\t\tvar n;\n\t\t\t\tfor (n = xml.firstChild; n; n = n.nextSibling) {\n\t\t\t\t\tif (n.nodeType === 1) {\n\t\t\t\t\t\thasElementChild = true;\n\t\t\t\t\t}\n\t\t\t\t\telse if (n.nodeType === 3 && n.nodeValue.match(/[^ \\f\\n\\r\\t\\v]/)) {\n\t\t\t\t\t\t// non-whitespace text\n\t\t\t\t\t\ttextChild += 1;\n\t\t\t\t\t}\n\t\t\t\t\telse if (n.nodeType === 4) {\n\t\t\t\t\t\t// cdata section node\n\t\t\t\t\t\tcdataChild += 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (hasElementChild) {\n\t\t\t\t\tif (textChild < 2 && cdataChild < 2) {\n\t\t\t\t\t\t// structured element with evtl. a single text or/and cdata node ..\n\t\t\t\t\t\tthis.removeWhite(xml);\n\t\t\t\t\t\tfor (n = xml.firstChild; n; n = n.nextSibling) {\n\t\t\t\t\t\t\tif (n.nodeType === 3) {\n\t\t\t\t\t\t\t\t// text node\n\t\t\t\t\t\t\t\to[\"#text\"] = this.escape(n.nodeValue);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (n.nodeType === 4) {\n\t\t\t\t\t\t\t\t// cdata node\n\t\t\t\t\t\t\t\tif (FuncTest.test(n.nodeValue)) {\n\t\t\t\t\t\t\t\t\to[n.nodeName] = [o[n.nodeName], n.nodeValue];\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\to[\"#cdata\"] = this.escape(n.nodeValue);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (o[n.nodeName]) {\n\t\t\t\t\t\t\t\t// multiple occurence of element ..\n\t\t\t\t\t\t\t\tif (o[n.nodeName] instanceof Array) {\n\t\t\t\t\t\t\t\t\to[n.nodeName][o[n.nodeName].length] = this.toObj(n);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\to[n.nodeName] = [o[n.nodeName], this.toObj(n)];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t// first occurence of element ..\n\t\t\t\t\t\t\t\to[n.nodeName] = this.toObj(n);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// mixed content\n\t\t\t\t\t\tif (!xml.attributes.length) {\n\t\t\t\t\t\t\to = this.escape(this.innerXml(xml));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\to[\"#text\"] = this.escape(this.innerXml(xml));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (textChild) {\n\t\t\t\t\t// pure text\n\t\t\t\t\tif (!xml.attributes.length) {\n\t\t\t\t\t\to = this.escape(this.innerXml(xml));\n\t\t\t\t\t\tif (o === \"__EMPTY_ARRAY_\") {\n\t\t\t\t\t\t\to = \"[]\";\n\t\t\t\t\t\t} else if (o === \"__EMPTY_STRING_\") {\n\t\t\t\t\t\t\to = \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\to[\"#text\"] = this.escape(this.innerXml(xml));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (cdataChild) {\n\t\t\t\t\t// cdata\n\t\t\t\t\tif (cdataChild > 1) {\n\t\t\t\t\t\to = this.escape(this.innerXml(xml));\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (n = xml.firstChild; n; n = n.nextSibling) {\n\t\t\t\t\t\t\tif(FuncTest.test(xml.firstChild.nodeValue)) {\n\t\t\t\t\t\t\t\to = xml.firstChild.nodeValue;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\to[\"#cdata\"] = this.escape(n.nodeValue);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!xml.attributes.length && !xml.firstChild) {\n\t\t\t\to = null;\n\t\t\t}\n\t\t}\n\t\telse if (xml.nodeType === 9) {\n\t\t\t// document.node\n\t\t\to = this.toObj(xml.documentElement);\n\t\t}\n\t\telse {\n\t\t\talert(\"unhandled node type: \" + xml.nodeType);\n\t\t}\n\t\treturn o;\n\t},\n\ttoJson: function(o, name, ind, wellform) {\n\t\tif(wellform === undefined) wellform = true;\n\t\tvar json = name ? (\"\\\"\" + name + \"\\\"\") : \"\", tab = \"\\t\", newline = \"\\n\";\n\t\tif(!wellform) {\n\t\t\ttab= \"\"; newline= \"\";\n\t\t}\n\n\t\tif (o === \"[]\") {\n\t\t\tjson += (name ? \":[]\" : \"[]\");\n\t\t}\n\t\telse if (o instanceof Array) {\n\t\t\tvar n, i, ar=[];\n\t\t\tfor (i = 0, n = o.length; i < n; i += 1) {\n\t\t\t\tar[i] = this.toJson(o[i], \"\", ind + tab, wellform);\n\t\t\t}\n\t\t\tjson += (name ? \":[\" : \"[\") + (ar.length > 1 ? (newline + ind + tab + ar.join(\",\"+newline + ind + tab) + newline + ind) : ar.join(\"\")) + \"]\";\n\t\t}\n\t\telse if (o === null) {\n\t\t\tjson += (name && \":\") + \"null\";\n\t\t}\n\t\telse if (typeof(o) === \"object\") {\n\t\t\tvar arr = [], m;\n\t\t\tfor (m in o) {\n\t\t\t\tif (o.hasOwnProperty(m)) {\n\t\t\t\t\tarr[arr.length] = this.toJson(o[m], m, ind + tab, wellform);\n\t\t\t}\n\t\t}\n\t\t\tjson += (name ? \":{\" : \"{\") + (arr.length > 1 ? (newline + ind + tab + arr.join(\",\"+newline + ind + tab) + newline + ind) : arr.join(\"\")) + \"}\";\n\t\t}\n\t\telse if (typeof(o) === \"string\") {\n\t\t\t/*\n\t\t\tvar objRegExp  = /(^-?\\d+\\.?\\d*$)/;\n\t\t\tvar FuncTest = /function/i;\n\t\t\tvar os = o.toString();\n\t\t\tif (objRegExp.test(os) || FuncTest.test(os) || os===\"false\" || os===\"true\") {\n\t\t\t\t// int or float\n\t\t\t\tjson += (name && \":\")  + \"\\\"\" +os + \"\\\"\";\n\t\t\t} \n\t\t\telse {\n\t\t\t*/\n\t\t\t\tjson += (name && \":\") + \"\\\"\" + o.replace(/\\\\/g,'\\\\\\\\').replace(/\\\"/g,'\\\\\"') + \"\\\"\";\n\t\t\t//}\n\t\t\t}\n\t\telse {\n\t\t\tjson += (name && \":\") +  o.toString();\n\t\t}\n\t\treturn json;\n\t},\n\tinnerXml: function(node) {\n\t\tvar s = \"\";\n\t\tif (\"innerHTML\" in node) {\n\t\t\ts = node.innerHTML;\n\t\t}\n\t\telse {\n\t\t\tvar asXml = function(n) {\n\t\t\t\tvar s = \"\", i;\n\t\t\t\tif (n.nodeType === 1) {\n\t\t\t\t\ts += \"<\" + n.nodeName;\n\t\t\t\t\tfor (i = 0; i < n.attributes.length; i += 1) {\n\t\t\t\t\t\ts += \" \" + n.attributes[i].nodeName + \"=\\\"\" + (n.attributes[i].nodeValue || \"\").toString() + \"\\\"\";\n\t\t\t\t\t}\n\t\t\t\t\tif (n.firstChild) {\n\t\t\t\t\t\ts += \">\";\n\t\t\t\t\t\tfor (var c = n.firstChild; c; c = c.nextSibling) {\n\t\t\t\t\t\t\ts += asXml(c);\n\t\t\t\t\t\t}\n\t\t\t\t\t\ts += \"</\" + n.nodeName + \">\";\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\ts += \"/>\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (n.nodeType === 3) {\n\t\t\t\t\ts += n.nodeValue;\n\t\t\t\t}\n\t\t\t\telse if (n.nodeType === 4) {\n\t\t\t\t\ts += \"<![CDATA[\" + n.nodeValue + \"]]>\";\n\t\t\t\t}\n\t\t\t\treturn s;\n\t\t\t};\n\t\t\tfor (var c = node.firstChild; c; c = c.nextSibling) {\n\t\t\t\ts += asXml(c);\n\t\t\t}\n\t\t}\n\t\treturn s;\n\t},\n\tescape: function(txt) {\n\t\treturn txt.replace(/[\\\\]/g, \"\\\\\\\\\").replace(/[\\\"]/g, '\\\\\"').replace(/[\\n]/g, '\\\\n').replace(/[\\r]/g, '\\\\r');\n\t},\n\tremoveWhite: function(e) {\n\t\te.normalize();\n\t\tvar n;\n\t\tfor (n = e.firstChild; n; ) {\n\t\t\tif (n.nodeType === 3) {\n\t\t\t\t// text node\n\t\t\t\tif (!n.nodeValue.match(/[^ \\f\\n\\r\\t\\v]/)) {\n\t\t\t\t\t// pure whitespace text node\n\t\t\t\t\tvar nxt = n.nextSibling;\n\t\t\t\t\te.removeChild(n);\n\t\t\t\t\tn = nxt;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tn = n.nextSibling;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (n.nodeType === 1) {\n\t\t\t\t// element node\n\t\t\t\tthis.removeWhite(n);\n\t\t\t\tn = n.nextSibling;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// any other node\n\t\t\t\tn = n.nextSibling;\n\t\t\t}\n\t\t}\n\t\treturn e;\n\t}\n};/*\n**\n * formatter for values but most of the values if for jqGrid\n * Some of this was inspired and based on how YUI does the table datagrid but in jQuery fashion\n * we are trying to keep it as light as possible\n * Joshua Burnett josh@9ci.com\t\n * http://www.greenbill.com\n *\n * Changes from Tony Tomov tony@trirand.com\n * Dual licensed under the MIT and GPL licenses:\n * http://www.opensource.org/licenses/mit-license.php\n * http://www.gnu.org/licenses/gpl-2.0.html\n * \n**/\n/*jshint eqeqeq:false */\n/*global jQuery */\n\n(function($) {\n\"use strict\";\t\n\t$.fmatter = {};\n\t//opts can be id:row id for the row, rowdata:the data for the row, colmodel:the column model for this column\n\t//example {id:1234,}\n\t$.extend($.fmatter,{\n\t\tisBoolean : function(o) {\n\t\t\treturn typeof o === 'boolean';\n\t\t},\n\t\tisObject : function(o) {\n\t\t\treturn (o && (typeof o === 'object' || $.isFunction(o))) || false;\n\t\t},\n\t\tisString : function(o) {\n\t\t\treturn typeof o === 'string';\n\t\t},\n\t\tisNumber : function(o) {\n\t\t\treturn typeof o === 'number' && isFinite(o);\n\t\t},\n\t\tisValue : function (o) {\n\t\t\treturn (this.isObject(o) || this.isString(o) || this.isNumber(o) || this.isBoolean(o));\n\t\t},\n\t\tisEmpty : function(o) {\n\t\t\tif(!this.isString(o) && this.isValue(o)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!this.isValue(o)){\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\to = $.trim(o).replace(/\\&nbsp\\;/ig,'').replace(/\\&#160\\;/ig,'');\n\t\t\treturn o===\"\";\t\n\t\t}\n\t});\n\t$.fn.fmatter = function(formatType, cellval, opts, rwd, act) {\n\t\t// build main options before element iteration\n\t\tvar v=cellval;\n\t\topts = $.extend({}, $.jgrid.formatter, opts);\n\n\t\ttry {\n\t\t\tv = $.fn.fmatter[formatType].call(this, cellval, opts, rwd, act);\n\t\t} catch(fe){}\n\t\treturn v;\n\t};\n\t$.fmatter.util = {\n\t\t// Taken from YAHOO utils\n\t\tNumberFormat : function(nData,opts) {\n\t\t\tif(!$.fmatter.isNumber(nData)) {\n\t\t\t\tnData *= 1;\n\t\t\t}\n\t\t\tif($.fmatter.isNumber(nData)) {\n\t\t\t\tvar bNegative = (nData < 0);\n\t\t\t\tvar sOutput = String(nData);\n\t\t\t\tvar sDecimalSeparator = opts.decimalSeparator || \".\";\n\t\t\t\tvar nDotIndex;\n\t\t\t\tif($.fmatter.isNumber(opts.decimalPlaces)) {\n\t\t\t\t\t// Round to the correct decimal place\n\t\t\t\t\tvar nDecimalPlaces = opts.decimalPlaces;\n\t\t\t\t\tvar nDecimal = Math.pow(10, nDecimalPlaces);\n\t\t\t\t\tsOutput = String(Math.round(nData*nDecimal)/nDecimal);\n\t\t\t\t\tnDotIndex = sOutput.lastIndexOf(\".\");\n\t\t\t\t\tif(nDecimalPlaces > 0) {\n\t\t\t\t\t// Add the decimal separator\n\t\t\t\t\t\tif(nDotIndex < 0) {\n\t\t\t\t\t\t\tsOutput += sDecimalSeparator;\n\t\t\t\t\t\t\tnDotIndex = sOutput.length-1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Replace the \".\"\n\t\t\t\t\t\telse if(sDecimalSeparator !== \".\"){\n\t\t\t\t\t\t\tsOutput = sOutput.replace(\".\",sDecimalSeparator);\n\t\t\t\t\t\t}\n\t\t\t\t\t// Add missing zeros\n\t\t\t\t\t\twhile((sOutput.length - 1 - nDotIndex) < nDecimalPlaces) {\n\t\t\t\t\t\t\tsOutput += \"0\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(opts.thousandsSeparator) {\n\t\t\t\t\tvar sThousandsSeparator = opts.thousandsSeparator;\n\t\t\t\t\tnDotIndex = sOutput.lastIndexOf(sDecimalSeparator);\n\t\t\t\t\tnDotIndex = (nDotIndex > -1) ? nDotIndex : sOutput.length;\n\t\t\t\t\tvar sNewOutput = sOutput.substring(nDotIndex);\n\t\t\t\t\tvar nCount = -1, i;\n\t\t\t\t\tfor (i=nDotIndex; i>0; i--) {\n\t\t\t\t\t\tnCount++;\n\t\t\t\t\t\tif ((nCount%3 === 0) && (i !== nDotIndex) && (!bNegative || (i > 1))) {\n\t\t\t\t\t\t\tsNewOutput = sThousandsSeparator + sNewOutput;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsNewOutput = sOutput.charAt(i-1) + sNewOutput;\n\t\t\t\t\t}\n\t\t\t\t\tsOutput = sNewOutput;\n\t\t\t\t}\n\t\t\t\t// Prepend prefix\n\t\t\t\tsOutput = (opts.prefix) ? opts.prefix + sOutput : sOutput;\n\t\t\t\t// Append suffix\n\t\t\t\tsOutput = (opts.suffix) ? sOutput + opts.suffix : sOutput;\n\t\t\t\treturn sOutput;\n\t\t\t\t\n\t\t\t}\n\t\t\treturn nData;\n\t\t}\n\t};\n\t$.fn.fmatter.defaultFormat = function(cellval, opts) {\n\t\treturn ($.fmatter.isValue(cellval) && cellval!==\"\" ) ?  cellval : opts.defaultValue || \"&#160;\";\n\t};\n\t$.fn.fmatter.email = function(cellval, opts) {\n\t\tif(!$.fmatter.isEmpty(cellval)) {\n\t\t\treturn \"<a href=\\\"mailto:\" + cellval + \"\\\">\" + cellval + \"</a>\";\n\t\t}\n\t\treturn $.fn.fmatter.defaultFormat(cellval,opts );\n\t};\n\t$.fn.fmatter.checkbox =function(cval, opts) {\n\t\tvar op = $.extend({},opts.checkbox), ds;\n\t\tif(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {\n\t\t\top = $.extend({},op,opts.colModel.formatoptions);\n\t\t}\n\t\tif(op.disabled===true) {ds = \"disabled=\\\"disabled\\\"\";} else {ds=\"\";}\n\t\tif($.fmatter.isEmpty(cval) || cval === undefined ) {cval = $.fn.fmatter.defaultFormat(cval,op);}\n\t\tcval=String(cval);\n\t\tcval=cval.toLowerCase();\n\t\tvar bchk = cval.search(/(false|f|0|no|n|off|undefined)/i)<0 ? \" checked='checked' \" : \"\";\n\t\treturn \"<input type=\\\"checkbox\\\" \" + bchk  + \" value=\\\"\"+ cval+\"\\\" offval=\\\"no\\\" \"+ds+ \"/>\";\n\t};\n\t$.fn.fmatter.link = function(cellval, opts) {\n\t\tvar op = {target:opts.target};\n\t\tvar target = \"\";\n\t\tif(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {\n\t\t\top = $.extend({},op,opts.colModel.formatoptions);\n\t\t}\n\t\tif(op.target) {target = 'target=' + op.target;}\n\t\tif(!$.fmatter.isEmpty(cellval)) {\n\t\t\treturn \"<a \"+target+\" href=\\\"\" + cellval + \"\\\">\" + cellval + \"</a>\";\n\t\t}\n\t\treturn $.fn.fmatter.defaultFormat(cellval,opts);\n\t};\n\t$.fn.fmatter.showlink = function(cellval, opts) {\n\t\tvar op = {baseLinkUrl: opts.baseLinkUrl,showAction:opts.showAction, addParam: opts.addParam || \"\", target: opts.target, idName: opts.idName},\n\t\ttarget = \"\", idUrl;\n\t\tif(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {\n\t\t\top = $.extend({},op,opts.colModel.formatoptions);\n\t\t}\n\t\tif(op.target) {target = 'target=' + op.target;}\n\t\tidUrl = op.baseLinkUrl+op.showAction + '?'+ op.idName+'='+opts.rowId+op.addParam;\n\t\tif($.fmatter.isString(cellval) || $.fmatter.isNumber(cellval)) {\t//add this one even if its blank string\n\t\t\treturn \"<a \"+target+\" href=\\\"\" + idUrl + \"\\\">\" + cellval + \"</a>\";\n\t\t}\n\t\treturn $.fn.fmatter.defaultFormat(cellval,opts);\n\t};\n\t$.fn.fmatter.integer = function(cellval, opts) {\n\t\tvar op = $.extend({},opts.integer);\n\t\tif(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {\n\t\t\top = $.extend({},op,opts.colModel.formatoptions);\n\t\t}\n\t\tif($.fmatter.isEmpty(cellval)) {\n\t\t\treturn op.defaultValue;\n\t\t}\n\t\treturn $.fmatter.util.NumberFormat(cellval,op);\n\t};\n\t$.fn.fmatter.number = function (cellval, opts) {\n\t\tvar op = $.extend({},opts.number);\n\t\tif(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {\n\t\t\top = $.extend({},op,opts.colModel.formatoptions);\n\t\t}\n\t\tif($.fmatter.isEmpty(cellval)) {\n\t\t\treturn op.defaultValue;\n\t\t}\n\t\treturn $.fmatter.util.NumberFormat(cellval,op);\n\t};\n\t$.fn.fmatter.currency = function (cellval, opts) {\n\t\tvar op = $.extend({},opts.currency);\n\t\tif(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {\n\t\t\top = $.extend({},op,opts.colModel.formatoptions);\n\t\t}\n\t\tif($.fmatter.isEmpty(cellval)) {\n\t\t\treturn op.defaultValue;\n\t\t}\n\t\treturn $.fmatter.util.NumberFormat(cellval,op);\n\t};\n\t$.fn.fmatter.date = function (cellval, opts, rwd, act) {\n\t\tvar op = $.extend({},opts.date);\n\t\tif(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {\n\t\t\top = $.extend({},op,opts.colModel.formatoptions);\n\t\t}\n\t\tif(!op.reformatAfterEdit && act === 'edit'){\n\t\t\treturn $.fn.fmatter.defaultFormat(cellval, opts);\n\t\t}\n\t\tif(!$.fmatter.isEmpty(cellval)) {\n\t\t\treturn $.jgrid.parseDate(op.srcformat,cellval,op.newformat,op);\n\t\t}\n\t\treturn $.fn.fmatter.defaultFormat(cellval, opts);\n\t};\n\t$.fn.fmatter.select = function (cellval,opts) {\n\t\t// jqGrid specific\n\t\tcellval = String(cellval);\n\t\tvar oSelect = false, ret=[], sep, delim;\n\t\tif(opts.colModel.formatoptions !== undefined){\n\t\t\toSelect= opts.colModel.formatoptions.value;\n\t\t\tsep = opts.colModel.formatoptions.separator === undefined ? \":\" : opts.colModel.formatoptions.separator;\n\t\t\tdelim = opts.colModel.formatoptions.delimiter === undefined ? \";\" : opts.colModel.formatoptions.delimiter;\n\t\t} else if(opts.colModel.editoptions !== undefined){\n\t\t\toSelect= opts.colModel.editoptions.value;\n\t\t\tsep = opts.colModel.editoptions.separator === undefined ? \":\" : opts.colModel.editoptions.separator;\n\t\t\tdelim = opts.colModel.editoptions.delimiter === undefined ? \";\" : opts.colModel.editoptions.delimiter;\n\t\t}\n\t\tif (oSelect) {\n\t\t\tvar\tmsl =  opts.colModel.editoptions.multiple === true ? true : false,\n\t\t\tscell = [], sv;\n\t\t\tif(msl) {scell = cellval.split(\",\");scell = $.map(scell,function(n){return $.trim(n);});}\n\t\t\tif ($.fmatter.isString(oSelect)) {\n\t\t\t\t// mybe here we can use some caching with care ????\n\t\t\t\tvar so = oSelect.split(delim), j=0, i;\n\t\t\t\tfor(i=0; i<so.length;i++){\n\t\t\t\t\tsv = so[i].split(sep);\n\t\t\t\t\tif(sv.length > 2 ) {\n\t\t\t\t\t\tsv[1] = $.map(sv,function(n,i){if(i>0) {return n;}}).join(sep);\n\t\t\t\t\t}\n\t\t\t\t\tif(msl) {\n\t\t\t\t\t\tif($.inArray(sv[0],scell)>-1) {\n\t\t\t\t\t\t\tret[j] = sv[1];\n\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if($.trim(sv[0]) === $.trim(cellval)) {\n\t\t\t\t\t\tret[0] = sv[1];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if($.fmatter.isObject(oSelect)) {\n\t\t\t\t// this is quicker\n\t\t\t\tif(msl) {\n\t\t\t\t\tret = $.map(scell, function(n){\n\t\t\t\t\t\treturn oSelect[n];\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tret[0] = oSelect[cellval] || \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcellval = ret.join(\", \");\n\t\treturn  cellval === \"\" ? $.fn.fmatter.defaultFormat(cellval,opts) : cellval;\n\t};\n\t$.fn.fmatter.rowactions = function(act) {\n\t\tvar $tr = $(this).closest(\"tr.jqgrow\"),\n\t\t\trid = $tr.attr(\"id\"),\n\t\t\t$id = $(this).closest(\"table.ui-jqgrid-btable\").attr('id').replace(/_frozen([^_]*)$/,'$1'),\n\t\t\t$grid = $(\"#\"+$id),\n\t\t\t$t = $grid[0],\n\t\t\tp = $t.p,\n\t\t\tcm = p.colModel[$.jgrid.getCellIndex(this)],\n\t\t\t$actionsDiv = cm.frozen ? $(\"tr#\"+rid+\" td:eq(\"+$.jgrid.getCellIndex(this)+\") > div\",$grid) :$(this).parent(),\n\t\t\top = {\n\t\t\t\tkeys: false,\n\t\t\t\tonEdit: null, \n\t\t\t\tonSuccess: null, \n\t\t\t\tafterSave: null,\n\t\t\t\tonError: null,\n\t\t\t\tafterRestore: null,\n\t\t\t\textraparam: {},\n\t\t\t\turl: null,\n\t\t\t\trestoreAfterError: true,\n\t\t\t\tmtype: \"POST\",\n\t\t\t\tdelOptions: {},\n\t\t\t\teditOptions: {}\n\t\t\t},\n\t\t\tsaverow = function(rowid, res) {\n\t\t\t\tif($.isFunction(op.afterSave)) { op.afterSave.call($t, rowid, res); }\n\t\t\t\t$actionsDiv.find(\"div.ui-inline-edit,div.ui-inline-del\").show();\n\t\t\t\t$actionsDiv.find(\"div.ui-inline-save,div.ui-inline-cancel\").hide();\n\t\t\t},\n\t\t\trestorerow = function(rowid) {\n\t\t\t\tif($.isFunction(op.afterRestore)) { op.afterRestore.call($t, rowid); }\n\t\t\t\t$actionsDiv.find(\"div.ui-inline-edit,div.ui-inline-del\").show();\n\t\t\t\t$actionsDiv.find(\"div.ui-inline-save,div.ui-inline-cancel\").hide();\n\t\t\t};\n\n\t\tif (cm.formatoptions !== undefined) {\n\t\t\top = $.extend(op,cm.formatoptions);\n\t\t}\n\t\tif (p.editOptions !== undefined) {\n\t\t\top.editOptions = p.editOptions;\n\t\t}\n\t\tif (p.delOptions !== undefined) {\n\t\t\top.delOptions = p.delOptions;\n\t\t}\n\t\tif ($tr.hasClass(\"jqgrid-new-row\")){\n\t\t\top.extraparam[p.prmNames.oper] = p.prmNames.addoper;\n\t\t}\n\t\tvar actop = {\n\t\t\tkeys: op.keys,\n\t\t\toneditfunc: op.onEdit,\n\t\t\tsuccessfunc: op.onSuccess,\n\t\t\tbeforeSubmit: op.beforeSubmit,\n\t\t\turl: op.url,\n\t\t\textraparam: op.extraparam,\n\t\t\taftersavefunc: saverow,\n\t\t\terrorfunc: op.onError,\n\t\t\tafterrestorefunc: restorerow,\n\t\t\trestoreAfterError: op.restoreAfterError,\n\t\t\tmtype: op.mtype\n\t\t};\n\t\tswitch(act)\n\t\t{\n\t\t\tcase 'edit':\n\t\t\t\t$grid.jqGrid('editRow', rid, actop);\n\t\t\t\t$actionsDiv.find(\"div.ui-inline-edit,div.ui-inline-del\").hide();\n\t\t\t\t$actionsDiv.find(\"div.ui-inline-save,div.ui-inline-cancel\").show();\n\t\t\t\t$grid.triggerHandler(\"jqGridAfterGridComplete\");\n\t\t\t\tbreak;\n\t\t\tcase 'save':\n\t\t\t\t// show dialog to ask if you want to save changes before submit\n\t\t\t\tif ($.isFunction(actop.beforeSubmit)) {\n\t\t\t\t\tif (!actop.beforeSubmit(rid)) {\n\t\t\t\t\t\t$grid.jqGrid('restoreRow', rid, restorerow);\n\t\t\t\t\t\t$actionsDiv.find(\"div.ui-inline-edit,div.ui-inline-del\").show();\n\t\t\t\t\t\t$actionsDiv.find(\"div.ui-inline-save,div.ui-inline-cancel\").hide();\n\t\t\t\t\t\t$grid.triggerHandler(\"jqGridAfterGridComplete\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ($grid.jqGrid('saveRow', rid, actop)) {\n\t\t\t\t\t$actionsDiv.find(\"div.ui-inline-edit,div.ui-inline-del\").show();\n\t\t\t\t\t$actionsDiv.find(\"div.ui-inline-save,div.ui-inline-cancel\").hide();\n\t\t\t\t\t$grid.triggerHandler(\"jqGridAfterGridComplete\");\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'cancel' :\n\t\t\t\t$grid.jqGrid('restoreRow', rid, restorerow);\n\t\t\t\t$actionsDiv.find(\"div.ui-inline-edit,div.ui-inline-del\").show();\n\t\t\t\t$actionsDiv.find(\"div.ui-inline-save,div.ui-inline-cancel\").hide();\n\t\t\t\t$grid.triggerHandler(\"jqGridAfterGridComplete\");\n\t\t\t\tbreak;\n\t\t\tcase 'del':\n\t\t\t\t$grid.jqGrid('delGridRow', rid, op.delOptions);\n\t\t\t\tbreak;\n\t\t\tcase 'formedit':\n\t\t\t\t$grid.jqGrid('setSelection', rid);\n\t\t\t\t$grid.jqGrid('editGridRow', rid, op.editOptions);\n\t\t\t\tbreak;\n\t\t}\n\t};\n\t$.fn.fmatter.actions = function(cellval,opts) {\n\t\tvar op={keys:false, editbutton:true, delbutton:true, editformbutton: false},\n\t\t\trowid=opts.rowId, str=\"\",ocl;\n\t\tif(opts.colModel.formatoptions !== undefined) {\n\t\t\top = $.extend(op,opts.colModel.formatoptions);\n\t\t}\n\t\tif(rowid === undefined || $.fmatter.isEmpty(rowid)) {return \"\";}\n\t\tif(op.editformbutton){\n\t\t\tocl = \"id='jEditButton_\"+rowid+\"' onclick=jQuery.fn.fmatter.rowactions.call(this,'formedit'); onmouseover=jQuery(this).addClass('ui-state-hover'); onmouseout=jQuery(this).removeClass('ui-state-hover'); \";\n\t\t\tstr += \"<div title='\"+$.jgrid.nav.edittitle+\"' style='float:left;cursor:pointer;' class='ui-pg-div ui-inline-edit' \"+ocl+\"><span class='ui-icon ui-icon-pencil'></span></div>\";\n\t\t} else if(op.editbutton){\n\t\t\tocl = \"id='jEditButton_\"+rowid+\"' onclick=jQuery.fn.fmatter.rowactions.call(this,'edit'); onmouseover=jQuery(this).addClass('ui-state-hover'); onmouseout=jQuery(this).removeClass('ui-state-hover') \";\n\t\t\tstr += \"<div title='\"+$.jgrid.nav.edittitle+\"' style='float:left;cursor:pointer;' class='ui-pg-div ui-inline-edit' \"+ocl+\"><span class='ui-icon ui-icon-pencil'></span></div>\";\n\t\t}\n\t\tif(op.delbutton) {\n\t\t\tocl = \"id='jDeleteButton_\"+rowid+\"' onclick=jQuery.fn.fmatter.rowactions.call(this,'del'); onmouseover=jQuery(this).addClass('ui-state-hover'); onmouseout=jQuery(this).removeClass('ui-state-hover'); \";\n\t\t\tstr += \"<div title='\"+$.jgrid.nav.deltitle+\"' style='float:left;margin-left:5px;' class='ui-pg-div ui-inline-del' \"+ocl+\"><span class='ui-icon ui-icon-trash'></span></div>\";\n\t\t}\n\t\tocl = \"id='jSaveButton_\"+rowid+\"' onclick=jQuery.fn.fmatter.rowactions.call(this,'save'); onmouseover=jQuery(this).addClass('ui-state-hover'); onmouseout=jQuery(this).removeClass('ui-state-hover'); \";\n\t\tstr += \"<div title='\"+$.jgrid.edit.bSubmit+\"' style='float:left;display:none' class='ui-pg-div ui-inline-save' \"+ocl+\"><span class='ui-icon ui-icon-disk'></span></div>\";\n\t\tocl = \"id='jCancelButton_\"+rowid+\"' onclick=jQuery.fn.fmatter.rowactions.call(this,'cancel'); onmouseover=jQuery(this).addClass('ui-state-hover'); onmouseout=jQuery(this).removeClass('ui-state-hover'); \";\n\t\tstr += \"<div title='\"+$.jgrid.edit.bCancel+\"' style='float:left;display:none;margin-left:5px;' class='ui-pg-div ui-inline-cancel' \"+ocl+\"><span class='ui-icon ui-icon-cancel'></span></div>\";\n\t\treturn \"<div style='margin-left:8px;'>\" + str + \"</div>\";\n\t};\n\t$.unformat = function (cellval,options,pos,cnt) {\n\t\t// specific for jqGrid only\n\t\tvar ret, formatType = options.colModel.formatter,\n\t\top =options.colModel.formatoptions || {}, sep,\n\t\tre = /([\\.\\*\\_\\'\\(\\)\\{\\}\\+\\?\\\\])/g,\n\t\tunformatFunc = options.colModel.unformat||($.fn.fmatter[formatType] && $.fn.fmatter[formatType].unformat);\n\t\tif(unformatFunc !== undefined && $.isFunction(unformatFunc) ) {\n\t\t\tret = unformatFunc.call(this, $(cellval).text(), options, cellval);\n\t\t} else if(formatType !== undefined && $.fmatter.isString(formatType) ) {\n\t\t\tvar opts = $.jgrid.formatter || {}, stripTag;\n\t\t\tswitch(formatType) {\n\t\t\t\tcase 'integer' :\n\t\t\t\t\top = $.extend({},opts.integer,op);\n\t\t\t\t\tsep = op.thousandsSeparator.replace(re,\"\\\\$1\");\n\t\t\t\t\tstripTag = new RegExp(sep, \"g\");\n\t\t\t\t\tret = $(cellval).text().replace(stripTag,'');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'number' :\n\t\t\t\t\top = $.extend({},opts.number,op);\n\t\t\t\t\tsep = op.thousandsSeparator.replace(re,\"\\\\$1\");\n\t\t\t\t\tstripTag = new RegExp(sep, \"g\");\n\t\t\t\t\tret = $(cellval).text().replace(stripTag,\"\").replace(op.decimalSeparator,'.');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'currency':\n\t\t\t\t\top = $.extend({},opts.currency,op);\n\t\t\t\t\tsep = op.thousandsSeparator.replace(re,\"\\\\$1\");\n\t\t\t\t\tstripTag = new RegExp(sep, \"g\");\n\t\t\t\t\tret = $(cellval).text();\n\t\t\t\t\tif (op.prefix && op.prefix.length) {\n\t\t\t\t\t\tret = ret.substr(op.prefix.length);\n\t\t\t\t\t}\n\t\t\t\t\tif (op.suffix && op.suffix.length) {\n\t\t\t\t\t\tret = ret.substr(0, ret.length - op.suffix.length);\n\t\t\t\t\t}\n\t\t\t\t\tret = ret.replace(stripTag,'').replace(op.decimalSeparator,'.');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'checkbox':\n\t\t\t\t\tvar cbv = (options.colModel.editoptions) ? options.colModel.editoptions.value.split(\":\") : [\"Yes\",\"No\"];\n\t\t\t\t\tret = $('input',cellval).is(\":checked\") ? cbv[0] : cbv[1];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'select' :\n\t\t\t\t\tret = $.unformat.select(cellval,options,pos,cnt);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'actions':\n\t\t\t\t\treturn \"\";\n\t\t\t\tdefault:\n\t\t\t\t\tret= $(cellval).text();\n\t\t\t}\n\t\t}\n\t\treturn ret !== undefined ? ret : cnt===true ? $(cellval).text() : $.jgrid.htmlDecode($(cellval).html());\n\t};\n\t$.unformat.select = function (cellval,options,pos,cnt) {\n\t\t// Spacial case when we have local data and perform a sort\n\t\t// cnt is set to true only in sortDataArray\n\t\tvar ret = [];\n\t\tvar cell = $(cellval).text();\n\t\tif(cnt===true) {return cell;}\n\t\tvar op = $.extend({}, options.colModel.formatoptions !== undefined ? options.colModel.formatoptions: options.colModel.editoptions),\n\t\tsep = op.separator === undefined ? \":\" : op.separator,\n\t\tdelim = op.delimiter === undefined ? \";\" : op.delimiter;\n\t\t\n\t\tif(op.value){\n\t\t\tvar oSelect = op.value,\n\t\t\tmsl =  op.multiple === true ? true : false,\n\t\t\tscell = [], sv;\n\t\t\tif(msl) {scell = cell.split(\",\");scell = $.map(scell,function(n){return $.trim(n);});}\n\t\t\tif ($.fmatter.isString(oSelect)) {\n\t\t\t\tvar so = oSelect.split(delim), j=0, i;\n\t\t\t\tfor(i=0; i<so.length;i++){\n\t\t\t\t\tsv = so[i].split(sep);\n\t\t\t\t\tif(sv.length > 2 ) {\n\t\t\t\t\t\tsv[1] = $.map(sv,function(n,i){if(i>0) {return n;}}).join(sep);\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\tif(msl) {\n\t\t\t\t\t\tif($.inArray(sv[1],scell)>-1) {\n\t\t\t\t\t\t\tret[j] = sv[0];\n\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if($.trim(sv[1]) === $.trim(cell)) {\n\t\t\t\t\t\tret[0] = sv[0];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if($.fmatter.isObject(oSelect) || $.isArray(oSelect) ){\n\t\t\t\tif(!msl) {scell[0] =  cell;}\n\t\t\t\tret = $.map(scell, function(n){\n\t\t\t\t\tvar rv;\n\t\t\t\t\t$.each(oSelect, function(i,val){\n\t\t\t\t\t\tif (val === n) {\n\t\t\t\t\t\t\trv = i;\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tif( rv !== undefined ) {return rv;}\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn ret.join(\", \");\n\t\t}\n\t\treturn cell || \"\";\n\t};\n\t$.unformat.date = function (cellval, opts) {\n\t\tvar op = $.jgrid.formatter.date || {};\n\t\tif(opts.formatoptions !== undefined) {\n\t\t\top = $.extend({},op,opts.formatoptions);\n\t\t}\t\t\n\t\tif(!$.fmatter.isEmpty(cellval)) {\n\t\t\treturn $.jgrid.parseDate(op.newformat,cellval,op.srcformat,op);\n\t\t}\n\t\treturn $.fn.fmatter.defaultFormat(cellval, opts);\n\t};\n})(jQuery);\n/*jshint eqeqeq:false */\n/*global jQuery */\n(function($){\n/*\n * jqGrid common function\n * Tony Tomov tony@trirand.com\n * http://trirand.com/blog/ \n * Dual licensed under the MIT and GPL licenses:\n * http://www.opensource.org/licenses/mit-license.php\n * http://www.gnu.org/licenses/gpl-2.0.html\n*/\n\"use strict\";\n$.extend($.jgrid,{\n// Modal functions\n\tshowModal : function(h) {\n\t\th.w.show();\n\t},\n\tcloseModal : function(h) {\n\t\th.w.hide().attr(\"aria-hidden\",\"true\");\n\t\tif(h.o) {h.o.remove();}\n\t},\n\thideModal : function (selector,o) {\n\t\to = $.extend({jqm : true, gb :''}, o || {});\n\t\tif(o.onClose) {\n\t\t\tvar oncret = o.gb && typeof o.gb === \"string\" && o.gb.substr(0,6) === \"#gbox_\" ? o.onClose.call($(\"#\" + o.gb.substr(6))[0], selector) : o.onClose(selector);\n\t\t\tif (typeof oncret === 'boolean'  && !oncret ) { return; }\n\t\t}\n\t\tif ($.fn.jqm && o.jqm === true) {\n\t\t\t$(selector).attr(\"aria-hidden\",\"true\").jqmHide();\n\t\t} else {\n\t\t\tif(o.gb !== '') {\n\t\t\t\ttry {$(\".jqgrid-overlay:first\",o.gb).hide();} catch (e){}\n\t\t\t}\n\t\t\t$(selector).hide().attr(\"aria-hidden\",\"true\");\n\t\t}\n\t},\n//Helper functions\n\tfindPos : function(obj) {\n\t\tvar curleft = 0, curtop = 0;\n\t\tif (obj.offsetParent) {\n\t\t\tdo {\n\t\t\t\tcurleft += obj.offsetLeft;\n\t\t\t\tcurtop += obj.offsetTop;\n\t\t\t} while (obj = obj.offsetParent);\n\t\t\t//do not change obj == obj.offsetParent\n\t\t}\n\t\treturn [curleft,curtop];\n\t},\n\tcreateModal : function(aIDs, content, p, insertSelector, posSelector, appendsel, css) {\n\t\tp = $.extend(true, {}, $.jgrid.jqModal || {}, p);\n\t\tvar mw  = document.createElement('div'), rtlsup, self = this;\n\t\tcss = $.extend({}, css || {});\n\t\trtlsup = $(p.gbox).attr(\"dir\") === \"rtl\" ? true : false;\n\t\tmw.className= \"ui-widget ui-widget-content ui-corner-all ui-jqdialog\";\n\t\tmw.id = aIDs.themodal;\n\t\tvar mh = document.createElement('div');\n\t\tmh.className = \"ui-jqdialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix\";\n\t\tmh.id = aIDs.modalhead;\n\t\t$(mh).append(\"<span class='ui-jqdialog-title'>\"+p.caption+\"</span>\");\n\t\tvar ahr= $(\"<a href='javascript:void(0)' class='ui-jqdialog-titlebar-close ui-corner-all'></a>\")\n\t\t.hover(function(){ahr.addClass('ui-state-hover');},\n\t\t\tfunction(){ahr.removeClass('ui-state-hover');})\n\t\t.append(\"<span class='ui-icon ui-icon-closethick'></span>\");\n\t\t$(mh).append(ahr);\n\t\tif(rtlsup) {\n\t\t\tmw.dir = \"rtl\";\n\t\t\t$(\".ui-jqdialog-title\",mh).css(\"float\",\"right\");\n\t\t\t$(\".ui-jqdialog-titlebar-close\",mh).css(\"left\",0.3+\"em\");\n\t\t} else {\n\t\t\tmw.dir = \"ltr\";\n\t\t\t$(\".ui-jqdialog-title\",mh).css(\"float\",\"left\");\n\t\t\t$(\".ui-jqdialog-titlebar-close\",mh).css(\"right\",0.3+\"em\");\n\t\t}\n\t\tvar mc = document.createElement('div');\n\t\t$(mc).addClass(\"ui-jqdialog-content ui-widget-content\").attr(\"id\",aIDs.modalcontent);\n\t\t$(mc).append(content);\n\t\tmw.appendChild(mc);\n\t\t$(mw).prepend(mh);\n\t\tif(appendsel===true) { $('body').append(mw); } //append as first child in body -for alert dialog\n\t\telse if (typeof appendsel === \"string\") {\n\t\t\t$(appendsel).append(mw);\n\t\t} else {$(mw).insertBefore(insertSelector);}\n\t\t$(mw).css(css);\n\t\tif(p.jqModal === undefined) {p.jqModal = true;} // internal use\n\t\tvar coord = {};\n\t\tif ( $.fn.jqm && p.jqModal === true) {\n\t\t\tif(p.left ===0 && p.top===0 && p.overlay) {\n\t\t\t\tvar pos = [];\n\t\t\t\tpos = $.jgrid.findPos(posSelector);\n\t\t\t\tp.left = pos[0] + 4;\n\t\t\t\tp.top = pos[1] + 4;\n\t\t\t}\n\t\t\tcoord.top = p.top+\"px\";\n\t\t\tcoord.left = p.left;\n\t\t} else if(p.left !==0 || p.top!==0) {\n\t\t\tcoord.left = p.left;\n\t\t\tcoord.top = p.top+\"px\";\n\t\t}\n\t\t$(\"a.ui-jqdialog-titlebar-close\",mh).click(function(){\n\t\t\tvar oncm = $(\"#\"+$.jgrid.jqID(aIDs.themodal)).data(\"onClose\") || p.onClose;\n\t\t\tvar gboxclose = $(\"#\"+$.jgrid.jqID(aIDs.themodal)).data(\"gbox\") || p.gbox;\n\t\t\tself.hideModal(\"#\"+$.jgrid.jqID(aIDs.themodal),{gb:gboxclose,jqm:p.jqModal,onClose:oncm});\n\t\t\treturn false;\n\t\t});\n\t\tif (p.width === 0 || !p.width) {p.width = 300;}\n\t\tif(p.height === 0 || !p.height) {p.height =200;}\n\t\tif(!p.zIndex) {\n\t\t\tvar parentZ = $(insertSelector).parents(\"*[role=dialog]\").filter(':first').css(\"z-index\");\n\t\t\tif(parentZ) {\n\t\t\t\tp.zIndex = parseInt(parentZ,10)+2;\n\t\t\t} else {\n\t\t\t\tp.zIndex = 950;\n\t\t\t}\n\t\t}\n\t\tvar rtlt = 0;\n\t\tif( rtlsup && coord.left && !appendsel) {\n\t\t\trtlt = $(p.gbox).width()- (!isNaN(p.width) ? parseInt(p.width,10) :0) - 8; // to do\n\t\t// just in case\n\t\t\tcoord.left = parseInt(coord.left,10) + parseInt(rtlt,10);\n\t\t}\n\t\tif(coord.left) { coord.left += \"px\"; }\n\t\t$(mw).css($.extend({\n\t\t\twidth: isNaN(p.width) ? \"auto\": p.width+\"px\",\n\t\t\theight:isNaN(p.height) ? \"auto\" : p.height + \"px\",\n\t\t\tzIndex:p.zIndex,\n\t\t\toverflow: 'hidden'\n\t\t},coord))\n\t\t.attr({tabIndex: \"-1\",\"role\":\"dialog\",\"aria-labelledby\":aIDs.modalhead,\"aria-hidden\":\"true\"});\n\t\tif(p.drag === undefined) { p.drag=true;}\n\t\tif(p.resize === undefined) {p.resize=true;}\n\t\tif (p.drag) {\n\t\t\t$(mh).css('cursor','move');\n\t\t\tif($.fn.jqDrag) {\n\t\t\t\t$(mw).jqDrag(mh);\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\t$(mw).draggable({handle: $(\"#\"+$.jgrid.jqID(mh.id))});\n\t\t\t\t} catch (e) {}\n\t\t\t}\n\t\t}\n\t\tif(p.resize) {\n\t\t\tif($.fn.jqResize) {\n\t\t\t\t$(mw).append(\"<div class='jqResize ui-resizable-handle ui-resizable-se ui-icon ui-icon-gripsmall-diagonal-se'></div>\");\n\t\t\t\t$(\"#\"+$.jgrid.jqID(aIDs.themodal)).jqResize(\".jqResize\",aIDs.scrollelm ? \"#\"+$.jgrid.jqID(aIDs.scrollelm) : false);\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\t$(mw).resizable({handles: 'se, sw',alsoResize: aIDs.scrollelm ? \"#\"+$.jgrid.jqID(aIDs.scrollelm) : false});\n\t\t\t\t} catch (r) {}\n\t\t\t}\n\t\t}\n\t\tif(p.closeOnEscape === true){\n\t\t\t$(mw).keydown( function( e ) {\n\t\t\t\tif( e.which == 27 ) {\n\t\t\t\t\tvar cone = $(\"#\"+$.jgrid.jqID(aIDs.themodal)).data(\"onClose\") || p.onClose;\n\t\t\t\t\tself.hideModal(\"#\"+$.jgrid.jqID(aIDs.themodal),{gb:p.gbox,jqm:p.jqModal,onClose: cone});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\tviewModal : function (selector,o){\n\t\to = $.extend({\n\t\t\ttoTop: true,\n\t\t\toverlay: 10,\n\t\t\tmodal: false,\n\t\t\toverlayClass : 'ui-widget-overlay',\n\t\t\tonShow: $.jgrid.showModal,\n\t\t\tonHide: $.jgrid.closeModal,\n\t\t\tgbox: '',\n\t\t\tjqm : true,\n\t\t\tjqM : true\n\t\t}, o || {});\n\t\tif ($.fn.jqm && o.jqm === true) {\n\t\t\tif(o.jqM) { $(selector).attr(\"aria-hidden\",\"false\").jqm(o).jqmShow(); }\n\t\t\telse {$(selector).attr(\"aria-hidden\",\"false\").jqmShow();}\n\t\t} else {\n\t\t\tif(o.gbox !== '') {\n\t\t\t\t$(\".jqgrid-overlay:first\",o.gbox).show();\n\t\t\t\t$(selector).data(\"gbox\",o.gbox);\n\t\t\t}\n\t\t\t$(selector).show().attr(\"aria-hidden\",\"false\");\n\t\t\ttry{$(':input:visible',selector)[0].focus();}catch(_){}\n\t\t}\n\t},\n\tinfo_dialog : function(caption, content,c_b, modalopt) {\n\t\tvar mopt = {\n\t\t\twidth:290,\n\t\t\theight:'auto',\n\t\t\tdataheight: 'auto',\n\t\t\tdrag: true,\n\t\t\tresize: false,\n\t\t\tleft:250,\n\t\t\ttop:170,\n\t\t\tzIndex : 1000,\n\t\t\tjqModal : true,\n\t\t\tmodal : false,\n\t\t\tcloseOnEscape : true,\n\t\t\talign: 'center',\n\t\t\tbuttonalign : 'center',\n\t\t\tbuttons : []\n\t\t// {text:'textbutt', id:\"buttid\", onClick : function(){...}}\n\t\t// if the id is not provided we set it like info_button_+ the index in the array - i.e info_button_0,info_button_1...\n\t\t};\n\t\t$.extend(true, mopt, $.jgrid.jqModal || {}, {caption:\"<b>\"+caption+\"</b>\"}, modalopt || {});\n\t\tvar jm = mopt.jqModal, self = this;\n\t\tif($.fn.jqm && !jm) { jm = false; }\n\t\t// in case there is no jqModal\n\t\tvar buttstr =\"\", i;\n\t\tif(mopt.buttons.length > 0) {\n\t\t\tfor(i=0;i<mopt.buttons.length;i++) {\n\t\t\t\tif(mopt.buttons[i].id === undefined) { mopt.buttons[i].id = \"info_button_\"+i; }\n\t\t\t\tbuttstr += \"<a href='javascript:void(0)' id='\"+mopt.buttons[i].id+\"' class='fm-button ui-state-default ui-corner-all'>\"+mopt.buttons[i].text+\"</a>\";\n\t\t\t}\n\t\t}\n\t\tvar dh = isNaN(mopt.dataheight) ? mopt.dataheight : mopt.dataheight+\"px\",\n\t\tcn = \"text-align:\"+mopt.align+\";\";\n\t\tvar cnt = \"<div id='info_id'>\";\n\t\tcnt += \"<div id='infocnt' style='margin:0px;padding-bottom:1em;width:100%;overflow:auto;position:relative;height:\"+dh+\";\"+cn+\"'>\"+content+\"</div>\";\n\t\tcnt += c_b ? \"<div class='ui-widget-content ui-helper-clearfix' style='text-align:\"+mopt.buttonalign+\";padding-bottom:0.8em;padding-top:0.5em;background-image: none;border-width: 1px 0 0 0;'><a href='javascript:void(0)' id='closedialog' class='fm-button ui-state-default ui-corner-all'>\"+c_b+\"</a>\"+buttstr+\"</div>\" :\n\t\t\tbuttstr !== \"\"  ? \"<div class='ui-widget-content ui-helper-clearfix' style='text-align:\"+mopt.buttonalign+\";padding-bottom:0.8em;padding-top:0.5em;background-image: none;border-width: 1px 0 0 0;'>\"+buttstr+\"</div>\" : \"\";\n\t\tcnt += \"</div>\";\n\n\t\ttry {\n\t\t\tif($(\"#info_dialog\").attr(\"aria-hidden\") === \"false\") {\n\t\t\t\t$.jgrid.hideModal(\"#info_dialog\",{jqm:jm});\n\t\t\t}\n\t\t\t$(\"#info_dialog\").remove();\n\t\t} catch (e){}\n\t\t$.jgrid.createModal({\n\t\t\tthemodal:'info_dialog',\n\t\t\tmodalhead:'info_head',\n\t\t\tmodalcontent:'info_content',\n\t\t\tscrollelm: 'infocnt'},\n\t\t\tcnt,\n\t\t\tmopt,\n\t\t\t'','',true\n\t\t);\n\t\t// attach onclick after inserting into the dom\n\t\tif(buttstr) {\n\t\t\t$.each(mopt.buttons,function(i){\n\t\t\t\t$(\"#\"+$.jgrid.jqID(this.id),\"#info_id\").bind('click',function(){mopt.buttons[i].onClick.call($(\"#info_dialog\")); return false;});\n\t\t\t});\n\t\t}\n\t\t$(\"#closedialog\", \"#info_id\").click(function(){\n\t\t\tself.hideModal(\"#info_dialog\",{\n\t\t\t\tjqm:jm,\n\t\t\t\tonClose: $(\"#info_dialog\").data(\"onClose\") || mopt.onClose,\n\t\t\t\tgb: $(\"#info_dialog\").data(\"gbox\") || mopt.gbox\n\t\t\t});\n\t\t\treturn false;\n\t\t});\n\t\t$(\".fm-button\",\"#info_dialog\").hover(\n\t\t\tfunction(){$(this).addClass('ui-state-hover');},\n\t\t\tfunction(){$(this).removeClass('ui-state-hover');}\n\t\t);\n\t\tif($.isFunction(mopt.beforeOpen) ) { mopt.beforeOpen(); }\n\t\t$.jgrid.viewModal(\"#info_dialog\",{\n\t\t\tonHide: function(h) {\n\t\t\t\th.w.hide().remove();\n\t\t\t\tif(h.o) { h.o.remove(); }\n\t\t\t},\n\t\t\tmodal :mopt.modal,\n\t\t\tjqm:jm\n\t\t});\n\t\tif($.isFunction(mopt.afterOpen) ) { mopt.afterOpen(); }\n\t\ttry{ $(\"#info_dialog\").focus();} catch (m){}\n\t},\n\tbindEv: function  (el, opt) {\n\t\tvar $t = this;\n\t\tif($.isFunction(opt.dataInit)) {\n\t\t\topt.dataInit.call($t,el);\n\t\t}\n\t\tif(opt.dataEvents) {\n\t\t\t$.each(opt.dataEvents, function() {\n\t\t\t\tif (this.data !== undefined) {\n\t\t\t\t\t$(el).bind(this.type, this.data, this.fn);\n\t\t\t\t} else {\n\t\t\t\t\t$(el).bind(this.type, this.fn);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n// Form Functions\n\tcreateEl : function(eltype,options,vl,autowidth, ajaxso) {\n\t\tvar elem = \"\", $t = this;\n\t\tfunction setAttributes(elm, atr, exl ) {\n\t\t\tvar exclude = ['dataInit','dataEvents','dataUrl', 'buildSelect','sopt', 'searchhidden', 'defaultValue', 'attr', 'custom_element', 'custom_value'];\n\t\t\tif(exl !== undefined && $.isArray(exl)) {\n\t\t\t\t$.merge(exclude, exl);\n\t\t\t}\n\t\t\t$.each(atr, function(key, value){\n\t\t\t\tif($.inArray(key, exclude) === -1) {\n\t\t\t\t\t$(elm).attr(key,value);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(!atr.hasOwnProperty('id')) {\n\t\t\t\t$(elm).attr('id', $.jgrid.randId());\n\t\t\t}\n\t\t}\n\t\tswitch (eltype)\n\t\t{\n\t\t\tcase \"textarea\" :\n\t\t\t\telem = document.createElement(\"textarea\");\n\t\t\t\tif(autowidth) {\n\t\t\t\t\tif(!options.cols) { $(elem).css({width:\"98%\"});}\n\t\t\t\t} else if (!options.cols) { options.cols = 20; }\n\t\t\t\tif(!options.rows) { options.rows = 2; }\n\t\t\t\tif(vl==='&nbsp;' || vl==='&#160;' || (vl.length===1 && vl.charCodeAt(0)===160)) {vl=\"\";}\n\t\t\t\telem.value = vl;\n\t\t\t\tsetAttributes(elem, options);\n\t\t\t\t$(elem).attr({\"role\":\"textbox\",\"multiline\":\"true\"});\n\t\t\tbreak;\n\t\t\tcase \"checkbox\" : //what code for simple checkbox\n\t\t\t\telem = document.createElement(\"input\");\n\t\t\t\telem.type = \"checkbox\";\n\t\t\t\tif( !options.value ) {\n\t\t\t\t\tvar vl1 = vl.toLowerCase();\n\t\t\t\t\tif(vl1.search(/(false|f|0|no|n|off|undefined)/i)<0 && vl1!==\"\") {\n\t\t\t\t\t\telem.checked=true;\n\t\t\t\t\t\telem.defaultChecked=true;\n\t\t\t\t\t\telem.value = vl;\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.value = \"on\";\n\t\t\t\t\t}\n\t\t\t\t\t$(elem).attr(\"offval\",\"off\");\n\t\t\t\t} else {\n\t\t\t\t\tvar cbval = options.value.split(\":\");\n\t\t\t\t\tif(vl === cbval[0]) {\n\t\t\t\t\t\telem.checked=true;\n\t\t\t\t\t\telem.defaultChecked=true;\n\t\t\t\t\t}\n\t\t\t\t\telem.value = cbval[0];\n\t\t\t\t\t$(elem).attr(\"offval\",cbval[1]);\n\t\t\t\t}\n\t\t\t\tsetAttributes(elem, options, ['value']);\n\t\t\t\t$(elem).attr(\"role\",\"checkbox\");\n\t\t\tbreak;\n\t\t\tcase \"select\" :\n\t\t\t\telem = document.createElement(\"select\");\n\t\t\t\telem.setAttribute(\"role\",\"select\");\n\t\t\t\tvar msl, ovm = [];\n\t\t\t\tif(options.multiple===true) {\n\t\t\t\t\tmsl = true;\n\t\t\t\t\telem.multiple=\"multiple\";\n\t\t\t\t\t$(elem).attr(\"aria-multiselectable\",\"true\");\n\t\t\t\t} else { msl = false; }\n\t\t\t\tif(options.dataUrl !== undefined) {\n\t\t\t\t\tvar rowid = options.name ? String(options.id).substring(0, String(options.id).length - String(options.name).length - 1) : String(options.id),\n\t\t\t\t\t\tpostData = options.postData || ajaxso.postData;\n\n\t\t\t\t\tif ($t.p && $t.p.idPrefix) {\n\t\t\t\t\t\trowid = $.jgrid.stripPref($t.p.idPrefix, rowid);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpostData = undefined; // don't use postData for searching from jqFilter. One can implement the feature in the future if required.\n\t\t\t\t\t}\n\t\t\t\t\t$.ajax($.extend({\n\t\t\t\t\t\turl: options.dataUrl,\n\t\t\t\t\t\ttype : \"GET\",\n\t\t\t\t\t\tdataType: \"html\",\n\t\t\t\t\t\tdata: $.isFunction(postData) ? postData.call($t, rowid, vl, String(options.name)) : postData,\n\t\t\t\t\t\tcontext: {elem:elem, options:options, vl:vl},\n\t\t\t\t\t\tsuccess: function(data){\n\t\t\t\t\t\t\tvar ovm = [], elem = this.elem, vl = this.vl,\n\t\t\t\t\t\t\toptions = $.extend({},this.options),\n\t\t\t\t\t\t\tmsl = options.multiple===true,\n\t\t\t\t\t\t\ta = $.isFunction(options.buildSelect) ? options.buildSelect.call($t,data) : data;\n\t\t\t\t\t\t\tif(typeof a === 'string') {\n\t\t\t\t\t\t\t\ta = $( $.trim( a ) ).html();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(a) {\n\t\t\t\t\t\t\t\t$(elem).append(a);\n\t\t\t\t\t\t\t\tsetAttributes(elem, options);\n\t\t\t\t\t\t\t\tif(options.size === undefined) { options.size =  msl ? 3 : 1;}\n\t\t\t\t\t\t\t\tif(msl) {\n\t\t\t\t\t\t\t\t\tovm = vl.split(\",\");\n\t\t\t\t\t\t\t\t\tovm = $.map(ovm,function(n){return $.trim(n);});\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tovm[0] = $.trim(vl);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t//$(elem).attr(options);\n\t\t\t\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\t\t\t\t$(\"option\",elem).each(function(i){\n\t\t\t\t\t\t\t\t\t\t//if(i===0) { this.selected = \"\"; }\n\t\t\t\t\t\t\t\t\t\t// fix IE8/IE7 problem with selecting of the first item on multiple=true\n\t\t\t\t\t\t\t\t\t\tif (i === 0 && elem.multiple) { this.selected = false; }\n\t\t\t\t\t\t\t\t\t\t$(this).attr(\"role\",\"option\");\n\t\t\t\t\t\t\t\t\t\tif($.inArray($.trim($(this).text()),ovm) > -1 || $.inArray($.trim($(this).val()),ovm) > -1 ) {\n\t\t\t\t\t\t\t\t\t\t\tthis.selected= \"selected\";\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t},0);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},ajaxso || {}));\n\t\t\t\t} else if(options.value) {\n\t\t\t\t\tvar i;\n\t\t\t\t\tif(options.size === undefined) {\n\t\t\t\t\t\toptions.size = msl ? 3 : 1;\n\t\t\t\t\t}\n\t\t\t\t\tif(msl) {\n\t\t\t\t\t\tovm = vl.split(\",\");\n\t\t\t\t\t\tovm = $.map(ovm,function(n){return $.trim(n);});\n\t\t\t\t\t}\n\t\t\t\t\tif(typeof options.value === 'function') { options.value = options.value(); }\n\t\t\t\t\tvar so,sv, ov, \n\t\t\t\t\tsep = options.separator === undefined ? \":\" : options.separator,\n\t\t\t\t\tdelim = options.delimiter === undefined ? \";\" : options.delimiter;\n\t\t\t\t\tif(typeof options.value === 'string') {\n\t\t\t\t\t\tso = options.value.split(delim);\n\t\t\t\t\t\tfor(i=0; i<so.length;i++){\n\t\t\t\t\t\t\tsv = so[i].split(sep);\n\t\t\t\t\t\t\tif(sv.length > 2 ) {\n\t\t\t\t\t\t\t\tsv[1] = $.map(sv,function(n,ii){if(ii>0) { return n;} }).join(sep);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tov = document.createElement(\"option\");\n\t\t\t\t\t\t\tov.setAttribute(\"role\",\"option\");\n\t\t\t\t\t\t\tov.value = sv[0]; ov.innerHTML = sv[1];\n\t\t\t\t\t\t\telem.appendChild(ov);\n\t\t\t\t\t\t\tif (!msl &&  ($.trim(sv[0]) === $.trim(vl) || $.trim(sv[1]) === $.trim(vl))) { ov.selected =\"selected\"; }\n\t\t\t\t\t\t\tif (msl && ($.inArray($.trim(sv[1]), ovm)>-1 || $.inArray($.trim(sv[0]), ovm)>-1)) {ov.selected =\"selected\";}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (typeof options.value === 'object') {\n\t\t\t\t\t\tvar oSv = options.value, key;\n\t\t\t\t\t\tfor (key in oSv) {\n\t\t\t\t\t\t\tif (oSv.hasOwnProperty(key ) ){\n\t\t\t\t\t\t\t\tov = document.createElement(\"option\");\n\t\t\t\t\t\t\t\tov.setAttribute(\"role\",\"option\");\n\t\t\t\t\t\t\t\tov.value = key; ov.innerHTML = oSv[key];\n\t\t\t\t\t\t\t\telem.appendChild(ov);\n\t\t\t\t\t\t\t\tif (!msl &&  ( $.trim(key) === $.trim(vl) || $.trim(oSv[key]) === $.trim(vl)) ) { ov.selected =\"selected\"; }\n\t\t\t\t\t\t\t\tif (msl && ($.inArray($.trim(oSv[key]),ovm)>-1 || $.inArray($.trim(key),ovm)>-1)) { ov.selected =\"selected\"; }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tsetAttributes(elem, options, ['value']);\n\t\t\t\t}\n\t\t\tbreak;\n\t\t\tcase \"text\" :\n\t\t\tcase \"password\" :\n\t\t\tcase \"button\" :\n\t\t\t\tvar role;\n\t\t\t\tif(eltype===\"button\") { role = \"button\"; }\n\t\t\t\telse { role = \"textbox\"; }\n\t\t\t\telem = document.createElement(\"input\");\n\t\t\t\telem.type = eltype;\n\t\t\t\telem.value = vl;\n\t\t\t\tsetAttributes(elem, options);\n\t\t\t\tif(eltype !== \"button\"){\n\t\t\t\t\tif(autowidth) {\n\t\t\t\t\t\tif(!options.size) { $(elem).css({width:\"98%\"}); }\n\t\t\t\t\t} else if (!options.size) { options.size = 20; }\n\t\t\t\t}\n\t\t\t\t$(elem).attr(\"role\",role);\n\t\t\tbreak;\n\t\t\tcase \"image\" :\n\t\t\tcase \"file\" :\n\t\t\t\telem = document.createElement(\"input\");\n\t\t\t\telem.type = eltype;\n\t\t\t\tsetAttributes(elem, options);\n\t\t\t\tbreak;\n\t\t\tcase \"custom\" :\n\t\t\t\telem = document.createElement(\"span\");\n\t\t\t\ttry {\n\t\t\t\t\tif($.isFunction(options.custom_element)) {\n\t\t\t\t\t\tvar celm = options.custom_element.call($t,vl,options);\n\t\t\t\t\t\tif(celm) {\n\t\t\t\t\t\t\tcelm = $(celm).addClass(\"customelement\").attr({id:options.id,name:options.name});\n\t\t\t\t\t\t\t$(elem).empty().append(celm);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow \"e2\";\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow \"e1\";\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (e===\"e1\") { $.jgrid.info_dialog($.jgrid.errors.errcap,\"function 'custom_element' \"+$.jgrid.edit.msg.nodefined, $.jgrid.edit.bClose);}\n\t\t\t\t\tif (e===\"e2\") { $.jgrid.info_dialog($.jgrid.errors.errcap,\"function 'custom_element' \"+$.jgrid.edit.msg.novalue,$.jgrid.edit.bClose);}\n\t\t\t\t\telse { $.jgrid.info_dialog($.jgrid.errors.errcap,typeof e===\"string\"?e:e.message,$.jgrid.edit.bClose); }\n\t\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\treturn elem;\n\t},\n// Date Validation Javascript\n\tcheckDate : function (format, date) {\n\t\tvar daysInFebruary = function(year){\n\t\t// February has 29 days in any year evenly divisible by four,\n\t\t// EXCEPT for centurial years which are not also divisible by 400.\n\t\t\treturn (((year % 4 === 0) && ( year % 100 !== 0 || (year % 400 === 0))) ? 29 : 28 );\n\t\t},\n\t\ttsp = {}, sep;\n\t\tformat = format.toLowerCase();\n\t\t//we search for /,-,. for the date separator\n\t\tif(format.indexOf(\"/\") !== -1) {\n\t\t\tsep = \"/\";\n\t\t} else if(format.indexOf(\"-\") !== -1) {\n\t\t\tsep = \"-\";\n\t\t} else if(format.indexOf(\".\") !== -1) {\n\t\t\tsep = \".\";\n\t\t} else {\n\t\t\tsep = \"/\";\n\t\t}\n\t\tformat = format.split(sep);\n\t\tdate = date.split(sep);\n\t\tif (date.length !== 3) { return false; }\n\t\tvar j=-1,yln, dln=-1, mln=-1, i;\n\t\tfor(i=0;i<format.length;i++){\n\t\t\tvar dv =  isNaN(date[i]) ? 0 : parseInt(date[i],10);\n\t\t\ttsp[format[i]] = dv;\n\t\t\tyln = format[i];\n\t\t\tif(yln.indexOf(\"y\") !== -1) { j=i; }\n\t\t\tif(yln.indexOf(\"m\") !== -1) { mln=i; }\n\t\t\tif(yln.indexOf(\"d\") !== -1) { dln=i; }\n\t\t}\n\t\tif (format[j] === \"y\" || format[j] === \"yyyy\") {\n\t\t\tyln=4;\n\t\t} else if(format[j] ===\"yy\"){\n\t\t\tyln = 2;\n\t\t} else {\n\t\t\tyln = -1;\n\t\t}\n\t\tvar daysInMonth = [0,31,29,31,30,31,30,31,31,30,31,30,31],\n\t\tstrDate;\n\t\tif (j === -1) {\n\t\t\treturn false;\n\t\t}\n\t\t\tstrDate = tsp[format[j]].toString();\n\t\t\tif(yln === 2 && strDate.length === 1) {yln = 1;}\n\t\t\tif (strDate.length !== yln || (tsp[format[j]]===0 && date[j]!==\"00\")){\n\t\t\t\treturn false;\n\t\t\t}\n\t\tif(mln === -1) {\n\t\t\treturn false;\n\t\t}\n\t\t\tstrDate = tsp[format[mln]].toString();\n\t\t\tif (strDate.length<1 || tsp[format[mln]]<1 || tsp[format[mln]]>12){\n\t\t\t\treturn false;\n\t\t\t}\n\t\tif(dln === -1) {\n\t\t\treturn false;\n\t\t}\n\t\t\tstrDate = tsp[format[dln]].toString();\n\t\t\tif (strDate.length<1 || tsp[format[dln]]<1 || tsp[format[dln]]>31 || (tsp[format[mln]]===2 && tsp[format[dln]]>daysInFebruary(tsp[format[j]])) || tsp[format[dln]] > daysInMonth[tsp[format[mln]]]){\n\t\t\t\treturn false;\n\t\t\t}\n\t\treturn true;\n\t},\n\tisEmpty : function(val)\n\t{\n\t\tif (val.match(/^\\s+$/) || val === \"\")\t{\n\t\t\treturn true;\n\t\t}\n\t\t\treturn false;\n\t},\n\tcheckTime : function(time){\n\t// checks only hh:ss (and optional am/pm)\n\t\tvar re = /^(\\d{1,2}):(\\d{2})([apAP][Mm])?$/,regs;\n\t\tif(!$.jgrid.isEmpty(time))\n\t\t{\n\t\t\tregs = time.match(re);\n\t\t\tif(regs) {\n\t\t\t\tif(regs[3]) {\n\t\t\t\t\tif(regs[1] < 1 || regs[1] > 12) { return false; }\n\t\t\t\t} else {\n\t\t\t\t\tif(regs[1] > 23) { return false; }\n\t\t\t\t}\n\t\t\t\tif(regs[2] > 59) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t},\n\tcheckValues : function(val, valref, customobject, nam) {\n\t\tvar edtrul,i, nm, dft, len, g = this, cm = g.p.colModel;\n\t\tif(customobject === undefined) {\n\t\t\tif(typeof valref==='string'){\n\t\t\t\tfor( i =0, len=cm.length;i<len; i++){\n\t\t\t\t\tif(cm[i].name===valref) {\n\t\t\t\t\t\tedtrul = cm[i].editrules;\n\t\t\t\t\t\tvalref = i;\n\t\t\t\t\t\tif(cm[i].formoptions != null) { nm = cm[i].formoptions.label; }\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if(valref >=0) {\n\t\t\t\tedtrul = cm[valref].editrules;\n\t\t\t}\n\t\t} else {\n\t\t\tedtrul = customobject;\n\t\t\tnm = nam===undefined ? \"_\" : nam;\n\t\t}\n\t\tif(edtrul) {\n\t\t\tif(!nm) { nm = g.p.colNames != null ? g.p.colNames[valref] : cm[valref].label; }\n\t\t\tif(edtrul.required === true) {\n\t\t\t\tif( $.jgrid.isEmpty(val) )  { return [false,nm+\": \"+$.jgrid.edit.msg.required,\"\"]; }\n\t\t\t}\n\t\t\t// force required\n\t\t\tvar rqfield = edtrul.required === false ? false : true;\n\t\t\tif(edtrul.number === true) {\n\t\t\t\tif( !(rqfield === false && $.jgrid.isEmpty(val)) ) {\n\t\t\t\t\tif(isNaN(val)) { return [false,nm+\": \"+$.jgrid.edit.msg.number,\"\"]; }\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(edtrul.minValue !== undefined && !isNaN(edtrul.minValue)) {\n\t\t\t\tif (parseFloat(val) < parseFloat(edtrul.minValue) ) { return [false,nm+\": \"+$.jgrid.edit.msg.minValue+\" \"+edtrul.minValue,\"\"];}\n\t\t\t}\n\t\t\tif(edtrul.maxValue !== undefined && !isNaN(edtrul.maxValue)) {\n\t\t\t\tif (parseFloat(val) > parseFloat(edtrul.maxValue) ) { return [false,nm+\": \"+$.jgrid.edit.msg.maxValue+\" \"+edtrul.maxValue,\"\"];}\n\t\t\t}\n\t\t\tvar filter;\n\t\t\tif(edtrul.email === true) {\n\t\t\t\tif( !(rqfield === false && $.jgrid.isEmpty(val)) ) {\n\t\t\t\t// taken from $ Validate plugin\n\t\t\t\t\tfilter = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?$/i;\n\t\t\t\t\tif(!filter.test(val)) {return [false,nm+\": \"+$.jgrid.edit.msg.email,\"\"];}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(edtrul.integer === true) {\n\t\t\t\tif( !(rqfield === false && $.jgrid.isEmpty(val)) ) {\n\t\t\t\t\tif(isNaN(val)) { return [false,nm+\": \"+$.jgrid.edit.msg.integer,\"\"]; }\n\t\t\t\t\tif ((val % 1 !== 0) || (val.indexOf('.') !== -1)) { return [false,nm+\": \"+$.jgrid.edit.msg.integer,\"\"];}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(edtrul.date === true) {\n\t\t\t\tif( !(rqfield === false && $.jgrid.isEmpty(val)) ) {\n\t\t\t\t\tif(cm[valref].formatoptions && cm[valref].formatoptions.newformat) {\n\t\t\t\t\t\tdft = cm[valref].formatoptions.newformat;\n\t\t\t\t\t\tif( $.jgrid.formatter.date.masks.hasOwnProperty(dft) ) {\n\t\t\t\t\t\t\tdft = $.jgrid.formatter.date.masks[dft];\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdft = cm[valref].datefmt || \"Y-m-d\";\n\t\t\t\t\t}\n\t\t\t\t\tif(!$.jgrid.checkDate (dft, val)) { return [false,nm+\": \"+$.jgrid.edit.msg.date+\" - \"+dft,\"\"]; }\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(edtrul.time === true) {\n\t\t\t\tif( !(rqfield === false && $.jgrid.isEmpty(val)) ) {\n\t\t\t\t\tif(!$.jgrid.checkTime (val)) { return [false,nm+\": \"+$.jgrid.edit.msg.date+\" - hh:mm (am/pm)\",\"\"]; }\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(edtrul.url === true) {\n\t\t\t\tif( !(rqfield === false && $.jgrid.isEmpty(val)) ) {\n\t\t\t\t\tfilter = /^(((https?)|(ftp)):\\/\\/([\\-\\w]+\\.)+\\w{2,3}(\\/[%\\-\\w]+(\\.\\w{2,})?)*(([\\w\\-\\.\\?\\\\\\/+@&#;`~=%!]*)(\\.\\w{2,})?)*\\/?)/i;\n\t\t\t\t\tif(!filter.test(val)) {return [false,nm+\": \"+$.jgrid.edit.msg.url,\"\"];}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(edtrul.custom === true) {\n\t\t\t\tif( !(rqfield === false && $.jgrid.isEmpty(val)) ) {\n\t\t\t\t\tif($.isFunction(edtrul.custom_func)) {\n\t\t\t\t\t\tvar ret = edtrul.custom_func.call(g,val,nm,valref);\n\t\t\t\t\t\treturn $.isArray(ret) ? ret : [false,$.jgrid.edit.msg.customarray,\"\"];\n\t\t\t\t\t}\n\t\t\t\t\treturn [false,$.jgrid.edit.msg.customfcheck,\"\"];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn [true,\"\",\"\"];\n\t}\n});\n})(jQuery);\n/*\n * jqFilter  jQuery jqGrid filter addon.\n * Copyright (c) 2011, Tony Tomov, tony@trirand.com\n * Dual licensed under the MIT and GPL licenses\n * http://www.opensource.org/licenses/mit-license.php\n * http://www.gnu.org/licenses/gpl-2.0.html\n * \n * The work is inspired from this Stefan Pirvu\n * http://www.codeproject.com/KB/scripting/json-filtering.aspx\n *\n * The filter uses JSON entities to hold filter rules and groups. Here is an example of a filter:\n\n{ \"groupOp\": \"AND\",\n      \"groups\" : [ \n        { \"groupOp\": \"OR\",\n            \"rules\": [\n                { \"field\": \"name\", \"op\": \"eq\", \"data\": \"England\" }, \n                { \"field\": \"id\", \"op\": \"le\", \"data\": \"5\"}\n             ]\n        } \n      ],\n      \"rules\": [\n        { \"field\": \"name\", \"op\": \"eq\", \"data\": \"Romania\" }, \n        { \"field\": \"id\", \"op\": \"le\", \"data\": \"1\"}\n      ]\n}\n*/\n/*jshint eqeqeq:false, eqnull:true, devel:true */\n/*global jQuery */\n\n(function ($) {\n\"use strict\";\n\n$.fn.jqFilter = function( arg ) {\n\tif (typeof arg === 'string') {\n\t\t\n\t\tvar fn = $.fn.jqFilter[arg];\n\t\tif (!fn) {\n\t\t\tthrow (\"jqFilter - No such method: \" + arg);\n\t\t}\n\t\tvar args = $.makeArray(arguments).slice(1);\n\t\treturn fn.apply(this,args);\n\t}\n\n\tvar p = $.extend(true,{\n\t\tfilter: null,\n\t\tcolumns: [],\n\t\tonChange : null,\n\t\tafterRedraw : null,\n\t\tcheckValues : null,\n\t\terror: false,\n\t\terrmsg : \"\",\n\t\terrorcheck : true,\n\t\tshowQuery : true,\n\t\tsopt : null,\n\t\tops : [],\n\t\toperands : null,\n\t\tnumopts : ['eq','ne', 'lt', 'le', 'gt', 'ge', 'nu', 'nn', 'in', 'ni'],\n\t\tstropts : ['eq', 'ne', 'bw', 'bn', 'ew', 'en', 'cn', 'nc', 'nu', 'nn', 'in', 'ni'],\n\t\tstrarr : ['text', 'string', 'blob'],\n\t\tgroupOps : [{ op: \"AND\", text: \"AND\" },\t{ op: \"OR\",  text: \"OR\" }],\n\t\tgroupButton : true,\n\t\truleButtons : true,\n\t\tdirection : \"ltr\"\n\t}, $.jgrid.filter, arg || {});\n\treturn this.each( function() {\n\t\tif (this.filter) {return;}\n\t\tthis.p = p;\n\t\t// setup filter in case if they is not defined\n\t\tif (this.p.filter === null || this.p.filter === undefined) {\n\t\t\tthis.p.filter = {\n\t\t\t\tgroupOp: this.p.groupOps[0].op,\n\t\t\t\trules: [],\n\t\t\t\tgroups: []\n\t\t\t};\n\t\t}\n\t\tvar i, len = this.p.columns.length, cl,\n\t\tisIE = /msie/i.test(navigator.userAgent) && !window.opera;\n\n\t\t// translating the options\n\t\tthis.p.initFilter = $.extend(true,{},this.p.filter);\n\n\t\t// set default values for the columns if they are not set\n\t\tif( !len ) {return;}\n\t\tfor(i=0; i < len; i++) {\n\t\t\tcl = this.p.columns[i];\n\t\t\tif( cl.stype ) {\n\t\t\t\t// grid compatibility\n\t\t\t\tcl.inputtype = cl.stype;\n\t\t\t} else if(!cl.inputtype) {\n\t\t\t\tcl.inputtype = 'text';\n\t\t\t}\n\t\t\tif( cl.sorttype ) {\n\t\t\t\t// grid compatibility\n\t\t\t\tcl.searchtype = cl.sorttype;\n\t\t\t} else if (!cl.searchtype) {\n\t\t\t\tcl.searchtype = 'string';\n\t\t\t}\n\t\t\tif(cl.hidden === undefined) {\n\t\t\t\t// jqGrid compatibility\n\t\t\t\tcl.hidden = false;\n\t\t\t}\n\t\t\tif(!cl.label) {\n\t\t\t\tcl.label = cl.name;\n\t\t\t}\n\t\t\tif(cl.index) {\n\t\t\t\tcl.name = cl.index;\n\t\t\t}\n\t\t\tif(!cl.hasOwnProperty('searchoptions')) {\n\t\t\t\tcl.searchoptions = {};\n\t\t\t}\n\t\t\tif(!cl.hasOwnProperty('searchrules')) {\n\t\t\t\tcl.searchrules = {};\n\t\t\t}\n\n\t\t}\n\t\tif(this.p.showQuery) {\n\t\t\t$(this).append(\"<table class='queryresult ui-widget ui-widget-content' style='display:block;max-width:440px;border:0px none;' dir='\"+this.p.direction+\"'><tbody><tr><td class='query'></td></tr></tbody></table>\");\n\t\t}\n\t\tvar getGrid = function () {\n\t\t\treturn $(\"#\" + $.jgrid.jqID(p.id))[0] || null;\n\t\t};\n\t\t/*\n\t\t *Perform checking.\n\t\t *\n\t\t*/\n\t\tvar checkData = function(val, colModelItem) {\n\t\t\tvar ret = [true,\"\"], $t = getGrid();\n\t\t\tif($.isFunction(colModelItem.searchrules)) {\n\t\t\t\tret = colModelItem.searchrules.call($t, val, colModelItem);\n\t\t\t} else if($.jgrid && $.jgrid.checkValues) {\n\t\t\t\ttry {\n\t\t\t\t\tret = $.jgrid.checkValues.call($t, val, -1, colModelItem.searchrules, colModelItem.label);\n\t\t\t\t} catch (e) {}\n\t\t\t}\n\t\t\tif(ret && ret.length && ret[0] === false) {\n\t\t\t\tp.error = !ret[0];\n\t\t\t\tp.errmsg = ret[1];\n\t\t\t}\n\t\t};\n\t\t/* moving to common\n\t\trandId = function() {\n\t\t\treturn Math.floor(Math.random()*10000).toString();\n\t\t};\n\t\t*/\n\n\t\tthis.onchange = function (  ){\n\t\t\t// clear any error \n\t\t\tthis.p.error = false;\n\t\t\tthis.p.errmsg=\"\";\n\t\t\treturn $.isFunction(this.p.onChange) ? this.p.onChange.call( this, this.p ) : false;\n\t\t};\n\t\t/*\n\t\t * Redraw the filter every time when new field is added/deleted\n\t\t * and field is  changed\n\t\t */\n\t\tthis.reDraw = function() {\n\t\t\t$(\"table.group:first\",this).remove();\n\t\t\tvar t = this.createTableForGroup(p.filter, null);\n\t\t\t$(this).append(t);\n\t\t\tif($.isFunction(this.p.afterRedraw) ) {\n\t\t\t\tthis.p.afterRedraw.call(this, this.p);\n\t\t\t}\n\t\t};\n\t\t/*\n\t\t * Creates a grouping data for the filter\n\t\t * @param group - object\n\t\t * @param parentgroup - object\n\t\t */\n\t\tthis.createTableForGroup = function(group, parentgroup) {\n\t\t\tvar that = this,  i;\n\t\t\t// this table will hold all the group (tables) and rules (rows)\n\t\t\tvar table = $(\"<table class='group ui-widget ui-widget-content' style='border:0px none;'><tbody></tbody></table>\"),\n\t\t\t// create error message row\n\t\t\talign = \"left\";\n\t\t\tif(this.p.direction === \"rtl\") {\n\t\t\t\talign = \"right\";\n\t\t\t\ttable.attr(\"dir\",\"rtl\");\n\t\t\t}\n\t\t\tif(parentgroup === null) {\n\t\t\t\ttable.append(\"<tr class='error' style='display:none;'><th colspan='5' class='ui-state-error' align='\"+align+\"'></th></tr>\");\n\t\t\t}\n\n\t\t\tvar tr = $(\"<tr></tr>\");\n\t\t\ttable.append(tr);\n\t\t\t// this header will hold the group operator type and group action buttons for\n\t\t\t// creating subgroup \"+ {}\", creating rule \"+\" or deleting the group \"-\"\n\t\t\tvar th = $(\"<th colspan='5' align='\"+align+\"'></th>\");\n\t\t\ttr.append(th);\n\n\t\t\tif(this.p.ruleButtons === true) {\n\t\t\t// dropdown for: choosing group operator type\n\t\t\tvar groupOpSelect = $(\"<select class='opsel'></select>\");\n\t\t\tth.append(groupOpSelect);\n\t\t\t// populate dropdown with all posible group operators: or, and\n\t\t\tvar str= \"\", selected;\n\t\t\tfor (i = 0; i < p.groupOps.length; i++) {\n\t\t\t\tselected =  group.groupOp === that.p.groupOps[i].op ? \" selected='selected'\" :\"\";\n\t\t\t\tstr += \"<option value='\"+that.p.groupOps[i].op+\"'\" + selected+\">\"+that.p.groupOps[i].text+\"</option>\";\n\t\t\t}\n\n\t\t\tgroupOpSelect\n\t\t\t.append(str)\n\t\t\t.bind('change',function() {\n\t\t\t\tgroup.groupOp = $(groupOpSelect).val();\n\t\t\t\tthat.onchange(); // signals that the filter has changed\n\t\t\t});\n\t\t\t}\n\t\t\t// button for adding a new subgroup\n\t\t\tvar inputAddSubgroup =\"<span></span>\";\n\t\t\tif(this.p.groupButton) {\n\t\t\t\tinputAddSubgroup = $(\"<input type='button' value='+ {}' title='Add subgroup' class='add-group'/>\");\n\t\t\t\tinputAddSubgroup.bind('click',function() {\n\t\t\t\t\tif (group.groups === undefined ) {\n\t\t\t\t\t\tgroup.groups = [];\n\t\t\t\t\t}\n\n\t\t\t\t\tgroup.groups.push({\n\t\t\t\t\t\tgroupOp: p.groupOps[0].op,\n\t\t\t\t\t\trules: [],\n\t\t\t\t\t\tgroups: []\n\t\t\t\t\t}); // adding a new group\n\n\t\t\t\t\tthat.reDraw(); // the html has changed, force reDraw\n\n\t\t\t\t\tthat.onchange(); // signals that the filter has changed\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t}\n\t\t\tth.append(inputAddSubgroup);\n\t\t\tif(this.p.ruleButtons === true) {\n\t\t\t// button for adding a new rule\n\t\t\tvar inputAddRule = $(\"<input type='button' value='+' title='Add rule' class='add-rule ui-add'/>\"), cm;\n\t\t\tinputAddRule.bind('click',function() {\n\t\t\t\t//if(!group) { group = {};}\n\t\t\t\tif (group.rules === undefined) {\n\t\t\t\t\tgroup.rules = [];\n\t\t\t\t}\n\t\t\t\tfor (i = 0; i < that.p.columns.length; i++) {\n\t\t\t\t// but show only serchable and serchhidden = true fields\n\t\t\t\t\tvar searchable = (that.p.columns[i].search === undefined) ?  true: that.p.columns[i].search,\n\t\t\t\t\thidden = (that.p.columns[i].hidden === true),\n\t\t\t\t\tignoreHiding = (that.p.columns[i].searchoptions.searchhidden === true);\n\t\t\t\t\tif ((ignoreHiding && searchable) || (searchable && !hidden)) {\n\t\t\t\t\t\tcm = that.p.columns[i];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar opr;\n\t\t\t\tif( cm.searchoptions.sopt ) {opr = cm.searchoptions.sopt;}\n\t\t\t\telse if(that.p.sopt) { opr= that.p.sopt; }\n\t\t\t\telse if  ( $.inArray(cm.searchtype, that.p.strarr) !== -1 ) {opr = that.p.stropts;}\n\t\t\t\telse {opr = that.p.numopts;}\n\n\t\t\t\tgroup.rules.push({\n\t\t\t\t\tfield: cm.name,\n\t\t\t\t\top: opr[0],\n\t\t\t\t\tdata: \"\"\n\t\t\t\t}); // adding a new rule\n\n\t\t\t\tthat.reDraw(); // the html has changed, force reDraw\n\t\t\t\t// for the moment no change have been made to the rule, so\n\t\t\t\t// this will not trigger onchange event\n\t\t\t\treturn false;\n\t\t\t});\n\t\t\tth.append(inputAddRule);\n\t\t\t}\n\n\t\t\t// button for delete the group\n\t\t\tif (parentgroup !== null) { // ignore the first group\n\t\t\t\tvar inputDeleteGroup = $(\"<input type='button' value='-' title='Delete group' class='delete-group'/>\");\n\t\t\t\tth.append(inputDeleteGroup);\n\t\t\t\tinputDeleteGroup.bind('click',function() {\n\t\t\t\t// remove group from parent\n\t\t\t\t\tfor (i = 0; i < parentgroup.groups.length; i++) {\n\t\t\t\t\t\tif (parentgroup.groups[i] === group) {\n\t\t\t\t\t\t\tparentgroup.groups.splice(i, 1);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tthat.reDraw(); // the html has changed, force reDraw\n\n\t\t\t\t\tthat.onchange(); // signals that the filter has changed\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// append subgroup rows\n\t\t\tif (group.groups !== undefined) {\n\t\t\t\tfor (i = 0; i < group.groups.length; i++) {\n\t\t\t\t\tvar trHolderForSubgroup = $(\"<tr></tr>\");\n\t\t\t\t\ttable.append(trHolderForSubgroup);\n\n\t\t\t\t\tvar tdFirstHolderForSubgroup = $(\"<td class='first'></td>\");\n\t\t\t\t\ttrHolderForSubgroup.append(tdFirstHolderForSubgroup);\n\n\t\t\t\t\tvar tdMainHolderForSubgroup = $(\"<td colspan='4'></td>\");\n\t\t\t\t\ttdMainHolderForSubgroup.append(this.createTableForGroup(group.groups[i], group));\n\t\t\t\t\ttrHolderForSubgroup.append(tdMainHolderForSubgroup);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(group.groupOp === undefined) {\n\t\t\t\tgroup.groupOp = that.p.groupOps[0].op;\n\t\t\t}\n\n\t\t\t// append rules rows\n\t\t\tif (group.rules !== undefined) {\n\t\t\t\tfor (i = 0; i < group.rules.length; i++) {\n\t\t\t\t\ttable.append(\n                       this.createTableRowForRule(group.rules[i], group)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn table;\n\t\t};\n\t\t/*\n\t\t * Create the rule data for the filter\n\t\t */\n\t\tthis.createTableRowForRule = function(rule, group ) {\n\t\t\t// save current entity in a variable so that it could\n\t\t\t// be referenced in anonimous method calls\n\n\t\t\tvar that=this, $t = getGrid(), tr = $(\"<tr></tr>\"),\n\t\t\t//document.createElement(\"tr\"),\n\n\t\t\t// first column used for padding\n\t\t\t//tdFirstHolderForRule = document.createElement(\"td\"),\n\t\t\ti, op, trpar, cm, str=\"\", selected;\n\t\t\t//tdFirstHolderForRule.setAttribute(\"class\", \"first\");\n\t\t\ttr.append(\"<td class='first'></td>\");\n\n\n\t\t\t// create field container\n\t\t\tvar ruleFieldTd = $(\"<td class='columns'></td>\");\n\t\t\ttr.append(ruleFieldTd);\n\n\n\t\t\t// dropdown for: choosing field\n\t\t\tvar ruleFieldSelect = $(\"<select></select>\"), ina, aoprs = [];\n\t\t\truleFieldTd.append(ruleFieldSelect);\n\t\t\truleFieldSelect.bind('change',function() {\n\t\t\t\trule.field = $(ruleFieldSelect).val();\n\n\t\t\t\ttrpar = $(this).parents(\"tr:first\");\n\t\t\t\tfor (i=0;i<that.p.columns.length;i++) {\n\t\t\t\t\tif(that.p.columns[i].name ===  rule.field) {\n\t\t\t\t\t\tcm = that.p.columns[i];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(!cm) {return;}\n\t\t\t\tcm.searchoptions.id = $.jgrid.randId();\n\t\t\t\tif(isIE && cm.inputtype === \"text\") {\n\t\t\t\t\tif(!cm.searchoptions.size) {\n\t\t\t\t\t\tcm.searchoptions.size = 10;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvar elm = $.jgrid.createEl.call($t, cm.inputtype,cm.searchoptions, \"\", true, that.p.ajaxSelectOptions, true);\n\t\t\t\t$(elm).addClass(\"input-elm\");\n\t\t\t\t//that.createElement(rule, \"\");\n\n\t\t\t\tif( cm.searchoptions.sopt ) {op = cm.searchoptions.sopt;}\n\t\t\t\telse if(that.p.sopt) { op= that.p.sopt; }\n\t\t\t\telse if  ($.inArray(cm.searchtype, that.p.strarr) !== -1) {op = that.p.stropts;}\n\t\t\t\telse {op = that.p.numopts;}\n\t\t\t\t// operators\n\t\t\t\tvar s =\"\", so = 0;\n\t\t\t\taoprs = [];\n\t\t\t\t$.each(that.p.ops, function() { aoprs.push(this.oper); });\n\t\t\t\tfor ( i = 0 ; i < op.length; i++) {\n\t\t\t\t\tina = $.inArray(op[i],aoprs);\n\t\t\t\t\tif(ina !== -1) {\n\t\t\t\t\t\tif(so===0) {\n\t\t\t\t\t\t\trule.op = that.p.ops[ina].oper;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ts += \"<option value='\"+that.p.ops[ina].oper+\"'>\"+that.p.ops[ina].text+\"</option>\";\n\t\t\t\t\t\tso++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$(\".selectopts\",trpar).empty().append( s );\n\t\t\t\t$(\".selectopts\",trpar)[0].selectedIndex = 0;\n\t\t\t\tif( $.jgrid.msie && $.jgrid.msiever() < 9) {\n\t\t\t\t\tvar sw = parseInt($(\"select.selectopts\",trpar)[0].offsetWidth, 10) + 1;\n\t\t\t\t\t$(\".selectopts\",trpar).width( sw );\n\t\t\t\t\t$(\".selectopts\",trpar).css(\"width\",\"auto\");\n\t\t\t\t}\n\t\t\t\t// data\n\t\t\t\t$(\".data\",trpar).empty().append( elm );\n\t\t\t\t$.jgrid.bindEv.call($t, elm, cm.searchoptions);\n\t\t\t\t$(\".input-elm\",trpar).bind('change',function( e ) {\n\t\t\t\t\tvar tmo = $(this).hasClass(\"ui-autocomplete-input\") ? 200 :0;\n\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\tvar elem = e.target;\n\t\t\t\t\t\trule.data = elem.nodeName.toUpperCase() === \"SPAN\" && cm.searchoptions && $.isFunction(cm.searchoptions.custom_value) ?\n\t\t\t\t\t\t\tcm.searchoptions.custom_value.call($t, $(elem).children(\".customelement:first\"), 'get') : elem.value;\n\t\t\t\t\t\tthat.onchange(); // signals that the filter has changed\n\t\t\t\t\t}, tmo);\n\t\t\t\t});\n\t\t\t\tsetTimeout(function(){ //IE, Opera, Chrome\n\t\t\t\trule.data = $(elm).val();\n\t\t\t\tthat.onchange();  // signals that the filter has changed\n\t\t\t\t}, 0);\n\t\t\t});\n\n\t\t\t// populate drop down with user provided column definitions\n\t\t\tvar j=0;\n\t\t\tfor (i = 0; i < that.p.columns.length; i++) {\n\t\t\t\t// but show only serchable and serchhidden = true fields\n\t\t\t\tvar searchable = (that.p.columns[i].search === undefined) ? true: that.p.columns[i].search,\n\t\t\t\thidden = (that.p.columns[i].hidden === true),\n\t\t\t\tignoreHiding = (that.p.columns[i].searchoptions.searchhidden === true);\n\t\t\t\tif ((ignoreHiding && searchable) || (searchable && !hidden)) {\n\t\t\t\t\tselected = \"\";\n\t\t\t\t\tif(rule.field === that.p.columns[i].name) {\n\t\t\t\t\t\tselected = \" selected='selected'\";\n\t\t\t\t\t\tj=i;\n\t\t\t\t\t}\n\t\t\t\t\tstr += \"<option value='\"+that.p.columns[i].name+\"'\" +selected+\">\"+that.p.columns[i].label+\"</option>\";\n\t\t\t\t}\n\t\t\t}\n\t\t\truleFieldSelect.append( str );\n\n\n\t\t\t// create operator container\n\t\t\tvar ruleOperatorTd = $(\"<td class='operators'></td>\");\n\t\t\ttr.append(ruleOperatorTd);\n\t\t\tcm = p.columns[j];\n\t\t\t// create it here so it can be referentiated in the onchange event\n\t\t\t//var RD = that.createElement(rule, rule.data);\n\t\t\tcm.searchoptions.id = $.jgrid.randId();\n\t\t\tif(isIE && cm.inputtype === \"text\") {\n\t\t\t\tif(!cm.searchoptions.size) {\n\t\t\t\t\tcm.searchoptions.size = 10;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar ruleDataInput = $.jgrid.createEl.call($t, cm.inputtype,cm.searchoptions, rule.data, true, that.p.ajaxSelectOptions, true);\n\t\t\tif(rule.op === 'nu' || rule.op === 'nn') {\n\t\t\t\t$(ruleDataInput).attr('readonly','true');\n\t\t\t\t$(ruleDataInput).attr('disabled','true');\n\t\t\t} //retain the state of disabled text fields in case of null ops\n\t\t\t// dropdown for: choosing operator\n\t\t\tvar ruleOperatorSelect = $(\"<select class='selectopts'></select>\");\n\t\t\truleOperatorTd.append(ruleOperatorSelect);\n\t\t\truleOperatorSelect.bind('change',function() {\n\t\t\t\trule.op = $(ruleOperatorSelect).val();\n\t\t\t\ttrpar = $(this).parents(\"tr:first\");\n\t\t\t\tvar rd = $(\".input-elm\",trpar)[0];\n\t\t\t\tif (rule.op === \"nu\" || rule.op === \"nn\") { // disable for operator \"is null\" and \"is not null\"\n\t\t\t\t\trule.data = \"\";\n\t\t\t\t\trd.value = \"\";\n\t\t\t\t\trd.setAttribute(\"readonly\", \"true\");\n\t\t\t\t\trd.setAttribute(\"disabled\", \"true\");\n\t\t\t\t} else {\n\t\t\t\t\trd.removeAttribute(\"readonly\");\n\t\t\t\t\trd.removeAttribute(\"disabled\");\n\t\t\t\t}\n\n\t\t\t\tthat.onchange();  // signals that the filter has changed\n\t\t\t});\n\n\t\t\t// populate drop down with all available operators\n\t\t\tif( cm.searchoptions.sopt ) {op = cm.searchoptions.sopt;}\n\t\t\telse if(that.p.sopt) { op= that.p.sopt; }\n\t\t\telse if  ($.inArray(cm.searchtype, that.p.strarr) !== -1) {op = that.p.stropts;}\n\t\t\telse {op = that.p.numopts;}\n\t\t\tstr=\"\";\n\t\t\t$.each(that.p.ops, function() { aoprs.push(this.oper); });\n\t\t\tfor ( i = 0; i < op.length; i++) {\n\t\t\t\tina = $.inArray(op[i],aoprs);\n\t\t\t\tif(ina !== -1) {\n\t\t\t\t\tselected = rule.op === that.p.ops[ina].oper ? \" selected='selected'\" : \"\";\n\t\t\t\t\tstr += \"<option value='\"+that.p.ops[ina].oper+\"'\"+selected+\">\"+that.p.ops[ina].text+\"</option>\";\n\t\t\t\t}\n\t\t\t}\n\t\t\truleOperatorSelect.append( str );\n\t\t\t// create data container\n\t\t\tvar ruleDataTd = $(\"<td class='data'></td>\");\n\t\t\ttr.append(ruleDataTd);\n\n\t\t\t// textbox for: data\n\t\t\t// is created previously\n\t\t\t//ruleDataInput.setAttribute(\"type\", \"text\");\n\t\t\truleDataTd.append(ruleDataInput);\n\t\t\t$.jgrid.bindEv.call($t, ruleDataInput, cm.searchoptions);\n\t\t\t$(ruleDataInput)\n\t\t\t.addClass(\"input-elm\")\n\t\t\t.bind('change', function() {\n\t\t\t\trule.data = cm.inputtype === 'custom' ? cm.searchoptions.custom_value.call($t, $(this).children(\".customelement:first\"),'get') : $(this).val();\n\t\t\t\tthat.onchange(); // signals that the filter has changed\n\t\t\t});\n\n\t\t\t// create action container\n\t\t\tvar ruleDeleteTd = $(\"<td></td>\");\n\t\t\ttr.append(ruleDeleteTd);\n\n\t\t\t// create button for: delete rule\n\t\t\tif(this.p.ruleButtons === true) {\n\t\t\tvar ruleDeleteInput = $(\"<input type='button' value='-' title='Delete rule' class='delete-rule ui-del'/>\");\n\t\t\truleDeleteTd.append(ruleDeleteInput);\n\t\t\t//$(ruleDeleteInput).html(\"\").height(20).width(30).button({icons: {  primary: \"ui-icon-minus\", text:false}});\n\t\t\truleDeleteInput.bind('click',function() {\n\t\t\t\t// remove rule from group\n\t\t\t\tfor (i = 0; i < group.rules.length; i++) {\n\t\t\t\t\tif (group.rules[i] === rule) {\n\t\t\t\t\t\tgroup.rules.splice(i, 1);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthat.reDraw(); // the html has changed, force reDraw\n\n\t\t\t\tthat.onchange(); // signals that the filter has changed\n\t\t\t\treturn false;\n\t\t\t});\n\t\t\t}\n\t\t\treturn tr;\n\t\t};\n\n\t\tthis.getStringForGroup = function(group) {\n\t\t\tvar s = \"(\", index;\n\t\t\tif (group.groups !== undefined) {\n\t\t\t\tfor (index = 0; index < group.groups.length; index++) {\n\t\t\t\t\tif (s.length > 1) {\n\t\t\t\t\t\ts += \" \" + group.groupOp + \" \";\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\ts += this.getStringForGroup(group.groups[index]);\n\t\t\t\t\t} catch (eg) {alert(eg);}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (group.rules !== undefined) {\n\t\t\t\ttry{\n\t\t\t\t\tfor (index = 0; index < group.rules.length; index++) {\n\t\t\t\t\t\tif (s.length > 1) {\n\t\t\t\t\t\t\ts += \" \" + group.groupOp + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t\ts += this.getStringForRule(group.rules[index]);\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {alert(e);}\n\t\t\t}\n\n\t\t\ts += \")\";\n\n\t\t\tif (s === \"()\") {\n\t\t\t\treturn \"\"; // ignore groups that don't have rules\n\t\t\t}\n\t\t\treturn s;\n\t\t};\n\t\tthis.getStringForRule = function(rule) {\n\t\t\tvar opUF = \"\",opC=\"\", i, cm, ret, val,\n\t\t\tnumtypes = ['int', 'integer', 'float', 'number', 'currency']; // jqGrid\n\t\t\tfor (i = 0; i < this.p.ops.length; i++) {\n\t\t\t\tif (this.p.ops[i].oper === rule.op) {\n\t\t\t\t\topUF = this.p.operands.hasOwnProperty(rule.op) ? this.p.operands[rule.op] : \"\";\n\t\t\t\t\topC = this.p.ops[i].oper;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (i=0; i<this.p.columns.length; i++) {\n\t\t\t\tif(this.p.columns[i].name === rule.field) {\n\t\t\t\t\tcm = this.p.columns[i];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (cm === undefined) { return \"\"; }\n\t\t\tval = rule.data;\n\t\t\tif(opC === 'bw' || opC === 'bn') { val = val+\"%\"; }\n\t\t\tif(opC === 'ew' || opC === 'en') { val = \"%\"+val; }\n\t\t\tif(opC === 'cn' || opC === 'nc') { val = \"%\"+val+\"%\"; }\n\t\t\tif(opC === 'in' || opC === 'ni') { val = \" (\"+val+\")\"; }\n\t\t\tif(p.errorcheck) { checkData(rule.data, cm); }\n\t\t\tif($.inArray(cm.searchtype, numtypes) !== -1 || opC === 'nn' || opC === 'nu') { ret = rule.field + \" \" + opUF + \" \" + val; }\n\t\t\telse { ret = rule.field + \" \" + opUF + \" \\\"\" + val + \"\\\"\"; }\n\t\t\treturn ret;\n\t\t};\n\t\tthis.resetFilter = function () {\n\t\t\tthis.p.filter = $.extend(true,{},this.p.initFilter);\n\t\t\tthis.reDraw();\n\t\t\tthis.onchange();\n\t\t};\n\t\tthis.hideError = function() {\n\t\t\t$(\"th.ui-state-error\", this).html(\"\");\n\t\t\t$(\"tr.error\", this).hide();\n\t\t};\n\t\tthis.showError = function() {\n\t\t\t$(\"th.ui-state-error\", this).html(this.p.errmsg);\n\t\t\t$(\"tr.error\", this).show();\n\t\t};\n\t\tthis.toUserFriendlyString = function() {\n\t\t\treturn this.getStringForGroup(p.filter);\n\t\t};\n\t\tthis.toString = function() {\n\t\t\t// this will obtain a string that can be used to match an item.\n\t\t\tvar that = this;\n\t\t\tfunction getStringRule(rule) {\n\t\t\t\tif(that.p.errorcheck) {\n\t\t\t\t\tvar i, cm;\n\t\t\t\t\tfor (i=0; i<that.p.columns.length; i++) {\n\t\t\t\t\t\tif(that.p.columns[i].name === rule.field) {\n\t\t\t\t\t\t\tcm = that.p.columns[i];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(cm) {checkData(rule.data, cm);}\n\t\t\t\t}\n\t\t\t\treturn rule.op + \"(item.\" + rule.field + \",'\" + rule.data + \"')\";\n\t\t\t}\n\n\t\t\tfunction getStringForGroup(group) {\n\t\t\t\tvar s = \"(\", index;\n\n\t\t\t\tif (group.groups !== undefined) {\n\t\t\t\t\tfor (index = 0; index < group.groups.length; index++) {\n\t\t\t\t\t\tif (s.length > 1) {\n\t\t\t\t\t\t\tif (group.groupOp === \"OR\") {\n\t\t\t\t\t\t\t\ts += \" || \";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\ts += \" && \";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\ts += getStringForGroup(group.groups[index]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (group.rules !== undefined) {\n\t\t\t\t\tfor (index = 0; index < group.rules.length; index++) {\n\t\t\t\t\t\tif (s.length > 1) {\n\t\t\t\t\t\t\tif (group.groupOp === \"OR\") {\n\t\t\t\t\t\t\t\ts += \" || \";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse  {\n\t\t\t\t\t\t\t\ts += \" && \";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\ts += getStringRule(group.rules[index]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ts += \")\";\n\n\t\t\t\tif (s === \"()\") {\n\t\t\t\t\treturn \"\"; // ignore groups that don't have rules\n\t\t\t\t}\n\t\t\t\treturn s;\n\t\t\t}\n\n\t\t\treturn getStringForGroup(this.p.filter);\n\t\t};\n\n\t\t// Here we init the filter\n\t\tthis.reDraw();\n\n\t\tif(this.p.showQuery) {\n\t\t\tthis.onchange();\n\t\t}\n\t\t// mark is as created so that it will not be created twice on this element\n\t\tthis.filter = true;\n\t});\n};\n$.extend($.fn.jqFilter,{\n\t/*\n\t * Return SQL like string. Can be used directly\n\t */\n\ttoSQLString : function()\n\t{\n\t\tvar s =\"\";\n\t\tthis.each(function(){\n\t\t\ts = this.toUserFriendlyString();\n\t\t});\n\t\treturn s;\n\t},\n\t/*\n\t * Return filter data as object.\n\t */\n\tfilterData : function()\n\t{\n\t\tvar s;\n\t\tthis.each(function(){\n\t\t\ts = this.p.filter;\n\t\t});\n\t\treturn s;\n\n\t},\n\tgetParameter : function (param) {\n\t\tif(param !== undefined) {\n\t\t\tif (this.p.hasOwnProperty(param) ) {\n\t\t\t\treturn this.p[param];\n\t\t\t}\n\t\t}\n\t\treturn this.p;\n\t},\n\tresetFilter: function() {\n\t\treturn this.each(function(){\n\t\t\tthis.resetFilter();\n\t\t});\n\t},\n\taddFilter: function (pfilter) {\n\t\tif (typeof pfilter === \"string\") {\n\t\t\tpfilter = $.jgrid.parse( pfilter );\n\t}\n\t\tthis.each(function(){\n\t\t\tthis.p.filter = pfilter;\n\t\t\tthis.reDraw();\n\t\t\tthis.onchange();\n\t\t});\n\t}\n\n});\n})(jQuery);\n/*jshint eqeqeq:false, eqnull:true, devel:true */\n/*global xmlJsonClass, jQuery */\n(function($){\n/**\n * jqGrid extension for form editing Grid Data\n * Tony Tomov tony@trirand.com\n * http://trirand.com/blog/\n * Dual licensed under the MIT and GPL licenses:\n * http://www.opensource.org/licenses/mit-license.php\n * http://www.gnu.org/licenses/gpl-2.0.html\n**/\n\"use strict\";\nvar rp_ge = {};\n$.jgrid.extend({\n\tsearchGrid : function (p) {\n\t\tp = $.extend(true, {\n\t\t\trecreateFilter: false,\n\t\t\tdrag: true,\n\t\t\tsField:'searchField',\n\t\t\tsValue:'searchString',\n\t\t\tsOper: 'searchOper',\n\t\t\tsFilter: 'filters',\n\t\t\tloadDefaults: true, // this options activates loading of default filters from grid's postData for Multipe Search only.\n\t\t\tbeforeShowSearch: null,\n\t\t\tafterShowSearch : null,\n\t\t\tonInitializeSearch: null,\n\t\t\tafterRedraw : null,\n\t\t\tafterChange: null,\n\t\t\tcloseAfterSearch : false,\n\t\t\tcloseAfterReset: false,\n\t\t\tcloseOnEscape : false,\n\t\t\tsearchOnEnter : false,\n\t\t\tmultipleSearch : false,\n\t\t\tmultipleGroup : false,\n\t\t\t//cloneSearchRowOnAdd: true,\n\t\t\ttop : 0,\n\t\t\tleft: 0,\n\t\t\tjqModal : true,\n\t\t\tmodal: false,\n\t\t\tresize : true,\n\t\t\twidth: 450,\n\t\t\theight: 'auto',\n\t\t\tdataheight: 'auto',\n\t\t\tshowQuery: false,\n\t\t\terrorcheck : true,\n\t\t\tsopt: null,\n\t\t\tstringResult: undefined,\n\t\t\tonClose : null,\n\t\t\tonSearch : null,\n\t\t\tonReset : null,\n\t\t\ttoTop : true,\n\t\t\toverlay : 30,\n\t\t\tcolumns : [],\n\t\t\ttmplNames : null,\n\t\t\ttmplFilters : null,\n\t\t\ttmplLabel : ' Template: ',\n\t\t\tshowOnLoad: false,\n\t\t\tlayer: null,\n\t\t\toperands : { \"eq\" :\"=\", \"ne\":\"<>\",\"lt\":\"<\",\"le\":\"<=\",\"gt\":\">\",\"ge\":\">=\",\"bw\":\"LIKE\",\"bn\":\"NOT LIKE\",\"in\":\"IN\",\"ni\":\"NOT IN\",\"ew\":\"LIKE\",\"en\":\"NOT LIKE\",\"cn\":\"LIKE\",\"nc\":\"NOT LIKE\",\"nu\":\"IS NULL\",\"nn\":\"ISNOT NULL\"}\n\t\t}, $.jgrid.search, p || {});\n\t\treturn this.each(function() {\n\t\t\tvar $t = this;\n\t\t\tif(!$t.grid) {return;}\n\t\t\tvar fid = \"fbox_\"+$t.p.id,\n\t\t\tshowFrm = true,\n\t\t\tIDs = {themodal:'searchmod'+fid,modalhead:'searchhd'+fid,modalcontent:'searchcnt'+fid, scrollelm : fid},\n\t\t\tdefaultFilters  = $t.p.postData[p.sFilter];\n\t\t\tif(typeof defaultFilters === \"string\") {\n\t\t\t\tdefaultFilters = $.jgrid.parse( defaultFilters );\n\t\t\t}\n\t\t\tif(p.recreateFilter === true) {\n\t\t\t\t$(\"#\"+$.jgrid.jqID(IDs.themodal)).remove();\n\t\t\t}\n\t\t\tfunction showFilter(_filter) {\n\t\t\t\tshowFrm = $($t).triggerHandler(\"jqGridFilterBeforeShow\", [_filter]);\n\t\t\t\tif(showFrm === undefined) {\n\t\t\t\t\tshowFrm = true;\n\t\t\t\t}\n\t\t\t\tif(showFrm && $.isFunction(p.beforeShowSearch)) {\n\t\t\t\t\tshowFrm = p.beforeShowSearch.call($t,_filter);\n\t\t\t\t}\n\t\t\t\tif(showFrm) {\n\t\t\t\t\t$.jgrid.viewModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gbox:\"#gbox_\"+$.jgrid.jqID(fid),jqm:p.jqModal, modal:p.modal, overlay: p.overlay, toTop: p.toTop});\n\t\t\t\t\t$($t).triggerHandler(\"jqGridFilterAfterShow\", [_filter]);\n\t\t\t\t\tif($.isFunction(p.afterShowSearch)) {\n\t\t\t\t\t\tp.afterShowSearch.call($t, _filter);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( $(\"#\"+$.jgrid.jqID(IDs.themodal))[0] !== undefined ) {\n\t\t\t\tshowFilter($(\"#fbox_\"+$.jgrid.jqID(+$t.p.id)));\n\t\t\t} else {\n\t\t\t\tvar fil = $(\"<div><div id='\"+fid+\"' class='searchFilter' style='overflow:auto'></div></div>\").insertBefore(\"#gview_\"+$.jgrid.jqID($t.p.id)),\n\t\t\t\talign = \"left\", butleft =\"\"; \n\t\t\t\tif($t.p.direction === \"rtl\") {\n\t\t\t\t\talign = \"right\";\n\t\t\t\t\tbutleft = \" style='text-align:left'\";\n\t\t\t\t\tfil.attr(\"dir\",\"rtl\");\n\t\t\t\t}\n\t\t\t\tvar columns = $.extend([],$t.p.colModel),\n\t\t\t\tbS  =\"<a href='javascript:void(0)' id='\"+fid+\"_search' class='fm-button ui-state-default ui-corner-all fm-button-icon-right ui-reset'><span class='ui-icon ui-icon-search'></span>\"+p.Find+\"</a>\",\n\t\t\t\tbC  =\"<a href='javascript:void(0)' id='\"+fid+\"_reset' class='fm-button ui-state-default ui-corner-all fm-button-icon-left ui-search'><span class='ui-icon ui-icon-arrowreturnthick-1-w'></span>\"+p.Reset+\"</a>\",\n\t\t\t\tbQ = \"\", tmpl=\"\", colnm, found = false, bt, cmi=-1;\n\t\t\t\tif(p.showQuery) {\n\t\t\t\t\tbQ =\"<a href='javascript:void(0)' id='\"+fid+\"_query' class='fm-button ui-state-default ui-corner-all fm-button-icon-left'><span class='ui-icon ui-icon-comment'></span>Query</a>\";\n\t\t\t\t}\n\t\t\t\tif(!p.columns.length) {\n\t\t\t\t\t$.each(columns, function(i,n){\n\t\t\t\t\t\tif(!n.label) {\n\t\t\t\t\t\t\tn.label = $t.p.colNames[i];\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// find first searchable column and set it if no default filter\n\t\t\t\t\t\tif(!found) {\n\t\t\t\t\t\t\tvar searchable = (n.search === undefined) ?  true: n.search ,\n\t\t\t\t\t\t\thidden = (n.hidden === true),\n\t\t\t\t\t\t\tignoreHiding = (n.searchoptions && n.searchoptions.searchhidden === true);\n\t\t\t\t\t\t\tif ((ignoreHiding && searchable) || (searchable && !hidden)) {\n\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t\tcolnm = n.index || n.name;\n\t\t\t\t\t\t\t\tcmi =i;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tcolumns = p.columns;\n\t\t\t\t\tcmi = 0;\n\t\t\t\t\tcolnm = columns[0].index || columns[0].name;\n\t\t\t\t}\n\t\t\t\t// old behaviour\n\t\t\t\tif( (!defaultFilters && colnm) || p.multipleSearch === false  ) {\n\t\t\t\t\tvar cmop = \"eq\";\n\t\t\t\t\tif(cmi >=0 && columns[cmi].searchoptions && columns[cmi].searchoptions.sopt) {\n\t\t\t\t\t\tcmop = columns[cmi].searchoptions.sopt[0];\n\t\t\t\t\t} else if(p.sopt && p.sopt.length) {\n\t\t\t\t\t\tcmop = p.sopt[0];\n\t\t\t\t\t}\n\t\t\t\t\tdefaultFilters = {groupOp: \"AND\", rules: [{field: colnm, op: cmop, data: \"\"}]};\n\t\t\t\t}\n\t\t\t\tfound = false;\n\t\t\t\tif(p.tmplNames && p.tmplNames.length) {\n\t\t\t\t\tfound = true;\n\t\t\t\t\ttmpl = p.tmplLabel;\n\t\t\t\t\ttmpl += \"<select class='ui-tpl'>\";\n\t\t\t\t\ttmpl += \"<option value='default'>Default</option>\";\n\t\t\t\t\t$.each(p.tmplNames, function(i,n){\n\t\t\t\t\t\ttmpl += \"<option value='\"+i+\"'>\"+n+\"</option>\";\n\t\t\t\t\t});\n\t\t\t\t\ttmpl += \"</select>\";\n\t\t\t\t}\n\n\t\t\t\tbt = \"<table class='EditTable' style='border:0px none;margin-top:5px' id='\"+fid+\"_2'><tbody><tr><td colspan='2'><hr class='ui-widget-content' style='margin:1px'/></td></tr><tr><td class='EditButton' style='text-align:\"+align+\"'>\"+bC+tmpl+\"</td><td class='EditButton' \"+butleft+\">\"+bQ+bS+\"</td></tr></tbody></table>\";\n\t\t\t\tfid = $.jgrid.jqID( fid);\n\t\t\t\t$(\"#\"+fid).jqFilter({\n\t\t\t\t\tcolumns : columns,\n\t\t\t\t\tfilter: p.loadDefaults ? defaultFilters : null,\n\t\t\t\t\tshowQuery: p.showQuery,\n\t\t\t\t\terrorcheck : p.errorcheck,\n\t\t\t\t\tsopt: p.sopt,\n\t\t\t\t\tgroupButton : p.multipleGroup,\n\t\t\t\t\truleButtons : p.multipleSearch,\n\t\t\t\t\tafterRedraw : p.afterRedraw,\n\t\t\t\t\tops : p.odata,\n\t\t\t\t\toperands : p.operands,\n\t\t\t\t\tajaxSelectOptions: $t.p.ajaxSelectOptions,\n\t\t\t\t\tgroupOps: p.groupOps,\n\t\t\t\t\tonChange : function() {\n\t\t\t\t\t\tif(this.p.showQuery) {\n\t\t\t\t\t\t\t$('.query',this).html(this.toUserFriendlyString());\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ($.isFunction(p.afterChange)) {\n\t\t\t\t\t\t\tp.afterChange.call($t, $(\"#\"+fid), p);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tdirection : $t.p.direction,\n\t\t\t\t\tid: $t.p.id\n\t\t\t\t});\n\t\t\t\tfil.append( bt );\n\t\t\t\tif(found && p.tmplFilters && p.tmplFilters.length) {\n\t\t\t\t\t$(\".ui-tpl\", fil).bind('change', function(){\n\t\t\t\t\t\tvar curtempl = $(this).val();\n\t\t\t\t\t\tif(curtempl===\"default\") {\n\t\t\t\t\t\t\t$(\"#\"+fid).jqFilter('addFilter', defaultFilters);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$(\"#\"+fid).jqFilter('addFilter', p.tmplFilters[parseInt(curtempl,10)]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(p.multipleGroup === true) {p.multipleSearch = true;}\n\t\t\t\t$($t).triggerHandler(\"jqGridFilterInitialize\", [$(\"#\"+fid)]);\n\t\t\t\tif($.isFunction(p.onInitializeSearch) ) {\n\t\t\t\t\tp.onInitializeSearch.call($t, $(\"#\"+fid));\n\t\t\t\t}\n\t\t\t\tp.gbox = \"#gbox_\"+fid;\n\t\t\t\tif (p.layer) {\n\t\t\t\t\t$.jgrid.createModal(IDs ,fil,p,\"#gview_\"+$.jgrid.jqID($t.p.id),$(\"#gbox_\"+$.jgrid.jqID($t.p.id))[0], \"#\"+$.jgrid.jqID(p.layer), {position: \"relative\"});\n\t\t\t\t} else {\n\t\t\t\t\t$.jgrid.createModal(IDs ,fil,p,\"#gview_\"+$.jgrid.jqID($t.p.id),$(\"#gbox_\"+$.jgrid.jqID($t.p.id))[0]);\n\t\t\t\t}\n\t\t\t\tif (p.searchOnEnter || p.closeOnEscape) {\n\t\t\t\t\t$(\"#\"+$.jgrid.jqID(IDs.themodal)).keydown(function (e) {\n\t\t\t\t\t\tvar $target = $(e.target);\n\t\t\t\t\t\tif (p.searchOnEnter && e.which === 13 && // 13 === $.ui.keyCode.ENTER\n\t\t\t\t\t\t\t\t!$target.hasClass('add-group') && !$target.hasClass('add-rule') &&\n\t\t\t\t\t\t\t\t!$target.hasClass('delete-group') && !$target.hasClass('delete-rule') &&\n\t\t\t\t\t\t\t\t(!$target.hasClass(\"fm-button\") || !$target.is(\"[id$=_query]\"))) {\n\t\t\t\t\t\t\t$(\"#\"+fid+\"_search\").focus().click();\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (p.closeOnEscape && e.which === 27) { // 27 === $.ui.keyCode.ESCAPE\n\t\t\t\t\t\t\t$(\"#\"+$.jgrid.jqID(IDs.modalhead)).find(\".ui-jqdialog-titlebar-close\").focus().click();\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(bQ) {\n\t\t\t\t\t$(\"#\"+fid+\"_query\").bind('click', function(){\n\t\t\t\t\t\t$(\".queryresult\", fil).toggle();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (p.stringResult===undefined) {\n\t\t\t\t\t// to provide backward compatibility, inferring stringResult value from multipleSearch\n\t\t\t\t\tp.stringResult = p.multipleSearch;\n\t\t\t\t}\n\t\t\t\t$(\"#\"+fid+\"_search\").bind('click', function(){\n\t\t\t\t\tvar fl = $(\"#\"+fid),\n\t\t\t\t\tsdata={}, res,\n\t\t\t\t\tfilters = fl.jqFilter('filterData');\n\t\t\t\t\tif(p.errorcheck) {\n\t\t\t\t\t\tfl[0].hideError();\n\t\t\t\t\t\tif(!p.showQuery) {fl.jqFilter('toSQLString');}\n\t\t\t\t\t\tif(fl[0].p.error) {\n\t\t\t\t\t\t\tfl[0].showError();\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(p.stringResult) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// xmlJsonClass or JSON.stringify\n\t\t\t\t\t\t\tres = xmlJsonClass.toJson(filters, '', '', false);\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tres = JSON.stringify(filters);\n\t\t\t\t\t\t\t} catch (e2) { }\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(typeof res===\"string\") {\n\t\t\t\t\t\t\tsdata[p.sFilter] = res;\n\t\t\t\t\t\t\t$.each([p.sField,p.sValue, p.sOper], function() {sdata[this] = \"\";});\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(p.multipleSearch) {\n\t\t\t\t\t\t\tsdata[p.sFilter] = filters;\n\t\t\t\t\t\t\t$.each([p.sField,p.sValue, p.sOper], function() {sdata[this] = \"\";});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsdata[p.sField] = filters.rules[0].field;\n\t\t\t\t\t\t\tsdata[p.sValue] = filters.rules[0].data;\n\t\t\t\t\t\t\tsdata[p.sOper] = filters.rules[0].op;\n\t\t\t\t\t\t\tsdata[p.sFilter] = \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$t.p.search = true;\n\t\t\t\t\t$.extend($t.p.postData,sdata);\n\t\t\t\t\t$($t).triggerHandler(\"jqGridFilterSearch\");\n\t\t\t\t\tif($.isFunction(p.onSearch) ) {\n\t\t\t\t\t\tp.onSearch.call($t);\n\t\t\t\t\t}\n\t\t\t\t\t$($t).trigger(\"reloadGrid\",[{page:1}]);\n\t\t\t\t\tif(p.closeAfterSearch) {\n\t\t\t\t\t\t$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID($t.p.id),jqm:p.jqModal,onClose: p.onClose});\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t\t$(\"#\"+fid+\"_reset\").bind('click', function(){\n\t\t\t\t\tvar sdata={},\n\t\t\t\t\tfl = $(\"#\"+fid);\n\t\t\t\t\t$t.p.search = false;\n\t\t\t\t\tif(p.multipleSearch===false) {\n\t\t\t\t\t\tsdata[p.sField] = sdata[p.sValue] = sdata[p.sOper] = \"\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsdata[p.sFilter] = \"\";\n\t\t\t\t\t}\n\t\t\t\t\tfl[0].resetFilter();\n\t\t\t\t\tif(found) {\n\t\t\t\t\t\t$(\".ui-tpl\", fil).val(\"default\");\n\t\t\t\t\t}\n\t\t\t\t\t$.extend($t.p.postData,sdata);\n\t\t\t\t\t$($t).triggerHandler(\"jqGridFilterReset\");\n\t\t\t\t\tif($.isFunction(p.onReset) ) {\n\t\t\t\t\t\tp.onReset.call($t);\n\t\t\t\t\t}\n\t\t\t\t\t$($t).trigger(\"reloadGrid\",[{page:1}]);\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t\tshowFilter($(\"#\"+fid));\n\t\t\t\t$(\".fm-button:not(.ui-state-disabled)\",fil).hover(\n\t\t\t\t\tfunction(){$(this).addClass('ui-state-hover');},\n\t\t\t\t\tfunction(){$(this).removeClass('ui-state-hover');}\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t},\n\teditGridRow : function(rowid, p){\n\t\tp = $.extend(true, {\n\t\t\ttop : 0,\n\t\t\tleft: 0,\n\t\t\twidth: 300,\n\t\t\tdatawidth: 'auto',\n\t\t\theight: 'auto',\n\t\t\tdataheight: 'auto',\n\t\t\tmodal: false,\n\t\t\toverlay : 30,\n\t\t\tdrag: true,\n\t\t\tresize: true,\n\t\t\turl: null,\n\t\t\tmtype : \"POST\",\n\t\t\tclearAfterAdd :true,\n\t\t\tcloseAfterEdit : false,\n\t\t\treloadAfterSubmit : true,\n\t\t\tonInitializeForm: null,\n\t\t\tbeforeInitData: null,\n\t\t\tbeforeShowForm: null,\n\t\t\tafterShowForm: null,\n\t\t\tbeforeSubmit: null,\n\t\t\tafterSubmit: null,\n\t\t\tonclickSubmit: null,\n\t\t\tafterComplete: null,\n\t\t\tonclickPgButtons : null,\n\t\t\tafterclickPgButtons: null,\n\t\t\teditData : {},\n\t\t\trecreateForm : false,\n\t\t\tjqModal : true,\n\t\t\tcloseOnEscape : false,\n\t\t\taddedrow : \"first\",\n\t\t\ttopinfo : '',\n\t\t\tbottominfo: '',\n\t\t\tsaveicon : [],\n\t\t\tcloseicon : [],\n\t\t\tsavekey: [false,13],\n\t\t\tnavkeys: [false,38,40],\n\t\t\tcheckOnSubmit : false,\n\t\t\tcheckOnUpdate : false,\n\t\t\t_savedData : {},\n\t\t\tprocessing : false,\n\t\t\tonClose : null,\n\t\t\tajaxEditOptions : {},\n\t\t\tserializeEditData : null,\n\t\t\tviewPagerButtons : true,\n\t\t\toverlayClass : 'ui-widget-overlay'\n\t\t}, $.jgrid.edit, p || {});\n\t\trp_ge[$(this)[0].p.id] = p;\n\t\treturn this.each(function(){\n\t\t\tvar $t = this;\n\t\t\tif (!$t.grid || !rowid) {return;}\n\t\t\tvar gID = $t.p.id,\n\t\t\tfrmgr = \"FrmGrid_\"+gID, frmtborg = \"TblGrid_\"+gID, frmtb = \"#\"+$.jgrid.jqID(frmtborg), \n\t\t\tIDs = {themodal:'editmod'+gID,modalhead:'edithd'+gID,modalcontent:'editcnt'+gID, scrollelm : frmgr},\n\t\t\tonBeforeShow = $.isFunction(rp_ge[$t.p.id].beforeShowForm) ? rp_ge[$t.p.id].beforeShowForm : false,\n\t\t\tonAfterShow = $.isFunction(rp_ge[$t.p.id].afterShowForm) ? rp_ge[$t.p.id].afterShowForm : false,\n\t\t\tonBeforeInit = $.isFunction(rp_ge[$t.p.id].beforeInitData) ? rp_ge[$t.p.id].beforeInitData : false,\n\t\t\tonInitializeForm = $.isFunction(rp_ge[$t.p.id].onInitializeForm) ? rp_ge[$t.p.id].onInitializeForm : false,\n\t\t\tshowFrm = true,\n\t\t\tmaxCols = 1, maxRows=0,\tpostdata, diff, frmoper;\n\t\t\tfrmgr = $.jgrid.jqID(frmgr);\n\t\t\tif (rowid === \"new\") {\n\t\t\t\trowid = \"_empty\";\n\t\t\t\tfrmoper = \"add\";\n\t\t\t\tp.caption=rp_ge[$t.p.id].addCaption;\n\t\t\t} else {\n\t\t\t\tp.caption=rp_ge[$t.p.id].editCaption;\n\t\t\t\tfrmoper = \"edit\";\n\t\t\t}\n\t\t\tif(p.recreateForm===true && $(\"#\"+$.jgrid.jqID(IDs.themodal))[0] !== undefined) {\n\t\t\t\t$(\"#\"+$.jgrid.jqID(IDs.themodal)).remove();\n\t\t\t}\n\t\t\tvar closeovrl = true;\n\t\t\tif(p.checkOnUpdate && p.jqModal && !p.modal) {\n\t\t\t\tcloseovrl = false;\n\t\t\t}\n\t\t\tfunction getFormData(){\n\t\t\t\t$(frmtb+\" > tbody > tr > td > .FormElement\").each(function() {\n\t\t\t\t\tvar celm = $(\".customelement\", this);\n\t\t\t\t\tif (celm.length) {\n\t\t\t\t\t\tvar  elem = celm[0], nm = $(elem).attr('name');\n\t\t\t\t\t\t$.each($t.p.colModel, function(){\n\t\t\t\t\t\t\tif(this.name === nm && this.editoptions && $.isFunction(this.editoptions.custom_value)) {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tpostdata[nm] = this.editoptions.custom_value.call($t, $(\"#\"+$.jgrid.jqID(nm),frmtb),'get');\n\t\t\t\t\t\t\t\t\tif (postdata[nm] === undefined) {throw \"e1\";}\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tif (e===\"e1\") {$.jgrid.info_dialog($.jgrid.errors.errcap,\"function 'custom_value' \"+$.jgrid.edit.msg.novalue,$.jgrid.edit.bClose);}\n\t\t\t\t\t\t\t\t\telse {$.jgrid.info_dialog($.jgrid.errors.errcap,e.message,$.jgrid.edit.bClose);}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\tswitch ($(this).get(0).type) {\n\t\t\t\t\t\tcase \"checkbox\":\n\t\t\t\t\t\t\tif($(this).is(\":checked\")) {\n\t\t\t\t\t\t\t\tpostdata[this.name]= $(this).val();\n\t\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\t\tvar ofv = $(this).attr(\"offval\");\n\t\t\t\t\t\t\t\tpostdata[this.name]= ofv;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"select-one\":\n\t\t\t\t\t\t\tpostdata[this.name]= $(\"option:selected\",this).val();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"select-multiple\":\n\t\t\t\t\t\t\tpostdata[this.name]= $(this).val();\n\t\t\t\t\t\t\tif(postdata[this.name]) {postdata[this.name] = postdata[this.name].join(\",\");}\n\t\t\t\t\t\t\telse {postdata[this.name] =\"\";}\n\t\t\t\t\t\t\tvar selectedText = [];\n\t\t\t\t\t\t\t$(\"option:selected\",this).each(\n\t\t\t\t\t\t\t\tfunction(i,selected){\n\t\t\t\t\t\t\t\t\tselectedText[i] = $(selected).text();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"password\":\n\t\t\t\t\t\tcase \"text\":\n\t\t\t\t\t\tcase \"textarea\":\n\t\t\t\t\t\tcase \"button\":\n\t\t\t\t\t\t\tpostdata[this.name] = $(this).val();\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif($t.p.autoencode) {postdata[this.name] = $.jgrid.htmlEncode(postdata[this.name]);}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tfunction createData(rowid,obj,tb,maxcols){\n\t\t\t\tvar nm, hc,trdata, cnt=0,tmp, dc,elc, retpos=[], ind=false,\n\t\t\t\ttdtmpl = \"<td class='CaptionTD'>&#160;</td><td class='DataTD'>&#160;</td>\", tmpl=\"\", i; //*2\n\t\t\t\tfor (i =1; i<=maxcols;i++) {\n\t\t\t\t\ttmpl += tdtmpl;\n\t\t\t\t}\n\t\t\t\tif(rowid !== '_empty') {\n\t\t\t\t\tind = $(obj).jqGrid(\"getInd\",rowid);\n\t\t\t\t}\n\t\t\t\t$(obj.p.colModel).each( function(i) {\n\t\t\t\t\tnm = this.name;\n\t\t\t\t\t// hidden fields are included in the form\n\t\t\t\t\tif(this.editrules && this.editrules.edithidden === true) {\n\t\t\t\t\t\thc = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\thc = this.hidden === true ? true : false;\n\t\t\t\t\t}\n\t\t\t\t\tdc = hc ? \"style='display:none'\" : \"\";\n\t\t\t\t\tif ( nm !== 'cb' && nm !== 'subgrid' && this.editable===true && nm !== 'rn') {\n\t\t\t\t\t\tif(ind === false) {\n\t\t\t\t\t\t\ttmp = \"\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif(nm === obj.p.ExpandColumn && obj.p.treeGrid === true) {\n\t\t\t\t\t\t\t\ttmp = $(\"td[role='gridcell']:eq(\"+i+\")\",obj.rows[ind]).text();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\ttmp =  $.unformat.call(obj, $(\"td[role='gridcell']:eq(\"+i+\")\",obj.rows[ind]),{rowId:rowid, colModel:this},i);\n\t\t\t\t\t\t\t\t} catch (_) {\n\t\t\t\t\t\t\t\t\ttmp =  (this.edittype && this.edittype === \"textarea\") ? $(\"td[role='gridcell']:eq(\"+i+\")\",obj.rows[ind]).text() : $(\"td[role='gridcell']:eq(\"+i+\")\",obj.rows[ind]).html();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif(!tmp || tmp === \"&nbsp;\" || tmp === \"&#160;\" || (tmp.length===1 && tmp.charCodeAt(0)===160) ) {tmp='';}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar opt = $.extend({}, this.editoptions || {} ,{id:nm,name:nm}),\n\t\t\t\t\t\tfrmopt = $.extend({}, {elmprefix:'',elmsuffix:'',rowabove:false,rowcontent:''}, this.formoptions || {}),\n\t\t\t\t\t\trp = parseInt(frmopt.rowpos,10) || cnt+1,\n\t\t\t\t\t\tcp = parseInt((parseInt(frmopt.colpos,10) || 1)*2,10);\n\t\t\t\t\t\tif(rowid === \"_empty\" && opt.defaultValue ) {\n\t\t\t\t\t\t\ttmp = $.isFunction(opt.defaultValue) ? opt.defaultValue.call($t) : opt.defaultValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(!this.edittype) {this.edittype = \"text\";}\n\t\t\t\t\t\tif($t.p.autoencode) {tmp = $.jgrid.htmlDecode(tmp);}\n\t\t\t\t\t\telc = $.jgrid.createEl.call($t,this.edittype,opt,tmp,false,$.extend({},$.jgrid.ajaxOptions,obj.p.ajaxSelectOptions || {}));\n\t\t\t\t\t\t//if(tmp === \"\" && this.edittype == \"checkbox\") {tmp = $(elc).attr(\"offval\");}\n\t\t\t\t\t\t//if(tmp === \"\" && this.edittype == \"select\") {tmp = $(\"option:eq(0)\",elc).text();}\n\t\t\t\t\t\tif(rp_ge[$t.p.id].checkOnSubmit || rp_ge[$t.p.id].checkOnUpdate) {rp_ge[$t.p.id]._savedData[nm] = tmp;}\n\t\t\t\t\t\t$(elc).addClass(\"FormElement\");\n\t\t\t\t\t\tif( $.inArray(this.edittype, ['text','textarea','password','select']) > -1) {\n\t\t\t\t\t\t\t$(elc).addClass(\"ui-widget-content ui-corner-all\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttrdata = $(tb).find(\"tr[rowpos=\"+rp+\"]\");\n\t\t\t\t\t\tif(frmopt.rowabove) {\n\t\t\t\t\t\t\tvar newdata = $(\"<tr><td class='contentinfo' colspan='\"+(maxcols*2)+\"'>\"+frmopt.rowcontent+\"</td></tr>\");\n\t\t\t\t\t\t\t$(tb).append(newdata);\n\t\t\t\t\t\t\tnewdata[0].rp = rp;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( trdata.length===0 ) {\n\t\t\t\t\t\t\ttrdata = $(\"<tr \"+dc+\" rowpos='\"+rp+\"'></tr>\").addClass(\"FormData\").attr(\"id\",\"tr_\"+nm);\n\t\t\t\t\t\t\t$(trdata).append(tmpl);\n\t\t\t\t\t\t\t$(tb).append(trdata);\n\t\t\t\t\t\t\ttrdata[0].rp = rp;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$(\"td:eq(\"+(cp-2)+\")\",trdata[0]).html(frmopt.label === undefined ? obj.p.colNames[i]: frmopt.label);\n\t\t\t\t\t\t$(\"td:eq(\"+(cp-1)+\")\",trdata[0]).append(frmopt.elmprefix).append(elc).append(frmopt.elmsuffix);\n\t\t\t\t\t\tif($.isFunction(opt.custom_value) && rowid !== \"_empty\" ) {\n\t\t\t\t\t\t\topt.custom_value.call($t, $(\"#\"+nm,\"#\"+frmgr),'set',tmp);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$.jgrid.bindEv.call($t, elc, opt);\n\t\t\t\t\t\tretpos[cnt] = i;\n\t\t\t\t\t\tcnt++;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif( cnt > 0) {\n\t\t\t\t\tvar idrow = $(\"<tr class='FormData' style='display:none'><td class='CaptionTD'></td><td colspan='\"+ (maxcols*2-1)+\"' class='DataTD'><input class='FormElement' id='id_g' type='text' name='\"+obj.p.id+\"_id' value='\"+rowid+\"'/></td></tr>\");\n\t\t\t\t\tidrow[0].rp = cnt+999;\n\t\t\t\t\t$(tb).append(idrow);\n\t\t\t\t\tif(rp_ge[$t.p.id].checkOnSubmit || rp_ge[$t.p.id].checkOnUpdate) {rp_ge[$t.p.id]._savedData[obj.p.id+\"_id\"] = rowid;}\n\t\t\t\t}\n\t\t\t\treturn retpos;\n\t\t\t}\n\t\t\tfunction fillData(rowid,obj,fmid){\n\t\t\t\tvar nm,cnt=0,tmp, fld,opt,vl,vlc;\n\t\t\t\tif(rp_ge[$t.p.id].checkOnSubmit || rp_ge[$t.p.id].checkOnUpdate) {rp_ge[$t.p.id]._savedData = {};rp_ge[$t.p.id]._savedData[obj.p.id+\"_id\"]=rowid;}\n\t\t\t\tvar cm = obj.p.colModel;\n\t\t\t\tif(rowid === '_empty') {\n\t\t\t\t\t$(cm).each(function(){\n\t\t\t\t\t\tnm = this.name;\n\t\t\t\t\t\topt = $.extend({}, this.editoptions || {} );\n\t\t\t\t\t\tfld = $(\"#\"+$.jgrid.jqID(nm),\"#\"+fmid);\n\t\t\t\t\t\tif(fld && fld.length && fld[0] !== null) {\n\t\t\t\t\t\t\tvl = \"\";\n\t\t\t\t\t\t\tif(opt.defaultValue ) {\n\t\t\t\t\t\t\t\tvl = $.isFunction(opt.defaultValue) ? opt.defaultValue.call($t) : opt.defaultValue;\n\t\t\t\t\t\t\t\tif(fld[0].type==='checkbox') {\n\t\t\t\t\t\t\t\t\tvlc = vl.toLowerCase();\n\t\t\t\t\t\t\t\t\tif(vlc.search(/(false|f|0|no|n|off|undefined)/i)<0 && vlc!==\"\") {\n\t\t\t\t\t\t\t\t\t\tfld[0].checked = true;\n\t\t\t\t\t\t\t\t\t\tfld[0].defaultChecked = true;\n\t\t\t\t\t\t\t\t\t\tfld[0].value = vl;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tfld[0].checked = false;\n\t\t\t\t\t\t\t\t\t\tfld[0].defaultChecked = false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {fld.val(vl);}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif( fld[0].type==='checkbox' ) {\n\t\t\t\t\t\t\t\t\tfld[0].checked = false;\n\t\t\t\t\t\t\t\t\tfld[0].defaultChecked = false;\n\t\t\t\t\t\t\t\t\tvl = $(fld).attr(\"offval\");\n\t\t\t\t\t\t\t\t} else if (fld[0].type && fld[0].type.substr(0,6)==='select') {\n\t\t\t\t\t\t\t\t\tfld[0].selectedIndex = 0;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tfld.val(vl);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(rp_ge[$t.p.id].checkOnSubmit===true || rp_ge[$t.p.id].checkOnUpdate) {rp_ge[$t.p.id]._savedData[nm] = vl;}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t$(\"#id_g\",\"#\"+fmid).val(rowid);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar tre = $(obj).jqGrid(\"getInd\",rowid,true);\n\t\t\t\tif(!tre) {return;}\n\t\t\t\t$('td[role=\"gridcell\"]',tre).each( function(i) {\n\t\t\t\t\tnm = cm[i].name;\n\t\t\t\t\t// hidden fields are included in the form\n\t\t\t\t\tif ( nm !== 'cb' && nm !== 'subgrid' && nm !== 'rn' && cm[i].editable===true) {\n\t\t\t\t\t\tif(nm === obj.p.ExpandColumn && obj.p.treeGrid === true) {\n\t\t\t\t\t\t\ttmp = $(this).text();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\ttmp =  $.unformat.call(obj, $(this),{rowId:rowid, colModel:cm[i]},i);\n\t\t\t\t\t\t\t} catch (_) {\n\t\t\t\t\t\t\t\ttmp = cm[i].edittype===\"textarea\" ? $(this).text() : $(this).html();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif($t.p.autoencode) {tmp = $.jgrid.htmlDecode(tmp);}\n\t\t\t\t\t\tif(rp_ge[$t.p.id].checkOnSubmit===true || rp_ge[$t.p.id].checkOnUpdate) {rp_ge[$t.p.id]._savedData[nm] = tmp;}\n\t\t\t\t\t\tnm = $.jgrid.jqID(nm);\n\t\t\t\t\t\tswitch (cm[i].edittype) {\n\t\t\t\t\t\t\tcase \"password\":\n\t\t\t\t\t\t\tcase \"text\":\n\t\t\t\t\t\t\tcase \"button\" :\n\t\t\t\t\t\t\tcase \"image\":\n\t\t\t\t\t\t\tcase \"textarea\":\n\t\t\t\t\t\t\t\tif(tmp === \"&nbsp;\" || tmp === \"&#160;\" || (tmp.length===1 && tmp.charCodeAt(0)===160) ) {tmp='';}\n\t\t\t\t\t\t\t\t$(\"#\"+nm,\"#\"+fmid).val(tmp);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"select\":\n\t\t\t\t\t\t\t\tvar opv = tmp.split(\",\");\n\t\t\t\t\t\t\t\topv = $.map(opv,function(n){return $.trim(n);});\n\t\t\t\t\t\t\t\t$(\"#\"+nm+\" option\",\"#\"+fmid).each(function(){\n\t\t\t\t\t\t\t\t\tif (!cm[i].editoptions.multiple && ($.trim(tmp) === $.trim($(this).text()) || opv[0] === $.trim($(this).text()) || opv[0] === $.trim($(this).val())) ){\n\t\t\t\t\t\t\t\t\t\tthis.selected= true;\n\t\t\t\t\t\t\t\t\t} else if (cm[i].editoptions.multiple){\n\t\t\t\t\t\t\t\t\t\tif(  $.inArray($.trim($(this).text()), opv ) > -1 || $.inArray($.trim($(this).val()), opv ) > -1  ){\n\t\t\t\t\t\t\t\t\t\t\tthis.selected = true;\n\t\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t\tthis.selected = false;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tthis.selected = false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"checkbox\":\n\t\t\t\t\t\t\t\ttmp = String(tmp);\n\t\t\t\t\t\t\t\tif(cm[i].editoptions && cm[i].editoptions.value) {\n\t\t\t\t\t\t\t\t\tvar cb = cm[i].editoptions.value.split(\":\");\n\t\t\t\t\t\t\t\t\tif(cb[0] === tmp) {\n\t\t\t\t\t\t\t\t\t\t$(\"#\"+nm,\"#\"+fmid)[$t.p.useProp ? 'prop': 'attr']({\"checked\":true, \"defaultChecked\" : true});\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t$(\"#\"+nm,\"#\"+fmid)[$t.p.useProp ? 'prop': 'attr']({\"checked\":false, \"defaultChecked\" : false});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\ttmp = tmp.toLowerCase();\n\t\t\t\t\t\t\t\t\tif(tmp.search(/(false|f|0|no|n|off|undefined)/i)<0 && tmp!==\"\") {\n\t\t\t\t\t\t\t\t\t\t$(\"#\"+nm,\"#\"+fmid)[$t.p.useProp ? 'prop': 'attr'](\"checked\",true);\n\t\t\t\t\t\t\t\t\t\t$(\"#\"+nm,\"#\"+fmid)[$t.p.useProp ? 'prop': 'attr'](\"defaultChecked\",true); //ie\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t$(\"#\"+nm,\"#\"+fmid)[$t.p.useProp ? 'prop': 'attr'](\"checked\", false);\n\t\t\t\t\t\t\t\t\t\t$(\"#\"+nm,\"#\"+fmid)[$t.p.useProp ? 'prop': 'attr'](\"defaultChecked\", false); //ie\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'custom' :\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tif(cm[i].editoptions && $.isFunction(cm[i].editoptions.custom_value)) {\n\t\t\t\t\t\t\t\t\t\tcm[i].editoptions.custom_value.call($t, $(\"#\"+nm,\"#\"+fmid),'set',tmp);\n\t\t\t\t\t\t\t\t\t} else {throw \"e1\";}\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tif (e===\"e1\") {$.jgrid.info_dialog($.jgrid.errors.errcap,\"function 'custom_value' \"+$.jgrid.edit.msg.nodefined,$.jgrid.edit.bClose);}\n\t\t\t\t\t\t\t\t\telse {$.jgrid.info_dialog($.jgrid.errors.errcap,e.message,$.jgrid.edit.bClose);}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcnt++;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(cnt>0) {$(\"#id_g\",frmtb).val(rowid);}\n\t\t\t}\n\t\t\tfunction setNulls() {\n\t\t\t\t$.each($t.p.colModel, function(i,n){\n\t\t\t\t\tif(n.editoptions && n.editoptions.NullIfEmpty === true) {\n\t\t\t\t\t\tif(postdata.hasOwnProperty(n.name) && postdata[n.name] === \"\") {\n\t\t\t\t\t\t\tpostdata[n.name] = 'null';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tfunction postIt() {\n\t\t\t\tvar copydata, ret=[true,\"\",\"\"], onCS = {}, opers = $t.p.prmNames, idname, oper, key, selr, i;\n\t\t\t\t\n\t\t\t\tvar retvals = $($t).triggerHandler(\"jqGridAddEditBeforeCheckValues\", [$(\"#\"+frmgr), frmoper]);\n\t\t\t\tif(retvals && typeof retvals === 'object') {postdata = retvals;}\n\t\t\t\t\n\t\t\t\tif($.isFunction(rp_ge[$t.p.id].beforeCheckValues)) {\n\t\t\t\t\tretvals = rp_ge[$t.p.id].beforeCheckValues.call($t, postdata,$(\"#\"+frmgr),frmoper);\n\t\t\t\t\tif(retvals && typeof retvals === 'object') {postdata = retvals;}\n\t\t\t\t}\n\t\t\t\tfor( key in postdata ){\n\t\t\t\t\tif(postdata.hasOwnProperty(key)) {\n\t\t\t\t\t\tret = $.jgrid.checkValues.call($t,postdata[key],key);\n\t\t\t\t\t\tif(ret[0] === false) {break;}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsetNulls();\n\t\t\t\tif(ret[0]) {\n\t\t\t\t\tonCS = $($t).triggerHandler(\"jqGridAddEditClickSubmit\", [rp_ge[$t.p.id], postdata, frmoper]);\n\t\t\t\t\tif( onCS === undefined && $.isFunction( rp_ge[$t.p.id].onclickSubmit)) { \n\t\t\t\t\t\tonCS = rp_ge[$t.p.id].onclickSubmit.call($t, rp_ge[$t.p.id], postdata, frmoper) || {}; \n\t\t\t\t\t}\n\t\t\t\t\tret = $($t).triggerHandler(\"jqGridAddEditBeforeSubmit\", [postdata, $(\"#\"+frmgr), frmoper]);\n\t\t\t\t\tif(ret === undefined) {\n\t\t\t\t\t\tret = [true,\"\",\"\"];\n\t\t\t\t\t}\n\t\t\t\t\tif( ret[0] && $.isFunction(rp_ge[$t.p.id].beforeSubmit))  {\n\t\t\t\t\t\tret = rp_ge[$t.p.id].beforeSubmit.call($t,postdata,$(\"#\"+frmgr), frmoper);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(ret[0] && !rp_ge[$t.p.id].processing) {\n\t\t\t\t\trp_ge[$t.p.id].processing = true;\n\t\t\t\t\t$(\"#sData\", frmtb+\"_2\").addClass('ui-state-active');\n\t\t\t\t\toper = opers.oper;\n\t\t\t\t\tidname = opers.id;\n\t\t\t\t\t// we add to pos data array the action - the name is oper\n\t\t\t\t\tpostdata[oper] = ($.trim(postdata[$t.p.id+\"_id\"]) === \"_empty\") ? opers.addoper : opers.editoper;\n\t\t\t\t\tif(postdata[oper] !== opers.addoper) {\n\t\t\t\t\t\tpostdata[idname] = postdata[$t.p.id+\"_id\"];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// check to see if we have allredy this field in the form and if yes lieve it\n\t\t\t\t\t\tif( postdata[idname] === undefined ) {postdata[idname] = postdata[$t.p.id+\"_id\"];}\n\t\t\t\t\t}\n\t\t\t\t\tdelete postdata[$t.p.id+\"_id\"];\n\t\t\t\t\tpostdata = $.extend(postdata,rp_ge[$t.p.id].editData,onCS);\n\t\t\t\t\tif($t.p.treeGrid === true)  {\n\t\t\t\t\t\tif(postdata[oper] === opers.addoper) {\n\t\t\t\t\t\tselr = $($t).jqGrid(\"getGridParam\", 'selrow');\n\t\t\t\t\t\t\tvar tr_par_id = $t.p.treeGridModel === 'adjacency' ? $t.p.treeReader.parent_id_field : 'parent_id';\n\t\t\t\t\t\t\tpostdata[tr_par_id] = selr;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor(i in $t.p.treeReader){\n\t\t\t\t\t\t\tif($t.p.treeReader.hasOwnProperty(i)) {\n\t\t\t\t\t\t\t\tvar itm = $t.p.treeReader[i];\n\t\t\t\t\t\t\t\tif(postdata.hasOwnProperty(itm)) {\n\t\t\t\t\t\t\t\t\tif(postdata[oper] === opers.addoper && i === 'parent_id_field') {continue;}\n\t\t\t\t\t\t\t\t\tdelete postdata[itm];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tpostdata[idname] = $.jgrid.stripPref($t.p.idPrefix, postdata[idname]);\n\t\t\t\t\tvar ajaxOptions = $.extend({\n\t\t\t\t\t\turl: rp_ge[$t.p.id].url || $($t).jqGrid('getGridParam','editurl'),\n\t\t\t\t\t\ttype: rp_ge[$t.p.id].mtype,\n\t\t\t\t\t\tdata: $.isFunction(rp_ge[$t.p.id].serializeEditData) ? rp_ge[$t.p.id].serializeEditData.call($t,postdata) :  postdata,\n\t\t\t\t\t\tcomplete:function(data,status){\n\t\t\t\t\t\t\tvar key;\n\t\t\t\t\t\t\tpostdata[idname] = $t.p.idPrefix + postdata[idname];\n\t\t\t\t\t\t\tif(data.status >= 300 && data.status !== 304) {\n\t\t\t\t\t\t\t\tret[0] = false;\n\t\t\t\t\t\t\t\tret[1] = $($t).triggerHandler(\"jqGridAddEditErrorTextFormat\", [data, frmoper]);\n\t\t\t\t\t\t\t\tif ($.isFunction(rp_ge[$t.p.id].errorTextFormat)) {\n\t\t\t\t\t\t\t\t\tret[1] = rp_ge[$t.p.id].errorTextFormat.call($t, data, frmoper);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tret[1] = status + \" Status: '\" + data.statusText + \"'. Error code: \" + data.status;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// data is posted successful\n\t\t\t\t\t\t\t\t// execute aftersubmit with the returned data from server\n\t\t\t\t\t\t\t\tret = $($t).triggerHandler(\"jqGridAddEditAfterSubmit\", [data, postdata, frmoper]);\n\t\t\t\t\t\t\t\tif(ret === undefined) {\n\t\t\t\t\t\t\t\t\tret = [true,\"\",\"\"];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif( ret[0] && $.isFunction(rp_ge[$t.p.id].afterSubmit) ) {\n\t\t\t\t\t\t\t\t\tret = rp_ge[$t.p.id].afterSubmit.call($t, data,postdata, frmoper);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(ret[0] === false) {\n\t\t\t\t\t\t\t\t$(\"#FormError>td\",frmtb).html(ret[1]);\n\t\t\t\t\t\t\t\t$(\"#FormError\",frmtb).show();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif($t.p.autoencode) {\n\t\t\t\t\t\t\t\t\t$.each(postdata,function(n,v){\n\t\t\t\t\t\t\t\t\t\tpostdata[n] = $.jgrid.htmlDecode(v);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t//rp_ge[$t.p.id].reloadAfterSubmit = rp_ge[$t.p.id].reloadAfterSubmit && $t.p.datatype != \"local\";\n\t\t\t\t\t\t\t\t// the action is add\n\t\t\t\t\t\t\t\tif(postdata[oper] === opers.addoper ) {\n\t\t\t\t\t\t\t\t\t//id processing\n\t\t\t\t\t\t\t\t\t// user not set the id ret[2]\n\t\t\t\t\t\t\t\t\tif(!ret[2]) {ret[2] = $.jgrid.randId();}\n\t\t\t\t\t\t\t\t\tpostdata[idname] = ret[2];\n\t\t\t\t\t\t\t\t\tif(rp_ge[$t.p.id].reloadAfterSubmit) {\n\t\t\t\t\t\t\t\t\t\t$($t).trigger(\"reloadGrid\");\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tif($t.p.treeGrid === true){\n\t\t\t\t\t\t\t\t\t\t\t$($t).jqGrid(\"addChildNode\",ret[2],selr,postdata );\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t$($t).jqGrid(\"addRowData\",ret[2],postdata,p.addedrow);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif(rp_ge[$t.p.id].closeAfterAdd) {\n\t\t\t\t\t\t\t\t\t\tif($t.p.treeGrid !== true){\n\t\t\t\t\t\t\t\t\t\t\t$($t).jqGrid(\"setSelection\",ret[2]);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal,onClose: rp_ge[$t.p.id].onClose});\n\t\t\t\t\t\t\t\t\t} else if (rp_ge[$t.p.id].clearAfterAdd) {\n\t\t\t\t\t\t\t\t\t\tfillData(\"_empty\",$t,frmgr);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// the action is update\n\t\t\t\t\t\t\t\t\tif(rp_ge[$t.p.id].reloadAfterSubmit) {\n\t\t\t\t\t\t\t\t\t\t$($t).trigger(\"reloadGrid\");\n\t\t\t\t\t\t\t\t\t\tif( !rp_ge[$t.p.id].closeAfterEdit ) {setTimeout(function(){$($t).jqGrid(\"setSelection\",postdata[idname]);},1000);}\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tif($t.p.treeGrid === true) {\n\t\t\t\t\t\t\t\t\t\t\t$($t).jqGrid(\"setTreeRow\", postdata[idname],postdata);\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t$($t).jqGrid(\"setRowData\", postdata[idname],postdata);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif(rp_ge[$t.p.id].closeAfterEdit) {$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal,onClose: rp_ge[$t.p.id].onClose});}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif($.isFunction(rp_ge[$t.p.id].afterComplete)) {\n\t\t\t\t\t\t\t\t\tcopydata = data;\n\t\t\t\t\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\t\t\t\t\t$($t).triggerHandler(\"jqGridAddEditAfterComplete\", [copydata, postdata, $(\"#\"+frmgr), frmoper]);\n\t\t\t\t\t\t\t\t\t\trp_ge[$t.p.id].afterComplete.call($t, copydata, postdata, $(\"#\"+frmgr), frmoper);\n\t\t\t\t\t\t\t\t\t\tcopydata=null;\n\t\t\t\t\t\t\t\t\t},500);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif(rp_ge[$t.p.id].checkOnSubmit || rp_ge[$t.p.id].checkOnUpdate) {\n\t\t\t\t\t\t\t\t\t$(\"#\"+frmgr).data(\"disabled\",false);\n\t\t\t\t\t\t\t\t\tif(rp_ge[$t.p.id]._savedData[$t.p.id+\"_id\"] !== \"_empty\"){\n\t\t\t\t\t\t\t\t\t\tfor(key in rp_ge[$t.p.id]._savedData) {\n\t\t\t\t\t\t\t\t\t\t\tif(rp_ge[$t.p.id]._savedData.hasOwnProperty(key) && postdata[key]) {\n\t\t\t\t\t\t\t\t\t\t\t\trp_ge[$t.p.id]._savedData[key] = postdata[key];\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\trp_ge[$t.p.id].processing=false;\n\t\t\t\t\t\t\t$(\"#sData\", frmtb+\"_2\").removeClass('ui-state-active');\n\t\t\t\t\t\t\ttry{$(':input:visible',\"#\"+frmgr)[0].focus();} catch (e){}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, $.jgrid.ajaxOptions, rp_ge[$t.p.id].ajaxEditOptions );\n\n\t\t\t\t\tif (!ajaxOptions.url && !rp_ge[$t.p.id].useDataProxy) {\n\t\t\t\t\t\tif ($.isFunction($t.p.dataProxy)) {\n\t\t\t\t\t\t\trp_ge[$t.p.id].useDataProxy = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tret[0]=false;ret[1] += \" \"+$.jgrid.errors.nourl;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (ret[0]) {\n\t\t\t\t\t\tif (rp_ge[$t.p.id].useDataProxy) {\n\t\t\t\t\t\t\tvar dpret = $t.p.dataProxy.call($t, ajaxOptions, \"set_\"+$t.p.id); \n\t\t\t\t\t\t\tif(dpret === undefined) {\n\t\t\t\t\t\t\t\tdpret = [true, \"\"];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(dpret[0] === false ) {\n\t\t\t\t\t\t\t\tret[0] = false;\n\t\t\t\t\t\t\t\tret[1] = dpret[1] || \"Error deleting the selected row!\" ;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif(ajaxOptions.data.oper === opers.addoper && rp_ge[$t.p.id].closeAfterAdd ) {\n\t\t\t\t\t\t\t\t\t$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal, onClose: rp_ge[$t.p.id].onClose});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif(ajaxOptions.data.oper === opers.editoper && rp_ge[$t.p.id].closeAfterEdit ) {\n\t\t\t\t\t\t\t\t\t$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal, onClose: rp_ge[$t.p.id].onClose});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$.ajax(ajaxOptions); \n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(ret[0] === false) {\n\t\t\t\t\t$(\"#FormError>td\",frmtb).html(ret[1]);\n\t\t\t\t\t$(\"#FormError\",frmtb).show();\n\t\t\t\t\t// return;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfunction compareData(nObj, oObj ) {\n\t\t\t\tvar ret = false,key;\n\t\t\t\tfor (key in nObj) {\n\t\t\t\t\tif(nObj.hasOwnProperty(key) && nObj[key] != oObj[key]) {\n\t\t\t\t\t\tret = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t\tfunction checkUpdates () {\n\t\t\t\tvar stat = true;\n\t\t\t\t$(\"#FormError\",frmtb).hide();\n\t\t\t\tif(rp_ge[$t.p.id].checkOnUpdate) {\n\t\t\t\t\tpostdata = {};\n\t\t\t\t\tgetFormData();\n\t\t\t\t\tdiff = compareData(postdata,rp_ge[$t.p.id]._savedData);\n\t\t\t\t\tif(diff) {\n\t\t\t\t\t\t$(\"#\"+frmgr).data(\"disabled\",true);\n\t\t\t\t\t\t$(\".confirm\",\"#\"+IDs.themodal).show();\n\t\t\t\t\t\tstat = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn stat;\n\t\t\t}\n\t\t\tfunction restoreInline()\n\t\t\t{\n\t\t\t\tvar i;\n\t\t\t\tif (rowid !== \"_empty\" && $t.p.savedRow !== undefined && $t.p.savedRow.length > 0 && $.isFunction($.fn.jqGrid.restoreRow)) {\n\t\t\t\t\tfor (i=0;i<$t.p.savedRow.length;i++) {\n\t\t\t\t\t\tif ($t.p.savedRow[i].id == rowid) {\n\t\t\t\t\t\t\t$($t).jqGrid('restoreRow',rowid);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfunction updateNav(cr, posarr){\n\t\t\t\tvar totr = posarr[1].length-1;\n\t\t\t\tif (cr===0) {\n\t\t\t\t\t$(\"#pData\",frmtb+\"_2\").addClass('ui-state-disabled');\n\t\t\t\t} else if( posarr[1][cr-1] !== undefined && $(\"#\"+$.jgrid.jqID(posarr[1][cr-1])).hasClass('ui-state-disabled')) {\n\t\t\t\t\t\t$(\"#pData\",frmtb+\"_2\").addClass('ui-state-disabled');\n\t\t\t\t} else {\n\t\t\t\t\t$(\"#pData\",frmtb+\"_2\").removeClass('ui-state-disabled');\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (cr===totr) {\n\t\t\t\t\t$(\"#nData\",frmtb+\"_2\").addClass('ui-state-disabled');\n\t\t\t\t} else if( posarr[1][cr+1] !== undefined && $(\"#\"+$.jgrid.jqID(posarr[1][cr+1])).hasClass('ui-state-disabled')) {\n\t\t\t\t\t$(\"#nData\",frmtb+\"_2\").addClass('ui-state-disabled');\n\t\t\t\t} else {\n\t\t\t\t\t$(\"#nData\",frmtb+\"_2\").removeClass('ui-state-disabled');\n\t\t\t\t}\n\t\t\t}\n\t\t\tfunction getCurrPos() {\n\t\t\t\tvar rowsInGrid = $($t).jqGrid(\"getDataIDs\"),\n\t\t\t\tselrow = $(\"#id_g\",frmtb).val(),\n\t\t\t\tpos = $.inArray(selrow,rowsInGrid);\n\t\t\t\treturn [pos,rowsInGrid];\n\t\t\t}\n\n\t\t\tif ( $(\"#\"+$.jgrid.jqID(IDs.themodal))[0] !== undefined ) {\n\t\t\t\tshowFrm = $($t).triggerHandler(\"jqGridAddEditBeforeInitData\", [$(\"#\"+$.jgrid.jqID(frmgr)), frmoper]);\n\t\t\t\tif(showFrm === undefined) {\n\t\t\t\t\tshowFrm = true;\n\t\t\t\t}\n\t\t\t\tif(showFrm && onBeforeInit) {\n\t\t\t\t\tshowFrm = onBeforeInit.call($t,$(\"#\"+frmgr), frmoper);\n\t\t\t\t}\n\t\t\t\tif(showFrm === false) {return;}\n\t\t\t\trestoreInline();\n\t\t\t\t$(\".ui-jqdialog-title\",\"#\"+$.jgrid.jqID(IDs.modalhead)).html(p.caption);\n\t\t\t\t$(\"#FormError\",frmtb).hide();\n\t\t\t\tif(rp_ge[$t.p.id].topinfo) {\n\t\t\t\t\t$(\".topinfo\",frmtb).html(rp_ge[$t.p.id].topinfo);\n\t\t\t\t\t$(\".tinfo\",frmtb).show();\n\t\t\t\t} else {\n\t\t\t\t\t$(\".tinfo\",frmtb).hide();\n\t\t\t\t}\n\t\t\t\tif(rp_ge[$t.p.id].bottominfo) {\n\t\t\t\t\t$(\".bottominfo\",frmtb+\"_2\").html(rp_ge[$t.p.id].bottominfo);\n\t\t\t\t\t$(\".binfo\",frmtb+\"_2\").show();\n\t\t\t\t} else {\n\t\t\t\t\t$(\".binfo\",frmtb+\"_2\").hide();\n\t\t\t\t}\n\t\t\t\t// filldata\n\t\t\t\tfillData(rowid,$t,frmgr);\n\t\t\t\t///\n\t\t\t\tif(rowid===\"_empty\" || !rp_ge[$t.p.id].viewPagerButtons) {\n\t\t\t\t\t$(\"#pData, #nData\",frmtb+\"_2\").hide();\n\t\t\t\t} else {\n\t\t\t\t\t$(\"#pData, #nData\",frmtb+\"_2\").show();\n\t\t\t\t}\n\t\t\t\tif(rp_ge[$t.p.id].processing===true) {\n\t\t\t\t\trp_ge[$t.p.id].processing=false;\n\t\t\t\t\t$(\"#sData\", frmtb+\"_2\").removeClass('ui-state-active');\n\t\t\t\t}\n\t\t\t\tif($(\"#\"+frmgr).data(\"disabled\")===true) {\n\t\t\t\t\t$(\".confirm\",\"#\"+$.jgrid.jqID(IDs.themodal)).hide();\n\t\t\t\t\t$(\"#\"+frmgr).data(\"disabled\",false);\n\t\t\t\t}\n\t\t\t\t$($t).triggerHandler(\"jqGridAddEditBeforeShowForm\", [$(\"#\"+frmgr), frmoper]);\n\t\t\t\tif(onBeforeShow) { onBeforeShow.call($t, $(\"#\"+frmgr), frmoper); }\n\t\t\t\t$(\"#\"+$.jgrid.jqID(IDs.themodal)).data(\"onClose\",rp_ge[$t.p.id].onClose);\n\t\t\t\t$.jgrid.viewModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gbox:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal, jqM: false, overlay: p.overlay, modal:p.modal, overlayClass : p.overlayClass});\n\t\t\t\tif(!closeovrl) {\n\t\t\t\t\t$(\".\" + $.jgrid.jqID(p.overlayClass)).click(function(){\n\t\t\t\t\t\tif(!checkUpdates()) {return false;}\n\t\t\t\t\t\t$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal, onClose: rp_ge[$t.p.id].onClose});\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t$($t).triggerHandler(\"jqGridAddEditAfterShowForm\", [$(\"#\"+frmgr), frmoper]);\n\t\t\t\tif(onAfterShow) { onAfterShow.call($t, $(\"#\"+frmgr), frmoper); }\n\t\t\t} else {\n\t\t\t\tvar dh = isNaN(p.dataheight) ? p.dataheight : p.dataheight+\"px\",\n\t\t\t\tdw = isNaN(p.datawidth) ? p.datawidth : p.datawidth+\"px\",\n\t\t\t\tfrm = $(\"<form name='FormPost' id='\"+frmgr+\"' class='FormGrid' onSubmit='return false;' style='width:\"+dw+\";overflow:auto;position:relative;height:\"+dh+\";'></form>\").data(\"disabled\",false),\n\t\t\t\ttbl = $(\"<table id='\"+frmtborg+\"' class='EditTable' cellspacing='0' cellpadding='0' border='0'><tbody></tbody></table>\");\n\t\t\t\tshowFrm = $($t).triggerHandler(\"jqGridAddEditBeforeInitData\", [$(\"#\"+frmgr), frmoper]);\n\t\t\t\tif(showFrm === undefined) {\n\t\t\t\t\tshowFrm = true;\n\t\t\t\t}\n\t\t\t\tif(showFrm && onBeforeInit) {\n\t\t\t\t\tshowFrm = onBeforeInit.call($t,$(\"#\"+frmgr,frmoper));\n\t\t\t\t}\n\t\t\t\tif(showFrm === false) {return;}\n\t\t\t\trestoreInline();\n\t\t\t\t$($t.p.colModel).each( function() {\n\t\t\t\t\tvar fmto = this.formoptions;\n\t\t\t\t\tmaxCols = Math.max(maxCols, fmto ? fmto.colpos || 0 : 0 );\n\t\t\t\t\tmaxRows = Math.max(maxRows, fmto ? fmto.rowpos || 0 : 0 );\n\t\t\t\t});\n\t\t\t\t$(frm).append(tbl);\n\t\t\t\tvar flr = $(\"<tr id='FormError' style='display:none'><td class='ui-state-error' colspan='\"+(maxCols*2)+\"'></td></tr>\");\n\t\t\t\tflr[0].rp = 0;\n\t\t\t\t$(tbl).append(flr);\n\t\t\t\t//topinfo\n\t\t\t\tflr = $(\"<tr style='display:none' class='tinfo'><td class='topinfo' colspan='\"+(maxCols*2)+\"'>\"+rp_ge[$t.p.id].topinfo+\"</td></tr>\");\n\t\t\t\tflr[0].rp = 0;\n\t\t\t\t$(tbl).append(flr);\n\t\t\t\t// set the id.\n\t\t\t\t// use carefull only to change here colproperties.\n\t\t\t\t// create data\n\t\t\t\tvar rtlb = $t.p.direction === \"rtl\" ? true :false,\n\t\t\t\tbp = rtlb ? \"nData\" : \"pData\",\n\t\t\t\tbn = rtlb ? \"pData\" : \"nData\";\n\t\t\t\tcreateData(rowid,$t,tbl,maxCols);\n\t\t\t\t// buttons at footer\n\t\t\t\tvar bP = \"<a href='javascript:void(0)' id='\"+bp+\"' class='fm-button ui-state-default ui-corner-left'><span class='ui-icon ui-icon-triangle-1-w'></span></a>\",\n\t\t\t\tbN = \"<a href='javascript:void(0)' id='\"+bn+\"' class='fm-button ui-state-default ui-corner-right'><span class='ui-icon ui-icon-triangle-1-e'></span></a>\",\n\t\t\t\tbS  =\"<a href='javascript:void(0)' id='sData' class='fm-button ui-state-default ui-corner-all'>\"+p.bSubmit+\"</a>\",\n\t\t\t\tbC  =\"<a href='javascript:void(0)' id='cData' class='fm-button ui-state-default ui-corner-all'>\"+p.bCancel+\"</a>\";\n\t\t\t\tvar bt = \"<table border='0' cellspacing='0' cellpadding='0' class='EditTable' id='\"+frmtborg+\"_2'><tbody><tr><td colspan='2'><hr class='ui-widget-content' style='margin:1px'/></td></tr><tr id='Act_Buttons'><td class='navButton'>\"+(rtlb ? bN+bP : bP+bN)+\"</td><td class='EditButton'>\"+bS+bC+\"</td></tr>\";\n\t\t\t\tbt += \"<tr style='display:none' class='binfo'><td class='bottominfo' colspan='2'>\"+rp_ge[$t.p.id].bottominfo+\"</td></tr>\";\n\t\t\t\tbt += \"</tbody></table>\";\n\t\t\t\tif(maxRows >  0) {\n\t\t\t\t\tvar sd=[];\n\t\t\t\t\t$.each($(tbl)[0].rows,function(i,r){\n\t\t\t\t\t\tsd[i] = r;\n\t\t\t\t\t});\n\t\t\t\t\tsd.sort(function(a,b){\n\t\t\t\t\t\tif(a.rp > b.rp) {return 1;}\n\t\t\t\t\t\tif(a.rp < b.rp) {return -1;}\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t});\n\t\t\t\t\t$.each(sd, function(index, row) {\n\t\t\t\t\t\t$('tbody',tbl).append(row);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tp.gbox = \"#gbox_\"+$.jgrid.jqID(gID);\n\t\t\t\tvar cle = false;\n\t\t\t\tif(p.closeOnEscape===true){\n\t\t\t\t\tp.closeOnEscape = false;\n\t\t\t\t\tcle = true;\n\t\t\t\t}\n\t\t\t\tvar tms = $(\"<div></div>\").append(frm).append(bt);\n\t\t\t\t$.jgrid.createModal(IDs,tms,p,\"#gview_\"+$.jgrid.jqID($t.p.id),$(\"#gbox_\"+$.jgrid.jqID($t.p.id))[0]);\n\t\t\t\tif(rtlb) {\n\t\t\t\t\t$(\"#pData, #nData\",frmtb+\"_2\").css(\"float\",\"right\");\n\t\t\t\t\t$(\".EditButton\",frmtb+\"_2\").css(\"text-align\",\"left\");\n\t\t\t\t}\n\t\t\t\tif(rp_ge[$t.p.id].topinfo) {$(\".tinfo\",frmtb).show();}\n\t\t\t\tif(rp_ge[$t.p.id].bottominfo) {$(\".binfo\",frmtb+\"_2\").show();}\n\t\t\t\ttms = null;bt=null;\n\t\t\t\t$(\"#\"+$.jgrid.jqID(IDs.themodal)).keydown( function( e ) {\n\t\t\t\t\tvar wkey = e.target;\n\t\t\t\t\tif ($(\"#\"+frmgr).data(\"disabled\")===true ) {return false;}//??\n\t\t\t\t\tif(rp_ge[$t.p.id].savekey[0] === true && e.which === rp_ge[$t.p.id].savekey[1]) { // save\n\t\t\t\t\t\tif(wkey.tagName !== \"TEXTAREA\") {\n\t\t\t\t\t\t\t$(\"#sData\", frmtb+\"_2\").trigger(\"click\");\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(e.which === 27) {\n\t\t\t\t\t\tif(!checkUpdates()) {return false;}\n\t\t\t\t\t\tif(cle)\t{$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:p.gbox,jqm:p.jqModal, onClose: rp_ge[$t.p.id].onClose});}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif(rp_ge[$t.p.id].navkeys[0]===true) {\n\t\t\t\t\t\tif($(\"#id_g\",frmtb).val() === \"_empty\") {return true;}\n\t\t\t\t\t\tif(e.which === rp_ge[$t.p.id].navkeys[1]){ //up\n\t\t\t\t\t\t\t$(\"#pData\", frmtb+\"_2\").trigger(\"click\");\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(e.which === rp_ge[$t.p.id].navkeys[2]){ //down\n\t\t\t\t\t\t\t$(\"#nData\", frmtb+\"_2\").trigger(\"click\");\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(p.checkOnUpdate) {\n\t\t\t\t\t$(\"a.ui-jqdialog-titlebar-close span\",\"#\"+$.jgrid.jqID(IDs.themodal)).removeClass(\"jqmClose\");\n\t\t\t\t\t$(\"a.ui-jqdialog-titlebar-close\",\"#\"+$.jgrid.jqID(IDs.themodal)).unbind(\"click\")\n\t\t\t\t\t.click(function(){\n\t\t\t\t\t\tif(!checkUpdates()) {return false;}\n\t\t\t\t\t\t$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal,onClose: rp_ge[$t.p.id].onClose});\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tp.saveicon = $.extend([true,\"left\",\"ui-icon-disk\"],p.saveicon);\n\t\t\t\tp.closeicon = $.extend([true,\"left\",\"ui-icon-close\"],p.closeicon);\n\t\t\t\t// beforeinitdata after creation of the form\n\t\t\t\tif(p.saveicon[0]===true) {\n\t\t\t\t\t$(\"#sData\",frmtb+\"_2\").addClass(p.saveicon[1] === \"right\" ? 'fm-button-icon-right' : 'fm-button-icon-left')\n\t\t\t\t\t.append(\"<span class='ui-icon \"+p.saveicon[2]+\"'></span>\");\n\t\t\t\t}\n\t\t\t\tif(p.closeicon[0]===true) {\n\t\t\t\t\t$(\"#cData\",frmtb+\"_2\").addClass(p.closeicon[1] === \"right\" ? 'fm-button-icon-right' : 'fm-button-icon-left')\n\t\t\t\t\t.append(\"<span class='ui-icon \"+p.closeicon[2]+\"'></span>\");\n\t\t\t\t}\n\t\t\t\tif(rp_ge[$t.p.id].checkOnSubmit || rp_ge[$t.p.id].checkOnUpdate) {\n\t\t\t\t\tbS  =\"<a href='javascript:void(0)' id='sNew' class='fm-button ui-state-default ui-corner-all' style='z-index:1002'>\"+p.bYes+\"</a>\";\n\t\t\t\t\tbN  =\"<a href='javascript:void(0)' id='nNew' class='fm-button ui-state-default ui-corner-all' style='z-index:1002'>\"+p.bNo+\"</a>\";\n\t\t\t\t\tbC  =\"<a href='javascript:void(0)' id='cNew' class='fm-button ui-state-default ui-corner-all' style='z-index:1002'>\"+p.bExit+\"</a>\";\n\t\t\t\t\tvar zI = p.zIndex  || 999;zI ++;\n\t\t\t\t\t$(\"<div class='\"+ p.overlayClass+\" jqgrid-overlay confirm' style='z-index:\"+zI+\";display:none;'>&#160;\"+\"</div><div class='confirm ui-widget-content ui-jqconfirm' style='z-index:\"+(zI+1)+\"'>\"+p.saveData+\"<br/><br/>\"+bS+bN+bC+\"</div>\").insertAfter(\"#\"+frmgr);\n\t\t\t\t\t$(\"#sNew\",\"#\"+$.jgrid.jqID(IDs.themodal)).click(function(){\n\t\t\t\t\t\tpostIt();\n\t\t\t\t\t\t$(\"#\"+frmgr).data(\"disabled\",false);\n\t\t\t\t\t\t$(\".confirm\",\"#\"+$.jgrid.jqID(IDs.themodal)).hide();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t});\n\t\t\t\t\t$(\"#nNew\",\"#\"+$.jgrid.jqID(IDs.themodal)).click(function(){\n\t\t\t\t\t\t$(\".confirm\",\"#\"+$.jgrid.jqID(IDs.themodal)).hide();\n\t\t\t\t\t\t$(\"#\"+frmgr).data(\"disabled\",false);\n\t\t\t\t\t\tsetTimeout(function(){$(\":input:visible\",\"#\"+frmgr)[0].focus();},0);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t});\n\t\t\t\t\t$(\"#cNew\",\"#\"+$.jgrid.jqID(IDs.themodal)).click(function(){\n\t\t\t\t\t\t$(\".confirm\",\"#\"+$.jgrid.jqID(IDs.themodal)).hide();\n\t\t\t\t\t\t$(\"#\"+frmgr).data(\"disabled\",false);\n\t\t\t\t\t\t$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal,onClose: rp_ge[$t.p.id].onClose});\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// here initform - only once\n\t\t\t\t$($t).triggerHandler(\"jqGridAddEditInitializeForm\", [$(\"#\"+frmgr), frmoper]);\n\t\t\t\tif(onInitializeForm) {onInitializeForm.call($t,$(\"#\"+frmgr), frmoper);}\n\t\t\t\tif(rowid===\"_empty\" || !rp_ge[$t.p.id].viewPagerButtons) {$(\"#pData,#nData\",frmtb+\"_2\").hide();} else {$(\"#pData,#nData\",frmtb+\"_2\").show();}\n\t\t\t\t$($t).triggerHandler(\"jqGridAddEditBeforeShowForm\", [$(\"#\"+frmgr), frmoper]);\n\t\t\t\tif(onBeforeShow) { onBeforeShow.call($t, $(\"#\"+frmgr), frmoper);}\n\t\t\t\t$(\"#\"+$.jgrid.jqID(IDs.themodal)).data(\"onClose\",rp_ge[$t.p.id].onClose);\n\t\t\t\t$.jgrid.viewModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gbox:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal, overlay: p.overlay,modal:p.modal, overlayClass: p.overlayClass});\n\t\t\t\tif(!closeovrl) {\n\t\t\t\t\t$(\".\" + $.jgrid.jqID(p.overlayClass)).click(function(){\n\t\t\t\t\t\tif(!checkUpdates()) {return false;}\n\t\t\t\t\t\t$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal, onClose: rp_ge[$t.p.id].onClose});\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t$($t).triggerHandler(\"jqGridAddEditAfterShowForm\", [$(\"#\"+frmgr), frmoper]);\n\t\t\t\tif(onAfterShow) { onAfterShow.call($t, $(\"#\"+frmgr), frmoper); }\n\t\t\t\t$(\".fm-button\",\"#\"+$.jgrid.jqID(IDs.themodal)).hover(\n\t\t\t\t\tfunction(){$(this).addClass('ui-state-hover');},\n\t\t\t\t\tfunction(){$(this).removeClass('ui-state-hover');}\n\t\t\t\t);\n\t\t\t\t$(\"#sData\", frmtb+\"_2\").click(function(){\n\t\t\t\t\tpostdata = {};\n\t\t\t\t\t$(\"#FormError\",frmtb).hide();\n\t\t\t\t\t// all depend on ret array\n\t\t\t\t\t//ret[0] - succes\n\t\t\t\t\t//ret[1] - msg if not succes\n\t\t\t\t\t//ret[2] - the id  that will be set if reload after submit false\n\t\t\t\t\tgetFormData();\n\t\t\t\t\tif(postdata[$t.p.id+\"_id\"] === \"_empty\")\t{postIt();}\n\t\t\t\t\telse if(p.checkOnSubmit===true ) {\n\t\t\t\t\t\tdiff = compareData(postdata,rp_ge[$t.p.id]._savedData);\n\t\t\t\t\t\tif(diff) {\n\t\t\t\t\t\t\t$(\"#\"+frmgr).data(\"disabled\",true);\n\t\t\t\t\t\t\t$(\".confirm\",\"#\"+$.jgrid.jqID(IDs.themodal)).show();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpostIt();\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpostIt();\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t\t$(\"#cData\", frmtb+\"_2\").click(function(){\n\t\t\t\t\tif(!checkUpdates()) {return false;}\n\t\t\t\t\t$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal,onClose: rp_ge[$t.p.id].onClose});\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t\t$(\"#nData\", frmtb+\"_2\").click(function(){\n\t\t\t\t\tif(!checkUpdates()) {return false;}\n\t\t\t\t\t$(\"#FormError\",frmtb).hide();\n\t\t\t\t\tvar npos = getCurrPos();\n\t\t\t\t\tnpos[0] = parseInt(npos[0],10);\n\t\t\t\t\tif(npos[0] !== -1 && npos[1][npos[0]+1]) {\n\t\t\t\t\t\t$($t).triggerHandler(\"jqGridAddEditClickPgButtons\", ['next',$(\"#\"+frmgr),npos[1][npos[0]]]);\n\t\t\t\t\t\tvar nposret;\n\t\t\t\t\t\tif($.isFunction(p.onclickPgButtons)) {\n\t\t\t\t\t\t\tnposret = p.onclickPgButtons.call($t, 'next',$(\"#\"+frmgr),npos[1][npos[0]]);\n\t\t\t\t\t\t\tif( nposret !== undefined && nposret === false ) {return false;}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif( $(\"#\"+$.jgrid.jqID(npos[1][npos[0]+1])).hasClass('ui-state-disabled')) {return false;}\n\t\t\t\t\t\tfillData(npos[1][npos[0]+1],$t,frmgr);\n\t\t\t\t\t\t$($t).jqGrid(\"setSelection\",npos[1][npos[0]+1]);\n\t\t\t\t\t\t$($t).triggerHandler(\"jqGridAddEditAfterClickPgButtons\", ['next',$(\"#\"+frmgr),npos[1][npos[0]]]);\n\t\t\t\t\t\tif($.isFunction(p.afterclickPgButtons)) {\n\t\t\t\t\t\t\tp.afterclickPgButtons.call($t, 'next',$(\"#\"+frmgr),npos[1][npos[0]+1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tupdateNav(npos[0]+1,npos);\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t\t$(\"#pData\", frmtb+\"_2\").click(function(){\n\t\t\t\t\tif(!checkUpdates()) {return false;}\n\t\t\t\t\t$(\"#FormError\",frmtb).hide();\n\t\t\t\t\tvar ppos = getCurrPos();\n\t\t\t\t\tif(ppos[0] !== -1 && ppos[1][ppos[0]-1]) {\n\t\t\t\t\t\t$($t).triggerHandler(\"jqGridAddEditClickPgButtons\", ['prev',$(\"#\"+frmgr),ppos[1][ppos[0]]]);\n\t\t\t\t\t\tvar pposret;\n\t\t\t\t\t\tif($.isFunction(p.onclickPgButtons)) {\n\t\t\t\t\t\t\tpposret = p.onclickPgButtons.call($t, 'prev',$(\"#\"+frmgr),ppos[1][ppos[0]]);\n\t\t\t\t\t\t\tif( pposret !== undefined && pposret === false ) {return false;}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif( $(\"#\"+$.jgrid.jqID(ppos[1][ppos[0]-1])).hasClass('ui-state-disabled')) {return false;}\n\t\t\t\t\t\tfillData(ppos[1][ppos[0]-1],$t,frmgr);\n\t\t\t\t\t\t$($t).jqGrid(\"setSelection\",ppos[1][ppos[0]-1]);\n\t\t\t\t\t\t$($t).triggerHandler(\"jqGridAddEditAfterClickPgButtons\", ['prev',$(\"#\"+frmgr),ppos[1][ppos[0]]]);\n\t\t\t\t\t\tif($.isFunction(p.afterclickPgButtons)) {\n\t\t\t\t\t\t\tp.afterclickPgButtons.call($t, 'prev',$(\"#\"+frmgr),ppos[1][ppos[0]-1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tupdateNav(ppos[0]-1,ppos);\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar posInit =getCurrPos();\n\t\t\tupdateNav(posInit[0],posInit);\n\n\t\t});\n\t},\n\tviewGridRow : function(rowid, p){\n\t\tp = $.extend(true, {\n\t\t\ttop : 0,\n\t\t\tleft: 0,\n\t\t\twidth: 0,\n\t\t\tdatawidth: 'auto',\n\t\t\theight: 'auto',\n\t\t\tdataheight: 'auto',\n\t\t\tmodal: false,\n\t\t\toverlay: 30,\n\t\t\tdrag: true,\n\t\t\tresize: true,\n\t\t\tjqModal: true,\n\t\t\tcloseOnEscape : false,\n\t\t\tlabelswidth: '30%',\n\t\t\tcloseicon: [],\n\t\t\tnavkeys: [false,38,40],\n\t\t\tonClose: null,\n\t\t\tbeforeShowForm : null,\n\t\t\tbeforeInitData : null,\n\t\t\tviewPagerButtons : true,\n\t\t\trecreateForm : false\n\t\t}, $.jgrid.view, p || {});\n\t\trp_ge[$(this)[0].p.id] = p;\n\t\treturn this.each(function(){\n\t\t\tvar $t = this;\n\t\t\tif (!$t.grid || !rowid) {return;}\n\t\t\tvar gID = $t.p.id,\n\t\t\tfrmgr = \"ViewGrid_\"+$.jgrid.jqID( gID  ), frmtb = \"ViewTbl_\" + $.jgrid.jqID( gID ),\n\t\t\tfrmgr_id = \"ViewGrid_\"+gID, frmtb_id = \"ViewTbl_\"+gID,\n\t\t\tIDs = {themodal:'viewmod'+gID,modalhead:'viewhd'+gID,modalcontent:'viewcnt'+gID, scrollelm : frmgr},\n\t\t\tonBeforeInit = $.isFunction(rp_ge[$t.p.id].beforeInitData) ? rp_ge[$t.p.id].beforeInitData : false,\n\t\t\tshowFrm = true,\n\t\t\tmaxCols = 1, maxRows=0;\n\t\t\tif(p.recreateForm===true && $(\"#\"+$.jgrid.jqID(IDs.themodal))[0] !== undefined) {\n\t\t\t\t$(\"#\"+$.jgrid.jqID(IDs.themodal)).remove();\n\t\t\t}\n\t\t\tfunction focusaref(){ //Sfari 3 issues\n\t\t\t\tif(rp_ge[$t.p.id].closeOnEscape===true || rp_ge[$t.p.id].navkeys[0]===true) {\n\t\t\t\t\tsetTimeout(function(){$(\".ui-jqdialog-titlebar-close\",\"#\"+$.jgrid.jqID(IDs.modalhead)).focus();},0);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfunction createData(rowid,obj,tb,maxcols){\n\t\t\t\tvar nm, hc,trdata, cnt=0,tmp, dc, retpos=[], ind=false, i,\n\t\t\t\ttdtmpl = \"<td class='CaptionTD form-view-label ui-widget-content' width='\"+p.labelswidth+\"'>&#160;</td><td class='DataTD form-view-data ui-helper-reset ui-widget-content'>&#160;</td>\", tmpl=\"\",\n\t\t\t\ttdtmpl2 = \"<td class='CaptionTD form-view-label ui-widget-content'>&#160;</td><td class='DataTD form-view-data ui-widget-content'>&#160;</td>\",\n\t\t\t\tfmtnum = ['integer','number','currency'],max1 =0, max2=0 ,maxw,setme, viewfld;\n\t\t\t\tfor (i=1;i<=maxcols;i++) {\n\t\t\t\t\ttmpl += i === 1 ? tdtmpl : tdtmpl2;\n\t\t\t\t}\n\t\t\t\t// find max number align rigth with property formatter\n\t\t\t\t$(obj.p.colModel).each( function() {\n\t\t\t\t\tif(this.editrules && this.editrules.edithidden === true) {\n\t\t\t\t\t\thc = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\thc = this.hidden === true ? true : false;\n\t\t\t\t\t}\n\t\t\t\t\tif(!hc && this.align==='right') {\n\t\t\t\t\t\tif(this.formatter && $.inArray(this.formatter,fmtnum) !== -1 ) {\n\t\t\t\t\t\t\tmax1 = Math.max(max1,parseInt(this.width,10));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmax2 = Math.max(max2,parseInt(this.width,10));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tmaxw  = max1 !==0 ? max1 : max2 !==0 ? max2 : 0;\n\t\t\t\tind = $(obj).jqGrid(\"getInd\",rowid);\n\t\t\t\t$(obj.p.colModel).each( function(i) {\n\t\t\t\t\tnm = this.name;\n\t\t\t\t\tsetme = false;\n\t\t\t\t\t// hidden fields are included in the form\n\t\t\t\t\tif(this.editrules && this.editrules.edithidden === true) {\n\t\t\t\t\t\thc = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\thc = this.hidden === true ? true : false;\n\t\t\t\t\t}\n\t\t\t\t\tdc = hc ? \"style='display:none'\" : \"\";\n\t\t\t\t\tviewfld = (typeof this.viewable !== 'boolean') ? true : this.viewable;\n\t\t\t\t\tif ( nm !== 'cb' && nm !== 'subgrid' && nm !== 'rn' && viewfld) {\n\t\t\t\t\t\tif(ind === false) {\n\t\t\t\t\t\t\ttmp = \"\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif(nm === obj.p.ExpandColumn && obj.p.treeGrid === true) {\n\t\t\t\t\t\t\t\ttmp = $(\"td:eq(\"+i+\")\",obj.rows[ind]).text();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttmp = $(\"td:eq(\"+i+\")\",obj.rows[ind]).html();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetme = this.align === 'right' && maxw !==0 ? true : false;\n\t\t\t\t\t\tvar frmopt = $.extend({},{rowabove:false,rowcontent:''}, this.formoptions || {}),\n\t\t\t\t\t\trp = parseInt(frmopt.rowpos,10) || cnt+1,\n\t\t\t\t\t\tcp = parseInt((parseInt(frmopt.colpos,10) || 1)*2,10);\n\t\t\t\t\t\tif(frmopt.rowabove) {\n\t\t\t\t\t\t\tvar newdata = $(\"<tr><td class='contentinfo' colspan='\"+(maxcols*2)+\"'>\"+frmopt.rowcontent+\"</td></tr>\");\n\t\t\t\t\t\t\t$(tb).append(newdata);\n\t\t\t\t\t\t\tnewdata[0].rp = rp;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttrdata = $(tb).find(\"tr[rowpos=\"+rp+\"]\");\n\t\t\t\t\t\tif ( trdata.length===0 ) {\n\t\t\t\t\t\t\ttrdata = $(\"<tr \"+dc+\" rowpos='\"+rp+\"'></tr>\").addClass(\"FormData\").attr(\"id\",\"trv_\"+nm);\n\t\t\t\t\t\t\t$(trdata).append(tmpl);\n\t\t\t\t\t\t\t$(tb).append(trdata);\n\t\t\t\t\t\t\ttrdata[0].rp = rp;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$(\"td:eq(\"+(cp-2)+\")\",trdata[0]).html('<b>'+ (frmopt.label === undefined ? obj.p.colNames[i]: frmopt.label)+'</b>');\n\t\t\t\t\t\t$(\"td:eq(\"+(cp-1)+\")\",trdata[0]).append(\"<span>\"+tmp+\"</span>\").attr(\"id\",\"v_\"+nm);\n\t\t\t\t\t\tif(setme){\n\t\t\t\t\t\t\t$(\"td:eq(\"+(cp-1)+\") span\",trdata[0]).css({'text-align':'right',width:maxw+\"px\"});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tretpos[cnt] = i;\n\t\t\t\t\t\tcnt++;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif( cnt > 0) {\n\t\t\t\t\tvar idrow = $(\"<tr class='FormData' style='display:none'><td class='CaptionTD'></td><td colspan='\"+ (maxcols*2-1)+\"' class='DataTD'><input class='FormElement' id='id_g' type='text' name='id' value='\"+rowid+\"'/></td></tr>\");\n\t\t\t\t\tidrow[0].rp = cnt+99;\n\t\t\t\t\t$(tb).append(idrow);\n\t\t\t\t}\n\t\t\t\treturn retpos;\n\t\t\t}\n\t\t\tfunction fillData(rowid,obj){\n\t\t\t\tvar nm, hc,cnt=0,tmp,trv;\n\t\t\t\ttrv = $(obj).jqGrid(\"getInd\",rowid,true);\n\t\t\t\tif(!trv) {return;}\n\t\t\t\t$('td',trv).each( function(i) {\n\t\t\t\t\tnm = obj.p.colModel[i].name;\n\t\t\t\t\t// hidden fields are included in the form\n\t\t\t\t\tif(obj.p.colModel[i].editrules && obj.p.colModel[i].editrules.edithidden === true) {\n\t\t\t\t\t\thc = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\thc = obj.p.colModel[i].hidden === true ? true : false;\n\t\t\t\t\t}\n\t\t\t\t\tif ( nm !== 'cb' && nm !== 'subgrid' && nm !== 'rn') {\n\t\t\t\t\t\tif(nm === obj.p.ExpandColumn && obj.p.treeGrid === true) {\n\t\t\t\t\t\t\ttmp = $(this).text();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttmp = $(this).html();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnm = $.jgrid.jqID(\"v_\"+nm);\n\t\t\t\t\t\t$(\"#\"+nm+\" span\",\"#\"+frmtb).html(tmp);\n\t\t\t\t\t\tif (hc) {$(\"#\"+nm,\"#\"+frmtb).parents(\"tr:first\").hide();}\n\t\t\t\t\t\tcnt++;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(cnt>0) {$(\"#id_g\",\"#\"+frmtb).val(rowid);}\n\t\t\t}\n\t\t\tfunction updateNav(cr,posarr){\n\t\t\t\tvar totr = posarr[1].length-1;\n\t\t\t\tif (cr===0) {\n\t\t\t\t\t$(\"#pData\",\"#\"+frmtb+\"_2\").addClass('ui-state-disabled');\n\t\t\t\t} else if( posarr[1][cr-1] !== undefined && $(\"#\"+$.jgrid.jqID(posarr[1][cr-1])).hasClass('ui-state-disabled')) {\n\t\t\t\t\t$(\"#pData\",frmtb+\"_2\").addClass('ui-state-disabled');\n\t\t\t\t} else {\n\t\t\t\t\t$(\"#pData\",\"#\"+frmtb+\"_2\").removeClass('ui-state-disabled');\n\t\t\t\t}\n\t\t\t\tif (cr===totr) {\n\t\t\t\t\t$(\"#nData\",\"#\"+frmtb+\"_2\").addClass('ui-state-disabled');\n\t\t\t\t} else if( posarr[1][cr+1] !== undefined && $(\"#\"+$.jgrid.jqID(posarr[1][cr+1])).hasClass('ui-state-disabled')) {\n\t\t\t\t\t$(\"#nData\",frmtb+\"_2\").addClass('ui-state-disabled');\n\t\t\t\t} else {\n\t\t\t\t\t$(\"#nData\",\"#\"+frmtb+\"_2\").removeClass('ui-state-disabled');\n\t\t\t\t}\n\t\t\t}\n\t\t\tfunction getCurrPos() {\n\t\t\t\tvar rowsInGrid = $($t).jqGrid(\"getDataIDs\"),\n\t\t\t\tselrow = $(\"#id_g\",\"#\"+frmtb).val(),\n\t\t\t\tpos = $.inArray(selrow,rowsInGrid);\n\t\t\t\treturn [pos,rowsInGrid];\n\t\t\t}\n\n\t\t\tif ( $(\"#\"+$.jgrid.jqID(IDs.themodal))[0] !== undefined ) {\n\t\t\t\tif(onBeforeInit) {\n\t\t\t\t\tshowFrm = onBeforeInit.call($t,$(\"#\"+frmgr));\n\t\t\t\t\tif(showFrm === undefined) {\n\t\t\t\t\t\tshowFrm = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(showFrm === false) {return;}\n\t\t\t\t$(\".ui-jqdialog-title\",\"#\"+$.jgrid.jqID(IDs.modalhead)).html(p.caption);\n\t\t\t\t$(\"#FormError\",\"#\"+frmtb).hide();\n\t\t\t\tfillData(rowid,$t);\n\t\t\t\tif($.isFunction(rp_ge[$t.p.id].beforeShowForm)) {rp_ge[$t.p.id].beforeShowForm.call($t,$(\"#\"+frmgr));}\n\t\t\t\t$.jgrid.viewModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gbox:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal, jqM: false, overlay: p.overlay, modal:p.modal});\n\t\t\t\tfocusaref();\n\t\t\t} else {\n\t\t\t\tvar dh = isNaN(p.dataheight) ? p.dataheight : p.dataheight+\"px\",\n\t\t\t\tdw = isNaN(p.datawidth) ? p.datawidth : p.datawidth+\"px\",\n\t\t\t\tfrm = $(\"<form name='FormPost' id='\"+frmgr_id+\"' class='FormGrid' style='width:\"+dw+\";overflow:auto;position:relative;height:\"+dh+\";'></form>\"),\n\t\t\t\ttbl =$(\"<table id='\"+frmtb_id+\"' class='EditTable' cellspacing='1' cellpadding='2' border='0' style='table-layout:fixed'><tbody></tbody></table>\");\n\t\t\t\tif(onBeforeInit) {\n\t\t\t\t\tshowFrm = onBeforeInit.call($t,$(\"#\"+frmgr));\n\t\t\t\t\tif(showFrm === undefined) {\n\t\t\t\t\t\tshowFrm = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(showFrm === false) {return;}\n\t\t\t\t$($t.p.colModel).each( function() {\n\t\t\t\t\tvar fmto = this.formoptions;\n\t\t\t\t\tmaxCols = Math.max(maxCols, fmto ? fmto.colpos || 0 : 0 );\n\t\t\t\t\tmaxRows = Math.max(maxRows, fmto ? fmto.rowpos || 0 : 0 );\n\t\t\t\t});\n\t\t\t\t// set the id.\n\t\t\t\t$(frm).append(tbl);\n\t\t\t\tcreateData(rowid, $t, tbl, maxCols);\n\t\t\t\tvar rtlb = $t.p.direction === \"rtl\" ? true :false,\n\t\t\t\tbp = rtlb ? \"nData\" : \"pData\",\n\t\t\t\tbn = rtlb ? \"pData\" : \"nData\",\n\n\t\t\t\t// buttons at footer\n\t\t\t\tbP = \"<a href='javascript:void(0)' id='\"+bp+\"' class='fm-button ui-state-default ui-corner-left'><span class='ui-icon ui-icon-triangle-1-w'></span></a>\",\n\t\t\t\tbN = \"<a href='javascript:void(0)' id='\"+bn+\"' class='fm-button ui-state-default ui-corner-right'><span class='ui-icon ui-icon-triangle-1-e'></span></a>\",\n\t\t\t\tbC  =\"<a href='javascript:void(0)' id='cData' class='fm-button ui-state-default ui-corner-all'>\"+p.bClose+\"</a>\";\n\t\t\t\tif(maxRows >  0) {\n\t\t\t\t\tvar sd=[];\n\t\t\t\t\t$.each($(tbl)[0].rows,function(i,r){\n\t\t\t\t\t\tsd[i] = r;\n\t\t\t\t\t});\n\t\t\t\t\tsd.sort(function(a,b){\n\t\t\t\t\t\tif(a.rp > b.rp) {return 1;}\n\t\t\t\t\t\tif(a.rp < b.rp) {return -1;}\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t});\n\t\t\t\t\t$.each(sd, function(index, row) {\n\t\t\t\t\t\t$('tbody',tbl).append(row);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tp.gbox = \"#gbox_\"+$.jgrid.jqID(gID);\n\t\t\t\tvar bt = $(\"<div></div>\").append(frm).append(\"<table border='0' class='EditTable' id='\"+frmtb+\"_2'><tbody><tr id='Act_Buttons'><td class='navButton' width='\"+p.labelswidth+\"'>\"+(rtlb ? bN+bP : bP+bN)+\"</td><td class='EditButton'>\"+bC+\"</td></tr></tbody></table>\");\n\t\t\t\t$.jgrid.createModal(IDs,bt,p,\"#gview_\"+$.jgrid.jqID($t.p.id),$(\"#gview_\"+$.jgrid.jqID($t.p.id))[0]);\n\t\t\t\tif(rtlb) {\n\t\t\t\t\t$(\"#pData, #nData\",\"#\"+frmtb+\"_2\").css(\"float\",\"right\");\n\t\t\t\t\t$(\".EditButton\",\"#\"+frmtb+\"_2\").css(\"text-align\",\"left\");\n\t\t\t\t}\n\t\t\t\tif(!p.viewPagerButtons) {$(\"#pData, #nData\",\"#\"+frmtb+\"_2\").hide();}\n\t\t\t\tbt = null;\n\t\t\t\t$(\"#\"+IDs.themodal).keydown( function( e ) {\n\t\t\t\t\tif(e.which === 27) {\n\t\t\t\t\t\tif(rp_ge[$t.p.id].closeOnEscape) {$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:p.gbox,jqm:p.jqModal, onClose: p.onClose});}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif(p.navkeys[0]===true) {\n\t\t\t\t\t\tif(e.which === p.navkeys[1]){ //up\n\t\t\t\t\t\t\t$(\"#pData\", \"#\"+frmtb+\"_2\").trigger(\"click\");\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(e.which === p.navkeys[2]){ //down\n\t\t\t\t\t\t\t$(\"#nData\", \"#\"+frmtb+\"_2\").trigger(\"click\");\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tp.closeicon = $.extend([true,\"left\",\"ui-icon-close\"],p.closeicon);\n\t\t\t\tif(p.closeicon[0]===true) {\n\t\t\t\t\t$(\"#cData\",\"#\"+frmtb+\"_2\").addClass(p.closeicon[1] === \"right\" ? 'fm-button-icon-right' : 'fm-button-icon-left')\n\t\t\t\t\t.append(\"<span class='ui-icon \"+p.closeicon[2]+\"'></span>\");\n\t\t\t\t}\n\t\t\t\tif($.isFunction(p.beforeShowForm)) {p.beforeShowForm.call($t,$(\"#\"+frmgr));}\n\t\t\t\t$.jgrid.viewModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gbox:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal,overlay: p.overlay, modal:p.modal});\n\t\t\t\t$(\".fm-button:not(.ui-state-disabled)\",\"#\"+frmtb+\"_2\").hover(\n\t\t\t\t\tfunction(){$(this).addClass('ui-state-hover');},\n\t\t\t\t\tfunction(){$(this).removeClass('ui-state-hover');}\n\t\t\t\t);\n\t\t\t\tfocusaref();\n\t\t\t\t$(\"#cData\", \"#\"+frmtb+\"_2\").click(function(){\n\t\t\t\t\t$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal, onClose: p.onClose});\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t\t$(\"#nData\", \"#\"+frmtb+\"_2\").click(function(){\n\t\t\t\t\t$(\"#FormError\",\"#\"+frmtb).hide();\n\t\t\t\t\tvar npos = getCurrPos();\n\t\t\t\t\tnpos[0] = parseInt(npos[0],10);\n\t\t\t\t\tif(npos[0] !== -1 && npos[1][npos[0]+1]) {\n\t\t\t\t\t\tif($.isFunction(p.onclickPgButtons)) {\n\t\t\t\t\t\t\tp.onclickPgButtons.call($t,'next',$(\"#\"+frmgr),npos[1][npos[0]]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfillData(npos[1][npos[0]+1],$t);\n\t\t\t\t\t\t$($t).jqGrid(\"setSelection\",npos[1][npos[0]+1]);\n\t\t\t\t\t\tif($.isFunction(p.afterclickPgButtons)) {\n\t\t\t\t\t\t\tp.afterclickPgButtons.call($t,'next',$(\"#\"+frmgr),npos[1][npos[0]+1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tupdateNav(npos[0]+1,npos);\n\t\t\t\t\t}\n\t\t\t\t\tfocusaref();\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t\t$(\"#pData\", \"#\"+frmtb+\"_2\").click(function(){\n\t\t\t\t\t$(\"#FormError\",\"#\"+frmtb).hide();\n\t\t\t\t\tvar ppos = getCurrPos();\n\t\t\t\t\tif(ppos[0] !== -1 && ppos[1][ppos[0]-1]) {\n\t\t\t\t\t\tif($.isFunction(p.onclickPgButtons)) {\n\t\t\t\t\t\t\tp.onclickPgButtons.call($t,'prev',$(\"#\"+frmgr),ppos[1][ppos[0]]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfillData(ppos[1][ppos[0]-1],$t);\n\t\t\t\t\t\t$($t).jqGrid(\"setSelection\",ppos[1][ppos[0]-1]);\n\t\t\t\t\t\tif($.isFunction(p.afterclickPgButtons)) {\n\t\t\t\t\t\t\tp.afterclickPgButtons.call($t,'prev',$(\"#\"+frmgr),ppos[1][ppos[0]-1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tupdateNav(ppos[0]-1,ppos);\n\t\t\t\t\t}\n\t\t\t\t\tfocusaref();\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar posInit =getCurrPos();\n\t\t\tupdateNav(posInit[0],posInit);\n\t\t});\n\t},\n\tdelGridRow : function(rowids,p) {\n\t\tp = $.extend(true, {\n\t\t\ttop : 0,\n\t\t\tleft: 0,\n\t\t\twidth: 240,\n\t\t\theight: 'auto',\n\t\t\tdataheight : 'auto',\n\t\t\tmodal: false,\n\t\t\toverlay: 30,\n\t\t\tdrag: true,\n\t\t\tresize: true,\n\t\t\turl : '',\n\t\t\tmtype : \"POST\",\n\t\t\treloadAfterSubmit: true,\n\t\t\tbeforeShowForm: null,\n\t\t\tbeforeInitData : null,\n\t\t\tafterShowForm: null,\n\t\t\tbeforeSubmit: null,\n\t\t\tonclickSubmit: null,\n\t\t\tafterSubmit: null,\n\t\t\tjqModal : true,\n\t\t\tcloseOnEscape : false,\n\t\t\tdelData: {},\n\t\t\tdelicon : [],\n\t\t\tcancelicon : [],\n\t\t\tonClose : null,\n\t\t\tajaxDelOptions : {},\n\t\t\tprocessing : false,\n\t\t\tserializeDelData : null,\n\t\t\tuseDataProxy : false\n\t\t}, $.jgrid.del, p ||{});\n\t\trp_ge[$(this)[0].p.id] = p;\n\t\treturn this.each(function(){\n\t\t\tvar $t = this;\n\t\t\tif (!$t.grid ) {return;}\n\t\t\tif(!rowids) {return;}\n\t\t\tvar onBeforeShow = $.isFunction( rp_ge[$t.p.id].beforeShowForm  ),\n\t\t\tonAfterShow = $.isFunction( rp_ge[$t.p.id].afterShowForm ),\n\t\t\tonBeforeInit = $.isFunction(rp_ge[$t.p.id].beforeInitData) ? rp_ge[$t.p.id].beforeInitData : false,\n\t\t\tgID = $t.p.id, onCS = {},\n\t\t\tshowFrm = true,\n\t\t\tdtbl = \"DelTbl_\"+$.jgrid.jqID(gID),postd, idname, opers, oper,\n\t\t\tdtbl_id = \"DelTbl_\" + gID,\n\t\t\tIDs = {themodal:'delmod'+gID,modalhead:'delhd'+gID,modalcontent:'delcnt'+gID, scrollelm: dtbl};\n\t\t\tif ($.isArray(rowids)) {rowids = rowids.join();}\n\t\t\tif ( $(\"#\"+$.jgrid.jqID(IDs.themodal))[0] !== undefined ) {\n\t\t\t\tif(onBeforeInit) {\n\t\t\t\t\tshowFrm = onBeforeInit.call($t,$(\"#\"+dtbl));\n\t\t\t\t\tif(showFrm === undefined) {\n\t\t\t\t\t\tshowFrm = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(showFrm === false) {return;}\n\t\t\t\t$(\"#DelData>td\",\"#\"+dtbl).text(rowids);\n\t\t\t\t$(\"#DelError\",\"#\"+dtbl).hide();\n\t\t\t\tif( rp_ge[$t.p.id].processing === true) {\n\t\t\t\t\trp_ge[$t.p.id].processing=false;\n\t\t\t\t\t$(\"#dData\", \"#\"+dtbl).removeClass('ui-state-active');\n\t\t\t\t}\n\t\t\t\tif(onBeforeShow) {rp_ge[$t.p.id].beforeShowForm.call($t,$(\"#\"+dtbl));}\n\t\t\t\t$.jgrid.viewModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gbox:\"#gbox_\"+$.jgrid.jqID(gID),jqm:rp_ge[$t.p.id].jqModal,jqM: false, overlay: rp_ge[$t.p.id].overlay, modal:rp_ge[$t.p.id].modal});\n\t\t\t\tif(onAfterShow) {rp_ge[$t.p.id].afterShowForm.call($t,$(\"#\"+dtbl));}\n\t\t\t} else {\n\t\t\t\tvar dh = isNaN(rp_ge[$t.p.id].dataheight) ? rp_ge[$t.p.id].dataheight : rp_ge[$t.p.id].dataheight+\"px\",\n\t\t\t\tdw = isNaN(p.datawidth) ? p.datawidth : p.datawidth+\"px\",\n\t\t\t\ttbl = \"<div id='\"+dtbl_id+\"' class='formdata' style='width:\"+dw+\";overflow:auto;position:relative;height:\"+dh+\";'>\";\n\t\t\t\ttbl += \"<table class='DelTable'><tbody>\";\n\t\t\t\t// error data\n\t\t\t\ttbl += \"<tr id='DelError' style='display:none'><td class='ui-state-error'></td></tr>\";\n\t\t\t\ttbl += \"<tr id='DelData' style='display:none'><td >\"+rowids+\"</td></tr>\";\n\t\t\t\ttbl += \"<tr><td class=\\\"delmsg\\\" style=\\\"white-space:pre;\\\">\"+rp_ge[$t.p.id].msg+\"</td></tr><tr><td >&#160;</td></tr>\";\n\t\t\t\t// buttons at footer\n\t\t\t\ttbl += \"</tbody></table></div>\";\n\t\t\t\tvar bS  = \"<a href='javascript:void(0)' id='dData' class='fm-button ui-state-default ui-corner-all'>\"+p.bSubmit+\"</a>\",\n\t\t\t\tbC  = \"<a href='javascript:void(0)' id='eData' class='fm-button ui-state-default ui-corner-all'>\"+p.bCancel+\"</a>\";\n\t\t\t\ttbl += \"<table cellspacing='0' cellpadding='0' border='0' class='EditTable' id='\"+dtbl+\"_2'><tbody><tr><td><hr class='ui-widget-content' style='margin:1px'/></td></tr><tr><td class='DelButton EditButton'>\"+bS+\"&#160;\"+bC+\"</td></tr></tbody></table>\";\n\t\t\t\tp.gbox = \"#gbox_\"+$.jgrid.jqID(gID);\n\t\t\t\t$.jgrid.createModal(IDs,tbl,p,\"#gview_\"+$.jgrid.jqID($t.p.id),$(\"#gview_\"+$.jgrid.jqID($t.p.id))[0]);\n\n\t\t\t\tif(onBeforeInit) {\n\t\t\t\t\tshowFrm = onBeforeInit.call($t,$(\"#\"+dtbl));\n\t\t\t\t\tif(showFrm === undefined) {\n\t\t\t\t\t\tshowFrm = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(showFrm === false) {return;}\n\n\t\t\t\t$(\".fm-button\",\"#\"+dtbl+\"_2\").hover(\n\t\t\t\t\tfunction(){$(this).addClass('ui-state-hover');},\n\t\t\t\t\tfunction(){$(this).removeClass('ui-state-hover');}\n\t\t\t\t);\n\t\t\t\tp.delicon = $.extend([true,\"left\",\"ui-icon-scissors\"],rp_ge[$t.p.id].delicon);\n\t\t\t\tp.cancelicon = $.extend([true,\"left\",\"ui-icon-cancel\"],rp_ge[$t.p.id].cancelicon);\n\t\t\t\tif(p.delicon[0]===true) {\n\t\t\t\t\t$(\"#dData\",\"#\"+dtbl+\"_2\").addClass(p.delicon[1] === \"right\" ? 'fm-button-icon-right' : 'fm-button-icon-left')\n\t\t\t\t\t.append(\"<span class='ui-icon \"+p.delicon[2]+\"'></span>\");\n\t\t\t\t}\n\t\t\t\tif(p.cancelicon[0]===true) {\n\t\t\t\t\t$(\"#eData\",\"#\"+dtbl+\"_2\").addClass(p.cancelicon[1] === \"right\" ? 'fm-button-icon-right' : 'fm-button-icon-left')\n\t\t\t\t\t.append(\"<span class='ui-icon \"+p.cancelicon[2]+\"'></span>\");\n\t\t\t\t}\n\t\t\t\t$(\"#dData\",\"#\"+dtbl+\"_2\").click(function(){\n\t\t\t\t\tvar ret=[true,\"\"], pk,\n\t\t\t\t\tpostdata = $(\"#DelData>td\",\"#\"+dtbl).text(); //the pair is name=val1,val2,...\n\t\t\t\t\tonCS = {};\n\t\t\t\t\tif( $.isFunction( rp_ge[$t.p.id].onclickSubmit ) ) {onCS = rp_ge[$t.p.id].onclickSubmit.call($t,rp_ge[$t.p.id], postdata) || {};}\n\t\t\t\t\tif( $.isFunction( rp_ge[$t.p.id].beforeSubmit ) ) {ret = rp_ge[$t.p.id].beforeSubmit.call($t,postdata);}\n\t\t\t\t\tif(ret[0] && !rp_ge[$t.p.id].processing) {\n\t\t\t\t\t\trp_ge[$t.p.id].processing = true;\n\t\t\t\t\t\topers = $t.p.prmNames;\n\t\t\t\t\t\tpostd = $.extend({},rp_ge[$t.p.id].delData, onCS);\n\t\t\t\t\t\toper = opers.oper;\n\t\t\t\t\t\tpostd[oper] = opers.deloper;\n\t\t\t\t\t\tidname = opers.id;\n\t\t\t\t\t\tpostdata = String(postdata).split(\",\");\n\t\t\t\t\t\tif(!postdata.length) { return false; }\n\t\t\t\t\t\tfor(pk in postdata) {\n\t\t\t\t\t\t\tif(postdata.hasOwnProperty(pk)) {\n\t\t\t\t\t\t\t\tpostdata[pk] = $.jgrid.stripPref($t.p.idPrefix, postdata[pk]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpostd[idname] = postdata.join();\n\t\t\t\t\t\t$(this).addClass('ui-state-active');\n\t\t\t\t\t\tvar ajaxOptions = $.extend({\n\t\t\t\t\t\t\turl: rp_ge[$t.p.id].url || $($t).jqGrid('getGridParam','editurl'),\n\t\t\t\t\t\t\ttype: rp_ge[$t.p.id].mtype,\n\t\t\t\t\t\t\tdata: $.isFunction(rp_ge[$t.p.id].serializeDelData) ? rp_ge[$t.p.id].serializeDelData.call($t,postd) : postd,\n\t\t\t\t\t\t\tcomplete:function(data,status){\n\t\t\t\t\t\t\t\tvar i;\n\t\t\t\t\t\t\t\tif(data.status >= 300 && data.status !== 304) {\n\t\t\t\t\t\t\t\t\tret[0] = false;\n\t\t\t\t\t\t\t\t\tif ($.isFunction(rp_ge[$t.p.id].errorTextFormat)) {\n\t\t\t\t\t\t\t\t\t\tret[1] = rp_ge[$t.p.id].errorTextFormat.call($t,data);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tret[1] = status + \" Status: '\" + data.statusText + \"'. Error code: \" + data.status;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// data is posted successful\n\t\t\t\t\t\t\t\t\t// execute aftersubmit with the returned data from server\n\t\t\t\t\t\t\t\t\tif( $.isFunction( rp_ge[$t.p.id].afterSubmit ) ) {\n\t\t\t\t\t\t\t\t\t\tret = rp_ge[$t.p.id].afterSubmit.call($t,data,postd);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif(ret[0] === false) {\n\t\t\t\t\t\t\t\t\t$(\"#DelError>td\",\"#\"+dtbl).html(ret[1]);\n\t\t\t\t\t\t\t\t\t$(\"#DelError\",\"#\"+dtbl).show();\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tif(rp_ge[$t.p.id].reloadAfterSubmit && $t.p.datatype !== \"local\") {\n\t\t\t\t\t\t\t\t\t\t$($t).trigger(\"reloadGrid\");\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tif($t.p.treeGrid===true){\n\t\t\t\t\t\t\t\t\t\t\t\ttry {$($t).jqGrid(\"delTreeNode\",$t.p.idPrefix+postdata[0]);} catch(e){}\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tfor(i=0;i<postdata.length;i++) {\n\t\t\t\t\t\t\t\t\t\t\t\t$($t).jqGrid(\"delRowData\",$t.p.idPrefix+ postdata[i]);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t$t.p.selrow = null;\n\t\t\t\t\t\t\t\t\t\t$t.p.selarrrow = [];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif($.isFunction(rp_ge[$t.p.id].afterComplete)) {\n\t\t\t\t\t\t\t\t\t\tsetTimeout(function(){rp_ge[$t.p.id].afterComplete.call($t,data,postdata);},500);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\trp_ge[$t.p.id].processing=false;\n\t\t\t\t\t\t\t\t$(\"#dData\", \"#\"+dtbl+\"_2\").removeClass('ui-state-active');\n\t\t\t\t\t\t\t\tif(ret[0]) {$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal, onClose: rp_ge[$t.p.id].onClose});}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, $.jgrid.ajaxOptions, rp_ge[$t.p.id].ajaxDelOptions);\n\n\n\t\t\t\t\t\tif (!ajaxOptions.url && !rp_ge[$t.p.id].useDataProxy) {\n\t\t\t\t\t\t\tif ($.isFunction($t.p.dataProxy)) {\n\t\t\t\t\t\t\t\trp_ge[$t.p.id].useDataProxy = true;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tret[0]=false;ret[1] += \" \"+$.jgrid.errors.nourl;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (ret[0]) {\n\t\t\t\t\t\t\tif (rp_ge[$t.p.id].useDataProxy) {\n\t\t\t\t\t\t\t\tvar dpret = $t.p.dataProxy.call($t, ajaxOptions, \"del_\"+$t.p.id); \n\t\t\t\t\t\t\t\tif(dpret === undefined) {\n\t\t\t\t\t\t\t\t\tdpret = [true, \"\"];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif(dpret[0] === false ) {\n\t\t\t\t\t\t\t\t\tret[0] = false;\n\t\t\t\t\t\t\t\t\tret[1] = dpret[1] || \"Error deleting the selected row!\" ;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:p.jqModal, onClose: rp_ge[$t.p.id].onClose});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {$.ajax(ajaxOptions);}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(ret[0] === false) {\n\t\t\t\t\t\t$(\"#DelError>td\",\"#\"+dtbl).html(ret[1]);\n\t\t\t\t\t\t$(\"#DelError\",\"#\"+dtbl).show();\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t\t$(\"#eData\", \"#\"+dtbl+\"_2\").click(function(){\n\t\t\t\t\t$.jgrid.hideModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gb:\"#gbox_\"+$.jgrid.jqID(gID),jqm:rp_ge[$t.p.id].jqModal, onClose: rp_ge[$t.p.id].onClose});\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t\tif(onBeforeShow) {rp_ge[$t.p.id].beforeShowForm.call($t,$(\"#\"+dtbl));}\n\t\t\t\t$.jgrid.viewModal(\"#\"+$.jgrid.jqID(IDs.themodal),{gbox:\"#gbox_\"+$.jgrid.jqID(gID),jqm:rp_ge[$t.p.id].jqModal, overlay: rp_ge[$t.p.id].overlay, modal:rp_ge[$t.p.id].modal});\n\t\t\t\tif(onAfterShow) {rp_ge[$t.p.id].afterShowForm.call($t,$(\"#\"+dtbl));}\n\t\t\t}\n\t\t\tif(rp_ge[$t.p.id].closeOnEscape===true) {\n\t\t\t\tsetTimeout(function(){$(\".ui-jqdialog-titlebar-close\",\"#\"+$.jgrid.jqID(IDs.modalhead)).focus();},0);\n\t\t\t}\n\t\t});\n\t},\n\tnavGrid : function (elem, o, pEdit,pAdd,pDel,pSearch, pView) {\n\t\to = $.extend({\n\t\t\tedit: true,\n\t\t\tediticon: \"ui-icon-pencil\",\n\t\t\tadd: true,\n\t\t\taddicon:\"ui-icon-plus\",\n\t\t\tdel: true,\n\t\t\tdelicon:\"ui-icon-trash\",\n\t\t\tsearch: true,\n\t\t\tsearchicon:\"ui-icon-search\",\n\t\t\trefresh: true,\n\t\t\trefreshicon:\"ui-icon-refresh\",\n\t\t\trefreshstate: 'firstpage',\n\t\t\tview: false,\n\t\t\tviewicon : \"ui-icon-document\",\n\t\t\tposition : \"left\",\n\t\t\tcloseOnEscape : true,\n\t\t\tbeforeRefresh : null,\n\t\t\tafterRefresh : null,\n\t\t\tcloneToTop : false,\n\t\t\talertwidth : 200,\n\t\t\talertheight : 'auto',\n\t\t\talerttop: null,\n\t\t\talertleft: null,\n\t\t\talertzIndex : null\n\t\t}, $.jgrid.nav, o ||{});\n\t\treturn this.each(function() {\n\t\t\tif(this.nav) {return;}\n\t\t\tvar alertIDs = {themodal: 'alertmod_' + this.p.id, modalhead: 'alerthd_' + this.p.id,modalcontent: 'alertcnt_' + this.p.id},\n\t\t\t$t = this, twd, tdw;\n\t\t\tif(!$t.grid || typeof elem !== 'string') {return;}\n\t\t\tif ($(\"#\"+alertIDs.themodal)[0] === undefined) {\n\t\t\t\tif(!o.alerttop && !o.alertleft) {\n\t\t\t\t\tif (window.innerWidth !== undefined) {\n\t\t\t\t\t\to.alertleft = window.innerWidth;\n\t\t\t\t\t\to.alerttop = window.innerHeight;\n\t\t\t\t\t} else if (document.documentElement !== undefined && document.documentElement.clientWidth !== undefined && document.documentElement.clientWidth !== 0) {\n\t\t\t\t\t\to.alertleft = document.documentElement.clientWidth;\n\t\t\t\t\t\to.alerttop = document.documentElement.clientHeight;\n\t\t\t\t\t} else {\n\t\t\t\t\t\to.alertleft=1024;\n\t\t\t\t\t\to.alerttop=768;\n\t\t\t\t\t}\n\t\t\t\t\to.alertleft = o.alertleft/2 - parseInt(o.alertwidth,10)/2;\n\t\t\t\t\to.alerttop = o.alerttop/2-25;\n\t\t\t\t}\n\t\t\t\t$.jgrid.createModal(alertIDs,\n\t\t\t\t\t\"<div>\"+o.alerttext+\"</div><span tabindex='0'><span tabindex='-1' id='jqg_alrt'></span></span>\",\n\t\t\t\t\t{ \n\t\t\t\t\t\tgbox:\"#gbox_\"+$.jgrid.jqID($t.p.id),\n\t\t\t\t\t\tjqModal:true,\n\t\t\t\t\t\tdrag:true,\n\t\t\t\t\t\tresize:true,\n\t\t\t\t\t\tcaption:o.alertcap,\n\t\t\t\t\t\ttop:o.alerttop,\n\t\t\t\t\t\tleft:o.alertleft,\n\t\t\t\t\t\twidth:o.alertwidth,\n\t\t\t\t\t\theight: o.alertheight,\n\t\t\t\t\t\tcloseOnEscape:o.closeOnEscape, \n\t\t\t\t\t\tzIndex: o.alertzIndex\n\t\t\t\t\t},\n\t\t\t\t\t\"#gview_\"+$.jgrid.jqID($t.p.id),\n\t\t\t\t\t$(\"#gbox_\"+$.jgrid.jqID($t.p.id))[0],\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t}\n\t\t\tvar clone = 1, i,\n\t\t\tonHoverIn = function () {\n\t\t\t\tif (!$(this).hasClass('ui-state-disabled')) {\n\t\t\t\t\t$(this).addClass(\"ui-state-hover\");\n\t\t\t\t}\n\t\t\t},\n\t\t\tonHoverOut = function () {\n\t\t\t\t$(this).removeClass(\"ui-state-hover\");\n\t\t\t};\n\t\t\tif(o.cloneToTop && $t.p.toppager) {clone = 2;}\n\t\t\tfor(i = 0; i<clone; i++) {\n\t\t\t\tvar tbd,\n\t\t\t\tnavtbl = $(\"<table cellspacing='0' cellpadding='0' border='0' class='ui-pg-table navtable' style='float:left;table-layout:auto;'><tbody><tr></tr></tbody></table>\"),\n\t\t\t\tsep = \"<td class='ui-pg-button ui-state-disabled' style='width:4px;'><span class='ui-separator'></span></td>\",\n\t\t\t\tpgid, elemids;\n\t\t\t\tif(i===0) {\n\t\t\t\t\tpgid = elem;\n\t\t\t\t\telemids = $t.p.id;\n\t\t\t\t\tif(pgid === $t.p.toppager) {\n\t\t\t\t\t\telemids += \"_top\";\n\t\t\t\t\t\tclone = 1;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tpgid = $t.p.toppager;\n\t\t\t\t\telemids = $t.p.id+\"_top\";\n\t\t\t\t}\n\t\t\t\tif($t.p.direction === \"rtl\") {$(navtbl).attr(\"dir\",\"rtl\").css(\"float\",\"right\");}\n\t\t\t\tif (o.add) {\n\t\t\t\t\tpAdd = pAdd || {};\n\t\t\t\t\ttbd = $(\"<td class='ui-pg-button ui-corner-all'></td>\");\n\t\t\t\t\t$(tbd).append(\"<div class='ui-pg-div'><span class='ui-icon \"+o.addicon+\"'></span>\"+o.addtext+\"</div>\");\n\t\t\t\t\t$(\"tr\",navtbl).append(tbd);\n\t\t\t\t\t$(tbd,navtbl)\n\t\t\t\t\t.attr({\"title\":o.addtitle || \"\",id : pAdd.id || \"add_\"+elemids})\n\t\t\t\t\t.click(function(){\n\t\t\t\t\t\tif (!$(this).hasClass('ui-state-disabled')) {\n\t\t\t\t\t\t\tif ($.isFunction( o.addfunc )) {\n\t\t\t\t\t\t\t\to.addfunc.call($t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$($t).jqGrid(\"editGridRow\",\"new\",pAdd);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}).hover(onHoverIn, onHoverOut);\n\t\t\t\t\ttbd = null;\n\t\t\t\t}\n\t\t\t\tif (o.edit) {\n\t\t\t\t\ttbd = $(\"<td class='ui-pg-button ui-corner-all'></td>\");\n\t\t\t\t\tpEdit = pEdit || {};\n\t\t\t\t\t$(tbd).append(\"<div class='ui-pg-div'><span class='ui-icon \"+o.editicon+\"'></span>\"+o.edittext+\"</div>\");\n\t\t\t\t\t$(\"tr\",navtbl).append(tbd);\n\t\t\t\t\t$(tbd,navtbl)\n\t\t\t\t\t.attr({\"title\":o.edittitle || \"\",id: pEdit.id || \"edit_\"+elemids})\n\t\t\t\t\t.click(function(){\n\t\t\t\t\t\tif (!$(this).hasClass('ui-state-disabled')) {\n\t\t\t\t\t\t\tvar sr = $t.p.selrow;\n\t\t\t\t\t\t\tif (sr) {\n\t\t\t\t\t\t\t\tif($.isFunction( o.editfunc ) ) {\n\t\t\t\t\t\t\t\t\to.editfunc.call($t, sr);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t$($t).jqGrid(\"editGridRow\",sr,pEdit);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$.jgrid.viewModal(\"#\"+alertIDs.themodal,{gbox:\"#gbox_\"+$.jgrid.jqID($t.p.id),jqm:true});\n\t\t\t\t\t\t\t\t$(\"#jqg_alrt\").focus();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}).hover(onHoverIn, onHoverOut);\n\t\t\t\t\ttbd = null;\n\t\t\t\t}\n\t\t\t\tif (o.view) {\n\t\t\t\t\ttbd = $(\"<td class='ui-pg-button ui-corner-all'></td>\");\n\t\t\t\t\tpView = pView || {};\n\t\t\t\t\t$(tbd).append(\"<div class='ui-pg-div'><span class='ui-icon \"+o.viewicon+\"'></span>\"+o.viewtext+\"</div>\");\n\t\t\t\t\t$(\"tr\",navtbl).append(tbd);\n\t\t\t\t\t$(tbd,navtbl)\n\t\t\t\t\t.attr({\"title\":o.viewtitle || \"\",id: pView.id || \"view_\"+elemids})\n\t\t\t\t\t.click(function(){\n\t\t\t\t\t\tif (!$(this).hasClass('ui-state-disabled')) {\n\t\t\t\t\t\t\tvar sr = $t.p.selrow;\n\t\t\t\t\t\t\tif (sr) {\n\t\t\t\t\t\t\t\tif($.isFunction( o.viewfunc ) ) {\n\t\t\t\t\t\t\t\t\to.viewfunc.call($t, sr);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t$($t).jqGrid(\"viewGridRow\",sr,pView);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$.jgrid.viewModal(\"#\"+alertIDs.themodal,{gbox:\"#gbox_\"+$.jgrid.jqID($t.p.id),jqm:true});\n\t\t\t\t\t\t\t\t$(\"#jqg_alrt\").focus();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}).hover(onHoverIn, onHoverOut);\n\t\t\t\t\ttbd = null;\n\t\t\t\t}\n\t\t\t\tif (o.del) {\n\t\t\t\t\ttbd = $(\"<td class='ui-pg-button ui-corner-all'></td>\");\n\t\t\t\t\tpDel = pDel || {};\n\t\t\t\t\t$(tbd).append(\"<div class='ui-pg-div'><span class='ui-icon \"+o.delicon+\"'></span>\"+o.deltext+\"</div>\");\n\t\t\t\t\t$(\"tr\",navtbl).append(tbd);\n\t\t\t\t\t$(tbd,navtbl)\n\t\t\t\t\t.attr({\"title\":o.deltitle || \"\",id: pDel.id || \"del_\"+elemids})\n\t\t\t\t\t.click(function(){\n\t\t\t\t\t\tif (!$(this).hasClass('ui-state-disabled')) {\n\t\t\t\t\t\t\tvar dr;\n\t\t\t\t\t\t\tif($t.p.multiselect) {\n\t\t\t\t\t\t\t\tdr = $t.p.selarrrow;\n\t\t\t\t\t\t\t\tif(dr.length===0) {dr = null;}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdr = $t.p.selrow;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(dr){\n\t\t\t\t\t\t\t\tif($.isFunction( o.delfunc )){\n\t\t\t\t\t\t\t\t\to.delfunc.call($t, dr);\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t$($t).jqGrid(\"delGridRow\",dr,pDel);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else  {\n\t\t\t\t\t\t\t\t$.jgrid.viewModal(\"#\"+alertIDs.themodal,{gbox:\"#gbox_\"+$.jgrid.jqID($t.p.id),jqm:true});$(\"#jqg_alrt\").focus();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}).hover(onHoverIn, onHoverOut);\n\t\t\t\t\ttbd = null;\n\t\t\t\t}\n\t\t\t\tif(o.add || o.edit || o.del || o.view) {$(\"tr\",navtbl).append(sep);}\n\t\t\t\tif (o.search) {\n\t\t\t\t\ttbd = $(\"<td class='ui-pg-button ui-corner-all'></td>\");\n\t\t\t\t\tpSearch = pSearch || {};\n\t\t\t\t\t$(tbd).append(\"<div class='ui-pg-div'><span class='ui-icon \"+o.searchicon+\"'></span>\"+o.searchtext+\"</div>\");\n\t\t\t\t\t$(\"tr\",navtbl).append(tbd);\n\t\t\t\t\t$(tbd,navtbl)\n\t\t\t\t\t.attr({\"title\":o.searchtitle  || \"\",id:pSearch.id || \"search_\"+elemids})\n\t\t\t\t\t.click(function(){\n\t\t\t\t\t\tif (!$(this).hasClass('ui-state-disabled')) {\n\t\t\t\t\t\t\tif($.isFunction( o.searchfunc )) {\n\t\t\t\t\t\t\t\to.searchfunc.call($t, pSearch);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$($t).jqGrid(\"searchGrid\",pSearch);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}).hover(onHoverIn, onHoverOut);\n\t\t\t\t\tif (pSearch.showOnLoad && pSearch.showOnLoad === true) {\n\t\t\t\t\t\t$(tbd,navtbl).click();\n\t\t\t\t\t}\n\t\t\t\t\ttbd = null;\n\t\t\t\t}\n\t\t\t\tif (o.refresh) {\n\t\t\t\t\ttbd = $(\"<td class='ui-pg-button ui-corner-all'></td>\");\n\t\t\t\t\t$(tbd).append(\"<div class='ui-pg-div'><span class='ui-icon \"+o.refreshicon+\"'></span>\"+o.refreshtext+\"</div>\");\n\t\t\t\t\t$(\"tr\",navtbl).append(tbd);\n\t\t\t\t\t$(tbd,navtbl)\n\t\t\t\t\t.attr({\"title\":o.refreshtitle  || \"\",id: \"refresh_\"+elemids})\n\t\t\t\t\t.click(function(){\n\t\t\t\t\t\tif (!$(this).hasClass('ui-state-disabled')) {\n\t\t\t\t\t\t\tif($.isFunction(o.beforeRefresh)) {o.beforeRefresh.call($t);}\n\t\t\t\t\t\t\t$t.p.search = false;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tvar gID = $t.p.id;\n\t\t\t\t\t\t\t\t$t.p.postData.filters =\"\";\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t$(\"#fbox_\"+$.jgrid.jqID(gID)).jqFilter('resetFilter');\n\t\t\t\t\t\t\t\t} catch(ef) {}\n\t\t\t\t\t\t\t\tif($.isFunction($t.clearToolbar)) {$t.clearToolbar.call($t,false);}\n\t\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t\t\tswitch (o.refreshstate) {\n\t\t\t\t\t\t\t\tcase 'firstpage':\n\t\t\t\t\t\t\t\t\t$($t).trigger(\"reloadGrid\", [{page:1}]);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'current':\n\t\t\t\t\t\t\t\t\t$($t).trigger(\"reloadGrid\", [{current:true}]);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif($.isFunction(o.afterRefresh)) {o.afterRefresh.call($t);}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}).hover(onHoverIn, onHoverOut);\n\t\t\t\t\ttbd = null;\n\t\t\t\t}\n\t\t\t\ttdw = $(\".ui-jqgrid\").css(\"font-size\") || \"11px\";\n\t\t\t\t$('body').append(\"<div id='testpg2' class='ui-jqgrid ui-widget ui-widget-content' style='font-size:\"+tdw+\";visibility:hidden;' ></div>\");\n\t\t\t\ttwd = $(navtbl).clone().appendTo(\"#testpg2\").width();\n\t\t\t\t$(\"#testpg2\").remove();\n\t\t\t\t$(pgid+\"_\"+o.position,pgid).append(navtbl);\n\t\t\t\tif($t.p._nvtd) {\n\t\t\t\t\tif(twd > $t.p._nvtd[0] ) {\n\t\t\t\t\t\t$(pgid+\"_\"+o.position,pgid).width(twd);\n\t\t\t\t\t\t$t.p._nvtd[0] = twd;\n\t\t\t\t\t}\n\t\t\t\t\t$t.p._nvtd[1] = twd;\n\t\t\t\t}\n\t\t\t\ttdw =null;twd=null;navtbl =null;\n\t\t\t\tthis.nav = true;\n\t\t\t}\n\t\t});\n\t},\n\tnavButtonAdd : function (elem, p) {\n\t\tp = $.extend({\n\t\t\tcaption : \"newButton\",\n\t\t\ttitle: '',\n\t\t\tbuttonicon : 'ui-icon-newwin',\n\t\t\tonClickButton: null,\n\t\t\tposition : \"last\",\n\t\t\tcursor : 'pointer'\n\t\t}, p ||{});\n\t\treturn this.each(function() {\n\t\t\tif( !this.grid)  {return;}\n\t\t\tif( typeof elem === \"string\" && elem.indexOf(\"#\") !== 0) {elem = \"#\"+$.jgrid.jqID(elem);}\n\t\t\tvar findnav = $(\".navtable\",elem)[0], $t = this;\n\t\t\tif (findnav) {\n\t\t\t\tif( p.id && $(\"#\"+$.jgrid.jqID(p.id), findnav)[0] !== undefined )  {return;}\n\t\t\t\tvar tbd = $(\"<td></td>\");\n\t\t\t\tif(p.buttonicon.toString().toUpperCase() === \"NONE\") {\n                    $(tbd).addClass('ui-pg-button ui-corner-all').append(\"<div class='ui-pg-div'>\"+p.caption+\"</div>\");\n\t\t\t\t} else\t{\n\t\t\t\t\t$(tbd).addClass('ui-pg-button ui-corner-all').append(\"<div class='ui-pg-div'><span class='ui-icon \"+p.buttonicon+\"'></span>\"+p.caption+\"</div>\");\n\t\t\t\t}\n\t\t\t\tif(p.id) {$(tbd).attr(\"id\",p.id);}\n\t\t\t\tif(p.position==='first'){\n\t\t\t\t\tif(findnav.rows[0].cells.length ===0 ) {\n\t\t\t\t\t\t$(\"tr\",findnav).append(tbd);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$(\"tr td:eq(0)\",findnav).before(tbd);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$(\"tr\",findnav).append(tbd);\n\t\t\t\t}\n\t\t\t\t$(tbd,findnav)\n\t\t\t\t.attr(\"title\",p.title  || \"\")\n\t\t\t\t.click(function(e){\n\t\t\t\t\tif (!$(this).hasClass('ui-state-disabled')) {\n\t\t\t\t\t\tif ($.isFunction(p.onClickButton) ) {p.onClickButton.call($t,e);}\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t})\n\t\t\t\t.hover(\n\t\t\t\t\tfunction () {\n\t\t\t\t\t\tif (!$(this).hasClass('ui-state-disabled')) {\n\t\t\t\t\t\t\t$(this).addClass('ui-state-hover');\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tfunction () {$(this).removeClass(\"ui-state-hover\");}\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t},\n\tnavSeparatorAdd:function (elem,p) {\n\t\tp = $.extend({\n\t\t\tsepclass : \"ui-separator\",\n\t\t\tsepcontent: '',\n                           position : \"last\"\n\t\t}, p ||{});\n\t\treturn this.each(function() {\n\t\t\tif( !this.grid)  {return;}\n\t\t\tif( typeof elem === \"string\" && elem.indexOf(\"#\") !== 0) {elem = \"#\"+$.jgrid.jqID(elem);}\n\t\t\tvar findnav = $(\".navtable\",elem)[0];\n\t\t\tif(findnav) {\n\t\t\t\tvar sep = \"<td class='ui-pg-button ui-state-disabled' style='width:4px;'><span class='\"+p.sepclass+\"'></span>\"+p.sepcontent+\"</td>\";\n\t\t\t\tif (p.position === 'first') {\n\t\t\t\t\tif (findnav.rows[0].cells.length === 0) {\n\t\t\t\t\t\t$(\"tr\", findnav).append(sep);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$(\"tr td:eq(0)\", findnav).before(sep);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$(\"tr\", findnav).append(sep);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\tGridToForm : function( rowid, formid ) {\n\t\treturn this.each(function(){\n\t\t\tvar $t = this, i;\n\t\t\tif (!$t.grid) {return;}\n\t\t\tvar rowdata = $($t).jqGrid(\"getRowData\",rowid);\n\t\t\tif (rowdata) {\n\t\t\t\tfor(i in rowdata) {\n\t\t\t\t\tif(rowdata.hasOwnProperty(i)) {\n\t\t\t\t\tif ( $(\"[name=\"+$.jgrid.jqID(i)+\"]\",formid).is(\"input:radio\") || $(\"[name=\"+$.jgrid.jqID(i)+\"]\",formid).is(\"input:checkbox\"))  {\n\t\t\t\t\t\t$(\"[name=\"+$.jgrid.jqID(i)+\"]\",formid).each( function() {\n\t\t\t\t\t\t\tif( $(this).val() == rowdata[i] ) {\n\t\t\t\t\t\t\t\t$(this)[$t.p.useProp ? 'prop': 'attr'](\"checked\",true);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$(this)[$t.p.useProp ? 'prop': 'attr'](\"checked\", false);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t// this is very slow on big table and form.\n\t\t\t\t\t\t$(\"[name=\"+$.jgrid.jqID(i)+\"]\",formid).val(rowdata[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\tFormToGrid : function(rowid, formid, mode, position){\n\t\treturn this.each(function() {\n\t\t\tvar $t = this;\n\t\t\tif(!$t.grid) {return;}\n\t\t\tif(!mode) {mode = 'set';}\n\t\t\tif(!position) {position = 'first';}\n\t\t\tvar fields = $(formid).serializeArray();\n\t\t\tvar griddata = {};\n\t\t\t$.each(fields, function(i, field){\n\t\t\t\tgriddata[field.name] = field.value;\n\t\t\t});\n\t\t\tif(mode==='add') {$($t).jqGrid(\"addRowData\",rowid,griddata, position);}\n\t\t\telse if(mode==='set') {$($t).jqGrid(\"setRowData\",rowid,griddata);}\n\t\t});\n\t}\n});\n})(jQuery);\n/*jshint eqeqeq:false, eqnull:true, devel:true */\n/*global jQuery */\n(function($){\n/**\n * jqGrid extension for manipulating Grid Data\n * Tony Tomov tony@trirand.com\n * http://trirand.com/blog/ \n * Dual licensed under the MIT and GPL licenses:\n * http://www.opensource.org/licenses/mit-license.php\n * http://www.gnu.org/licenses/gpl-2.0.html\n**/ \n\"use strict\";\n$.jgrid.inlineEdit = $.jgrid.inlineEdit || {};\n$.jgrid.extend({\n//Editing\n\teditRow : function(rowid,keys,oneditfunc,successfunc, url, extraparam, aftersavefunc,errorfunc, afterrestorefunc) {\n\t\t// Compatible mode old versions\n\t\tvar o={}, args = $.makeArray(arguments).slice(1);\n\n\t\tif( $.type(args[0]) === \"object\" ) {\n\t\t\to = args[0];\n\t\t} else {\n\t\t\tif (keys !== undefined) { o.keys = keys; }\n\t\t\tif ($.isFunction(oneditfunc)) { o.oneditfunc = oneditfunc; }\n\t\t\tif ($.isFunction(successfunc)) { o.successfunc = successfunc; }\n\t\t\tif (url !== undefined) { o.url = url; }\n\t\t\tif (extraparam !== undefined) { o.extraparam = extraparam; }\n\t\t\tif ($.isFunction(aftersavefunc)) { o.aftersavefunc = aftersavefunc; }\n\t\t\tif ($.isFunction(errorfunc)) { o.errorfunc = errorfunc; }\n\t\t\tif ($.isFunction(afterrestorefunc)) { o.afterrestorefunc = afterrestorefunc; }\n\t\t\t// last two not as param, but as object (sorry)\n\t\t\t//if (restoreAfterError !== undefined) { o.restoreAfterError = restoreAfterError; }\n\t\t\t//if (mtype !== undefined) { o.mtype = mtype || \"POST\"; }\t\t\t\n\t\t}\n\t\to = $.extend(true, {\n\t\t\tkeys : false,\n\t\t\toneditfunc: null,\n\t\t\tsuccessfunc: null,\n\t\t\turl: null,\n\t\t\textraparam: {},\n\t\t\taftersavefunc: null,\n\t\t\terrorfunc: null,\n\t\t\tafterrestorefunc: null,\n\t\t\trestoreAfterError: true,\n\t\t\tmtype: \"POST\"\n\t\t}, $.jgrid.inlineEdit, o );\n\n\t\t// End compatible\n\t\treturn this.each(function(){\n\t\t\tvar $t = this, nm, tmp, editable, cnt=0, focus=null, svr={}, ind,cm;\n\t\t\tif (!$t.grid ) { return; }\n\t\t\tind = $($t).jqGrid(\"getInd\",rowid,true);\n\t\t\tif( ind === false ) {return;}\n\t\t\teditable = $(ind).attr(\"editable\") || \"0\";\n\t\t\tif (editable === \"0\" && !$(ind).hasClass(\"not-editable-row\")) {\n\t\t\t\tcm = $t.p.colModel;\n\t\t\t\t$('td[role=\"gridcell\"]',ind).each( function(i) {\n\t\t\t\t\tnm = cm[i].name;\n\t\t\t\t\tvar treeg = $t.p.treeGrid===true && nm === $t.p.ExpandColumn;\n\t\t\t\t\tif(treeg) { tmp = $(\"span:first\",this).html();}\n\t\t\t\t\telse {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\ttmp = $.unformat.call($t,this,{rowId:rowid, colModel:cm[i]},i);\n\t\t\t\t\t\t} catch (_) {\n\t\t\t\t\t\t\ttmp =  ( cm[i].edittype && cm[i].edittype === 'textarea' ) ? $(this).text() : $(this).html();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( nm !== 'cb' && nm !== 'subgrid' && nm !== 'rn') {\n\t\t\t\t\t\tif($t.p.autoencode) { tmp = $.jgrid.htmlDecode(tmp); }\n\t\t\t\t\t\tsvr[nm]=tmp;\n\t\t\t\t\t\tif(cm[i].editable===true) {\n\t\t\t\t\t\t\tif(focus===null) { focus = i; }\n\t\t\t\t\t\t\tif (treeg) { $(\"span:first\",this).html(\"\"); }\n\t\t\t\t\t\t\telse { $(this).html(\"\"); }\n\t\t\t\t\t\t\tvar opt = $.extend({},cm[i].editoptions || {},{id:rowid+\"_\"+nm,name:nm});\n\t\t\t\t\t\t\tif(!cm[i].edittype) { cm[i].edittype = \"text\"; }\n\t\t\t\t\t\t\tif(tmp === \"&nbsp;\" || tmp === \"&#160;\" || (tmp.length===1 && tmp.charCodeAt(0)===160) ) {tmp='';}\n\t\t\t\t\t\t\tvar elc = $.jgrid.createEl.call($t,cm[i].edittype,opt,tmp,true,$.extend({},$.jgrid.ajaxOptions,$t.p.ajaxSelectOptions || {}));\n\t\t\t\t\t\t\t$(elc).addClass(\"editable\");\n\t\t\t\t\t\t\tif(treeg) { $(\"span:first\",this).append(elc); }\n\t\t\t\t\t\t\telse { $(this).append(elc); }\n\t\t\t\t\t\t\t$.jgrid.bindEv.call($t, elc, opt);\n\t\t\t\t\t\t\t//Again IE\n\t\t\t\t\t\t\tif(cm[i].edittype === \"select\" && cm[i].editoptions!==undefined && cm[i].editoptions.multiple===true  && cm[i].editoptions.dataUrl===undefined && $.jgrid.msie) {\n\t\t\t\t\t\t\t\t$(elc).width($(elc).width());\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcnt++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(cnt > 0) {\n\t\t\t\t\tsvr.id = rowid; $t.p.savedRow.push(svr);\n\t\t\t\t\t$(ind).attr(\"editable\",\"1\");\n\t\t\t\t\t$(\"td:eq(\"+focus+\") input\",ind).focus();\n\t\t\t\t\tif(o.keys===true) {\n\t\t\t\t\t\t$(ind).bind(\"keydown\",function(e) {\n\t\t\t\t\t\t\tif (e.keyCode === 27) {\n\t\t\t\t\t\t\t\t$($t).jqGrid(\"restoreRow\",rowid, o.afterrestorefunc);\n\t\t\t\t\t\t\t\tif($t.p._inlinenav) {\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t$($t).jqGrid('showAddEditButtons');\n\t\t\t\t\t\t\t\t\t} catch (eer1) {}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (e.keyCode === 13) {\n\t\t\t\t\t\t\t\tvar ta = e.target;\n\t\t\t\t\t\t\t\tif(ta.tagName === 'TEXTAREA') { return true; }\n\t\t\t\t\t\t\t\tif( $($t).jqGrid(\"saveRow\", rowid, o ) ) {\n\t\t\t\t\t\t\t\t\tif($t.p._inlinenav) {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\t$($t).jqGrid('showAddEditButtons');\n\t\t\t\t\t\t\t\t\t\t} catch (eer2) {}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t$($t).triggerHandler(\"jqGridInlineEditRow\", [rowid, o]);\n\t\t\t\t\tif( $.isFunction(o.oneditfunc)) { o.oneditfunc.call($t, rowid); }\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\tsaveRow : function(rowid, successfunc, url, extraparam, aftersavefunc,errorfunc, afterrestorefunc) {\n\t\t\n\t\t// Compatible mode old versions\n\t\tvar args = $.makeArray(arguments).slice(1), o = {};\n\n\t\tif( $.type(args[0]) === \"object\" ) {\n\t\t\to = args[0];\n\t\t} else {\n\t\t\tif ($.isFunction(successfunc)) { o.successfunc = successfunc; }\n\t\t\tif (url !== undefined) { o.url = url; }\n\t\t\tif (extraparam !== undefined) { o.extraparam = extraparam; }\n\t\t\tif ($.isFunction(aftersavefunc)) { o.aftersavefunc = aftersavefunc; }\n\t\t\tif ($.isFunction(errorfunc)) { o.errorfunc = errorfunc; }\n\t\t\tif ($.isFunction(afterrestorefunc)) { o.afterrestorefunc = afterrestorefunc; }\n\t\t}\n\t\to = $.extend(true, {\n\t\t\tsuccessfunc: null,\n\t\t\turl: null,\n\t\t\textraparam: {},\n\t\t\taftersavefunc: null,\n\t\t\terrorfunc: null,\n\t\t\tafterrestorefunc: null,\n\t\t\trestoreAfterError: true,\n\t\t\tmtype: \"POST\"\n\t\t}, $.jgrid.inlineEdit, o );\n\t\t// End compatible\n\t\t\n\t\tvar success = false;\n\t\tvar $t = this[0], nm, tmp={}, tmp2={}, tmp3= {}, editable, fr, cv, ind;\n\t\tif (!$t.grid ) { return success; }\n\t\tind = $($t).jqGrid(\"getInd\",rowid,true);\n\t\tif(ind === false) {return success;}\n\t\teditable = $(ind).attr(\"editable\");\n\t\to.url = o.url || $t.p.editurl;\n\t\tif (editable===\"1\") {\n\t\t\tvar cm;\n\t\t\t$('td[role=\"gridcell\"]',ind).each(function(i) {\n\t\t\t\tcm = $t.p.colModel[i];\n\t\t\t\tnm = cm.name;\n\t\t\t\tif ( nm !== 'cb' && nm !== 'subgrid' && cm.editable===true && nm !== 'rn' && !$(this).hasClass('not-editable-cell')) {\n\t\t\t\t\tswitch (cm.edittype) {\n\t\t\t\t\t\tcase \"checkbox\":\n\t\t\t\t\t\t\tvar cbv = [\"Yes\",\"No\"];\n\t\t\t\t\t\t\tif(cm.editoptions ) {\n\t\t\t\t\t\t\t\tcbv = cm.editoptions.value.split(\":\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttmp[nm]=  $(\"input\",this).is(\":checked\") ? cbv[0] : cbv[1]; \n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'text':\n\t\t\t\t\t\tcase 'password':\n\t\t\t\t\t\tcase 'textarea':\n\t\t\t\t\t\tcase \"button\" :\n\t\t\t\t\t\t\ttmp[nm]=$(\"input, textarea\",this).val();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'select':\n\t\t\t\t\t\t\tif(!cm.editoptions.multiple) {\n\t\t\t\t\t\t\t\ttmp[nm] = $(\"select option:selected\",this).val();\n\t\t\t\t\t\t\t\ttmp2[nm] = $(\"select option:selected\", this).text();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tvar sel = $(\"select\",this), selectedText = [];\n\t\t\t\t\t\t\t\ttmp[nm] = $(sel).val();\n\t\t\t\t\t\t\t\tif(tmp[nm]) { tmp[nm]= tmp[nm].join(\",\"); } else { tmp[nm] =\"\"; }\n\t\t\t\t\t\t\t\t$(\"select option:selected\",this).each(\n\t\t\t\t\t\t\t\t\tfunction(i,selected){\n\t\t\t\t\t\t\t\t\t\tselectedText[i] = $(selected).text();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\ttmp2[nm] = selectedText.join(\",\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(cm.formatter && cm.formatter === 'select') { tmp2={}; }\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'custom' :\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tif(cm.editoptions && $.isFunction(cm.editoptions.custom_value)) {\n\t\t\t\t\t\t\t\t\ttmp[nm] = cm.editoptions.custom_value.call($t, $(\".customelement\",this),'get');\n\t\t\t\t\t\t\t\t\tif (tmp[nm] === undefined) { throw \"e2\"; }\n\t\t\t\t\t\t\t\t} else { throw \"e1\"; }\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\tif (e===\"e1\") { $.jgrid.info_dialog($.jgrid.errors.errcap,\"function 'custom_value' \"+$.jgrid.edit.msg.nodefined,$.jgrid.edit.bClose); }\n\t\t\t\t\t\t\t\tif (e===\"e2\") { $.jgrid.info_dialog($.jgrid.errors.errcap,\"function 'custom_value' \"+$.jgrid.edit.msg.novalue,$.jgrid.edit.bClose); }\n\t\t\t\t\t\t\t\telse { $.jgrid.info_dialog($.jgrid.errors.errcap,e.message,$.jgrid.edit.bClose); }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcv = $.jgrid.checkValues.call($t,tmp[nm],i);\n\t\t\t\t\tif(cv[0] === false) {\n\t\t\t\t\t\tcv[1] = tmp[nm] + \" \" + cv[1];\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif($t.p.autoencode) { tmp[nm] = $.jgrid.htmlEncode(tmp[nm]); }\n\t\t\t\t\tif(o.url !== 'clientArray' && cm.editoptions && cm.editoptions.NullIfEmpty === true) {\n\t\t\t\t\t\tif(tmp[nm] === \"\") {\n\t\t\t\t\t\t\ttmp3[nm] = 'null';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (cv[0] === false){\n\t\t\t\ttry {\n\t\t\t\t\tvar tr = $t.rows.namedItem(rowid), positions = $.jgrid.findPos(tr);\n\t\t\t\t\t$.jgrid.info_dialog($.jgrid.errors.errcap,cv[1],$.jgrid.edit.bClose,{left:positions[0],top:positions[1]+$(tr).outerHeight()});\n\t\t\t\t} catch (e) {\n\t\t\t\t\talert(cv[1]);\n\t\t\t\t}\n\t\t\t\treturn success;\n\t\t\t}\n\t\t\tvar idname, opers = $t.p.prmNames, oldRowId = rowid;\n\t\t\tif ($t.p.keyIndex === false) {\n\t\t\t\tidname = opers.id;\n\t\t\t} else {\n\t\t\t\tidname = $t.p.colModel[$t.p.keyIndex +\n\t\t\t\t\t($t.p.rownumbers === true ? 1 : 0) +\n\t\t\t\t\t($t.p.multiselect === true ? 1 : 0) +\n\t\t\t\t\t($t.p.subGrid === true ? 1 : 0)].name;\n\t\t\t}\n\t\t\tif(tmp) {\n\t\t\t\ttmp[opers.oper] = opers.editoper;\n\t\t\t\tif (tmp[idname] === undefined || tmp[idname]===\"\") {\n\t\t\t\t\ttmp[idname] = rowid;\n\t\t\t\t} else if (ind.id !== $t.p.idPrefix + tmp[idname]) {\n\t\t\t\t\t// rename rowid\n\t\t\t\t\tvar oldid = $.jgrid.stripPref($t.p.idPrefix, rowid);\n\t\t\t\t\tif ($t.p._index[oldid] !== undefined) {\n\t\t\t\t\t\t$t.p._index[tmp[idname]] = $t.p._index[oldid];\n\t\t\t\t\t\tdelete $t.p._index[oldid];\n\t\t\t\t\t}\n\t\t\t\t\trowid = $t.p.idPrefix + tmp[idname];\n\t\t\t\t\t$(ind).attr(\"id\", rowid);\n\t\t\t\t\tif ($t.p.selrow === oldRowId) {\n\t\t\t\t\t\t$t.p.selrow = rowid;\n\t\t\t\t\t}\n\t\t\t\t\tif ($.isArray($t.p.selarrrow)) {\n\t\t\t\t\t\tvar i = $.inArray(oldRowId, $t.p.selarrrow);\n\t\t\t\t\t\tif (i>=0) {\n\t\t\t\t\t\t\t$t.p.selarrrow[i] = rowid;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ($t.p.multiselect) {\n\t\t\t\t\t\tvar newCboxId = \"jqg_\" + $t.p.id + \"_\" + rowid;\n\t\t\t\t\t\t$(\"input.cbox\",ind)\n\t\t\t\t\t\t\t.attr(\"id\", newCboxId)\n\t\t\t\t\t\t\t.attr(\"name\", newCboxId);\n\t\t\t\t\t}\n\t\t\t\t\t// TODO: to test the case of frozen columns\n\t\t\t\t}\n\t\t\t\tif($t.p.inlineData === undefined) { $t.p.inlineData ={}; }\n\t\t\t\ttmp = $.extend({},tmp,$t.p.inlineData,o.extraparam);\n\t\t\t}\n\t\t\tif (o.url === 'clientArray') {\n\t\t\t\ttmp = $.extend({},tmp, tmp2);\n\t\t\t\tif($t.p.autoencode) {\n\t\t\t\t\t$.each(tmp,function(n,v){\n\t\t\t\t\t\ttmp[n] = $.jgrid.htmlDecode(v);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tvar k, resp = $($t).jqGrid(\"setRowData\",rowid,tmp);\n\t\t\t\t$(ind).attr(\"editable\",\"0\");\n\t\t\t\tfor(k=0;k<$t.p.savedRow.length;k++) {\n\t\t\t\t\tif( String($t.p.savedRow[k].id) === String(oldRowId)) {fr = k; break;}\n\t\t\t\t}\n\t\t\t\tif(fr >= 0) { $t.p.savedRow.splice(fr,1); }\n\t\t\t\t$($t).triggerHandler(\"jqGridInlineAfterSaveRow\", [rowid, resp, tmp, o]);\n\t\t\t\tif( $.isFunction(o.aftersavefunc) ) { o.aftersavefunc.call($t, rowid,resp, o); }\n\t\t\t\tsuccess = true;\n\t\t\t\t$(ind).removeClass(\"jqgrid-new-row\").unbind(\"keydown\");\n\t\t\t} else {\n\t\t\t\t$(\"#lui_\"+$.jgrid.jqID($t.p.id)).show();\n\t\t\t\ttmp3 = $.extend({},tmp,tmp3);\n\t\t\t\ttmp3[idname] = $.jgrid.stripPref($t.p.idPrefix, tmp3[idname]);\n\t\t\t\t$.ajax($.extend({\n\t\t\t\t\turl:o.url,\n\t\t\t\t\tdata: $.isFunction($t.p.serializeRowData) ? $t.p.serializeRowData.call($t, tmp3) : tmp3,\n\t\t\t\t\ttype: o.mtype,\n\t\t\t\t\tasync : true, //?!?\n\t\t\t\t\tcomplete: function(res,stat){\n\t\t\t\t\t\t$(\"#lui_\"+$.jgrid.jqID($t.p.id)).hide();\n\t\t\t\t\t\tif (stat === \"success\"){\n\t\t\t\t\t\t\tvar ret = true, sucret, k;\n\t\t\t\t\t\t\tsucret = $($t).triggerHandler(\"jqGridInlineSuccessSaveRow\", [res, rowid, o]);\n\t\t\t\t\t\t\tif (!$.isArray(sucret)) {sucret = [true, tmp];}\n\t\t\t\t\t\t\tif (sucret[0] && $.isFunction(o.successfunc)) {sucret = o.successfunc.call($t, res);}\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif($.isArray(sucret)) {\n\t\t\t\t\t\t\t\t// expect array - status, data, rowid\n\t\t\t\t\t\t\t\tret = sucret[0];\n\t\t\t\t\t\t\t\ttmp = sucret[1] || tmp;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tret = sucret;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (ret===true) {\n\t\t\t\t\t\t\t\tif($t.p.autoencode) {\n\t\t\t\t\t\t\t\t\t$.each(tmp,function(n,v){\n\t\t\t\t\t\t\t\t\t\ttmp[n] = $.jgrid.htmlDecode(v);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttmp = $.extend({},tmp, tmp2);\n\t\t\t\t\t\t\t\t$($t).jqGrid(\"setRowData\",rowid,tmp);\n\t\t\t\t\t\t\t\t$(ind).attr(\"editable\",\"0\");\n\t\t\t\t\t\t\t\tfor(k=0;k<$t.p.savedRow.length;k++) {\n\t\t\t\t\t\t\t\t\tif( String($t.p.savedRow[k].id) === String(rowid)) {fr = k; break;}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif(fr >= 0) { $t.p.savedRow.splice(fr,1); }\n\t\t\t\t\t\t\t\t$($t).triggerHandler(\"jqGridInlineAfterSaveRow\", [rowid, res, tmp, o]);\n\t\t\t\t\t\t\t\tif( $.isFunction(o.aftersavefunc) ) { o.aftersavefunc.call($t, rowid,res); }\n\t\t\t\t\t\t\t\tsuccess = true;\n\t\t\t\t\t\t\t\t$(ind).removeClass(\"jqgrid-new-row\").unbind(\"keydown\");\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$($t).triggerHandler(\"jqGridInlineErrorSaveRow\", [rowid, res, stat, null, o]);\n\t\t\t\t\t\t\t\tif($.isFunction(o.errorfunc) ) {\n\t\t\t\t\t\t\t\t\to.errorfunc.call($t, rowid, res, stat, null);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif(o.restoreAfterError === true) {\n\t\t\t\t\t\t\t\t\t$($t).jqGrid(\"restoreRow\",rowid, o.afterrestorefunc);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\terror:function(res,stat,err){\n\t\t\t\t\t\t$(\"#lui_\"+$.jgrid.jqID($t.p.id)).hide();\n\t\t\t\t\t\t$($t).triggerHandler(\"jqGridInlineErrorSaveRow\", [rowid, res, stat, err, o]);\n\t\t\t\t\t\tif($.isFunction(o.errorfunc) ) {\n\t\t\t\t\t\t\to.errorfunc.call($t, rowid, res, stat, err);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar rT = res.responseText || res.statusText;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t$.jgrid.info_dialog($.jgrid.errors.errcap,'<div class=\"ui-state-error\">'+ rT +'</div>', $.jgrid.edit.bClose,{buttonalign:'right'});\n\t\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\t\talert(rT);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(o.restoreAfterError === true) {\n\t\t\t\t\t\t\t$($t).jqGrid(\"restoreRow\",rowid, o.afterrestorefunc);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, $.jgrid.ajaxOptions, $t.p.ajaxRowOptions || {}));\n\t\t\t}\n\t\t}\n\t\treturn success;\n\t},\n\trestoreRow : function(rowid, afterrestorefunc) {\n\t\t// Compatible mode old versions\n\t\tvar args = $.makeArray(arguments).slice(1), o={};\n\n\t\tif( $.type(args[0]) === \"object\" ) {\n\t\t\to = args[0];\n\t\t} else {\n\t\t\tif ($.isFunction(afterrestorefunc)) { o.afterrestorefunc = afterrestorefunc; }\n\t\t}\n\t\to = $.extend(true, {}, $.jgrid.inlineEdit, o );\n\n\t\t// End compatible\n\n\t\treturn this.each(function(){\n\t\t\tvar $t= this, fr, ind, ares={}, k;\n\t\t\tif (!$t.grid ) { return; }\n\t\t\tind = $($t).jqGrid(\"getInd\",rowid,true);\n\t\t\tif(ind === false) {return;}\n\t\t\tfor(k=0;k<$t.p.savedRow.length;k++) {\n\t\t\t\tif( String($t.p.savedRow[k].id) === String(rowid)) {fr = k; break;}\n\t\t\t}\n\t\t\tif(fr >= 0) {\n\t\t\t\tif($.isFunction($.fn.datepicker)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t$(\"input.hasDatepicker\",\"#\"+$.jgrid.jqID(ind.id)).datepicker('hide');\n\t\t\t\t\t} catch (e) {}\n\t\t\t\t}\n\t\t\t\t$.each($t.p.colModel, function(){\n\t\t\t\t\tif(this.editable === true && $t.p.savedRow[fr].hasOwnProperty(this.name)) {\n\t\t\t\t\t\tares[this.name] = $t.p.savedRow[fr][this.name];\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t$($t).jqGrid(\"setRowData\",rowid,ares);\n\t\t\t\t$(ind).attr(\"editable\",\"0\").unbind(\"keydown\");\n\t\t\t\t$t.p.savedRow.splice(fr,1);\n\t\t\t\tif($(\"#\"+$.jgrid.jqID(rowid), \"#\"+$.jgrid.jqID($t.p.id)).hasClass(\"jqgrid-new-row\")){\n\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\t$($t).jqGrid(\"delRowData\",rowid);\n\t\t\t\t\t\t$($t).jqGrid('showAddEditButtons');\n\t\t\t\t\t},0);\n\t\t\t\t}\n\t\t\t}\n\t\t\t$($t).triggerHandler(\"jqGridInlineAfterRestoreRow\", [rowid]);\n\t\t\tif ($.isFunction(o.afterrestorefunc))\n\t\t\t{\n\t\t\t\to.afterrestorefunc.call($t, rowid);\n\t\t\t}\n\t\t});\n\t},\n\taddRow : function ( p ) {\n\t\tp = $.extend(true, {\n\t\t\trowID : null,\n\t\t\tinitdata : {},\n\t\t\tposition :\"first\",\n\t\t\tuseDefValues : true,\n\t\t\tuseFormatter : false,\n\t\t\taddRowParams : {extraparam:{}}\n\t\t},p  || {});\n\t\treturn this.each(function(){\n\t\t\tif (!this.grid ) { return; }\n\t\t\tvar $t = this;\n\t\t\tp.rowID = $.isFunction(p.rowID) ? p.rowID.call($t, p) : ( (p.rowID != null) ? p.rowID : $.jgrid.randId());\n\t\t\tif(p.useDefValues === true) {\n\t\t\t\t$($t.p.colModel).each(function(){\n\t\t\t\t\tif( this.editoptions && this.editoptions.defaultValue ) {\n\t\t\t\t\t\tvar opt = this.editoptions.defaultValue,\n\t\t\t\t\t\ttmp = $.isFunction(opt) ? opt.call($t) : opt;\n\t\t\t\t\t\tp.initdata[this.name] = tmp;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\t$($t).jqGrid('addRowData', p.rowID, p.initdata, p.position);\n\t\t\tp.rowID = $t.p.idPrefix + p.rowID;\n\t\t\t$(\"#\"+$.jgrid.jqID(p.rowID), \"#\"+$.jgrid.jqID($t.p.id)).addClass(\"jqgrid-new-row\");\n\t\t\tif(p.useFormatter) {\n\t\t\t\t$(\"#\"+$.jgrid.jqID(p.rowID)+\" .ui-inline-edit\", \"#\"+$.jgrid.jqID($t.p.id)).click();\n\t\t\t} else {\n\t\t\t\tvar opers = $t.p.prmNames,\n\t\t\t\toper = opers.oper;\n\t\t\t\tp.addRowParams.extraparam[oper] = opers.addoper;\n\t\t\t\t$($t).jqGrid('editRow', p.rowID, p.addRowParams);\n\t\t\t\t$($t).jqGrid('setSelection', p.rowID);\n\t\t\t}\n\t\t});\n\t},\n\tinlineNav : function (elem, o) {\n\t\to = $.extend(true,{\n\t\t\tedit: true,\n\t\t\tediticon: \"ui-icon-pencil\",\n\t\t\tadd: true,\n\t\t\taddicon:\"ui-icon-plus\",\n\t\t\tsave: true,\n\t\t\tsaveicon:\"ui-icon-disk\",\n\t\t\tcancel: true,\n\t\t\tcancelicon:\"ui-icon-cancel\",\n\t\t\taddParams : {addRowParams: {extraparam: {}}},\n\t\t\teditParams : {},\n\t\t\trestoreAfterSelect : true\n\t\t}, $.jgrid.nav, o ||{});\n\t\treturn this.each(function(){\n\t\t\tif (!this.grid ) { return; }\n\t\t\tvar $t = this, onSelect, gID = $.jgrid.jqID($t.p.id);\n\t\t\t$t.p._inlinenav = true;\n\t\t\t// detect the formatactions column\n\t\t\tif(o.addParams.useFormatter === true) {\n\t\t\t\tvar cm = $t.p.colModel,i;\n\t\t\t\tfor (i = 0; i<cm.length; i++) {\n\t\t\t\t\tif(cm[i].formatter && cm[i].formatter === \"actions\" ) {\n\t\t\t\t\t\tif(cm[i].formatoptions) {\n\t\t\t\t\t\t\tvar defaults =  {\n\t\t\t\t\t\t\t\tkeys:false,\n\t\t\t\t\t\t\t\tonEdit : null,\n\t\t\t\t\t\t\t\tonSuccess: null,\n\t\t\t\t\t\t\t\tafterSave:null,\n\t\t\t\t\t\t\t\tonError: null,\n\t\t\t\t\t\t\t\tafterRestore: null,\n\t\t\t\t\t\t\t\textraparam: {},\n\t\t\t\t\t\t\t\turl: null\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tap = $.extend( defaults, cm[i].formatoptions );\n\t\t\t\t\t\t\to.addParams.addRowParams = {\n\t\t\t\t\t\t\t\t\"keys\" : ap.keys,\n\t\t\t\t\t\t\t\t\"oneditfunc\" : ap.onEdit,\n\t\t\t\t\t\t\t\t\"successfunc\" : ap.onSuccess,\n\t\t\t\t\t\t\t\t\"url\" : ap.url,\n\t\t\t\t\t\t\t\t\"extraparam\" : ap.extraparam,\n\t\t\t\t\t\t\t\t\"aftersavefunc\" : ap.afterSave,\n\t\t\t\t\t\t\t\t\"errorfunc\": ap.onError,\n\t\t\t\t\t\t\t\t\"afterrestorefunc\" : ap.afterRestore\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(o.add) {\n\t\t\t\t$($t).jqGrid('navButtonAdd', elem,{\n\t\t\t\t\tcaption : o.addtext,\n\t\t\t\t\ttitle : o.addtitle,\n\t\t\t\t\tbuttonicon : o.addicon,\n\t\t\t\t\tid : $t.p.id+\"_iladd\",\n\t\t\t\t\tonClickButton : function () {\n\t\t\t\t\t\t$($t).jqGrid('addRow', o.addParams);\n\t\t\t\t\t\tif(!o.addParams.useFormatter) {\n\t\t\t\t\t\t\t$(\"#\"+gID+\"_ilsave\").removeClass('ui-state-disabled');\n\t\t\t\t\t\t\t$(\"#\"+gID+\"_ilcancel\").removeClass('ui-state-disabled');\n\t\t\t\t\t\t\t$(\"#\"+gID+\"_iladd\").addClass('ui-state-disabled');\n\t\t\t\t\t\t\t$(\"#\"+gID+\"_iledit\").addClass('ui-state-disabled');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tif(o.edit) {\n\t\t\t\t$($t).jqGrid('navButtonAdd', elem,{\n\t\t\t\t\tcaption : o.edittext,\n\t\t\t\t\ttitle : o.edittitle,\n\t\t\t\t\tbuttonicon : o.editicon,\n\t\t\t\t\tid : $t.p.id+\"_iledit\",\n\t\t\t\t\tonClickButton : function () {\n\t\t\t\t\t\tvar sr = $($t).jqGrid('getGridParam','selrow');\n\t\t\t\t\t\tif(sr) {\n\t\t\t\t\t\t\t$($t).jqGrid('editRow', sr, o.editParams);\n\t\t\t\t\t\t\t$(\"#\"+gID+\"_ilsave\").removeClass('ui-state-disabled');\n\t\t\t\t\t\t\t$(\"#\"+gID+\"_ilcancel\").removeClass('ui-state-disabled');\n\t\t\t\t\t\t\t$(\"#\"+gID+\"_iladd\").addClass('ui-state-disabled');\n\t\t\t\t\t\t\t$(\"#\"+gID+\"_iledit\").addClass('ui-state-disabled');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$.jgrid.viewModal(\"#alertmod\",{gbox:\"#gbox_\"+gID,jqm:true});$(\"#jqg_alrt\").focus();\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tif(o.save) {\n\t\t\t\t$($t).jqGrid('navButtonAdd', elem,{\n\t\t\t\t\tcaption : o.savetext || '',\n\t\t\t\t\ttitle : o.savetitle || 'Save row',\n\t\t\t\t\tbuttonicon : o.saveicon,\n\t\t\t\t\tid : $t.p.id+\"_ilsave\",\n\t\t\t\t\tonClickButton : function () {\n\t\t\t\t\t\tvar sr = $t.p.savedRow[0].id;\n\t\t\t\t\t\tif(sr) {\n\t\t\t\t\t\t\tvar opers = $t.p.prmNames,\n\t\t\t\t\t\t\toper = opers.oper, tmpParams = {};\n\t\t\t\t\t\t\tif($(\"#\"+$.jgrid.jqID(sr), \"#\"+gID ).hasClass(\"jqgrid-new-row\")) {\n\t\t\t\t\t\t\t\to.addParams.addRowParams.extraparam[oper] = opers.addoper;\n\t\t\t\t\t\t\t\ttmpParams = o.addParams.addRowParams;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif(!o.editParams.extraparam) {\n\t\t\t\t\t\t\t\t\to.editParams.extraparam = {};\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\to.editParams.extraparam[oper] = opers.editoper;\n\t\t\t\t\t\t\t\ttmpParams = o.editParams;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif( $($t).jqGrid('saveRow', sr, tmpParams) ) {\n\t\t\t\t\t\t\t\t$($t).jqGrid('showAddEditButtons');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$.jgrid.viewModal(\"#alertmod\",{gbox:\"#gbox_\"+gID,jqm:true});$(\"#jqg_alrt\").focus();\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t$(\"#\"+gID+\"_ilsave\").addClass('ui-state-disabled');\n\t\t\t}\n\t\t\tif(o.cancel) {\n\t\t\t\t$($t).jqGrid('navButtonAdd', elem,{\n\t\t\t\t\tcaption : o.canceltext || '',\n\t\t\t\t\ttitle : o.canceltitle || 'Cancel row editing',\n\t\t\t\t\tbuttonicon : o.cancelicon,\n\t\t\t\t\tid : $t.p.id+\"_ilcancel\",\n\t\t\t\t\tonClickButton : function () {\n\t\t\t\t\t\tvar sr = $t.p.savedRow[0].id, cancelPrm = {};\n\t\t\t\t\t\tif(sr) {\n\t\t\t\t\t\t\tif($(\"#\"+$.jgrid.jqID(sr), \"#\"+gID ).hasClass(\"jqgrid-new-row\")) {\n\t\t\t\t\t\t\t\tcancelPrm = o.addParams.addRowParams;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcancelPrm = o.editParams;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$($t).jqGrid('restoreRow', sr, cancelPrm);\n\t\t\t\t\t\t\t$($t).jqGrid('showAddEditButtons');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$.jgrid.viewModal(\"#alertmod\",{gbox:\"#gbox_\"+gID,jqm:true});$(\"#jqg_alrt\").focus();\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t$(\"#\"+gID+\"_ilcancel\").addClass('ui-state-disabled');\n\t\t\t}\n\t\t\tif(o.restoreAfterSelect === true) {\n\t\t\t\tif($.isFunction($t.p.beforeSelectRow)) {\n\t\t\t\t\tonSelect = $t.p.beforeSelectRow;\n\t\t\t\t} else {\n\t\t\t\t\tonSelect =  false;\n\t\t\t\t}\n\t\t\t\t$t.p.beforeSelectRow = function(id, stat) {\n\t\t\t\t\tvar ret = true;\n\t\t\t\t\tif($t.p.savedRow.length > 0 && $t.p._inlinenav===true && ( id !== $t.p.selrow && $t.p.selrow !==null) ) {\n\t\t\t\t\t\tif($t.p.selrow === o.addParams.rowID ) {\n\t\t\t\t\t\t\t$($t).jqGrid('delRowData', $t.p.selrow);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$($t).jqGrid('restoreRow', $t.p.selrow, o.editParams);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$($t).jqGrid('showAddEditButtons');\n\t\t\t\t\t}\n\t\t\t\t\tif(onSelect) {\n\t\t\t\t\t\tret = onSelect.call($t, id, stat);\n\t\t\t\t\t}\n\t\t\t\t\treturn ret;\n\t\t\t\t};\n\t\t\t}\n\n\t\t});\n\t},\n\tshowAddEditButtons : function()  {\n\t\treturn this.each(function(){\n\t\t\tif (!this.grid ) { return; }\n\t\t\tvar gID = $.jgrid.jqID(this.p.id);\n\t\t\t$(\"#\"+gID+\"_ilsave\").addClass('ui-state-disabled');\n\t\t\t$(\"#\"+gID+\"_ilcancel\").addClass('ui-state-disabled');\n\t\t\t$(\"#\"+gID+\"_iladd\").removeClass('ui-state-disabled');\n\t\t\t$(\"#\"+gID+\"_iledit\").removeClass('ui-state-disabled');\n\t\t});\n\t}\n//end inline edit\n});\n})(jQuery);\n/*jshint eqeqeq:false */\n/*global jQuery */\n(function($){\n/*\n**\n * jqGrid extension for cellediting Grid Data\n * Tony Tomov tony@trirand.com\n * http://trirand.com/blog/ \n * Dual licensed under the MIT and GPL licenses:\n * http://www.opensource.org/licenses/mit-license.php\n * http://www.gnu.org/licenses/gpl-2.0.html\n**/ \n/**\n * all events and options here are aded anonynous and not in the base grid\n * since the array is to big. Here is the order of execution.\n * From this point we use jQuery isFunction\n * formatCell\n * beforeEditCell,\n * onSelectCell (used only for noneditable cels)\n * afterEditCell,\n * beforeSaveCell, (called before validation of values if any)\n * beforeSubmitCell (if cellsubmit remote (ajax))\n * afterSubmitCell(if cellsubmit remote (ajax)),\n * afterSaveCell,\n * errorCell,\n * serializeCellData - new\n * Options\n * cellsubmit (remote,clientArray) (added in grid options)\n * cellurl\n * ajaxCellOptions\n* */\n\"use strict\";\n$.jgrid.extend({\n\teditCell : function (iRow,iCol, ed){\n\t\treturn this.each(function (){\n\t\t\tvar $t = this, nm, tmp,cc, cm;\n\t\t\tif (!$t.grid || $t.p.cellEdit !== true) {return;}\n\t\t\tiCol = parseInt(iCol,10);\n\t\t\t// select the row that can be used for other methods\n\t\t\t$t.p.selrow = $t.rows[iRow].id;\n\t\t\tif (!$t.p.knv) {$($t).jqGrid(\"GridNav\");}\n\t\t\t// check to see if we have already edited cell\n\t\t\tif ($t.p.savedRow.length>0) {\n\t\t\t\t// prevent second click on that field and enable selects\n\t\t\t\tif (ed===true ) {\n\t\t\t\t\tif(iRow == $t.p.iRow && iCol == $t.p.iCol){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// save the cell\n\t\t\t\t$($t).jqGrid(\"saveCell\",$t.p.savedRow[0].id,$t.p.savedRow[0].ic);\n\t\t\t} else {\n\t\t\t\twindow.setTimeout(function () { $(\"#\"+$.jgrid.jqID($t.p.knv)).attr(\"tabindex\",\"-1\").focus();},0);\n\t\t\t}\n\t\t\tcm = $t.p.colModel[iCol];\n\t\t\tnm = cm.name;\n\t\t\tif (nm==='subgrid' || nm==='cb' || nm==='rn') {return;}\n\t\t\tcc = $(\"td:eq(\"+iCol+\")\",$t.rows[iRow]);\n\t\t\tif (cm.editable===true && ed===true && !cc.hasClass(\"not-editable-cell\")) {\n\t\t\t\tif(parseInt($t.p.iCol,10)>=0  && parseInt($t.p.iRow,10)>=0) {\n\t\t\t\t\t$(\"td:eq(\"+$t.p.iCol+\")\",$t.rows[$t.p.iRow]).removeClass(\"edit-cell ui-state-highlight\");\n\t\t\t\t\t$($t.rows[$t.p.iRow]).removeClass(\"selected-row ui-state-hover\");\n\t\t\t\t}\n\t\t\t\t$(cc).addClass(\"edit-cell ui-state-highlight\");\n\t\t\t\t$($t.rows[iRow]).addClass(\"selected-row ui-state-hover\");\n\t\t\t\ttry {\n\t\t\t\t\ttmp =  $.unformat.call($t,cc,{rowId: $t.rows[iRow].id, colModel:cm},iCol);\n\t\t\t\t} catch (_) {\n\t\t\t\t\ttmp = ( cm.edittype && cm.edittype === 'textarea' ) ? $(cc).text() : $(cc).html();\n\t\t\t\t}\n\t\t\t\tif($t.p.autoencode) { tmp = $.jgrid.htmlDecode(tmp); }\n\t\t\t\tif (!cm.edittype) {cm.edittype = \"text\";}\n\t\t\t\t$t.p.savedRow.push({id:iRow,ic:iCol,name:nm,v:tmp});\n\t\t\t\tif(tmp === \"&nbsp;\" || tmp === \"&#160;\" || (tmp.length===1 && tmp.charCodeAt(0)===160) ) {tmp='';}\n\t\t\t\tif($.isFunction($t.p.formatCell)) {\n\t\t\t\t\tvar tmp2 = $t.p.formatCell.call($t, $t.rows[iRow].id,nm,tmp,iRow,iCol);\n\t\t\t\t\tif(tmp2 !== undefined ) {tmp = tmp2;}\n\t\t\t\t}\n\t\t\t\tvar opt = $.extend({}, cm.editoptions || {} ,{id:iRow+\"_\"+nm,name:nm});\n\t\t\t\tvar elc = $.jgrid.createEl.call($t,cm.edittype,opt,tmp,true,$.extend({},$.jgrid.ajaxOptions,$t.p.ajaxSelectOptions || {}));\n\t\t\t\t$($t).triggerHandler(\"jqGridBeforeEditCell\", [$t.rows[iRow].id, nm, tmp, iRow, iCol]);\n\t\t\t\tif ($.isFunction($t.p.beforeEditCell)) {\n\t\t\t\t\t$t.p.beforeEditCell.call($t, $t.rows[iRow].id,nm,tmp,iRow,iCol);\n\t\t\t\t}\n\t\t\t\t$(cc).html(\"\").append(elc).attr(\"tabindex\",\"0\");\n\t\t\t\t$.jgrid.bindEv.call($t, elc, opt);\n\t\t\t\twindow.setTimeout(function () { $(elc).focus();},0);\n\t\t\t\t$(\"input, select, textarea\",cc).bind(\"keydown\",function(e) {\n\t\t\t\t\tif (e.keyCode === 27) {\n\t\t\t\t\t\tif($(\"input.hasDatepicker\",cc).length >0) {\n\t\t\t\t\t\t\tif( $(\".ui-datepicker\").is(\":hidden\") )  { $($t).jqGrid(\"restoreCell\",iRow,iCol); }\n\t\t\t\t\t\t\telse { $(\"input.hasDatepicker\",cc).datepicker('hide'); }\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$($t).jqGrid(\"restoreCell\",iRow,iCol);\n\t\t\t\t\t\t}\n\t\t\t\t\t} //ESC\n\t\t\t\t\tif (e.keyCode === 13) {\n\t\t\t\t\t\t$($t).jqGrid(\"saveCell\",iRow,iCol);\n\t\t\t\t\t\t// Prevent default action\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} //Enter\n\t\t\t\t\tif (e.keyCode === 9)  {\n\t\t\t\t\t\tif(!$t.grid.hDiv.loading ) {\n\t\t\t\t\t\t\tif (e.shiftKey) {$($t).jqGrid(\"prevCell\",iRow,iCol);} //Shift TAb\n\t\t\t\t\t\t\telse {$($t).jqGrid(\"nextCell\",iRow,iCol);} //Tab\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t});\n\t\t\t\t$($t).triggerHandler(\"jqGridAfterEditCell\", [$t.rows[iRow].id, nm, tmp, iRow, iCol]);\n\t\t\t\tif ($.isFunction($t.p.afterEditCell)) {\n\t\t\t\t\t$t.p.afterEditCell.call($t, $t.rows[iRow].id,nm,tmp,iRow,iCol);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (parseInt($t.p.iCol,10)>=0  && parseInt($t.p.iRow,10)>=0) {\n\t\t\t\t\t$(\"td:eq(\"+$t.p.iCol+\")\",$t.rows[$t.p.iRow]).removeClass(\"edit-cell ui-state-highlight\");\n\t\t\t\t\t$($t.rows[$t.p.iRow]).removeClass(\"selected-row ui-state-hover\");\n\t\t\t\t}\n\t\t\t\tcc.addClass(\"edit-cell ui-state-highlight\");\n\t\t\t\t$($t.rows[iRow]).addClass(\"selected-row ui-state-hover\");\n\t\t\t\ttmp = cc.html().replace(/\\&#160\\;/ig,'');\n\t\t\t\t$($t).triggerHandler(\"jqGridSelectCell\", [$t.rows[iRow].id, nm, tmp, iRow, iCol]);\n\t\t\t\tif ($.isFunction($t.p.onSelectCell)) {\n\t\t\t\t\t$t.p.onSelectCell.call($t, $t.rows[iRow].id,nm,tmp,iRow,iCol);\n\t\t\t\t}\n\t\t\t}\n\t\t\t$t.p.iCol = iCol; $t.p.iRow = iRow;\n\t\t});\n\t},\n\tsaveCell : function (iRow, iCol){\n\t\treturn this.each(function(){\n\t\t\tvar $t= this, fr;\n\t\t\tif (!$t.grid || $t.p.cellEdit !== true) {return;}\n\t\t\tif ( $t.p.savedRow.length >= 1) {fr = 0;} else {fr=null;} \n\t\t\tif(fr !== null) {\n\t\t\t\tvar cc = $(\"td:eq(\"+iCol+\")\",$t.rows[iRow]),v,v2,\n\t\t\t\tcm = $t.p.colModel[iCol], nm = cm.name, nmjq = $.jgrid.jqID(nm) ;\n\t\t\t\tswitch (cm.edittype) {\n\t\t\t\t\tcase \"select\":\n\t\t\t\t\t\tif(!cm.editoptions.multiple) {\n\t\t\t\t\t\t\tv = $(\"#\"+iRow+\"_\"+nmjq+\" option:selected\",$t.rows[iRow]).val();\n\t\t\t\t\t\t\tv2 = $(\"#\"+iRow+\"_\"+nmjq+\" option:selected\",$t.rows[iRow]).text();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar sel = $(\"#\"+iRow+\"_\"+nmjq,$t.rows[iRow]), selectedText = [];\n\t\t\t\t\t\t\tv = $(sel).val();\n\t\t\t\t\t\t\tif(v) { v.join(\",\");} else { v=\"\"; }\n\t\t\t\t\t\t\t$(\"option:selected\",sel).each(\n\t\t\t\t\t\t\t\tfunction(i,selected){\n\t\t\t\t\t\t\t\t\tselectedText[i] = $(selected).text();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tv2 = selectedText.join(\",\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(cm.formatter) { v2 = v; }\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"checkbox\":\n\t\t\t\t\t\tvar cbv  = [\"Yes\",\"No\"];\n\t\t\t\t\t\tif(cm.editoptions){\n\t\t\t\t\t\t\tcbv = cm.editoptions.value.split(\":\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tv = $(\"#\"+iRow+\"_\"+nmjq,$t.rows[iRow]).is(\":checked\") ? cbv[0] : cbv[1];\n\t\t\t\t\t\tv2=v;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"password\":\n\t\t\t\t\tcase \"text\":\n\t\t\t\t\tcase \"textarea\":\n\t\t\t\t\tcase \"button\" :\n\t\t\t\t\t\tv = $(\"#\"+iRow+\"_\"+nmjq,$t.rows[iRow]).val();\n\t\t\t\t\t\tv2=v;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'custom' :\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tif(cm.editoptions && $.isFunction(cm.editoptions.custom_value)) {\n\t\t\t\t\t\t\t\tv = cm.editoptions.custom_value.call($t, $(\".customelement\",cc),'get');\n\t\t\t\t\t\t\t\tif (v===undefined) { throw \"e2\";} else { v2=v; }\n\t\t\t\t\t\t\t} else { throw \"e1\"; }\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tif (e===\"e1\") { $.jgrid.info_dialog($.jgrid.errors.errcap,\"function 'custom_value' \"+$.jgrid.edit.msg.nodefined,$.jgrid.edit.bClose); }\n\t\t\t\t\t\t\tif (e===\"e2\") { $.jgrid.info_dialog($.jgrid.errors.errcap,\"function 'custom_value' \"+$.jgrid.edit.msg.novalue,$.jgrid.edit.bClose); }\n\t\t\t\t\t\t\telse {$.jgrid.info_dialog($.jgrid.errors.errcap,e.message,$.jgrid.edit.bClose); }\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// The common approach is if nothing changed do not do anything\n\t\t\t\tif (v2 !== $t.p.savedRow[fr].v){\n\t\t\t\t\tvar vvv = $($t).triggerHandler(\"jqGridBeforeSaveCell\", [$t.rows[iRow].id, nm, v, iRow, iCol]);\n\t\t\t\t\tif (vvv) {v = vvv; v2=vvv;}\n\t\t\t\t\tif ($.isFunction($t.p.beforeSaveCell)) {\n\t\t\t\t\t\tvar vv = $t.p.beforeSaveCell.call($t, $t.rows[iRow].id,nm, v, iRow,iCol);\n\t\t\t\t\t\tif (vv) {v = vv; v2=vv;}\n\t\t\t\t\t}\n\t\t\t\t\tvar cv = $.jgrid.checkValues.call($t,v,iCol);\n\t\t\t\t\tif(cv[0] === true) {\n\t\t\t\t\t\tvar addpost = $($t).triggerHandler(\"jqGridBeforeSubmitCell\", [$t.rows[iRow].id, nm, v, iRow, iCol]) || {};\n\t\t\t\t\t\tif ($.isFunction($t.p.beforeSubmitCell)) {\n\t\t\t\t\t\t\taddpost = $t.p.beforeSubmitCell.call($t, $t.rows[iRow].id,nm, v, iRow,iCol);\n\t\t\t\t\t\t\tif (!addpost) {addpost={};}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif( $(\"input.hasDatepicker\",cc).length >0) { $(\"input.hasDatepicker\",cc).datepicker('hide'); }\n\t\t\t\t\t\tif ($t.p.cellsubmit === 'remote') {\n\t\t\t\t\t\t\tif ($t.p.cellurl) {\n\t\t\t\t\t\t\t\tvar postdata = {};\n\t\t\t\t\t\t\t\tif($t.p.autoencode) { v = $.jgrid.htmlEncode(v); }\n\t\t\t\t\t\t\t\tpostdata[nm] = v;\n\t\t\t\t\t\t\t\tvar idname,oper, opers;\n\t\t\t\t\t\t\t\topers = $t.p.prmNames;\n\t\t\t\t\t\t\t\tidname = opers.id;\n\t\t\t\t\t\t\t\toper = opers.oper;\n\t\t\t\t\t\t\t\tpostdata[idname] = $.jgrid.stripPref($t.p.idPrefix, $t.rows[iRow].id);\n\t\t\t\t\t\t\t\tpostdata[oper] = opers.editoper;\n\t\t\t\t\t\t\t\tpostdata = $.extend(addpost,postdata);\n\t\t\t\t\t\t\t\t$(\"#lui_\"+$.jgrid.jqID($t.p.id)).show();\n\t\t\t\t\t\t\t\t$t.grid.hDiv.loading = true;\n\t\t\t\t\t\t\t\t$.ajax( $.extend( {\n\t\t\t\t\t\t\t\t\turl: $t.p.cellurl,\n\t\t\t\t\t\t\t\t\tdata :$.isFunction($t.p.serializeCellData) ? $t.p.serializeCellData.call($t, postdata) : postdata,\n\t\t\t\t\t\t\t\t\ttype: \"POST\",\n\t\t\t\t\t\t\t\t\tcomplete: function (result, stat) {\n\t\t\t\t\t\t\t\t\t\t$(\"#lui_\"+$t.p.id).hide();\n\t\t\t\t\t\t\t\t\t\t$t.grid.hDiv.loading = false;\n\t\t\t\t\t\t\t\t\t\tif (stat === 'success') {\n\t\t\t\t\t\t\t\t\t\t\tvar ret = $($t).triggerHandler(\"jqGridAfterSubmitCell\", [$t, result, postdata.id, nm, v, iRow, iCol]) || [true, ''];\n\t\t\t\t\t\t\t\t\t\t\tif (ret[0] === true && $.isFunction($t.p.afterSubmitCell)) {\n\t\t\t\t\t\t\t\t\t\t\t\tret = $t.p.afterSubmitCell.call($t, result,postdata.id,nm,v,iRow,iCol);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif(ret[0] === true){\n\t\t\t\t\t\t\t\t\t\t\t\t$(cc).empty();\n\t\t\t\t\t\t\t\t\t\t\t\t$($t).jqGrid(\"setCell\",$t.rows[iRow].id, iCol, v2, false, false, true);\n\t\t\t\t\t\t\t\t\t\t\t\t$(cc).addClass(\"dirty-cell\");\n\t\t\t\t\t\t\t\t\t\t\t\t$($t.rows[iRow]).addClass(\"edited\");\n\t\t\t\t\t\t\t\t\t\t\t\t$($t).triggerHandler(\"jqGridAfterSaveCell\", [$t.rows[iRow].id, nm, v, iRow, iCol]);\n\t\t\t\t\t\t\t\t\t\t\t\tif ($.isFunction($t.p.afterSaveCell)) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t$t.p.afterSaveCell.call($t, $t.rows[iRow].id,nm, v, iRow,iCol);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t$t.p.savedRow.splice(0,1);\n\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t$.jgrid.info_dialog($.jgrid.errors.errcap,ret[1],$.jgrid.edit.bClose);\n\t\t\t\t\t\t\t\t\t\t\t\t$($t).jqGrid(\"restoreCell\",iRow,iCol);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\terror:function(res,stat,err) {\n\t\t\t\t\t\t\t\t\t\t$(\"#lui_\"+$.jgrid.jqID($t.p.id)).hide();\n\t\t\t\t\t\t\t\t\t\t$t.grid.hDiv.loading = false;\n\t\t\t\t\t\t\t\t\t\t$($t).triggerHandler(\"jqGridErrorCell\", [res, stat, err]);\n\t\t\t\t\t\t\t\t\t\tif ($.isFunction($t.p.errorCell)) {\n\t\t\t\t\t\t\t\t\t\t\t$t.p.errorCell.call($t, res,stat,err);\n\t\t\t\t\t\t\t\t\t\t\t$($t).jqGrid(\"restoreCell\",iRow,iCol);\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t$.jgrid.info_dialog($.jgrid.errors.errcap,res.status+\" : \"+res.statusText+\"<br/>\"+stat,$.jgrid.edit.bClose);\n\t\t\t\t\t\t\t\t\t\t\t$($t).jqGrid(\"restoreCell\",iRow,iCol);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}, $.jgrid.ajaxOptions, $t.p.ajaxCellOptions || {}));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t$.jgrid.info_dialog($.jgrid.errors.errcap,$.jgrid.errors.nourl,$.jgrid.edit.bClose);\n\t\t\t\t\t\t\t\t\t$($t).jqGrid(\"restoreCell\",iRow,iCol);\n\t\t\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ($t.p.cellsubmit === 'clientArray') {\n\t\t\t\t\t\t\t$(cc).empty();\n\t\t\t\t\t\t\t$($t).jqGrid(\"setCell\",$t.rows[iRow].id,iCol, v2, false, false, true);\n\t\t\t\t\t\t\t$(cc).addClass(\"dirty-cell\");\n\t\t\t\t\t\t\t$($t.rows[iRow]).addClass(\"edited\");\n\t\t\t\t\t\t\t$($t).triggerHandler(\"jqGridAfterSaveCell\", [$t.rows[iRow].id, nm, v, iRow, iCol]);\n\t\t\t\t\t\t\tif ($.isFunction($t.p.afterSaveCell)) {\n\t\t\t\t\t\t\t\t$t.p.afterSaveCell.call($t, $t.rows[iRow].id,nm, v, iRow,iCol);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$t.p.savedRow.splice(0,1);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\twindow.setTimeout(function(){$.jgrid.info_dialog($.jgrid.errors.errcap,v+\" \"+cv[1],$.jgrid.edit.bClose);},100);\n\t\t\t\t\t\t\t$($t).jqGrid(\"restoreCell\",iRow,iCol);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$($t).jqGrid(\"restoreCell\",iRow,iCol);\n\t\t\t\t}\n\t\t\t}\n\t\t\twindow.setTimeout(function () { $(\"#\"+$.jgrid.jqID($t.p.knv)).attr(\"tabindex\",\"-1\").focus();},0);\n\t\t});\n\t},\n\trestoreCell : function(iRow, iCol) {\n\t\treturn this.each(function(){\n\t\t\tvar $t= this, fr;\n\t\t\tif (!$t.grid || $t.p.cellEdit !== true ) {return;}\n\t\t\tif ( $t.p.savedRow.length >= 1) {fr = 0;} else {fr=null;}\n\t\t\tif(fr !== null) {\n\t\t\t\tvar cc = $(\"td:eq(\"+iCol+\")\",$t.rows[iRow]);\n\t\t\t\t// datepicker fix\n\t\t\t\tif($.isFunction($.fn.datepicker)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t$(\"input.hasDatepicker\",cc).datepicker('hide');\n\t\t\t\t\t} catch (e) {}\n\t\t\t\t}\n\t\t\t\t$(cc).empty().attr(\"tabindex\",\"-1\");\n\t\t\t\t$($t).jqGrid(\"setCell\",$t.rows[iRow].id, iCol, $t.p.savedRow[fr].v, false, false, true);\n\t\t\t\t$($t).triggerHandler(\"jqGridAfterRestoreCell\", [$t.rows[iRow].id, $t.p.savedRow[fr].v, iRow, iCol]);\n\t\t\t\tif ($.isFunction($t.p.afterRestoreCell)) {\n\t\t\t\t\t$t.p.afterRestoreCell.call($t, $t.rows[iRow].id, $t.p.savedRow[fr].v, iRow, iCol);\n\t\t\t\t}\t\t\t\t\n\t\t\t\t$t.p.savedRow.splice(0,1);\n\t\t\t}\n\t\t\twindow.setTimeout(function () { $(\"#\"+$t.p.knv).attr(\"tabindex\",\"-1\").focus();},0);\n\t\t});\n\t},\n\tnextCell : function (iRow,iCol) {\n\t\treturn this.each(function (){\n\t\t\tvar $t = this, nCol=false, i;\n\t\t\tif (!$t.grid || $t.p.cellEdit !== true) {return;}\n\t\t\t// try to find next editable cell\n\t\t\tfor (i=iCol+1; i<$t.p.colModel.length; i++) {\n\t\t\t\tif ( $t.p.colModel[i].editable ===true) {\n\t\t\t\t\tnCol = i; break;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(nCol !== false) {\n\t\t\t\t$($t).jqGrid(\"editCell\",iRow,nCol,true);\n\t\t\t} else {\n\t\t\t\tif ($t.p.savedRow.length >0) {\n\t\t\t\t\t$($t).jqGrid(\"saveCell\",iRow,iCol);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\tprevCell : function (iRow,iCol) {\n\t\treturn this.each(function (){\n\t\t\tvar $t = this, nCol=false, i;\n\t\t\tif (!$t.grid || $t.p.cellEdit !== true) {return;}\n\t\t\t// try to find next editable cell\n\t\t\tfor (i=iCol-1; i>=0; i--) {\n\t\t\t\tif ( $t.p.colModel[i].editable ===true) {\n\t\t\t\t\tnCol = i; break;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(nCol !== false) {\n\t\t\t\t$($t).jqGrid(\"editCell\",iRow,nCol,true);\n\t\t\t} else {\n\t\t\t\tif ($t.p.savedRow.length >0) {\n\t\t\t\t\t$($t).jqGrid(\"saveCell\",iRow,iCol);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\tGridNav : function() {\n\t\treturn this.each(function () {\n\t\t\tvar  $t = this;\n\t\t\tif (!$t.grid || $t.p.cellEdit !== true ) {return;}\n\t\t\t// trick to process keydown on non input elements\n\t\t\t$t.p.knv = $t.p.id + \"_kn\";\n\t\t\tvar selection = $(\"<div style='position:fixed;top:0px;width:1px;height:1px;' tabindex='0'><div tabindex='-1' style='width:1px;height:1px;' id='\"+$t.p.knv+\"'></div></div>\"),\n\t\t\ti, kdir;\n\t\t\tfunction scrollGrid(iR, iC, tp){\n\t\t\t\tif (tp.substr(0,1)==='v') {\n\t\t\t\t\tvar ch = $($t.grid.bDiv)[0].clientHeight,\n\t\t\t\t\tst = $($t.grid.bDiv)[0].scrollTop,\n\t\t\t\t\tnROT = $t.rows[iR].offsetTop+$t.rows[iR].clientHeight,\n\t\t\t\t\tpROT = $t.rows[iR].offsetTop;\n\t\t\t\t\tif(tp === 'vd') {\n\t\t\t\t\t\tif(nROT >= ch) {\n\t\t\t\t\t\t\t$($t.grid.bDiv)[0].scrollTop = $($t.grid.bDiv)[0].scrollTop + $t.rows[iR].clientHeight;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(tp === 'vu'){\n\t\t\t\t\t\tif (pROT < st ) {\n\t\t\t\t\t\t\t$($t.grid.bDiv)[0].scrollTop = $($t.grid.bDiv)[0].scrollTop - $t.rows[iR].clientHeight;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(tp==='h') {\n\t\t\t\t\tvar cw = $($t.grid.bDiv)[0].clientWidth,\n\t\t\t\t\tsl = $($t.grid.bDiv)[0].scrollLeft,\n\t\t\t\t\tnCOL = $t.rows[iR].cells[iC].offsetLeft+$t.rows[iR].cells[iC].clientWidth,\n\t\t\t\t\tpCOL = $t.rows[iR].cells[iC].offsetLeft;\n\t\t\t\t\tif(nCOL >= cw+parseInt(sl,10)) {\n\t\t\t\t\t\t$($t.grid.bDiv)[0].scrollLeft = $($t.grid.bDiv)[0].scrollLeft + $t.rows[iR].cells[iC].clientWidth;\n\t\t\t\t\t} else if (pCOL < sl) {\n\t\t\t\t\t\t$($t.grid.bDiv)[0].scrollLeft = $($t.grid.bDiv)[0].scrollLeft - $t.rows[iR].cells[iC].clientWidth;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfunction findNextVisible(iC,act){\n\t\t\t\tvar ind, i;\n\t\t\t\tif(act === 'lft') {\n\t\t\t\t\tind = iC+1;\n\t\t\t\t\tfor (i=iC;i>=0;i--){\n\t\t\t\t\t\tif ($t.p.colModel[i].hidden !== true) {\n\t\t\t\t\t\t\tind = i;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(act === 'rgt') {\n\t\t\t\t\tind = iC-1;\n\t\t\t\t\tfor (i=iC; i<$t.p.colModel.length;i++){\n\t\t\t\t\t\tif ($t.p.colModel[i].hidden !== true) {\n\t\t\t\t\t\t\tind = i;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ind;\n\t\t\t}\n\n\t\t\t$(selection).insertBefore($t.grid.cDiv);\n\t\t\t$(\"#\"+$t.p.knv)\n\t\t\t.focus()\n\t\t\t.keydown(function (e){\n\t\t\t\tkdir = e.keyCode;\n\t\t\t\tif($t.p.direction === \"rtl\") {\n\t\t\t\t\tif(kdir===37) { kdir = 39;}\n\t\t\t\t\telse if (kdir===39) { kdir = 37; }\n\t\t\t\t}\n\t\t\t\tswitch (kdir) {\n\t\t\t\t\tcase 38:\n\t\t\t\t\t\tif ($t.p.iRow-1 >0 ) {\n\t\t\t\t\t\t\tscrollGrid($t.p.iRow-1,$t.p.iCol,'vu');\n\t\t\t\t\t\t\t$($t).jqGrid(\"editCell\",$t.p.iRow-1,$t.p.iCol,false);\n\t\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 40 :\n\t\t\t\t\t\tif ($t.p.iRow+1 <=  $t.rows.length-1) {\n\t\t\t\t\t\t\tscrollGrid($t.p.iRow+1,$t.p.iCol,'vd');\n\t\t\t\t\t\t\t$($t).jqGrid(\"editCell\",$t.p.iRow+1,$t.p.iCol,false);\n\t\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 37 :\n\t\t\t\t\t\tif ($t.p.iCol -1 >=  0) {\n\t\t\t\t\t\t\ti = findNextVisible($t.p.iCol-1,'lft');\n\t\t\t\t\t\t\tscrollGrid($t.p.iRow, i,'h');\n\t\t\t\t\t\t\t$($t).jqGrid(\"editCell\",$t.p.iRow, i,false);\n\t\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 39 :\n\t\t\t\t\t\tif ($t.p.iCol +1 <=  $t.p.colModel.length-1) {\n\t\t\t\t\t\t\ti = findNextVisible($t.p.iCol+1,'rgt');\n\t\t\t\t\t\t\tscrollGrid($t.p.iRow,i,'h');\n\t\t\t\t\t\t\t$($t).jqGrid(\"editCell\",$t.p.iRow,i,false);\n\t\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 13:\n\t\t\t\t\t\tif (parseInt($t.p.iCol,10)>=0 && parseInt($t.p.iRow,10)>=0) {\n\t\t\t\t\t\t\t$($t).jqGrid(\"editCell\",$t.p.iRow,$t.p.iCol,true);\n\t\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\tdefault :\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\t\t});\n\t},\n\tgetChangedCells : function (mthd) {\n\t\tvar ret=[];\n\t\tif (!mthd) {mthd='all';}\n\t\tthis.each(function(){\n\t\t\tvar $t= this,nm;\n\t\t\tif (!$t.grid || $t.p.cellEdit !== true ) {return;}\n\t\t\t$($t.rows).each(function(j){\n\t\t\t\tvar res = {};\n\t\t\t\tif ($(this).hasClass(\"edited\")) {\n\t\t\t\t\t$('td',this).each( function(i) {\n\t\t\t\t\t\tnm = $t.p.colModel[i].name;\n\t\t\t\t\t\tif ( nm !== 'cb' && nm !== 'subgrid') {\n\t\t\t\t\t\t\tif (mthd==='dirty') {\n\t\t\t\t\t\t\t\tif ($(this).hasClass('dirty-cell')) {\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tres[nm] = $.unformat.call($t,this,{rowId:$t.rows[j].id, colModel:$t.p.colModel[i]},i);\n\t\t\t\t\t\t\t\t\t} catch (e){\n\t\t\t\t\t\t\t\t\t\tres[nm] = $.jgrid.htmlDecode($(this).html());\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tres[nm] = $.unformat.call($t,this,{rowId:$t.rows[j].id,colModel:$t.p.colModel[i]},i);\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tres[nm] = $.jgrid.htmlDecode($(this).html());\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tres.id = this.id;\n\t\t\t\t\tret.push(res);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\treturn ret;\n\t}\n/// end  cell editing\n});\n})(jQuery);\n/*jshint eqeqeq:false */\n/*global jQuery */\n(function($){\n/**\n * jqGrid extension for SubGrid Data\n * Tony Tomov tony@trirand.com\n * http://trirand.com/blog/ \n * Dual licensed under the MIT and GPL licenses:\n * http://www.opensource.org/licenses/mit-license.php\n * http://www.gnu.org/licenses/gpl-2.0.html\n**/\n\"use strict\";\n$.jgrid.extend({\nsetSubGrid : function () {\n\treturn this.each(function (){\n\t\tvar $t = this, cm, i,\n\t\tsuboptions = {\n\t\t\tplusicon : \"ui-icon-plus\",\n\t\t\tminusicon : \"ui-icon-minus\",\n\t\t\topenicon: \"ui-icon-carat-1-sw\",\n\t\t\texpandOnLoad:  false,\n\t\t\tdelayOnLoad : 50,\n\t\t\tselectOnExpand : false,\n\t\t\treloadOnExpand : true\n\t\t};\n\t\t$t.p.subGridOptions = $.extend(suboptions, $t.p.subGridOptions || {});\n\t\t$t.p.colNames.unshift(\"\");\n\t\t$t.p.colModel.unshift({name:'subgrid',width: $.jgrid.cell_width ?  $t.p.subGridWidth+$t.p.cellLayout : $t.p.subGridWidth,sortable: false,resizable:false,hidedlg:true,search:false,fixed:true});\n\t\tcm = $t.p.subGridModel;\n\t\tif(cm[0]) {\n\t\t\tcm[0].align = $.extend([],cm[0].align || []);\n\t\t\tfor(i=0;i<cm[0].name.length;i++) { cm[0].align[i] = cm[0].align[i] || 'left';}\n\t\t}\n\t});\n},\naddSubGridCell :function (pos,iRow) {\n\tvar prp='',ic,sid;\n\tthis.each(function(){\n\t\tprp = this.formatCol(pos,iRow);\n\t\tsid= this.p.id;\n\t\tic = this.p.subGridOptions.plusicon;\n\t});\n\treturn \"<td role=\\\"gridcell\\\" aria-describedby=\\\"\"+sid+\"_subgrid\\\" class=\\\"ui-sgcollapsed sgcollapsed\\\" \"+prp+\"><a href='javascript:void(0);'><span class='ui-icon \"+ic+\"'></span></a></td>\";\n},\naddSubGrid : function( pos, sind ) {\n\treturn this.each(function(){\n\t\tvar ts = this;\n\t\tif (!ts.grid ) { return; }\n\t\t//-------------------------\n\t\tvar subGridCell = function(trdiv,cell,pos)\n\t\t{\n\t\t\tvar tddiv = $(\"<td align='\"+ts.p.subGridModel[0].align[pos]+\"'></td>\").html(cell);\n\t\t\t$(trdiv).append(tddiv);\n\t\t};\n\t\tvar subGridXml = function(sjxml, sbid){\n\t\t\tvar tddiv, i,  sgmap,\n\t\t\tdummy = $(\"<table cellspacing='0' cellpadding='0' border='0'><tbody></tbody></table>\"),\n\t\t\ttrdiv = $(\"<tr></tr>\");\n\t\t\tfor (i = 0; i<ts.p.subGridModel[0].name.length; i++) {\n\t\t\t\ttddiv = $(\"<th class='ui-state-default ui-th-subgrid ui-th-column ui-th-\"+ts.p.direction+\"'></th>\");\n\t\t\t\t$(tddiv).html(ts.p.subGridModel[0].name[i]);\n\t\t\t\t$(tddiv).width( ts.p.subGridModel[0].width[i]);\n\t\t\t\t$(trdiv).append(tddiv);\n\t\t\t}\n\t\t\t$(dummy).append(trdiv);\n\t\t\tif (sjxml){\n\t\t\t\tsgmap = ts.p.xmlReader.subgrid;\n\t\t\t\t$(sgmap.root+\" \"+sgmap.row, sjxml).each( function(){\n\t\t\t\t\ttrdiv = $(\"<tr class='ui-widget-content ui-subtblcell'></tr>\");\n\t\t\t\t\tif(sgmap.repeatitems === true) {\n\t\t\t\t\t\t$(sgmap.cell,this).each( function(i) {\n\t\t\t\t\t\t\tsubGridCell(trdiv, $(this).text() || '&#160;',i);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar f = ts.p.subGridModel[0].mapping || ts.p.subGridModel[0].name;\n\t\t\t\t\t\tif (f) {\n\t\t\t\t\t\t\tfor (i=0;i<f.length;i++) {\n\t\t\t\t\t\t\t\tsubGridCell(trdiv, $(f[i],this).text() || '&#160;',i);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$(dummy).append(trdiv);\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar pID = $(\"table:first\",ts.grid.bDiv).attr(\"id\")+\"_\";\n\t\t\t$(\"#\"+$.jgrid.jqID(pID+sbid)).append(dummy);\n\t\t\tts.grid.hDiv.loading = false;\n\t\t\t$(\"#load_\"+$.jgrid.jqID(ts.p.id)).hide();\n\t\t\treturn false;\n\t\t};\n\t\tvar subGridJson = function(sjxml, sbid){\n\t\t\tvar tddiv,result,i,cur, sgmap,j,\n\t\t\tdummy = $(\"<table cellspacing='0' cellpadding='0' border='0'><tbody></tbody></table>\"),\n\t\t\ttrdiv = $(\"<tr></tr>\");\n\t\t\tfor (i = 0; i<ts.p.subGridModel[0].name.length; i++) {\n\t\t\t\ttddiv = $(\"<th class='ui-state-default ui-th-subgrid ui-th-column ui-th-\"+ts.p.direction+\"'></th>\");\n\t\t\t\t$(tddiv).html(ts.p.subGridModel[0].name[i]);\n\t\t\t\t$(tddiv).width( ts.p.subGridModel[0].width[i]);\n\t\t\t\t$(trdiv).append(tddiv);\n\t\t\t}\n\t\t\t$(dummy).append(trdiv);\n\t\t\tif (sjxml){\n\t\t\t\tsgmap = ts.p.jsonReader.subgrid;\n\t\t\t\tresult = $.jgrid.getAccessor(sjxml, sgmap.root);\n\t\t\t\tif ( result !== undefined ) {\n\t\t\t\t\tfor (i=0;i<result.length;i++) {\n\t\t\t\t\t\tcur = result[i];\n\t\t\t\t\t\ttrdiv = $(\"<tr class='ui-widget-content ui-subtblcell'></tr>\");\n\t\t\t\t\t\tif(sgmap.repeatitems === true) {\n\t\t\t\t\t\t\tif(sgmap.cell) { cur=cur[sgmap.cell]; }\n\t\t\t\t\t\t\tfor (j=0;j<cur.length;j++) {\n\t\t\t\t\t\t\t\tsubGridCell(trdiv, cur[j] || '&#160;',j);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar f = ts.p.subGridModel[0].mapping || ts.p.subGridModel[0].name;\n\t\t\t\t\t\t\tif(f.length) {\n\t\t\t\t\t\t\t\tfor (j=0;j<f.length;j++) {\n\t\t\t\t\t\t\t\t\tsubGridCell(trdiv, cur[f[j]] || '&#160;',j);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$(dummy).append(trdiv);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar pID = $(\"table:first\",ts.grid.bDiv).attr(\"id\")+\"_\";\n\t\t\t$(\"#\"+$.jgrid.jqID(pID+sbid)).append(dummy);\n\t\t\tts.grid.hDiv.loading = false;\n\t\t\t$(\"#load_\"+$.jgrid.jqID(ts.p.id)).hide();\n\t\t\treturn false;\n\t\t};\n\t\tvar populatesubgrid = function( rd )\n\t\t{\n\t\t\tvar sid,dp, i, j;\n\t\t\tsid = $(rd).attr(\"id\");\n\t\t\tdp = {nd_: (new Date().getTime())};\n\t\t\tdp[ts.p.prmNames.subgridid]=sid;\n\t\t\tif(!ts.p.subGridModel[0]) { return false; }\n\t\t\tif(ts.p.subGridModel[0].params) {\n\t\t\t\tfor(j=0; j < ts.p.subGridModel[0].params.length; j++) {\n\t\t\t\t\tfor(i=0; i<ts.p.colModel.length; i++) {\n\t\t\t\t\t\tif(ts.p.colModel[i].name === ts.p.subGridModel[0].params[j]) {\n\t\t\t\t\t\t\tdp[ts.p.colModel[i].name]= $(\"td:eq(\"+i+\")\",rd).text().replace(/\\&#160\\;/ig,'');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(!ts.grid.hDiv.loading) {\n\t\t\t\tts.grid.hDiv.loading = true;\n\t\t\t\t$(\"#load_\"+$.jgrid.jqID(ts.p.id)).show();\n\t\t\t\tif(!ts.p.subgridtype) { ts.p.subgridtype = ts.p.datatype; }\n\t\t\t\tif($.isFunction(ts.p.subgridtype)) {\n\t\t\t\t\tts.p.subgridtype.call(ts, dp);\n\t\t\t\t} else {\n\t\t\t\t\tts.p.subgridtype = ts.p.subgridtype.toLowerCase();\n\t\t\t\t}\n\t\t\t\tswitch(ts.p.subgridtype) {\n\t\t\t\t\tcase \"xml\":\n\t\t\t\t\tcase \"json\":\n\t\t\t\t\t$.ajax($.extend({\n\t\t\t\t\t\ttype:ts.p.mtype,\n\t\t\t\t\t\turl: ts.p.subGridUrl,\n\t\t\t\t\t\tdataType:ts.p.subgridtype,\n\t\t\t\t\t\tdata: $.isFunction(ts.p.serializeSubGridData)? ts.p.serializeSubGridData.call(ts, dp) : dp,\n\t\t\t\t\t\tcomplete: function(sxml) {\n\t\t\t\t\t\t\tif(ts.p.subgridtype === \"xml\") {\n\t\t\t\t\t\t\t\tsubGridXml(sxml.responseXML, sid);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tsubGridJson($.jgrid.parse(sxml.responseText),sid);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsxml=null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}, $.jgrid.ajaxOptions, ts.p.ajaxSubgridOptions || {}));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\t\tvar _id, pID,atd, nhc=0, bfsc, r;\n\t\t$.each(ts.p.colModel,function(){\n\t\t\tif(this.hidden === true || this.name === 'rn' || this.name === 'cb') {\n\t\t\t\tnhc++;\n\t\t\t}\n\t\t});\n\t\tvar len = ts.rows.length, i=1;\n\t\tif( sind !== undefined && sind > 0) {\n\t\t\ti = sind;\n\t\t\tlen = sind+1;\n\t\t}\n\t\twhile(i < len) {\n\t\t\tif($(ts.rows[i]).hasClass('jqgrow')) {\n\t\t\t\t$(ts.rows[i].cells[pos]).bind('click', function() {\n\t\t\t\t\tvar tr = $(this).parent(\"tr\")[0];\n\t\t\t\t\tr = tr.nextSibling;\n\t\t\t\t\tif($(this).hasClass(\"sgcollapsed\")) {\n\t\t\t\t\t\tpID = ts.p.id;\n\t\t\t\t\t\t_id = tr.id;\n\t\t\t\t\t\tif(ts.p.subGridOptions.reloadOnExpand === true || ( ts.p.subGridOptions.reloadOnExpand === false && !$(r).hasClass('ui-subgrid') ) ) {\n\t\t\t\t\t\t\tatd = pos >=1 ? \"<td colspan='\"+pos+\"'>&#160;</td>\":\"\";\n\t\t\t\t\t\t\tbfsc = $(ts).triggerHandler(\"jqGridSubGridBeforeExpand\", [pID + \"_\" + _id, _id]);\n\t\t\t\t\t\t\tbfsc = (bfsc === false || bfsc === 'stop') ? false : true;\n\t\t\t\t\t\t\tif(bfsc && $.isFunction(ts.p.subGridBeforeExpand)) {\n\t\t\t\t\t\t\t\tbfsc = ts.p.subGridBeforeExpand.call(ts, pID+\"_\"+_id,_id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(bfsc === false) {return false;}\n\t\t\t\t\t\t\t$(tr).after( \"<tr role='row' class='ui-subgrid'>\"+atd+\"<td class='ui-widget-content subgrid-cell'><span class='ui-icon \"+ts.p.subGridOptions.openicon+\"'></span></td><td colspan='\"+parseInt(ts.p.colNames.length-1-nhc,10)+\"' class='ui-widget-content subgrid-data'><div id=\"+pID+\"_\"+_id+\" class='tablediv'></div></td></tr>\" );\n\t\t\t\t\t\t\t$(ts).triggerHandler(\"jqGridSubGridRowExpanded\", [pID + \"_\" + _id, _id]);\n\t\t\t\t\t\t\tif( $.isFunction(ts.p.subGridRowExpanded)) {\n\t\t\t\t\t\t\t\tts.p.subGridRowExpanded.call(ts, pID+\"_\"+ _id,_id);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tpopulatesubgrid(tr);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$(r).show();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$(this).html(\"<a href='javascript:void(0);'><span class='ui-icon \"+ts.p.subGridOptions.minusicon+\"'></span></a>\").removeClass(\"sgcollapsed\").addClass(\"sgexpanded\");\n\t\t\t\t\t\tif(ts.p.subGridOptions.selectOnExpand) {\n\t\t\t\t\t\t\t$(ts).jqGrid('setSelection',_id);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if($(this).hasClass(\"sgexpanded\")) {\n\t\t\t\t\t\tbfsc = $(ts).triggerHandler(\"jqGridSubGridRowColapsed\", [pID + \"_\" + _id, _id]);\n\t\t\t\t\t\tbfsc = (bfsc === false || bfsc === 'stop') ? false : true;\n\t\t\t\t\t\tif( bfsc &&  $.isFunction(ts.p.subGridRowColapsed)) {\n\t\t\t\t\t\t\t_id = tr.id;\n\t\t\t\t\t\t\tbfsc = ts.p.subGridRowColapsed.call(ts, pID+\"_\"+_id,_id );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(bfsc===false) {return false;}\n\t\t\t\t\t\tif(ts.p.subGridOptions.reloadOnExpand === true) {\n\t\t\t\t\t\t\t$(r).remove(\".ui-subgrid\");\n\t\t\t\t\t\t} else if($(r).hasClass('ui-subgrid')) { // incase of dynamic deleting\n\t\t\t\t\t\t\t$(r).hide();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$(this).html(\"<a href='javascript:void(0);'><span class='ui-icon \"+ts.p.subGridOptions.plusicon+\"'></span></a>\").removeClass(\"sgexpanded\").addClass(\"sgcollapsed\");\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\t\tif(ts.p.subGridOptions.expandOnLoad === true) {\n\t\t\t$(ts.rows).filter('.jqgrow').each(function(index,row){\n\t\t\t\t$(row.cells[0]).click();\n\t\t\t});\n\t\t}\n\t\tts.subGridXml = function(xml,sid) {subGridXml(xml,sid);};\n\t\tts.subGridJson = function(json,sid) {subGridJson(json,sid);};\n\t});\n},\nexpandSubGridRow : function(rowid) {\n\treturn this.each(function () {\n\t\tvar $t = this;\n\t\tif(!$t.grid && !rowid) {return;}\n\t\tif($t.p.subGrid===true) {\n\t\t\tvar rc = $(this).jqGrid(\"getInd\",rowid,true);\n\t\t\tif(rc) {\n\t\t\t\tvar sgc = $(\"td.sgcollapsed\",rc)[0];\n\t\t\t\tif(sgc) {\n\t\t\t\t\t$(sgc).trigger(\"click\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n},\ncollapseSubGridRow : function(rowid) {\n\treturn this.each(function () {\n\t\tvar $t = this;\n\t\tif(!$t.grid && !rowid) {return;}\n\t\tif($t.p.subGrid===true) {\n\t\t\tvar rc = $(this).jqGrid(\"getInd\",rowid,true);\n\t\t\tif(rc) {\n\t\t\t\tvar sgc = $(\"td.sgexpanded\",rc)[0];\n\t\t\t\tif(sgc) {\n\t\t\t\t\t$(sgc).trigger(\"click\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n},\ntoggleSubGridRow : function(rowid) {\n\treturn this.each(function () {\n\t\tvar $t = this;\n\t\tif(!$t.grid && !rowid) {return;}\n\t\tif($t.p.subGrid===true) {\n\t\t\tvar rc = $(this).jqGrid(\"getInd\",rowid,true);\n\t\t\tif(rc) {\n\t\t\t\tvar sgc = $(\"td.sgcollapsed\",rc)[0];\n\t\t\t\tif(sgc) {\n\t\t\t\t\t$(sgc).trigger(\"click\");\n\t\t\t\t} else {\n\t\t\t\t\tsgc = $(\"td.sgexpanded\",rc)[0];\n\t\t\t\t\tif(sgc) {\n\t\t\t\t\t\t$(sgc).trigger(\"click\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n}\n});\n})(jQuery);\n/**\n * jqGrid extension - Tree Grid\n * Tony Tomov tony@trirand.com\n * http://trirand.com/blog/\n * Dual licensed under the MIT and GPL licenses:\n * http://www.opensource.org/licenses/mit-license.php\n * http://www.gnu.org/licenses/gpl.html\n**/\n\n/*jshint eqeqeq:false */\n/*global jQuery */\n(function($) {\n\"use strict\";\n$.jgrid.extend({\n\tsetTreeNode : function(i, len){\n\t\treturn this.each(function(){\n\t\t\tvar $t = this;\n\t\t\tif( !$t.grid || !$t.p.treeGrid ) {return;}\n\t\t\tvar expCol = $t.p.expColInd,\n\t\t\texpanded = $t.p.treeReader.expanded_field,\n\t\t\tisLeaf = $t.p.treeReader.leaf_field,\n\t\t\tlevel = $t.p.treeReader.level_field,\n\t\t\ticon = $t.p.treeReader.icon_field,\n\t\t\tloaded = $t.p.treeReader.loaded,  lft, rgt, curLevel, ident,lftpos, twrap,\n\t\t\tldat, lf;\n\t\t\twhile(i<len) {\n\t\t\t\tvar ind = $.jgrid.stripPref($t.p.idPrefix, $t.rows[i].id), dind = $t.p._index[ind], expan;\n\t\t\t\tldat = $t.p.data[dind];\n\t\t\t\t//$t.rows[i].level = ldat[level];\n\t\t\t\tif($t.p.treeGridModel === 'nested') {\n\t\t\t\t\tif(!ldat[isLeaf]) {\n\t\t\t\t\tlft = parseInt(ldat[$t.p.treeReader.left_field],10);\n\t\t\t\t\trgt = parseInt(ldat[$t.p.treeReader.right_field],10);\n\t\t\t\t\t// NS Model\n\t\t\t\t\t\tldat[isLeaf] = (rgt === lft+1) ? 'true' : 'false';\n\t\t\t\t\t\t$t.rows[i].cells[$t.p._treeleafpos].innerHTML = ldat[isLeaf];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t//else {\n\t\t\t\t\t//row.parent_id = rd[$t.p.treeReader.parent_id_field];\n\t\t\t\t//}\n\t\t\t\tcurLevel = parseInt(ldat[level],10);\n\t\t\t\tif($t.p.tree_root_level === 0) {\n\t\t\t\t\tident = curLevel+1;\n\t\t\t\t\tlftpos = curLevel;\n\t\t\t\t} else {\n\t\t\t\t\tident = curLevel;\n\t\t\t\t\tlftpos = curLevel -1;\n\t\t\t\t}\n\t\t\t\ttwrap = \"<div class='tree-wrap tree-wrap-\"+$t.p.direction+\"' style='width:\"+(ident*18)+\"px;'>\";\n\t\t\t\ttwrap += \"<div style='\"+($t.p.direction===\"rtl\" ? \"right:\" : \"left:\")+(lftpos*18)+\"px;' class='ui-icon \";\n\n\n\t\t\t\tif(ldat[loaded] !== undefined) {\n\t\t\t\t\tif(ldat[loaded]===\"true\" || ldat[loaded]===true) {\n\t\t\t\t\t\tldat[loaded] = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tldat[loaded] = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(ldat[isLeaf] === \"true\" || ldat[isLeaf] === true) {\n\t\t\t\t\ttwrap += ((ldat[icon] !== undefined && ldat[icon] !== \"\") ? ldat[icon] : $t.p.treeIcons.leaf)+\" tree-leaf treeclick\";\n\t\t\t\t\tldat[isLeaf] = true;\n\t\t\t\t\tlf=\"leaf\";\n\t\t\t\t} else {\n\t\t\t\t\tldat[isLeaf] = false;\n\t\t\t\t\tlf=\"\";\n\t\t\t\t}\n\t\t\t\tldat[expanded] = ((ldat[expanded] === \"true\" || ldat[expanded] === true) ? true : false) && (ldat[loaded] || ldat[loaded] === undefined);\n\t\t\t\tif(ldat[expanded] === false) {\n\t\t\t\t\ttwrap += ((ldat[isLeaf] === true) ? \"'\" : $t.p.treeIcons.plus+\" tree-plus treeclick'\");\n\t\t\t\t} else {\n\t\t\t\t\ttwrap += ((ldat[isLeaf] === true) ? \"'\" : $t.p.treeIcons.minus+\" tree-minus treeclick'\");\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\ttwrap += \"></div></div>\";\n\t\t\t\t$($t.rows[i].cells[expCol]).wrapInner(\"<span class='cell-wrapper\"+lf+\"'></span>\").prepend(twrap);\n\n\t\t\t\tif(curLevel !== parseInt($t.p.tree_root_level,10)) {\n\t\t\t\t\tvar pn = $($t).jqGrid('getNodeParent',ldat);\n\t\t\t\t\texpan = pn && pn.hasOwnProperty(expanded) ? pn[expanded] : true;\n\t\t\t\t\tif( !expan ){\n\t\t\t\t\t\t$($t.rows[i]).css(\"display\",\"none\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$($t.rows[i].cells[expCol])\n\t\t\t\t\t.find(\"div.treeclick\")\n\t\t\t\t\t.bind(\"click\",function(e){\n\t\t\t\t\t\tvar target = e.target || e.srcElement,\n\t\t\t\t\t\tind2 =$.jgrid.stripPref($t.p.idPrefix,$(target,$t.rows).closest(\"tr.jqgrow\")[0].id),\n\t\t\t\t\t\tpos = $t.p._index[ind2];\n\t\t\t\t\t\tif(!$t.p.data[pos][isLeaf]){\n\t\t\t\t\t\t\tif($t.p.data[pos][expanded]){\n\t\t\t\t\t\t\t\t$($t).jqGrid(\"collapseRow\",$t.p.data[pos]);\n\t\t\t\t\t\t\t\t$($t).jqGrid(\"collapseNode\",$t.p.data[pos]);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$($t).jqGrid(\"expandRow\",$t.p.data[pos]);\n\t\t\t\t\t\t\t\t$($t).jqGrid(\"expandNode\",$t.p.data[pos]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t});\n\t\t\t\tif($t.p.ExpandColClick === true) {\n\t\t\t\t\t$($t.rows[i].cells[expCol])\n\t\t\t\t\t\t.find(\"span.cell-wrapper\")\n\t\t\t\t\t\t.css(\"cursor\",\"pointer\")\n\t\t\t\t\t\t.bind(\"click\",function(e) {\n\t\t\t\t\t\t\tvar target = e.target || e.srcElement,\n\t\t\t\t\t\t\tind2 =$.jgrid.stripPref($t.p.idPrefix,$(target,$t.rows).closest(\"tr.jqgrow\")[0].id),\n\t\t\t\t\t\t\tpos = $t.p._index[ind2];\n\t\t\t\t\t\t\tif(!$t.p.data[pos][isLeaf]){\n\t\t\t\t\t\t\t\tif($t.p.data[pos][expanded]){\n\t\t\t\t\t\t\t\t\t$($t).jqGrid(\"collapseRow\",$t.p.data[pos]);\n\t\t\t\t\t\t\t\t\t$($t).jqGrid(\"collapseNode\",$t.p.data[pos]);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t$($t).jqGrid(\"expandRow\",$t.p.data[pos]);\n\t\t\t\t\t\t\t\t\t$($t).jqGrid(\"expandNode\",$t.p.data[pos]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$($t).jqGrid(\"setSelection\",ind2);\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t});\n\t},\n\tsetTreeGrid : function() {\n\t\treturn this.each(function (){\n\t\t\tvar $t = this, i=0, pico, ecol = false, nm, key, tkey, dupcols=[];\n\t\t\tif(!$t.p.treeGrid) {return;}\n\t\t\tif(!$t.p.treedatatype ) {$.extend($t.p,{treedatatype: $t.p.datatype});}\n\t\t\t$t.p.subGrid = false;$t.p.altRows =false;\n\t\t\t$t.p.pgbuttons = false;$t.p.pginput = false;\n\t\t\t$t.p.gridview =  true;\n\t\t\tif($t.p.rowTotal === null ) { $t.p.rowNum = 10000; }\n\t\t\t$t.p.multiselect = false;$t.p.rowList = [];\n\t\t\t$t.p.expColInd = 0;\n\t\t\tpico = 'ui-icon-triangle-1-' + ($t.p.direction===\"rtl\" ? 'w' : 'e');\n\t\t\t$t.p.treeIcons = $.extend({plus:pico,minus:'ui-icon-triangle-1-s',leaf:'ui-icon-radio-off'},$t.p.treeIcons || {});\n\t\t\tif($t.p.treeGridModel === 'nested') {\n\t\t\t\t$t.p.treeReader = $.extend({\n\t\t\t\t\tlevel_field: \"level\",\n\t\t\t\t\tleft_field:\"lft\",\n\t\t\t\t\tright_field: \"rgt\",\n\t\t\t\t\tleaf_field: \"isLeaf\",\n\t\t\t\t\texpanded_field: \"expanded\",\n\t\t\t\t\tloaded: \"loaded\",\n\t\t\t\t\ticon_field: \"icon\"\n\t\t\t\t},$t.p.treeReader);\n\t\t\t} else if($t.p.treeGridModel === 'adjacency') {\n\t\t\t\t$t.p.treeReader = $.extend({\n\t\t\t\t\t\tlevel_field: \"level\",\n\t\t\t\t\t\tparent_id_field: \"parent\",\n\t\t\t\t\t\tleaf_field: \"isLeaf\",\n\t\t\t\t\t\texpanded_field: \"expanded\",\n\t\t\t\t\t\tloaded: \"loaded\",\n\t\t\t\t\t\ticon_field: \"icon\"\n\t\t\t\t},$t.p.treeReader );\n\t\t\t}\n\t\t\tfor ( key in $t.p.colModel){\n\t\t\t\tif($t.p.colModel.hasOwnProperty(key)) {\n\t\t\t\t\tnm = $t.p.colModel[key].name;\n\t\t\t\t\tif( nm === $t.p.ExpandColumn && !ecol ) {\n\t\t\t\t\t\tecol = true;\n\t\t\t\t\t\t$t.p.expColInd = i;\n\t\t\t\t\t}\n\t\t\t\t\ti++;\n\t\t\t\t\t//\n\t\t\t\t\tfor(tkey in $t.p.treeReader) {\n\t\t\t\t\t\tif($t.p.treeReader.hasOwnProperty(tkey) && $t.p.treeReader[tkey] === nm) {\n\t\t\t\t\t\t\tdupcols.push(nm);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t$.each($t.p.treeReader,function(j,n){\n\t\t\t\tif(n && $.inArray(n, dupcols) === -1){\n\t\t\t\t\tif(j==='leaf_field') { $t.p._treeleafpos= i; }\n\t\t\t\ti++;\n\t\t\t\t\t$t.p.colNames.push(n);\n\t\t\t\t\t$t.p.colModel.push({name:n,width:1,hidden:true,sortable:false,resizable:false,hidedlg:true,editable:true,search:false});\n\t\t\t\t}\n\t\t\t});\t\t\t\n\t\t});\n\t},\n\texpandRow: function (record){\n\t\tthis.each(function(){\n\t\t\tvar $t = this;\n\t\t\tif(!$t.grid || !$t.p.treeGrid) {return;}\n\t\t\tvar childern = $($t).jqGrid(\"getNodeChildren\",record),\n\t\t\t//if ($($t).jqGrid(\"isVisibleNode\",record)) {\n\t\t\texpanded = $t.p.treeReader.expanded_field,\n\t\t\trows = $t.rows;\n\t\t\t$(childern).each(function(){\n\t\t\t\tvar id  = $t.p.idPrefix + $.jgrid.getAccessor(this,$t.p.localReader.id);\n\t\t\t\t$(rows.namedItem(id)).css(\"display\",\"\");\n\t\t\t\tif(this[expanded]) {\n\t\t\t\t\t$($t).jqGrid(\"expandRow\",this);\n\t\t\t\t}\n\t\t\t});\n\t\t\t//}\n\t\t});\n\t},\n\tcollapseRow : function (record) {\n\t\tthis.each(function(){\n\t\t\tvar $t = this;\n\t\t\tif(!$t.grid || !$t.p.treeGrid) {return;}\n\t\t\tvar childern = $($t).jqGrid(\"getNodeChildren\",record),\n\t\t\texpanded = $t.p.treeReader.expanded_field,\n\t\t\trows = $t.rows;\n\t\t\t$(childern).each(function(){\n\t\t\t\tvar id  = $t.p.idPrefix + $.jgrid.getAccessor(this,$t.p.localReader.id);\n\t\t\t\t$(rows.namedItem(id)).css(\"display\",\"none\");\n\t\t\t\tif(this[expanded]){\n\t\t\t\t\t$($t).jqGrid(\"collapseRow\",this);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t},\n\t// NS ,adjacency models\n\tgetRootNodes : function() {\n\t\tvar result = [];\n\t\tthis.each(function(){\n\t\t\tvar $t = this;\n\t\t\tif(!$t.grid || !$t.p.treeGrid) {return;}\n\t\t\tswitch ($t.p.treeGridModel) {\n\t\t\t\tcase 'nested' :\n\t\t\t\t\tvar level = $t.p.treeReader.level_field;\n\t\t\t\t\t$($t.p.data).each(function(){\n\t\t\t\t\t\tif(parseInt(this[level],10) === parseInt($t.p.tree_root_level,10)) {\n\t\t\t\t\t\t\tresult.push(this);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'adjacency' :\n\t\t\t\t\tvar parent_id = $t.p.treeReader.parent_id_field;\n\t\t\t\t\t$($t.p.data).each(function(){\n\t\t\t\t\t\tif(this[parent_id] === null || String(this[parent_id]).toLowerCase() === \"null\") {\n\t\t\t\t\t\t\tresult.push(this);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t\treturn result;\n\t},\n\tgetNodeDepth : function(rc) {\n\t\tvar ret = null;\n\t\tthis.each(function(){\n\t\t\tif(!this.grid || !this.p.treeGrid) {return;}\n\t\t\tvar $t = this;\n\t\t\tswitch ($t.p.treeGridModel) {\n\t\t\t\tcase 'nested' :\n\t\t\t\t\tvar level = $t.p.treeReader.level_field;\n\t\t\t\t\tret = parseInt(rc[level],10) - parseInt($t.p.tree_root_level,10);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'adjacency' :\n\t\t\t\t\tret = $($t).jqGrid(\"getNodeAncestors\",rc).length;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t\treturn ret;\n\t},\n\tgetNodeParent : function(rc) {\n\t\tvar result = null;\n\t\tthis.each(function(){\n\t\t\tvar $t = this;\n\t\t\tif(!$t.grid || !$t.p.treeGrid) {return;}\n\t\t\tswitch ($t.p.treeGridModel) {\n\t\t\t\tcase 'nested' :\n\t\t\t\t\tvar lftc = $t.p.treeReader.left_field,\n\t\t\t\t\trgtc = $t.p.treeReader.right_field,\n\t\t\t\t\tlevelc = $t.p.treeReader.level_field,\n\t\t\t\t\tlft = parseInt(rc[lftc],10), rgt = parseInt(rc[rgtc],10), level = parseInt(rc[levelc],10);\n\t\t\t\t\t$(this.p.data).each(function(){\n\t\t\t\t\t\tif(parseInt(this[levelc],10) === level-1 && parseInt(this[lftc],10) < lft && parseInt(this[rgtc],10) > rgt) {\n\t\t\t\t\t\t\tresult = this;\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'adjacency' :\n\t\t\t\t\tvar parent_id = $t.p.treeReader.parent_id_field,\n\t\t\t\t\tdtid = $t.p.localReader.id;\n\t\t\t\t\t$(this.p.data).each(function(){\n\t\t\t\t\t\tif(this[dtid] === $.jgrid.stripPref($t.p.idPrefix, rc[parent_id]) ) {\n\t\t\t\t\t\t\tresult = this;\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t\treturn result;\n\t},\n\tgetNodeChildren : function(rc) {\n\t\tvar result = [];\n\t\tthis.each(function(){\n\t\t\tvar $t = this;\n\t\t\tif(!$t.grid || !$t.p.treeGrid) {return;}\n\t\t\tswitch ($t.p.treeGridModel) {\n\t\t\t\tcase 'nested' :\n\t\t\t\t\tvar lftc = $t.p.treeReader.left_field,\n\t\t\t\t\trgtc = $t.p.treeReader.right_field,\n\t\t\t\t\tlevelc = $t.p.treeReader.level_field,\n\t\t\t\t\tlft = parseInt(rc[lftc],10), rgt = parseInt(rc[rgtc],10), level = parseInt(rc[levelc],10);\n\t\t\t\t\t$(this.p.data).each(function(){\n\t\t\t\t\t\tif(parseInt(this[levelc],10) === level+1 && parseInt(this[lftc],10) > lft && parseInt(this[rgtc],10) < rgt) {\n\t\t\t\t\t\t\tresult.push(this);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'adjacency' :\n\t\t\t\t\tvar parent_id = $t.p.treeReader.parent_id_field,\n\t\t\t\t\tdtid = $t.p.localReader.id;\n\t\t\t\t\t$(this.p.data).each(function(){\n\t\t\t\t\t\tif(this[parent_id] == $.jgrid.stripPref($t.p.idPrefix, rc[dtid])) {\n\t\t\t\t\t\t\tresult.push(this);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t\treturn result;\n\t},\n\tgetFullTreeNode : function(rc) {\n\t\tvar result = [];\n\t\tthis.each(function(){\n\t\t\tvar $t = this, len;\n\t\t\tif(!$t.grid || !$t.p.treeGrid) {return;}\n\t\t\tswitch ($t.p.treeGridModel) {\n\t\t\t\tcase 'nested' :\n\t\t\t\t\tvar lftc = $t.p.treeReader.left_field,\n\t\t\t\t\trgtc = $t.p.treeReader.right_field,\n\t\t\t\t\tlevelc = $t.p.treeReader.level_field,\n\t\t\t\t\tlft = parseInt(rc[lftc],10), rgt = parseInt(rc[rgtc],10), level = parseInt(rc[levelc],10);\n\t\t\t\t\t$(this.p.data).each(function(){\n\t\t\t\t\t\tif(parseInt(this[levelc],10) >= level && parseInt(this[lftc],10) >= lft && parseInt(this[lftc],10) <= rgt) {\n\t\t\t\t\t\t\tresult.push(this);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'adjacency' :\n\t\t\t\t\tif(rc) {\n\t\t\t\t\tresult.push(rc);\n\t\t\t\t\tvar parent_id = $t.p.treeReader.parent_id_field,\n\t\t\t\t\tdtid = $t.p.localReader.id;\n\t\t\t\t\t$(this.p.data).each(function(i){\n\t\t\t\t\t\tlen = result.length;\n\t\t\t\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t\t\t\tif ($.jgrid.stripPref($t.p.idPrefix, result[i][dtid]) === this[parent_id]) {\n\t\t\t\t\t\t\t\tresult.push(this);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t\treturn result;\n\t},\t\n\t// End NS, adjacency Model\n\tgetNodeAncestors : function(rc) {\n\t\tvar ancestors = [];\n\t\tthis.each(function(){\n\t\t\tif(!this.grid || !this.p.treeGrid) {return;}\n\t\t\tvar parent = $(this).jqGrid(\"getNodeParent\",rc);\n\t\t\twhile (parent) {\n\t\t\t\tancestors.push(parent);\n\t\t\t\tparent = $(this).jqGrid(\"getNodeParent\",parent);\t\n\t\t\t}\n\t\t});\n\t\treturn ancestors;\n\t},\n\tisVisibleNode : function(rc) {\n\t\tvar result = true;\n\t\tthis.each(function(){\n\t\t\tvar $t = this;\n\t\t\tif(!$t.grid || !$t.p.treeGrid) {return;}\n\t\t\tvar ancestors = $($t).jqGrid(\"getNodeAncestors\",rc),\n\t\t\texpanded = $t.p.treeReader.expanded_field;\n\t\t\t$(ancestors).each(function(){\n\t\t\t\tresult = result && this[expanded];\n\t\t\t\tif(!result) {return false;}\n\t\t\t});\n\t\t});\n\t\treturn result;\n\t},\n\tisNodeLoaded : function(rc) {\n\t\tvar result;\n\t\tthis.each(function(){\n\t\t\tvar $t = this;\n\t\t\tif(!$t.grid || !$t.p.treeGrid) {return;}\n\t\t\tvar isLeaf = $t.p.treeReader.leaf_field;\n\t\t\tif(rc !== undefined ) {\n\t\t\t\tif(rc.loaded !== undefined) {\n\t\t\t\t\tresult = rc.loaded;\n\t\t\t\t} else if( rc[isLeaf] || $($t).jqGrid(\"getNodeChildren\",rc).length > 0){\n\t\t\t\t\tresult = true;\n\t\t\t\t} else {\n\t\t\t\t\tresult = false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresult = false;\n\t\t\t}\n\t\t});\n\t\treturn result;\n\t},\n\texpandNode : function(rc) {\n\t\treturn this.each(function(){\n\t\t\tif(!this.grid || !this.p.treeGrid) {return;}\n\t\t\tvar expanded = this.p.treeReader.expanded_field,\n\t\t\tparent = this.p.treeReader.parent_id_field,\n\t\t\tloaded = this.p.treeReader.loaded,\n\t\t\tlevel = this.p.treeReader.level_field,\n\t\t\tlft = this.p.treeReader.left_field,\n\t\t\trgt = this.p.treeReader.right_field;\n\n\t\t\tif(!rc[expanded]) {\n\t\t\t\tvar id = $.jgrid.getAccessor(rc,this.p.localReader.id);\n\t\t\t\tvar rc1 = $(\"#\" + this.p.idPrefix + $.jgrid.jqID(id),this.grid.bDiv)[0];\n\t\t\t\tvar position = this.p._index[id];\n\t\t\t\tif( $(this).jqGrid(\"isNodeLoaded\",this.p.data[position]) ) {\n\t\t\t\t\trc[expanded] = true;\n\t\t\t\t\t$(\"div.treeclick\",rc1).removeClass(this.p.treeIcons.plus+\" tree-plus\").addClass(this.p.treeIcons.minus+\" tree-minus\");\n\t\t\t\t} else if (!this.grid.hDiv.loading) {\n\t\t\t\t\trc[expanded] = true;\n\t\t\t\t\t$(\"div.treeclick\",rc1).removeClass(this.p.treeIcons.plus+\" tree-plus\").addClass(this.p.treeIcons.minus+\" tree-minus\");\n\t\t\t\t\tthis.p.treeANode = rc1.rowIndex;\n\t\t\t\t\tthis.p.datatype = this.p.treedatatype;\n\t\t\t\t\tif(this.p.treeGridModel === 'nested') {\n\t\t\t\t\t\t$(this).jqGrid(\"setGridParam\",{postData:{nodeid:id,n_left:rc[lft],n_right:rc[rgt],n_level:rc[level]}});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$(this).jqGrid(\"setGridParam\",{postData:{nodeid:id,parentid:rc[parent],n_level:rc[level]}} );\n\t\t\t\t\t}\n\t\t\t\t\t$(this).trigger(\"reloadGrid\");\n\t\t\t\t\trc[loaded] = true;\n\t\t\t\t\tif(this.p.treeGridModel === 'nested') {\n\t\t\t\t\t\t$(this).jqGrid(\"setGridParam\",{postData:{nodeid:'',n_left:'',n_right:'',n_level:''}});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$(this).jqGrid(\"setGridParam\",{postData:{nodeid:'',parentid:'',n_level:''}}); \n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\tcollapseNode : function(rc) {\n\t\treturn this.each(function(){\n\t\t\tif(!this.grid || !this.p.treeGrid) {return;}\n\t\t\tvar expanded = this.p.treeReader.expanded_field;\n\t\t\tif(rc[expanded]) {\n\t\t\t\trc[expanded] = false;\n\t\t\t\tvar id = $.jgrid.getAccessor(rc,this.p.localReader.id);\n\t\t\t\tvar rc1 = $(\"#\" + this.p.idPrefix + $.jgrid.jqID(id),this.grid.bDiv)[0];\n\t\t\t\t$(\"div.treeclick\",rc1).removeClass(this.p.treeIcons.minus+\" tree-minus\").addClass(this.p.treeIcons.plus+\" tree-plus\");\n\t\t\t}\n\t\t});\n\t},\n\tSortTree : function( sortname, newDir, st, datefmt) {\n\t\treturn this.each(function(){\n\t\t\tif(!this.grid || !this.p.treeGrid) {return;}\n\t\t\tvar i, len,\n\t\t\trec, records = [], $t = this, query, roots,\n\t\t\trt = $(this).jqGrid(\"getRootNodes\");\n\t\t\t// Sorting roots\n\t\t\tquery = $.jgrid.from(rt);\n\t\t\tquery.orderBy(sortname,newDir,st, datefmt);\n\t\t\troots = query.select();\n\n\t\t\t// Sorting children\n\t\t\tfor (i = 0, len = roots.length; i < len; i++) {\n\t\t\t\trec = roots[i];\n\t\t\t\trecords.push(rec);\n\t\t\t\t$(this).jqGrid(\"collectChildrenSortTree\",records, rec, sortname, newDir,st, datefmt);\n\t\t\t}\n\t\t\t$.each(records, function(index) {\n\t\t\t\tvar id  = $.jgrid.getAccessor(this,$t.p.localReader.id);\n\t\t\t\t$('#'+$.jgrid.jqID($t.p.id)+ ' tbody tr:eq('+index+')').after($('tr#'+$.jgrid.jqID(id),$t.grid.bDiv));\n\t\t\t});\n\t\t\tquery = null;roots=null;records=null;\n\t\t});\n\t},\n\tcollectChildrenSortTree : function(records, rec, sortname, newDir,st, datefmt) {\n\t\treturn this.each(function(){\n\t\t\tif(!this.grid || !this.p.treeGrid) {return;}\n\t\t\tvar i, len,\n\t\t\tchild, ch, query, children;\n\t\t\tch = $(this).jqGrid(\"getNodeChildren\",rec);\n\t\t\tquery = $.jgrid.from(ch);\n\t\t\tquery.orderBy(sortname, newDir, st, datefmt);\n\t\t\tchildren = query.select();\n\t\t\tfor (i = 0, len = children.length; i < len; i++) {\n\t\t\t\tchild = children[i];\n\t\t\t\trecords.push(child);\n\t\t\t\t$(this).jqGrid(\"collectChildrenSortTree\",records, child, sortname, newDir, st, datefmt); \n\t\t\t}\n\t\t});\n\t},\n\t// experimental \n\tsetTreeRow : function(rowid, data) {\n\t\tvar success=false;\n\t\tthis.each(function(){\n\t\t\tvar t = this;\n\t\t\tif(!t.grid || !t.p.treeGrid) {return;}\n\t\t\tsuccess = $(t).jqGrid(\"setRowData\",rowid,data);\n\t\t});\n\t\treturn success;\n\t},\n\tdelTreeNode : function (rowid) {\n\t\treturn this.each(function () {\n\t\t\tvar $t = this, rid = $t.p.localReader.id, i,\n\t\t\tleft = $t.p.treeReader.left_field,\n\t\t\tright = $t.p.treeReader.right_field, myright, width, res, key;\n\t\t\tif(!$t.grid || !$t.p.treeGrid) {return;}\n\t\t\tvar rc = $t.p._index[rowid];\n\t\t\tif (rc !== undefined) {\n\t\t\t\t// nested\n\t\t\t\tmyright = parseInt($t.p.data[rc][right],10);\n\t\t\t\twidth = myright -  parseInt($t.p.data[rc][left],10) + 1;\n\t\t\t\tvar dr = $($t).jqGrid(\"getFullTreeNode\",$t.p.data[rc]);\n\t\t\t\tif(dr.length>0){\n\t\t\t\t\tfor (i=0;i<dr.length;i++){\n\t\t\t\t\t\t$($t).jqGrid(\"delRowData\",dr[i][rid]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif( $t.p.treeGridModel === \"nested\") {\n\t\t\t\t\t// ToDo - update grid data\n\t\t\t\t\tres = $.jgrid.from($t.p.data)\n\t\t\t\t\t\t.greater(left,myright,{stype:'integer'})\n\t\t\t\t\t\t.select();\n\t\t\t\t\tif(res.length) {\n\t\t\t\t\t\tfor( key in res) {\n\t\t\t\t\t\t\tif(res.hasOwnProperty(key)) {\n\t\t\t\t\t\t\t\tres[key][left] = parseInt(res[key][left],10) - width ;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tres = $.jgrid.from($t.p.data)\n\t\t\t\t\t\t.greater(right,myright,{stype:'integer'})\n\t\t\t\t\t\t.select();\n\t\t\t\t\tif(res.length) {\n\t\t\t\t\t\tfor( key in res) {\n\t\t\t\t\t\t\tif(res.hasOwnProperty(key)) {\n\t\t\t\t\t\t\t\tres[key][right] = parseInt(res[key][right],10) - width ;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\taddChildNode : function( nodeid, parentid, data, expandData ) {\n\t\t//return this.each(function(){\n\t\tvar $t = this[0];\n\t\tif(data) {\n\t\t\t// we suppose tha the id is autoincremet and\n\t\t\tvar expanded = $t.p.treeReader.expanded_field,\n\t\t\tisLeaf = $t.p.treeReader.leaf_field,\n\t\t\tlevel = $t.p.treeReader.level_field,\n\t\t\t//icon = $t.p.treeReader.icon_field,\n\t\t\tparent = $t.p.treeReader.parent_id_field,\n\t\t\tleft = $t.p.treeReader.left_field,\n\t\t\tright = $t.p.treeReader.right_field,\n\t\t\tloaded = $t.p.treeReader.loaded,\n\t\t\tmethod, parentindex, parentdata, parentlevel, i, len, max=0, rowind = parentid, leaf, maxright;\n\t\t\tif(expandData===undefined) {expandData = false;}\n\t\t\tif ( nodeid === undefined || nodeid === null ) {\n\t\t\t\ti = $t.p.data.length-1;\n\t\t\t\tif(\ti>= 0 ) {\n\t\t\t\t\twhile(i>=0){max = Math.max(max, parseInt($t.p.data[i][$t.p.localReader.id],10)); i--;}\n\t\t\t\t}\n\t\t\t\tnodeid = max+1;\n\t\t\t}\n\t\t\tvar prow = $($t).jqGrid('getInd', parentid);\n\t\t\tleaf = false;\n\t\t\t// if not a parent we assume root\n\t\t\tif ( parentid === undefined  || parentid === null || parentid===\"\") {\n\t\t\t\tparentid = null;\n\t\t\t\trowind = null;\n\t\t\t\tmethod = 'last';\n\t\t\t\tparentlevel = $t.p.tree_root_level;\n\t\t\t\ti = $t.p.data.length+1;\n\t\t\t} else {\n\t\t\t\tmethod = 'after';\n\t\t\t\tparentindex = $t.p._index[parentid];\n\t\t\t\tparentdata = $t.p.data[parentindex];\n\t\t\t\tparentid = parentdata[$t.p.localReader.id];\n\t\t\t\tparentlevel = parseInt(parentdata[level],10)+1;\n\t\t\t\tvar childs = $($t).jqGrid('getFullTreeNode', parentdata);\n\t\t\t\t// if there are child nodes get the last index of it\n\t\t\t\tif(childs.length) {\n\t\t\t\t\ti = childs[childs.length-1][$t.p.localReader.id];\n\t\t\t\t\trowind = i;\n\t\t\t\t\ti = $($t).jqGrid('getInd',rowind)+1;\n\t\t\t\t} else {\n\t\t\t\t\ti = $($t).jqGrid('getInd', parentid)+1;\n\t\t\t\t}\n\t\t\t\t// if the node is leaf\n\t\t\t\tif(parentdata[isLeaf]) {\n\t\t\t\t\tleaf = true;\n\t\t\t\t\tparentdata[expanded] = true;\n\t\t\t\t\t//var prow = $($t).jqGrid('getInd', parentid);\n\t\t\t\t\t$($t.rows[prow])\n\t\t\t\t\t\t.find(\"span.cell-wrapperleaf\").removeClass(\"cell-wrapperleaf\").addClass(\"cell-wrapper\")\n\t\t\t\t\t\t.end()\n\t\t\t\t\t\t.find(\"div.tree-leaf\").removeClass($t.p.treeIcons.leaf+\" tree-leaf\").addClass($t.p.treeIcons.minus+\" tree-minus\");\n\t\t\t\t\t$t.p.data[parentindex][isLeaf] = false;\n\t\t\t\t\tparentdata[loaded] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlen = i+1;\n\n\t\t\tif( data[expanded]===undefined)  {data[expanded]= false;}\n\t\t\tif( data[loaded]===undefined )  { data[loaded] = false;}\n\t\t\tdata[level] = parentlevel;\n\t\t\tif( data[isLeaf]===undefined) {data[isLeaf]= true;}\n\t\t\tif( $t.p.treeGridModel === \"adjacency\") {\n\t\t\t\tdata[parent] = parentid;\n\t\t\t}\n\t\t\tif( $t.p.treeGridModel === \"nested\") {\n\t\t\t\t// this method requiere more attention\n\t\t\t\tvar query, res, key;\n\t\t\t\t//maxright = parseInt(maxright,10);\n\t\t\t\t// ToDo - update grid data\n\t\t\t\tif(parentid !== null) {\n\t\t\t\t\tmaxright = parseInt(parentdata[right],10);\n\t\t\t\t\tquery = $.jgrid.from($t.p.data);\n\t\t\t\t\tquery = query.greaterOrEquals(right,maxright,{stype:'integer'});\n\t\t\t\t\tres = query.select();\n\t\t\t\t\tif(res.length) {\n\t\t\t\t\t\tfor( key in res) {\n\t\t\t\t\t\t\tif(res.hasOwnProperty(key)) {\n\t\t\t\t\t\t\t\tres[key][left] = res[key][left] > maxright ? parseInt(res[key][left],10) +2 : res[key][left];\n\t\t\t\t\t\t\t\tres[key][right] = res[key][right] >= maxright ? parseInt(res[key][right],10) +2 : res[key][right];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdata[left] = maxright;\n\t\t\t\t\tdata[right]= maxright+1;\n\t\t\t\t} else {\n\t\t\t\t\tmaxright = parseInt( $($t).jqGrid('getCol', right, false, 'max'), 10);\n\t\t\t\t\tres = $.jgrid.from($t.p.data)\n\t\t\t\t\t\t.greater(left,maxright,{stype:'integer'})\n\t\t\t\t\t\t.select();\n\t\t\t\t\tif(res.length) {\n\t\t\t\t\t\tfor( key in res) {\n\t\t\t\t\t\t\tif(res.hasOwnProperty(key)) {\n\t\t\t\t\t\t\t\tres[key][left] = parseInt(res[key][left],10) +2 ;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tres = $.jgrid.from($t.p.data)\n\t\t\t\t\t\t.greater(right,maxright,{stype:'integer'})\n\t\t\t\t\t\t.select();\n\t\t\t\t\tif(res.length) {\n\t\t\t\t\t\tfor( key in res) {\n\t\t\t\t\t\t\tif(res.hasOwnProperty(key)) {\n\t\t\t\t\t\t\t\tres[key][right] = parseInt(res[key][right],10) +2 ;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdata[left] = maxright+1;\n\t\t\t\t\tdata[right] = maxright + 2;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif( parentid === null || $($t).jqGrid(\"isNodeLoaded\",parentdata) || leaf ) {\n\t\t\t\t\t$($t).jqGrid('addRowData', nodeid, data, method, rowind);\n\t\t\t\t\t$($t).jqGrid('setTreeNode', i, len);\n\t\t\t}\n\t\t\tif(parentdata && !parentdata[expanded] && expandData) {\n\t\t\t\t$($t.rows[prow])\n\t\t\t\t\t.find(\"div.treeclick\")\n\t\t\t\t\t.click();\n\t\t\t}\n\t\t}\n\t\t//});\n\t}\n});\n})(jQuery);\n/*jshint eqeqeq:false, eqnull:true */\n/*global jQuery */\n// Grouping module\n(function($){\n\"use strict\";\n$.extend($.jgrid,{\n\ttemplate : function(format){ //jqgformat\n\t\tvar args = $.makeArray(arguments).slice(1), j, al = args.length;\n\t\tif(format==null) { format = \"\"; }\n\t\treturn format.replace(/\\{([\\w\\-]+)(?:\\:([\\w\\.]*)(?:\\((.*?)?\\))?)?\\}/g, function(m,i){\n\t\t\tif(!isNaN(parseInt(i,10))) {\n\t\t\t\treturn args[parseInt(i,10)];\n\t\t\t}\n\t\t\tfor(j=0; j < al;j++) {\n\t\t\t\tif($.isArray(args[j])) {\n\t\t\t\t\tvar nmarr = args[ j ],\n\t\t\t\t\tk = nmarr.length;\n\t\t\t\t\twhile(k--) {\n\t\t\t\t\t\tif(i===nmarr[k].nm) {\n\t\t\t\t\t\t\treturn nmarr[k].v;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n});\n$.jgrid.extend({\n\tgroupingSetup : function () {\n\t\treturn this.each(function (){\n\t\t\tvar $t = this, i, j, cml, cm = $t.p.colModel, grp = $t.p.groupingView;\n\t\t\tif(grp !== null && ( (typeof grp === 'object') || $.isFunction(grp) ) ) {\n\t\t\t\tif(!grp.groupField.length) {\n\t\t\t\t\t$t.p.grouping = false;\n\t\t\t\t} else {\n\t\t\t\t\tif (grp.visibiltyOnNextGrouping === undefined) {\n\t\t\t\t\t\tgrp.visibiltyOnNextGrouping = [];\n\t\t\t\t\t}\n\n\t\t\t\t\tgrp.lastvalues=[];\n\t\t\t\t\tgrp.groups =[];\n\t\t\t\t\tgrp.counters =[];\n\t\t\t\t\tfor(i=0;i<grp.groupField.length;i++) {\n\t\t\t\t\t\tif(!grp.groupOrder[i]) {\n\t\t\t\t\t\t\tgrp.groupOrder[i] = 'asc';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(!grp.groupText[i]) {\n\t\t\t\t\t\t\tgrp.groupText[i] = '{0}';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif( typeof grp.groupColumnShow[i] !== 'boolean') {\n\t\t\t\t\t\t\tgrp.groupColumnShow[i] = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif( typeof grp.groupSummary[i] !== 'boolean') {\n\t\t\t\t\t\t\tgrp.groupSummary[i] = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(grp.groupColumnShow[i] === true) {\n\t\t\t\t\t\t\tgrp.visibiltyOnNextGrouping[i] = true;\n\t\t\t\t\t\t\t$($t).jqGrid('showCol',grp.groupField[i]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tgrp.visibiltyOnNextGrouping[i] = $(\"#\"+$.jgrid.jqID($t.p.id+\"_\"+grp.groupField[i])).is(\":visible\");\n\t\t\t\t\t\t\t$($t).jqGrid('hideCol',grp.groupField[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tgrp.summary =[];\n\t\t\t\t\tfor(j=0, cml = cm.length; j < cml; j++) {\n\t\t\t\t\t\tif(cm[j].summaryType) {\n\t\t\t\t\t\t\tgrp.summary.push({nm:cm[j].name,st:cm[j].summaryType, v: '', sr: cm[j].summaryRound, srt: cm[j].summaryRoundType || 'round'});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$t.p.grouping = false;\n\t\t\t}\n\t\t});\n\t},\n\tgroupingPrepare : function (rData, gdata, record, irow) {\n\t\tthis.each(function(){\n\t\t\tvar grp = this.p.groupingView, $t= this, i,\n\t\t\tgrlen = grp.groupField.length, \n\t\t\tfieldName,\n\t\t\tv,\n\t\t\tdisplayName,\n\t\t\tdisplayValue,\n\t\t\tchanged = 0;\n\t\t\tfor(i=0;i<grlen;i++) {\n\t\t\t\tfieldName = grp.groupField[i];\n\t\t\t\tdisplayName = grp.displayField[i];\n\t\t\t\tv = record[fieldName];\n\t\t\t\tdisplayValue = displayName == null ? null : record[displayName];\n\n\t\t\t\tif( displayValue == null ) {\n\t\t\t\t\tdisplayValue = v;\n\t\t\t\t}\n\t\t\t\tif( v !== undefined ) {\n\t\t\t\t\tif(irow === 0 ) {\n\t\t\t\t\t\t// First record always starts a new group\n\t\t\t\t\t\tgrp.groups.push({idx:i,dataIndex:fieldName,value:v, displayValue: displayValue, startRow: irow, cnt:1, summary : [] } );\n\t\t\t\t\t\tgrp.lastvalues[i] = v;\n\t\t\t\t\t\tgrp.counters[i] = {cnt:1, pos:grp.groups.length-1, summary: $.extend(true,[],grp.summary)};\n\t\t\t\t\t\t$.each(grp.counters[i].summary,function() {\n\t\t\t\t\t\t\tif ($.isFunction(this.st)) {\n\t\t\t\t\t\t\t\tthis.v = this.st.call($t, this.v, this.nm, record);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.v = $($t).jqGrid('groupingCalculations.handler',this.st, this.v, this.nm, this.sr, this.srt, record);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tgrp.groups[grp.counters[i].pos].summary = grp.counters[i].summary;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (typeof v !== \"object\" && ($.isArray(grp.isInTheSameGroup) && $.isFunction(grp.isInTheSameGroup[i]) ? ! grp.isInTheSameGroup[i].call($t, grp.lastvalues[i], v, i, grp): grp.lastvalues[i] !== v)) {\n\t\t\t\t\t\t\t// This record is not in same group as previous one\n\t\t\t\t\t\t\tgrp.groups.push({idx:i,dataIndex:fieldName,value:v, displayValue: displayValue, startRow: irow, cnt:1, summary : [] } );\n\t\t\t\t\t\t\tgrp.lastvalues[i] = v;\n\t\t\t\t\t\t\tchanged = 1;\n\t\t\t\t\t\t\tgrp.counters[i] = {cnt:1, pos:grp.groups.length-1, summary: $.extend(true,[],grp.summary)};\n\t\t\t\t\t\t\t$.each(grp.counters[i].summary,function() {\n\t\t\t\t\t\t\t\tif ($.isFunction(this.st)) {\n\t\t\t\t\t\t\t\t\tthis.v = this.st.call($t, this.v, this.nm, record);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tthis.v = $($t).jqGrid('groupingCalculations.handler',this.st, this.v, this.nm, this.sr, this.srt, record);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tgrp.groups[grp.counters[i].pos].summary = grp.counters[i].summary;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (changed === 1) {\n\t\t\t\t\t\t\t\t// This group has changed because an earlier group changed.\n\t\t\t\t\t\t\t\tgrp.groups.push({idx:i,dataIndex:fieldName,value:v, displayValue: displayValue, startRow: irow, cnt:1, summary : [] } );\n\t\t\t\t\t\t\t\tgrp.lastvalues[i] = v;\n\t\t\t\t\t\t\t\tgrp.counters[i] = {cnt:1, pos:grp.groups.length-1, summary: $.extend(true,[],grp.summary)};\n\t\t\t\t\t\t\t\t$.each(grp.counters[i].summary,function() {\n\t\t\t\t\t\t\t\t\tif ($.isFunction(this.st)) {\n\t\t\t\t\t\t\t\t\t\tthis.v = this.st.call($t, this.v, this.nm, record);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tthis.v = $($t).jqGrid('groupingCalculations.handler',this.st, this.v, this.nm, this.sr, this.srt, record);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tgrp.groups[grp.counters[i].pos].summary = grp.counters[i].summary;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tgrp.counters[i].cnt += 1;\n\t\t\t\t\t\t\t\tgrp.groups[grp.counters[i].pos].cnt = grp.counters[i].cnt;\n\t\t\t\t\t\t\t\t$.each(grp.counters[i].summary,function() {\n\t\t\t\t\t\t\t\t\tif ($.isFunction(this.st)) {\n\t\t\t\t\t\t\t\t\t\tthis.v = this.st.call($t, this.v, this.nm, record);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tthis.v = $($t).jqGrid('groupingCalculations.handler',this.st, this.v, this.nm, this.sr, this.srt, record);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tgrp.groups[grp.counters[i].pos].summary = grp.counters[i].summary;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tgdata.push( rData );\n\t\t});\n\t\treturn gdata;\n\t},\n\tgroupingToggle : function(hid){\n\t\tthis.each(function(){\n\t\t\tvar $t = this,\n\t\t\tgrp = $t.p.groupingView,\n\t\t\tstrpos = hid.split('_'),\n\t\t\tuidpos,\n\t\t\t//uid = hid.substring(0,strpos+1),\n\t\t\tnum = parseInt(strpos[strpos.length-2], 10);\n\t\t\tstrpos.splice(strpos.length-2,2);\n\t\t\tvar uid = strpos.join(\"_\"),\n\t\t\tminus = grp.minusicon,\n\t\t\tplus = grp.plusicon,\n\t\t\ttar = $(\"#\"+$.jgrid.jqID(hid)),\n\t\t\tr = tar.length ? tar[0].nextSibling : null,\n\t\t\ttarspan = $(\"#\"+$.jgrid.jqID(hid)+\" span.\"+\"tree-wrap-\"+$t.p.direction),\n\t\t\tcollapsed = false, tspan;\n\t\t\tif( tarspan.hasClass(minus) ) {\n\t\t\t\tif(grp.showSummaryOnHide) {\n\t\t\t\t\tif(r){\n\t\t\t\t\t\twhile(r) {\n\t\t\t\t\t\t\tif($(r).hasClass('jqfoot') ) {\n\t\t\t\t\t\t\t\tvar lv = parseInt($(r).attr(\"jqfootlevel\"),10);\n\t\t\t\t\t\t\t\tif(  lv <= num) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$(r).hide();\n\t\t\t\t\t\t\tr = r.nextSibling;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else  {\n\t\t\t\t\tif(r){\n\t\t\t\t\t\twhile(r) {\n\t\t\t\t\t\t\tuidpos = r.className.indexOf(uid);\n\t\t\t\t\t\t\tif(uidpos !== -1) {\n\t\t\t\t\t\t\t\tif( parseInt(r.className.substring(uidpos+uid.length + 1),10) <=  num) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$(r).hide();\n\t\t\t\t\t\t\tr = r.nextSibling;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttarspan.removeClass(minus).addClass(plus);\n\t\t\t\tcollapsed = true;\n\t\t\t} else {\n\t\t\t\tif(r){\n\t\t\t\t\twhile(r) {\n\t\t\t\t\t\tuidpos = r.className.indexOf(uid);\n\t\t\t\t\t\tif(uidpos !== -1) {\n\t\t\t\t\t\t\tif( parseInt(r.className.substring(uidpos+uid.length + 1),10) <=  num) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$(r).show();\n\t\t\t\t\t\ttspan = $(r).find(\"span.\"+\"tree-wrap-\"+$t.p.direction);\n\t\t\t\t\t\tif( tspan && $(tspan).hasClass(plus) ) {\n\t\t\t\t\t\t\t$(tspan).removeClass(plus).addClass(minus);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tr = r.nextSibling;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttarspan.removeClass(plus).addClass(minus);\n\t\t\t}\n\t\t\t$($t).triggerHandler(\"jqGridGroupingClickGroup\", [hid , collapsed]);\n\t\t\tif( $.isFunction($t.p.onClickGroup)) { $t.p.onClickGroup.call($t, hid , collapsed); }\n\n\t\t});\n\t\treturn false;\n\t},\n\tgroupingRender : function (grdata, colspans ) {\n\t\treturn this.each(function(){\n\t\t\tvar $t = this,\n\t\t\tgrp = $t.p.groupingView,\n\t\t\tstr = \"\", icon = \"\", hid, clid, pmrtl = grp.groupCollapse ? grp.plusicon : grp.minusicon, gv, cp=[], len =grp.groupField.length;\n\t\t\tpmrtl += \" tree-wrap-\"+$t.p.direction; \n\t\t\t$.each($t.p.colModel, function (i,n){\n\t\t\t\tvar ii;\n\t\t\t\tfor(ii=0;ii<len;ii++) {\n\t\t\t\t\tif(grp.groupField[ii] === n.name ) {\n\t\t\t\t\t\tcp[ii] = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tvar toEnd = 0;\n\t\t\tfunction findGroupIdx( ind , offset, grp) {\n\t\t\t\tvar ret = false, i;\n\t\t\t\tif(offset===0) {\n\t\t\t\t\tret = grp[ind];\n\t\t\t\t} else {\n\t\t\t\t\tvar id = grp[ind].idx;\n\t\t\t\t\tif(id===0) { \n\t\t\t\t\t\tret = grp[ind]; \n\t\t\t\t\t}  else {\n\t\t\t\t\t\tfor(i=ind;i >= 0; i--) {\n\t\t\t\t\t\t\tif(grp[i].idx === id-offset) {\n\t\t\t\t\t\t\t\tret = grp[i];\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t\tvar sumreverse = $.makeArray(grp.groupSummary);\n\t\t\tsumreverse.reverse();\n\t\t\t$.each(grp.groups,function(i,n){\n\t\t\t\ttoEnd++;\n\t\t\t\tclid = $t.p.id+\"ghead_\"+n.idx;\n\t\t\t\thid = clid+\"_\"+i;\n\t\t\t\ticon = \"<span style='cursor:pointer;' class='ui-icon \"+pmrtl+\"' onclick=\\\"jQuery('#\"+$.jgrid.jqID($t.p.id)+\"').jqGrid('groupingToggle','\"+hid+\"');return false;\\\"></span>\";\n\t\t\t\ttry {\n\t\t\t\t\tif ($.isArray(grp.formatDisplayField) && $.isFunction(grp.formatDisplayField[n.idx])) {\n\t\t\t\t\t\tn.displayValue = grp.formatDisplayField[n.idx].call($t, n.displayValue, n.value, $t.p.colModel[cp[n.idx]], n.idx, grp);\n\t\t\t\t\t}\n\t\t\t\t\tgv = $t.formatter(hid, n.displayValue, cp[n.idx], n.value );\n\t\t\t\t} catch (egv) {\n\t\t\t\t\tgv = n.displayValue;\n\t\t\t\t}\n\t\t\t\tstr += \"<tr id=\\\"\"+hid+\"\\\" role=\\\"row\\\" class= \\\"ui-widget-content jqgroup ui-row-\"+$t.p.direction+\" \"+clid+\"\\\"><td style=\\\"padding-left:\"+(n.idx * 12) + \"px;\"+\"\\\" colspan=\\\"\"+colspans+\"\\\">\"+icon+$.jgrid.template(grp.groupText[n.idx], gv, n.cnt, n.summary)+\"</td></tr>\";\n\t\t\t\tvar leaf = len-1 === n.idx; \n\t\t\t\tif( leaf ) {\n\t\t\t\t\tvar gg = grp.groups[i+1], k, kk, ik;\n\t\t\t\t\tvar end = gg !== undefined ?  grp.groups[i+1].startRow : grdata.length;\n\t\t\t\t\tfor(kk=n.startRow;kk<end;kk++) {\n\t\t\t\t\t\tstr += grdata[kk].join('');\n\t\t\t\t\t}\n\t\t\t\t\tvar jj;\n\t\t\t\t\tif (gg !== undefined) {\n\t\t\t\t\t\tfor (jj = 0; jj < grp.groupField.length; jj++) {\n\t\t\t\t\t\t\tif (gg.dataIndex === grp.groupField[jj]) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttoEnd = grp.groupField.length - jj;\n\t\t\t\t\t}\n\t\t\t\t\tfor (ik = 0; ik < toEnd; ik++) {\n\t\t\t\t\t\tif(!sumreverse[ik]) { continue; }\n\t\t\t\t\t\tvar hhdr = \"\";\n\t\t\t\t\t\tif(grp.groupCollapse && !grp.showSummaryOnHide) {\n\t\t\t\t\t\t\thhdr = \" style=\\\"display:none;\\\"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstr += \"<tr\"+hhdr+\" jqfootlevel=\\\"\"+(n.idx-ik)+\"\\\" role=\\\"row\\\" class=\\\"ui-widget-content jqfoot ui-row-\"+$t.p.direction+\"\\\">\";\n\t\t\t\t\t\tvar fdata = findGroupIdx(i, ik, grp.groups),\n\t\t\t\t\t\tcm = $t.p.colModel,\n\t\t\t\t\t\tvv, grlen = fdata.cnt;\n\t\t\t\t\t\tfor(k=0; k<colspans;k++) {\n\t\t\t\t\t\t\tvar tmpdata = \"<td \"+$t.formatCol(k,1,'')+\">&#160;</td>\",\n\t\t\t\t\t\t\ttplfld = \"{0}\";\n\t\t\t\t\t\t\t$.each(fdata.summary,function(){\n\t\t\t\t\t\t\t\tif(this.nm === cm[k].name) {\n\t\t\t\t\t\t\t\t\tif(cm[k].summaryTpl)  {\n\t\t\t\t\t\t\t\t\t\ttplfld = cm[k].summaryTpl;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif(typeof this.st === 'string' && this.st.toLowerCase() === 'avg') {\n\t\t\t\t\t\t\t\t\t\tif(this.v && grlen > 0) {\n\t\t\t\t\t\t\t\t\t\t\tthis.v = (this.v/grlen);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tvv = $t.formatter('', this.v, k, this);\n\t\t\t\t\t\t\t\t\t} catch (ef) {\n\t\t\t\t\t\t\t\t\t\tvv = this.v;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\ttmpdata= \"<td \"+$t.formatCol(k,1,'')+\">\"+$.jgrid.format(tplfld,vv)+ \"</td>\";\n\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tstr += tmpdata;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstr += \"</tr>\";\n\t\t\t\t\t}\n\t\t\t\t\ttoEnd = jj;\n\t\t\t\t}\n\t\t\t});\n\t\t\t$(\"#\"+$.jgrid.jqID($t.p.id)+\" tbody:first\").append(str);\n\t\t\t// free up memory\n\t\t\tstr = null;\n\t\t});\n\t},\n\tgroupingGroupBy : function (name, options ) {\n\t\treturn this.each(function(){\n\t\t\tvar $t = this;\n\t\t\tif(typeof name === \"string\") {\n\t\t\t\tname = [name];\n\t\t\t}\n\t\t\tvar grp = $t.p.groupingView;\n\t\t\t$t.p.grouping = true;\n\n\t\t\t//Set default, in case visibilityOnNextGrouping is undefined \n\t\t\tif (grp.visibiltyOnNextGrouping === undefined) {\n\t\t\t\tgrp.visibiltyOnNextGrouping = [];\n\t\t\t}\n\t\t\tvar i;\n\t\t\t// show previous hidden groups if they are hidden and weren't removed yet\n\t\t\tfor(i=0;i<grp.groupField.length;i++) {\n\t\t\t\tif(!grp.groupColumnShow[i] && grp.visibiltyOnNextGrouping[i]) {\n\t\t\t\t$($t).jqGrid('showCol',grp.groupField[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// set visibility status of current group columns on next grouping\n\t\t\tfor(i=0;i<name.length;i++) {\n\t\t\t\tgrp.visibiltyOnNextGrouping[i] = $(\"#\"+$.jgrid.jqID($t.p.id)+\"_\"+$.jgrid.jqID(name[i])).is(\":visible\");\n\t\t\t}\n\t\t\t$t.p.groupingView = $.extend($t.p.groupingView, options || {});\n\t\t\tgrp.groupField = name;\n\t\t\t$($t).trigger(\"reloadGrid\");\n\t\t});\n\t},\n\tgroupingRemove : function (current) {\n\t\treturn this.each(function(){\n\t\t\tvar $t = this;\n\t\t\tif(current === undefined) {\n\t\t\t\tcurrent = true;\n\t\t\t}\n\t\t\t$t.p.grouping = false;\n\t\t\tif(current===true) {\n\t\t\t\tvar grp = $t.p.groupingView, i;\n\t\t\t\t// show previous hidden groups if they are hidden and weren't removed yet\n\t\t\t\tfor(i=0;i<grp.groupField.length;i++) {\n\t\t\t\tif (!grp.groupColumnShow[i] && grp.visibiltyOnNextGrouping[i]) {\n\t\t\t\t\t\t$($t).jqGrid('showCol', grp.groupField);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$(\"tr.jqgroup, tr.jqfoot\",\"#\"+$.jgrid.jqID($t.p.id)+\" tbody:first\").remove();\n\t\t\t\t$(\"tr.jqgrow:hidden\",\"#\"+$.jgrid.jqID($t.p.id)+\" tbody:first\").show();\n\t\t\t} else {\n\t\t\t\t$($t).trigger(\"reloadGrid\");\n\t\t\t}\n\t\t});\n\t},\n\tgroupingCalculations : {\n\t\thandler: function(fn, v, field, round, roundType, rc) {\n\t\t\tvar funcs = {\n\t\t\t\tsum: function() {\n\t\t\t\t\treturn parseFloat(v||0) + parseFloat((rc[field]||0));\n\t\t\t\t},\n\n\t\t\t\tmin: function() {\n\t\t\t\t\tif(v===\"\") {\n\t\t\t\t\t\treturn parseFloat(rc[field]||0);\n\t\t\t\t\t}\n\t\t\t\t\treturn Math.min(parseFloat(v),parseFloat(rc[field]||0));\n\t\t\t\t},\n\n\t\t\t\tmax: function() {\n\t\t\t\t\tif(v===\"\") {\n\t\t\t\t\t\treturn parseFloat(rc[field]||0);\n\t\t\t\t\t}\n\t\t\t\t\treturn Math.max(parseFloat(v),parseFloat(rc[field]||0));\n\t\t\t\t},\n\n\t\t\t\tcount: function() {\n\t\t\t\t\tif(v===\"\") {v=0;}\n\t\t\t\t\tif(rc.hasOwnProperty(field)) {\n\t\t\t\t\t\treturn v+1;\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\t\t\t\t},\n\n\t\t\t\tavg: function() {\n\t\t\t\t\t// the same as sum, but at end we divide it\n\t\t\t\t\t// so use sum instead of duplicating the code (?)\n\t\t\t\t\treturn funcs.sum();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif(!funcs[fn]) {\n\t\t\t\tthrow (\"jqGrid Grouping No such method: \" + fn);\n\t\t\t}\n\t\t\tvar res = funcs[fn]();\n\n\t\t\tif (round != null) {\n\t\t\t\tif (roundType === 'fixed') {\n\t\t\t\t\tres = res.toFixed(round);\n\t\t\t\t} else {\n\t\t\t\t\tvar mul = Math.pow(10, round);\n\t\t\t\t\tres = Math.round(res * mul) / mul;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn res;\n\t\t}\t\n\t}\n});\n})(jQuery);\n/*jshint eqeqeq:false, eqnull:true, devel:true */\n/*global jQuery, xmlJsonClass */\n(function($){\n/*\n * jqGrid extension for constructing Grid Data from external file\n * Tony Tomov tony@trirand.com\n * http://trirand.com/blog/ \n * Dual licensed under the MIT and GPL licenses:\n * http://www.opensource.org/licenses/mit-license.php\n * http://www.gnu.org/licenses/gpl-2.0.html\n**/ \n\n\"use strict\";\n    $.jgrid.extend({\n        jqGridImport : function(o) {\n            o = $.extend({\n                imptype : \"xml\", // xml, json, xmlstring, jsonstring\n                impstring: \"\",\n                impurl: \"\",\n                mtype: \"GET\",\n                impData : {},\n                xmlGrid :{\n                    config : \"roots>grid\",\n                    data: \"roots>rows\"\n                },\n                jsonGrid :{\n                    config : \"grid\",\n                    data: \"data\"\n                },\n                ajaxOptions :{}\n            }, o || {});\n            return this.each(function(){\n                var $t = this;\n                var xmlConvert = function (xml,o) {\n                    var cnfg = $(o.xmlGrid.config,xml)[0];\n                    var xmldata = $(o.xmlGrid.data,xml)[0], jstr, jstr1, key;\n                    if(xmlJsonClass.xml2json && $.jgrid.parse) {\n                        jstr = xmlJsonClass.xml2json(cnfg,\" \");\n                        jstr = $.jgrid.parse(jstr);\n                        for(key in jstr) {\n                            if(jstr.hasOwnProperty(key)) {\n                                jstr1=jstr[key];\n                            }\n                        }\n                        if(xmldata) {\n                        // save the datatype\n                            var svdatatype = jstr.grid.datatype;\n                            jstr.grid.datatype = 'xmlstring';\n                            jstr.grid.datastr = xml;\n                            $($t).jqGrid( jstr1 ).jqGrid(\"setGridParam\",{datatype:svdatatype});\n                        } else {\n                            $($t).jqGrid( jstr1 );\n                        }\n                        jstr = null;jstr1=null;\n                    } else {\n                        alert(\"xml2json or parse are not present\");\n                    }\n                };\n                var jsonConvert = function (jsonstr,o){\n                    if (jsonstr && typeof jsonstr === 'string') {\n\t\t\t\t\t\tvar _jsonparse = false;\n\t\t\t\t\t\tif($.jgrid.useJSON) {\n\t\t\t\t\t\t\t$.jgrid.useJSON = false;\n\t\t\t\t\t\t\t_jsonparse = true;\n\t\t\t\t\t\t}\n                        var json = $.jgrid.parse(jsonstr);\n\t\t\t\t\t\tif(_jsonparse) { $.jgrid.useJSON = true; }\n                        var gprm = json[o.jsonGrid.config];\n                        var jdata = json[o.jsonGrid.data];\n                        if(jdata) {\n                            var svdatatype = gprm.datatype;\n                            gprm.datatype = 'jsonstring';\n                            gprm.datastr = jdata;\n                            $($t).jqGrid( gprm ).jqGrid(\"setGridParam\",{datatype:svdatatype});\n                        } else {\n                            $($t).jqGrid( gprm );\n                        }\n                    }\n                };\n                switch (o.imptype){\n                    case 'xml':\n                        $.ajax($.extend({\n                            url:o.impurl,\n                            type:o.mtype,\n                            data: o.impData,\n                            dataType:\"xml\",\n                            complete: function(xml,stat) {\n                                if(stat === 'success') {\n                                    xmlConvert(xml.responseXML,o);\n                                    $($t).triggerHandler(\"jqGridImportComplete\", [xml, o]);\n                                    if($.isFunction(o.importComplete)) {\n                                        o.importComplete(xml);\n                                    }\n                                }\n                                xml=null;\n                            }\n                        }, o.ajaxOptions));\n                        break;\n                    case 'xmlstring' :\n                        // we need to make just the conversion and use the same code as xml\n                        if(o.impstring && typeof o.impstring === 'string') {\n                            var xmld = $.parseXML(o.impstring);\n                            if(xmld) {\n                                xmlConvert(xmld,o);\n                                $($t).triggerHandler(\"jqGridImportComplete\", [xmld, o]);\n                                if($.isFunction(o.importComplete)) {\n                                    o.importComplete(xmld);\n                                }\n                                o.impstring = null;\n                            }\n                            xmld = null;\n                        }\n                        break;\n                    case 'json':\n                        $.ajax($.extend({\n                            url:o.impurl,\n                            type:o.mtype,\n                            data: o.impData,\n                            dataType:\"json\",\n                            complete: function(json) {\n                                try {\n                                    jsonConvert(json.responseText,o );\n                                    $($t).triggerHandler(\"jqGridImportComplete\", [json, o]);\n                                    if($.isFunction(o.importComplete)) {\n                                        o.importComplete(json);\n                                    }\n                                } catch (ee){}\n                                json=null;\n                            }\n                        }, o.ajaxOptions ));\n                        break;\n                    case 'jsonstring' :\n                        if(o.impstring && typeof o.impstring === 'string') {\n                            jsonConvert(o.impstring,o );\n                            $($t).triggerHandler(\"jqGridImportComplete\", [o.impstring, o]);\n                            if($.isFunction(o.importComplete)) {\n                                o.importComplete(o.impstring);\n                            }\n                            o.impstring = null;\n                        }\n                        break;\n                }\n            });\n        },\n        jqGridExport : function(o) {\n            o = $.extend({\n                exptype : \"xmlstring\",\n                root: \"grid\",\n                ident: \"\\t\"\n            }, o || {});\n            var ret = null;\n            this.each(function () {\n                if(!this.grid) { return;}\n                var key, gprm = $.extend(true, {},$(this).jqGrid(\"getGridParam\"));\n                // we need to check for:\n                // 1.multiselect, 2.subgrid  3. treegrid and remove the unneded columns from colNames\n                if(gprm.rownumbers) {\n                    gprm.colNames.splice(0,1);\n                    gprm.colModel.splice(0,1);\n                }\n                if(gprm.multiselect) {\n                    gprm.colNames.splice(0,1);\n                    gprm.colModel.splice(0,1);\n                }\n                if(gprm.subGrid) {\n                    gprm.colNames.splice(0,1);\n                    gprm.colModel.splice(0,1);\n                }\n                gprm.knv = null;\n                if(gprm.treeGrid) {\n                    for (key in gprm.treeReader) {\n                        if(gprm.treeReader.hasOwnProperty(key)) {\n                            gprm.colNames.splice(gprm.colNames.length-1);\n                            gprm.colModel.splice(gprm.colModel.length-1);\n                        }\n                    }\n                }\n                switch (o.exptype) {\n                    case 'xmlstring' :\n                        ret = \"<\"+o.root+\">\"+xmlJsonClass.json2xml(gprm,o.ident)+\"</\"+o.root+\">\";\n                        break;\n                    case 'jsonstring' :\n                        ret = \"{\"+ xmlJsonClass.toJson(gprm,o.root,o.ident,false)+\"}\";\n                        if(gprm.postData.filters !== undefined) {\n                            ret=ret.replace(/filters\":\"/,'filters\":');\n                            ret=ret.replace(/}]}\"/,'}]}');\n                        }\n                        break;\n                }\n            });\n            return ret;\n        },\n        excelExport : function(o) {\n            o = $.extend({\n                exptype : \"remote\",\n                url : null,\n                oper: \"oper\",\n                tag: \"excel\",\n                exportOptions : {}\n            }, o || {});\n            return this.each(function(){\n                if(!this.grid) { return;}\n                var url;\n                if(o.exptype === \"remote\") {\n                    var pdata = $.extend({},this.p.postData);\n                    pdata[o.oper] = o.tag;\n                    var params = jQuery.param(pdata);\n                    if(o.url.indexOf(\"?\") !== -1) { url = o.url+\"&\"+params; }\n                    else { url = o.url+\"?\"+params; }\n                    window.location = url;\n                }\n            });\n        }\n    });\n})(jQuery);\n/*jshint evil:true, eqeqeq:false, eqnull:true, devel:true */\n/*global jQuery */\n(function($){\n/*\n**\n * jqGrid addons using jQuery UI \n * Author: Mark Williams\n * Dual licensed under the MIT and GPL licenses:\n * http://www.opensource.org/licenses/mit-license.php\n * http://www.gnu.org/licenses/gpl-2.0.html\n * depends on jQuery UI \n**/\n\"use strict\";\nif ($.jgrid.msie && $.jgrid.msiever()===8) {\n\t$.expr[\":\"].hidden = function(elem) {\n\t\treturn elem.offsetWidth === 0 || elem.offsetHeight === 0 ||\n\t\t\telem.style.display === \"none\";\n\t};\n}\n// requiere load multiselect before grid\n$.jgrid._multiselect = false;\nif($.ui) {\n\tif ($.ui.multiselect ) {\n\t\tif($.ui.multiselect.prototype._setSelected) {\n\t\t\tvar setSelected = $.ui.multiselect.prototype._setSelected;\n\t\t\t$.ui.multiselect.prototype._setSelected = function(item,selected) {\n\t\t\t\tvar ret = setSelected.call(this,item,selected);\n\t\t\t\tif (selected && this.selectedList) {\n\t\t\t\t\tvar elt = this.element;\n\t\t\t\t\tthis.selectedList.find('li').each(function() {\n\t\t\t\t\t\tif ($(this).data('optionLink')) {\n\t\t\t\t\t\t\t$(this).data('optionLink').remove().appendTo(elt);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t\t};\n\t\t}\n\t\tif($.ui.multiselect.prototype.destroy) {\n\t\t\t$.ui.multiselect.prototype.destroy = function() {\n\t\t\t\tthis.element.show();\n\t\t\t\tthis.container.remove();\n\t\t\t\tif ($.Widget === undefined) {\n\t\t\t\t\t$.widget.prototype.destroy.apply(this, arguments);\n\t\t\t\t} else {\n\t\t\t\t\t$.Widget.prototype.destroy.apply(this, arguments);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\t$.jgrid._multiselect = true;\n\t}\n}\n        \n$.jgrid.extend({\n\tsortableColumns : function (tblrow)\n\t{\n\t\treturn this.each(function (){\n\t\t\tvar ts = this, tid= $.jgrid.jqID( ts.p.id );\n\t\t\tfunction start() {ts.p.disableClick = true;}\n\t\t\tvar sortable_opts = {\n\t\t\t\t\"tolerance\" : \"pointer\",\n\t\t\t\t\"axis\" : \"x\",\n\t\t\t\t\"scrollSensitivity\": \"1\",\n\t\t\t\t\"items\": '>th:not(:has(#jqgh_'+tid+'_cb'+',#jqgh_'+tid+'_rn'+',#jqgh_'+tid+'_subgrid),:hidden)',\n\t\t\t\t\"placeholder\": {\n\t\t\t\t\telement: function(item) {\n\t\t\t\t\t\tvar el = $(document.createElement(item[0].nodeName))\n\t\t\t\t\t\t.addClass(item[0].className+\" ui-sortable-placeholder ui-state-highlight\")\n\t\t\t\t\t\t.removeClass(\"ui-sortable-helper\")[0];\n\t\t\t\t\t\treturn el;\n\t\t\t\t\t},\n\t\t\t\t\tupdate: function(self, p) {\n\t\t\t\t\t\tp.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10));\n\t\t\t\t\t\tp.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10));\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"update\": function(event, ui) {\n\t\t\t\t\tvar p = $(ui.item).parent(),\n\t\t\t\t\tth = $(\">th\", p),\n\t\t\t\t\tcolModel = ts.p.colModel,\n\t\t\t\t\tcmMap = {}, tid= ts.p.id+\"_\";\n\t\t\t\t\t$.each(colModel, function(i) { cmMap[this.name]=i; });\n\t\t\t\t\tvar permutation = [];\n\t\t\t\t\tth.each(function() {\n\t\t\t\t\t\tvar id = $(\">div\", this).get(0).id.replace(/^jqgh_/, \"\").replace(tid,\"\");\n\t\t\t\t\t\t\tif (cmMap.hasOwnProperty(id)) {\n\t\t\t\t\t\t\t\tpermutation.push(cmMap[id]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\n\t\t\t\t\t$(ts).jqGrid(\"remapColumns\",permutation, true, true);\n\t\t\t\t\tif ($.isFunction(ts.p.sortable.update)) {\n\t\t\t\t\t\tts.p.sortable.update(permutation);\n\t\t\t\t\t}\n\t\t\t\t\tsetTimeout(function(){ts.p.disableClick=false;}, 50);\n\t\t\t\t}\n\t\t\t};\n\t\t\tif (ts.p.sortable.options) {\n\t\t\t\t$.extend(sortable_opts, ts.p.sortable.options);\n\t\t\t} else if ($.isFunction(ts.p.sortable)) {\n\t\t\t\tts.p.sortable = { \"update\" : ts.p.sortable };\n\t\t\t}\n\t\t\tif (sortable_opts.start) {\n\t\t\t\tvar s = sortable_opts.start;\n\t\t\t\tsortable_opts.start = function(e,ui) {\n\t\t\t\t\tstart();\n\t\t\t\t\ts.call(this,e,ui);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tsortable_opts.start = start;\n\t\t\t}\n\t\t\tif (ts.p.sortable.exclude) {\n\t\t\t\tsortable_opts.items += \":not(\"+ts.p.sortable.exclude+\")\";\n\t\t\t}\n\t\t\ttblrow.sortable(sortable_opts).data(\"sortable\").floating = true;\n\t\t});\n\t},\n    columnChooser : function(opts) {\n        var self = this;\n\t\tif($(\"#colchooser_\"+$.jgrid.jqID(self[0].p.id)).length ) { return; }\n        var selector = $('<div id=\"colchooser_'+self[0].p.id+'\" style=\"position:relative;overflow:hidden\"><div><select multiple=\"multiple\"></select></div></div>');\n        var select = $('select', selector);\n\t\t\n\t\tfunction insert(perm,i,v) {\n\t\t\tif(i>=0){\n\t\t\t\tvar a = perm.slice();\n\t\t\t\tvar b = a.splice(i,Math.max(perm.length-i,i));\n\t\t\t\tif(i>perm.length) { i = perm.length; }\n\t\t\t\ta[i] = v;\n\t\t\t\treturn a.concat(b);\n\t\t\t}\n\t\t}\n        opts = $.extend({\n            \"width\" : 420,\n            \"height\" : 240,\n            \"classname\" : null,\n            \"done\" : function(perm) { if (perm) { self.jqGrid(\"remapColumns\", perm, true); } },\n            /* msel is either the name of a ui widget class that\n               extends a multiselect, or a function that supports\n               creating a multiselect object (with no argument,\n               or when passed an object), and destroying it (when\n               passed the string \"destroy\"). */\n            \"msel\" : \"multiselect\",\n            /* \"msel_opts\" : {}, */\n\n            /* dlog is either the name of a ui widget class that \n               behaves in a dialog-like way, or a function, that\n               supports creating a dialog (when passed dlog_opts)\n               or destroying a dialog (when passed the string\n               \"destroy\")\n               */\n            \"dlog\" : \"dialog\",\n\t\t\t\"dialog_opts\" : {\n\t\t\t\t\"minWidth\": 470\n\t\t\t},\n            /* dlog_opts is either an option object to be passed \n               to \"dlog\", or (more likely) a function that creates\n               the options object.\n               The default produces a suitable options object for\n               ui.dialog */\n            \"dlog_opts\" : function(opts) {\n                var buttons = {};\n                buttons[opts.bSubmit] = function() {\n                    opts.apply_perm();\n                    opts.cleanup(false);\n                };\n                buttons[opts.bCancel] = function() {\n                    opts.cleanup(true);\n                };\n                return $.extend(true, {\n                    \"buttons\": buttons,\n                    \"close\": function() {\n                        opts.cleanup(true);\n                    },\n\t\t\t\t\t\"modal\" : opts.modal || false,\n\t\t\t\t\t\"resizable\": opts.resizable || true,\n                    \"width\": opts.width+20\n                }, opts.dialog_opts || {});\n            },\n            /* Function to get the permutation array, and pass it to the\n               \"done\" function */\n            \"apply_perm\" : function() {\n                $('option',select).each(function() {\n                    if (this.selected) {\n                        self.jqGrid(\"showCol\", colModel[this.value].name);\n                    } else {\n                        self.jqGrid(\"hideCol\", colModel[this.value].name);\n                    }\n                });\n                \n                var perm = [];\n\t\t\t\t//fixedCols.slice(0);\n                $('option:selected',select).each(function() { perm.push(parseInt(this.value,10)); });\n                $.each(perm, function() { delete colMap[colModel[parseInt(this,10)].name]; });\n                $.each(colMap, function() {\n\t\t\t\t\tvar ti = parseInt(this,10);\n\t\t\t\t\tperm = insert(perm,ti,ti);\n\t\t\t\t});\n                if (opts.done) {\n                    opts.done.call(self, perm);\n                }\n            },\n            /* Function to cleanup the dialog, and select. Also calls the\n               done function with no permutation (to indicate that the\n               columnChooser was aborted */\n            \"cleanup\" : function(calldone) {\n                call(opts.dlog, selector, 'destroy');\n                call(opts.msel, select, 'destroy');\n                selector.remove();\n                if (calldone && opts.done) {\n                    opts.done.call(self);\n                }\n            },\n\t\t\t\"msel_opts\" : {}\n        }, $.jgrid.col, opts || {});\n\t\tif($.ui) {\n\t\t\tif ($.ui.multiselect ) {\n\t\t\t\tif(opts.msel === \"multiselect\") {\n\t\t\t\t\tif(!$.jgrid._multiselect) {\n\t\t\t\t\t\t// should be in language file\n\t\t\t\t\t\talert(\"Multiselect plugin loaded after jqGrid. Please load the plugin before the jqGrid!\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\topts.msel_opts = $.extend($.ui.multiselect.defaults,opts.msel_opts);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n        if (opts.caption) {\n            selector.attr(\"title\", opts.caption);\n        }\n        if (opts.classname) {\n            selector.addClass(opts.classname);\n            select.addClass(opts.classname);\n        }\n        if (opts.width) {\n            $(\">div\",selector).css({\"width\": opts.width,\"margin\":\"0 auto\"});\n            select.css(\"width\", opts.width);\n        }\n        if (opts.height) {\n            $(\">div\",selector).css(\"height\", opts.height);\n            select.css(\"height\", opts.height - 10);\n        }\n        var colModel = self.jqGrid(\"getGridParam\", \"colModel\");\n        var colNames = self.jqGrid(\"getGridParam\", \"colNames\");\n        var colMap = {}, fixedCols = [];\n\n        select.empty();\n        $.each(colModel, function(i) {\n            colMap[this.name] = i;\n            if (this.hidedlg) {\n                if (!this.hidden) {\n                    fixedCols.push(i);\n                }\n                return;\n            }\n\n            select.append(\"<option value='\"+i+\"' \"+\n                          (this.hidden?\"\":\"selected='selected'\")+\">\"+$.jgrid.stripHtml(colNames[i])+\"</option>\");\n        });\n        function call(fn, obj) {\n            if (!fn) { return; }\n            if (typeof fn === 'string') {\n                if ($.fn[fn]) {\n                    $.fn[fn].apply(obj, $.makeArray(arguments).slice(2));\n                }\n            } else if ($.isFunction(fn)) {\n                fn.apply(obj, $.makeArray(arguments).slice(2));\n            }\n        }\n\n        var dopts = $.isFunction(opts.dlog_opts) ? opts.dlog_opts.call(self, opts) : opts.dlog_opts;\n        call(opts.dlog, selector, dopts);\n        var mopts = $.isFunction(opts.msel_opts) ? opts.msel_opts.call(self, opts) : opts.msel_opts;\n        call(opts.msel, select, mopts);\n    },\n\tsortableRows : function (opts) {\n\t\t// Can accept all sortable options and events\n\t\treturn this.each(function(){\n\t\t\tvar $t = this;\n\t\t\tif(!$t.grid) { return; }\n\t\t\t// Currently we disable a treeGrid sortable\n\t\t\tif($t.p.treeGrid) { return; }\n\t\t\tif($.fn.sortable) {\n\t\t\t\topts = $.extend({\n\t\t\t\t\t\"cursor\":\"move\",\n\t\t\t\t\t\"axis\" : \"y\",\n\t\t\t\t\t\"items\": \".jqgrow\"\n\t\t\t\t\t},\n\t\t\t\topts || {});\n\t\t\t\tif(opts.start && $.isFunction(opts.start)) {\n\t\t\t\t\topts._start_ = opts.start;\n\t\t\t\t\tdelete opts.start;\n\t\t\t\t} else {opts._start_=false;}\n\t\t\t\tif(opts.update && $.isFunction(opts.update)) {\n\t\t\t\t\topts._update_ = opts.update;\n\t\t\t\t\tdelete opts.update;\n\t\t\t\t} else {opts._update_ = false;}\n\t\t\t\topts.start = function(ev,ui) {\n\t\t\t\t\t$(ui.item).css(\"border-width\",\"0px\");\n\t\t\t\t\t$(\"td\",ui.item).each(function(i){\n\t\t\t\t\t\tthis.style.width = $t.grid.cols[i].style.width;\n\t\t\t\t\t});\n\t\t\t\t\tif($t.p.subGrid) {\n\t\t\t\t\t\tvar subgid = $(ui.item).attr(\"id\");\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t$($t).jqGrid('collapseSubGridRow',subgid);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\t\t\t\t\tif(opts._start_) {\n\t\t\t\t\t\topts._start_.apply(this,[ev,ui]);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\topts.update = function (ev,ui) {\n\t\t\t\t\t$(ui.item).css(\"border-width\",\"\");\n\t\t\t\t\tif($t.p.rownumbers === true) {\n\t\t\t\t\t\t$(\"td.jqgrid-rownum\",$t.rows).each(function( i ){\n\t\t\t\t\t\t\t$(this).html( i+1+(parseInt($t.p.page,10)-1)*parseInt($t.p.rowNum,10) );\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif(opts._update_) {\n\t\t\t\t\t\topts._update_.apply(this,[ev,ui]);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t$(\"tbody:first\",$t).sortable(opts);\n\t\t\t\t$(\"tbody:first\",$t).disableSelection();\n\t\t\t}\n\t\t});\n\t},\n\tgridDnD : function(opts) {\n\t\treturn this.each(function(){\n\t\tvar $t = this, i, cn;\n\t\tif(!$t.grid) { return; }\n\t\t// Currently we disable a treeGrid drag and drop\n\t\tif($t.p.treeGrid) { return; }\n\t\tif(!$.fn.draggable || !$.fn.droppable) { return; }\n\t\tfunction updateDnD ()\n\t\t{\n\t\t\tvar datadnd = $.data($t,\"dnd\");\n\t\t\t$(\"tr.jqgrow:not(.ui-draggable)\",$t).draggable($.isFunction(datadnd.drag) ? datadnd.drag.call($($t),datadnd) : datadnd.drag);\n\t\t}\n\t\tvar appender = \"<table id='jqgrid_dnd' class='ui-jqgrid-dnd'></table>\";\n\t\tif($(\"#jqgrid_dnd\")[0] === undefined) {\n\t\t\t$('body').append(appender);\n\t\t}\n\n\t\tif(typeof opts === 'string' && opts === 'updateDnD' && $t.p.jqgdnd===true) {\n\t\t\tupdateDnD();\n\t\t\treturn;\n\t\t}\n\t\topts = $.extend({\n\t\t\t\"drag\" : function (opts) {\n\t\t\t\treturn $.extend({\n\t\t\t\t\tstart : function (ev, ui) {\n\t\t\t\t\t\tvar i, subgid;\n\t\t\t\t\t\t// if we are in subgrid mode try to collapse the node\n\t\t\t\t\t\tif($t.p.subGrid) {\n\t\t\t\t\t\t\tsubgid = $(ui.helper).attr(\"id\");\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t$($t).jqGrid('collapseSubGridRow',subgid);\n\t\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// hack\n\t\t\t\t\t\t// drag and drop does not insert tr in table, when the table has no rows\n\t\t\t\t\t\t// we try to insert new empty row on the target(s)\n\t\t\t\t\t\tfor (i=0;i<$.data($t,\"dnd\").connectWith.length;i++){\n\t\t\t\t\t\t\tif($($.data($t,\"dnd\").connectWith[i]).jqGrid('getGridParam','reccount') === 0 ){\n\t\t\t\t\t\t\t\t$($.data($t,\"dnd\").connectWith[i]).jqGrid('addRowData','jqg_empty_row',{});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tui.helper.addClass(\"ui-state-highlight\");\n\t\t\t\t\t\t$(\"td\",ui.helper).each(function(i) {\n\t\t\t\t\t\t\tthis.style.width = $t.grid.headers[i].width+\"px\";\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif(opts.onstart && $.isFunction(opts.onstart) ) { opts.onstart.call($($t),ev,ui); }\n\t\t\t\t\t},\n\t\t\t\t\tstop :function(ev,ui) {\n\t\t\t\t\t\tvar i, ids;\n\t\t\t\t\t\tif(ui.helper.dropped && !opts.dragcopy) {\n\t\t\t\t\t\t\tids = $(ui.helper).attr(\"id\");\n\t\t\t\t\t\t\tif(ids === undefined) { ids = $(this).attr(\"id\"); }\n\t\t\t\t\t\t\t$($t).jqGrid('delRowData',ids );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// if we have a empty row inserted from start event try to delete it\n\t\t\t\t\t\tfor (i=0;i<$.data($t,\"dnd\").connectWith.length;i++){\n\t\t\t\t\t\t\t$($.data($t,\"dnd\").connectWith[i]).jqGrid('delRowData','jqg_empty_row');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(opts.onstop && $.isFunction(opts.onstop) ) { opts.onstop.call($($t),ev,ui); }\n\t\t\t\t\t}\n\t\t\t\t},opts.drag_opts || {});\n\t\t\t},\n\t\t\t\"drop\" : function (opts) {\n\t\t\t\treturn $.extend({\n\t\t\t\t\taccept: function(d) {\n\t\t\t\t\t\tif (!$(d).hasClass('jqgrow')) { return d;}\n\t\t\t\t\t\tvar tid = $(d).closest(\"table.ui-jqgrid-btable\");\n\t\t\t\t\t\tif(tid.length > 0 && $.data(tid[0],\"dnd\") !== undefined) {\n\t\t\t\t\t\t\tvar cn = $.data(tid[0],\"dnd\").connectWith;\n\t\t\t\t\t\t\treturn $.inArray('#'+$.jgrid.jqID(this.id),cn) !== -1 ? true : false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t},\n\t\t\t\t\tdrop: function(ev, ui) {\n\t\t\t\t\t\tif (!$(ui.draggable).hasClass('jqgrow')) { return; }\n\t\t\t\t\t\tvar accept = $(ui.draggable).attr(\"id\");\n\t\t\t\t\t\tvar getdata = ui.draggable.parent().parent().jqGrid('getRowData',accept);\n\t\t\t\t\t\tif(!opts.dropbyname) {\n\t\t\t\t\t\t\tvar j =0, tmpdata = {}, nm, key;\n\t\t\t\t\t\t\tvar dropmodel = $(\"#\"+$.jgrid.jqID(this.id)).jqGrid('getGridParam','colModel');\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tfor (key in getdata) {\n\t\t\t\t\t\t\t\t\tif (getdata.hasOwnProperty(key)) {\n\t\t\t\t\t\t\t\t\tnm = dropmodel[j].name;\n\t\t\t\t\t\t\t\t\tif( !(nm === 'cb' || nm === 'rn' || nm === 'subgrid' )) {\n\t\t\t\t\t\t\t\t\t\tif(getdata.hasOwnProperty(key) && dropmodel[j]) {\n\t\t\t\t\t\t\t\t\t\t\ttmpdata[nm] = getdata[key];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tgetdata = tmpdata;\n\t\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tui.helper.dropped = true;\n\t\t\t\t\t\tif(opts.beforedrop && $.isFunction(opts.beforedrop) ) {\n\t\t\t\t\t\t\t//parameters to this callback - event, element, data to be inserted, sender, reciever\n\t\t\t\t\t\t\t// should return object which will be inserted into the reciever\n\t\t\t\t\t\t\tvar datatoinsert = opts.beforedrop.call(this,ev,ui,getdata,$('#'+$.jgrid.jqID($t.p.id)),$(this));\n\t\t\t\t\t\t\tif (datatoinsert !== undefined && datatoinsert !== null && typeof datatoinsert === \"object\") { getdata = datatoinsert; }\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(ui.helper.dropped) {\n\t\t\t\t\t\t\tvar grid;\n\t\t\t\t\t\t\tif(opts.autoid) {\n\t\t\t\t\t\t\t\tif($.isFunction(opts.autoid)) {\n\t\t\t\t\t\t\t\t\tgrid = opts.autoid.call(this,getdata);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tgrid = Math.ceil(Math.random()*1000);\n\t\t\t\t\t\t\t\t\tgrid = opts.autoidprefix+grid;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// NULL is interpreted as undefined while null as object\n\t\t\t\t\t\t\t$(\"#\"+$.jgrid.jqID(this.id)).jqGrid('addRowData',grid,getdata,opts.droppos);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(opts.ondrop && $.isFunction(opts.ondrop) ) { opts.ondrop.call(this,ev,ui, getdata); }\n\t\t\t\t\t}}, opts.drop_opts || {});\n\t\t\t},\n\t\t\t\"onstart\" : null,\n\t\t\t\"onstop\" : null,\n\t\t\t\"beforedrop\": null,\n\t\t\t\"ondrop\" : null,\n\t\t\t\"drop_opts\" : {\n\t\t\t\t\"activeClass\": \"ui-state-active\",\n\t\t\t\t\"hoverClass\": \"ui-state-hover\"\n\t\t\t},\n\t\t\t\"drag_opts\" : {\n\t\t\t\t\"revert\": \"invalid\",\n\t\t\t\t\"helper\": \"clone\",\n\t\t\t\t\"cursor\": \"move\",\n\t\t\t\t\"appendTo\" : \"#jqgrid_dnd\",\n\t\t\t\t\"zIndex\": 5000\n\t\t\t},\n\t\t\t\"dragcopy\": false,\n\t\t\t\"dropbyname\" : false,\n\t\t\t\"droppos\" : \"first\",\n\t\t\t\"autoid\" : true,\n\t\t\t\"autoidprefix\" : \"dnd_\"\n\t\t}, opts || {});\n\t\t\n\t\tif(!opts.connectWith) { return; }\n\t\topts.connectWith = opts.connectWith.split(\",\");\n\t\topts.connectWith = $.map(opts.connectWith,function(n){return $.trim(n);});\n\t\t$.data($t,\"dnd\",opts);\n\t\t\n\t\tif($t.p.reccount !== 0 && !$t.p.jqgdnd) {\n\t\t\tupdateDnD();\n\t\t}\n\t\t$t.p.jqgdnd = true;\n\t\tfor (i=0;i<opts.connectWith.length;i++){\n\t\t\tcn =opts.connectWith[i];\n\t\t\t$(cn).droppable($.isFunction(opts.drop) ? opts.drop.call($($t),opts) : opts.drop);\n\t\t}\n\t\t});\n\t},\n\tgridResize : function(opts) {\n\t\treturn this.each(function(){\n\t\t\tvar $t = this, gID = $.jgrid.jqID($t.p.id);\n\t\t\tif(!$t.grid || !$.fn.resizable) { return; }\n\t\t\topts = $.extend({}, opts || {});\n\t\t\tif(opts.alsoResize ) {\n\t\t\t\topts._alsoResize_ = opts.alsoResize;\n\t\t\t\tdelete opts.alsoResize;\n\t\t\t} else {\n\t\t\t\topts._alsoResize_ = false;\n\t\t\t}\n\t\t\tif(opts.stop && $.isFunction(opts.stop)) {\n\t\t\t\topts._stop_ = opts.stop;\n\t\t\t\tdelete opts.stop;\n\t\t\t} else {\n\t\t\t\topts._stop_ = false;\n\t\t\t}\n\t\t\topts.stop = function (ev, ui) {\n\t\t\t\t$($t).jqGrid('setGridParam',{height:$(\"#gview_\"+gID+\" .ui-jqgrid-bdiv\").height()});\n\t\t\t\t$($t).jqGrid('setGridWidth',ui.size.width,opts.shrinkToFit);\n\t\t\t\tif(opts._stop_) { opts._stop_.call($t,ev,ui); }\n\t\t\t};\n\t\t\tif(opts._alsoResize_) {\n\t\t\t\tvar optstest = \"{\\'#gview_\"+gID+\" .ui-jqgrid-bdiv\\':true,'\" +opts._alsoResize_+\"':true}\";\n\t\t\t\topts.alsoResize = eval('('+optstest+')'); // the only way that I found to do this\n\t\t\t} else {\n\t\t\t\topts.alsoResize = $(\".ui-jqgrid-bdiv\",\"#gview_\"+gID);\n\t\t\t}\n\t\t\tdelete opts._alsoResize_;\n\t\t\t$(\"#gbox_\"+gID).resizable(opts);\n\t\t});\n\t}\n});\n})(jQuery);\n/*\n Transform a table to a jqGrid.\n Peter Romianowski <peter.romianowski@optivo.de> \n If the first column of the table contains checkboxes or\n radiobuttons then the jqGrid is made selectable.\n*/\n// Addition - selector can be a class or id\nfunction tableToGrid(selector, options) {\njQuery(selector).each(function() {\n\tif(this.grid) {return;} //Adedd from Tony Tomov\n\t// This is a small \"hack\" to make the width of the jqGrid 100%\n\tjQuery(this).width(\"99%\");\n\tvar w = jQuery(this).width();\n\n\t// Text whether we have single or multi select\n\tvar inputCheckbox = jQuery('tr td:first-child input[type=checkbox]:first', jQuery(this));\n\tvar inputRadio = jQuery('tr td:first-child input[type=radio]:first', jQuery(this));\n\tvar selectMultiple = inputCheckbox.length > 0;\n\tvar selectSingle = !selectMultiple && inputRadio.length > 0;\n\tvar selectable = selectMultiple || selectSingle;\n\t//var inputName = inputCheckbox.attr(\"name\") || inputRadio.attr(\"name\");\n\n\t// Build up the columnModel and the data\n\tvar colModel = [];\n\tvar colNames = [];\n\tjQuery('th', jQuery(this)).each(function() {\n\t\tif (colModel.length === 0 && selectable) {\n\t\t\tcolModel.push({\n\t\t\t\tname: '__selection__',\n\t\t\t\tindex: '__selection__',\n\t\t\t\twidth: 0,\n\t\t\t\thidden: true\n\t\t\t});\n\t\t\tcolNames.push('__selection__');\n\t\t} else {\n\t\t\tcolModel.push({\n\t\t\t\tname: jQuery(this).attr(\"id\") || jQuery.trim(jQuery.jgrid.stripHtml(jQuery(this).html())).split(' ').join('_'),\n\t\t\t\tindex: jQuery(this).attr(\"id\") || jQuery.trim(jQuery.jgrid.stripHtml(jQuery(this).html())).split(' ').join('_'),\n\t\t\t\twidth: jQuery(this).width() || 150\n\t\t\t});\n\t\t\tcolNames.push(jQuery(this).html());\n\t\t}\n\t});\n\tvar data = [];\n\tvar rowIds = [];\n\tvar rowChecked = [];\n\tjQuery('tbody > tr', jQuery(this)).each(function() {\n\t\tvar row = {};\n\t\tvar rowPos = 0;\n\t\tjQuery('td', jQuery(this)).each(function() {\n\t\t\tif (rowPos === 0 && selectable) {\n\t\t\t\tvar input = jQuery('input', jQuery(this));\n\t\t\t\tvar rowId = input.attr(\"value\");\n\t\t\t\trowIds.push(rowId || data.length);\n\t\t\t\tif (input.is(\":checked\")) {\n\t\t\t\t\trowChecked.push(rowId);\n\t\t\t\t}\n\t\t\t\trow[colModel[rowPos].name] = input.attr(\"value\");\n\t\t\t} else {\n\t\t\t\trow[colModel[rowPos].name] = jQuery(this).html();\n\t\t\t}\n\t\t\trowPos++;\n\t\t});\n\t\tif(rowPos >0) { data.push(row); }\n\t});\n\n\t// Clear the original HTML table\n\tjQuery(this).empty();\n\n\t// Mark it as jqGrid\n\tjQuery(this).addClass(\"scroll\");\n\n\tjQuery(this).jqGrid(jQuery.extend({\n\t\tdatatype: \"local\",\n\t\twidth: w,\n\t\tcolNames: colNames,\n\t\tcolModel: colModel,\n\t\tmultiselect: selectMultiple\n\t\t//inputName: inputName,\n\t\t//inputValueCol: imputName != null ? \"__selection__\" : null\n\t}, options || {}));\n\n\t// Add data\n\tvar a;\n\tfor (a = 0; a < data.length; a++) {\n\t\tvar id = null;\n\t\tif (rowIds.length > 0) {\n\t\t\tid = rowIds[a];\n\t\t\tif (id && id.replace) {\n\t\t\t\t// We have to do this since the value of a checkbox\n\t\t\t\t// or radio button can be anything \n\t\t\t\tid = encodeURIComponent(id).replace(/[.\\-%]/g, \"_\");\n\t\t\t}\n\t\t}\n\t\tif (id === null) {\n\t\t\tid = a + 1;\n\t\t}\n\t\tjQuery(this).jqGrid(\"addRowData\",id, data[a]);\n\t}\n\n\t// Set the selection\n\tfor (a = 0; a < rowChecked.length; a++) {\n\t\tjQuery(this).jqGrid(\"setSelection\",rowChecked[a]);\n\t}\n});\n};\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/js/jquery.colorbox-min.js",
    "content": "/*!\n\tColorbox v1.4.27 - 2013-07-16\n\tjQuery lightbox and modal window plugin\n\t(c) 2013 Jack Moore - http://www.jacklmoore.com/colorbox\n\tlicense: http://www.opensource.org/licenses/mit-license.php\n*/\n(function(t,e,i){function o(i,o,n){var r=e.createElement(i);return o&&(r.id=te+o),n&&(r.style.cssText=n),t(r)}function n(){return i.innerHeight?i.innerHeight:t(i).height()}function r(t){var e=E.length,i=(j+t)%e;return 0>i?e+i:i}function l(t,e){return Math.round((/%/.test(t)?(\"x\"===e?H.width():n())/100:1)*parseInt(t,10))}function h(t,e){return t.photo||t.photoRegex.test(e)}function s(t,e){return t.retinaUrl&&i.devicePixelRatio>1?e.replace(t.photoRegex,t.retinaSuffix):e}function a(t){\"contains\"in v[0]&&!v[0].contains(t.target)&&(t.stopPropagation(),v.focus())}function d(){var e,i=t.data(A,Z);null==i?(O=t.extend({},Y),console&&console.log&&console.log(\"Error: cboxElement missing settings object\")):O=t.extend({},i);for(e in O)t.isFunction(O[e])&&\"on\"!==e.slice(0,2)&&(O[e]=O[e].call(A));O.rel=O.rel||A.rel||t(A).data(\"rel\")||\"nofollow\",O.href=O.href||t(A).attr(\"href\"),O.title=O.title||A.title,\"string\"==typeof O.href&&(O.href=t.trim(O.href))}function c(i,o){t(e).trigger(i),se.trigger(i),t.isFunction(o)&&o.call(A)}function u(){var t,e,i,o,n,r=te+\"Slideshow_\",l=\"click.\"+te;O.slideshow&&E[1]?(e=function(){clearTimeout(t)},i=function(){(O.loop||E[j+1])&&(t=setTimeout(J.next,O.slideshowSpeed))},o=function(){R.html(O.slideshowStop).unbind(l).one(l,n),se.bind(ne,i).bind(oe,e).bind(re,n),v.removeClass(r+\"off\").addClass(r+\"on\")},n=function(){e(),se.unbind(ne,i).unbind(oe,e).unbind(re,n),R.html(O.slideshowStart).unbind(l).one(l,function(){J.next(),o()}),v.removeClass(r+\"on\").addClass(r+\"off\")},O.slideshowAuto?o():n()):v.removeClass(r+\"off \"+r+\"on\")}function p(i){G||(A=i,d(),E=t(A),j=0,\"nofollow\"!==O.rel&&(E=t(\".\"+ee).filter(function(){var e,i=t.data(this,Z);return i&&(e=t(this).data(\"rel\")||i.rel||this.rel),e===O.rel}),j=E.index(A),-1===j&&(E=E.add(A),j=E.length-1)),g.css({opacity:parseFloat(O.opacity),cursor:O.overlayClose?\"pointer\":\"auto\",visibility:\"visible\"}).show(),V&&v.add(g).removeClass(V),O.className&&v.add(g).addClass(O.className),V=O.className,O.closeButton?P.html(O.close).appendTo(x):P.appendTo(\"<div/>\"),$||($=q=!0,v.css({visibility:\"hidden\",display:\"block\"}),W=o(ae,\"LoadedContent\",\"width:0; height:0; overflow:hidden\"),x.css({width:\"\",height:\"\"}).append(W),_=b.height()+k.height()+x.outerHeight(!0)-x.height(),D=T.width()+C.width()+x.outerWidth(!0)-x.width(),N=W.outerHeight(!0),z=W.outerWidth(!0),O.w=l(O.initialWidth,\"x\"),O.h=l(O.initialHeight,\"y\"),J.position(),u(),c(ie,O.onOpen),B.add(S).hide(),v.focus(),O.trapFocus&&e.addEventListener&&(e.addEventListener(\"focus\",a,!0),se.one(le,function(){e.removeEventListener(\"focus\",a,!0)})),O.returnFocus&&se.one(le,function(){t(A).focus()})),w())}function f(){!v&&e.body&&(X=!1,H=t(i),v=o(ae).attr({id:Z,\"class\":t.support.opacity===!1?te+\"IE\":\"\",role:\"dialog\",tabindex:\"-1\"}).hide(),g=o(ae,\"Overlay\").hide(),L=t([o(ae,\"LoadingOverlay\")[0],o(ae,\"LoadingGraphic\")[0]]),y=o(ae,\"Wrapper\"),x=o(ae,\"Content\").append(S=o(ae,\"Title\"),M=o(ae,\"Current\"),K=t('<button type=\"button\"/>').attr({id:te+\"Previous\"}),I=t('<button type=\"button\"/>').attr({id:te+\"Next\"}),R=o(\"button\",\"Slideshow\"),L),P=t('<button type=\"button\"/>').attr({id:te+\"Close\"}),y.append(o(ae).append(o(ae,\"TopLeft\"),b=o(ae,\"TopCenter\"),o(ae,\"TopRight\")),o(ae,!1,\"clear:left\").append(T=o(ae,\"MiddleLeft\"),x,C=o(ae,\"MiddleRight\")),o(ae,!1,\"clear:left\").append(o(ae,\"BottomLeft\"),k=o(ae,\"BottomCenter\"),o(ae,\"BottomRight\"))).find(\"div div\").css({\"float\":\"left\"}),F=o(ae,!1,\"position:absolute; width:9999px; visibility:hidden; display:none\"),B=I.add(K).add(M).add(R),t(e.body).append(g,v.append(y,F)))}function m(){function i(t){t.which>1||t.shiftKey||t.altKey||t.metaKey||t.ctrlKey||(t.preventDefault(),p(this))}return v?(X||(X=!0,I.click(function(){J.next()}),K.click(function(){J.prev()}),P.click(function(){J.close()}),g.click(function(){O.overlayClose&&J.close()}),t(e).bind(\"keydown.\"+te,function(t){var e=t.keyCode;$&&O.escKey&&27===e&&(t.preventDefault(),J.close()),$&&O.arrowKey&&E[1]&&!t.altKey&&(37===e?(t.preventDefault(),K.click()):39===e&&(t.preventDefault(),I.click()))}),t.isFunction(t.fn.on)?t(e).on(\"click.\"+te,\".\"+ee,i):t(\".\"+ee).live(\"click.\"+te,i)),!0):!1}function w(){var n,r,a,u=J.prep,p=++de;q=!0,U=!1,A=E[j],d(),c(he),c(oe,O.onLoad),O.h=O.height?l(O.height,\"y\")-N-_:O.innerHeight&&l(O.innerHeight,\"y\"),O.w=O.width?l(O.width,\"x\")-z-D:O.innerWidth&&l(O.innerWidth,\"x\"),O.mw=O.w,O.mh=O.h,O.maxWidth&&(O.mw=l(O.maxWidth,\"x\")-z-D,O.mw=O.w&&O.w<O.mw?O.w:O.mw),O.maxHeight&&(O.mh=l(O.maxHeight,\"y\")-N-_,O.mh=O.h&&O.h<O.mh?O.h:O.mh),n=O.href,Q=setTimeout(function(){L.show()},100),O.inline?(a=o(ae).hide().insertBefore(t(n)[0]),se.one(he,function(){a.replaceWith(W.children())}),u(t(n))):O.iframe?u(\" \"):O.html?u(O.html):h(O,n)?(n=s(O,n),U=e.createElement(\"img\"),t(U).addClass(te+\"Photo\").bind(\"error\",function(){O.title=!1,u(o(ae,\"Error\").html(O.imgError))}).one(\"load\",function(){var e;p===de&&(U.alt=t(A).attr(\"alt\")||t(A).attr(\"data-alt\")||\"\",O.retinaImage&&i.devicePixelRatio>1&&(U.height=U.height/i.devicePixelRatio,U.width=U.width/i.devicePixelRatio),O.scalePhotos&&(r=function(){U.height-=U.height*e,U.width-=U.width*e},O.mw&&U.width>O.mw&&(e=(U.width-O.mw)/U.width,r()),O.mh&&U.height>O.mh&&(e=(U.height-O.mh)/U.height,r())),O.h&&(U.style.marginTop=Math.max(O.mh-U.height,0)/2+\"px\"),E[1]&&(O.loop||E[j+1])&&(U.style.cursor=\"pointer\",U.onclick=function(){J.next()}),U.style.width=U.width+\"px\",U.style.height=U.height+\"px\",setTimeout(function(){u(U)},1))}),setTimeout(function(){U.src=n},1)):n&&F.load(n,O.data,function(e,i){p===de&&u(\"error\"===i?o(ae,\"Error\").html(O.xhrError):t(this).contents())})}var g,v,y,x,b,T,C,k,E,H,W,F,L,S,M,R,I,K,P,B,O,_,D,N,z,A,j,U,$,q,G,Q,J,V,X,Y={transition:\"elastic\",speed:300,fadeOut:300,width:!1,initialWidth:\"600\",innerWidth:!1,maxWidth:!1,height:!1,initialHeight:\"450\",innerHeight:!1,maxHeight:!1,scalePhotos:!0,scrolling:!0,inline:!1,html:!1,iframe:!1,fastIframe:!0,photo:!1,href:!1,title:!1,rel:!1,opacity:.9,preloading:!0,className:!1,retinaImage:!1,retinaUrl:!1,retinaSuffix:\"@2x.$1\",current:\"image {current} of {total}\",previous:\"previous\",next:\"next\",close:\"close\",xhrError:\"This content failed to load.\",imgError:\"This image failed to load.\",open:!1,returnFocus:!0,trapFocus:!0,reposition:!0,loop:!0,slideshow:!1,slideshowAuto:!0,slideshowSpeed:2500,slideshowStart:\"start slideshow\",slideshowStop:\"stop slideshow\",photoRegex:/\\.(gif|png|jp(e|g|eg)|bmp|ico|webp)((#|\\?).*)?$/i,onOpen:!1,onLoad:!1,onComplete:!1,onCleanup:!1,onClosed:!1,overlayClose:!0,escKey:!0,arrowKey:!0,top:!1,bottom:!1,left:!1,right:!1,fixed:!1,data:void 0,closeButton:!0},Z=\"colorbox\",te=\"cbox\",ee=te+\"Element\",ie=te+\"_open\",oe=te+\"_load\",ne=te+\"_complete\",re=te+\"_cleanup\",le=te+\"_closed\",he=te+\"_purge\",se=t(\"<a/>\"),ae=\"div\",de=0,ce={};t.colorbox||(t(f),J=t.fn[Z]=t[Z]=function(e,i){var o=this;if(e=e||{},f(),m()){if(t.isFunction(o))o=t(\"<a/>\"),e.open=!0;else if(!o[0])return o;i&&(e.onComplete=i),o.each(function(){t.data(this,Z,t.extend({},t.data(this,Z)||Y,e))}).addClass(ee),(t.isFunction(e.open)&&e.open.call(o)||e.open)&&p(o[0])}return o},J.position=function(e,i){function o(){b[0].style.width=k[0].style.width=x[0].style.width=parseInt(v[0].style.width,10)-D+\"px\",x[0].style.height=T[0].style.height=C[0].style.height=parseInt(v[0].style.height,10)-_+\"px\"}var r,h,s,a=0,d=0,c=v.offset();if(H.unbind(\"resize.\"+te),v.css({top:-9e4,left:-9e4}),h=H.scrollTop(),s=H.scrollLeft(),O.fixed?(c.top-=h,c.left-=s,v.css({position:\"fixed\"})):(a=h,d=s,v.css({position:\"absolute\"})),d+=O.right!==!1?Math.max(H.width()-O.w-z-D-l(O.right,\"x\"),0):O.left!==!1?l(O.left,\"x\"):Math.round(Math.max(H.width()-O.w-z-D,0)/2),a+=O.bottom!==!1?Math.max(n()-O.h-N-_-l(O.bottom,\"y\"),0):O.top!==!1?l(O.top,\"y\"):Math.round(Math.max(n()-O.h-N-_,0)/2),v.css({top:c.top,left:c.left,visibility:\"visible\"}),y[0].style.width=y[0].style.height=\"9999px\",r={width:O.w+z+D,height:O.h+N+_,top:a,left:d},e){var u=0;t.each(r,function(t){return r[t]!==ce[t]?(u=e,void 0):void 0}),e=u}ce=r,e||v.css(r),v.dequeue().animate(r,{duration:e||0,complete:function(){o(),q=!1,y[0].style.width=O.w+z+D+\"px\",y[0].style.height=O.h+N+_+\"px\",O.reposition&&setTimeout(function(){H.bind(\"resize.\"+te,J.position)},1),i&&i()},step:o})},J.resize=function(t){var e;$&&(t=t||{},t.width&&(O.w=l(t.width,\"x\")-z-D),t.innerWidth&&(O.w=l(t.innerWidth,\"x\")),W.css({width:O.w}),t.height&&(O.h=l(t.height,\"y\")-N-_),t.innerHeight&&(O.h=l(t.innerHeight,\"y\")),t.innerHeight||t.height||(e=W.scrollTop(),W.css({height:\"auto\"}),O.h=W.height()),W.css({height:O.h}),e&&W.scrollTop(e),J.position(\"none\"===O.transition?0:O.speed))},J.prep=function(i){function n(){return O.w=O.w||W.width(),O.w=O.mw&&O.mw<O.w?O.mw:O.w,O.w}function l(){return O.h=O.h||W.height(),O.h=O.mh&&O.mh<O.h?O.mh:O.h,O.h}if($){var a,d=\"none\"===O.transition?0:O.speed;W.empty().remove(),W=o(ae,\"LoadedContent\").append(i),W.hide().appendTo(F.show()).css({width:n(),overflow:O.scrolling?\"auto\":\"hidden\"}).css({height:l()}).prependTo(x),F.hide(),t(U).css({\"float\":\"none\"}),a=function(){function i(){t.support.opacity===!1&&v[0].style.removeAttribute(\"filter\")}var n,l,a=E.length,u=\"frameBorder\",p=\"allowTransparency\";$&&(l=function(){clearTimeout(Q),L.hide(),c(ne,O.onComplete)},S.html(O.title).add(W).show(),a>1?(\"string\"==typeof O.current&&M.html(O.current.replace(\"{current}\",j+1).replace(\"{total}\",a)).show(),I[O.loop||a-1>j?\"show\":\"hide\"]().html(O.next),K[O.loop||j?\"show\":\"hide\"]().html(O.previous),O.slideshow&&R.show(),O.preloading&&t.each([r(-1),r(1)],function(){var i,o,n=E[this],r=t.data(n,Z);r&&r.href?(i=r.href,t.isFunction(i)&&(i=i.call(n))):i=t(n).attr(\"href\"),i&&h(r,i)&&(i=s(r,i),o=e.createElement(\"img\"),o.src=i)})):B.hide(),O.iframe?(n=o(\"iframe\")[0],u in n&&(n[u]=0),p in n&&(n[p]=\"true\"),O.scrolling||(n.scrolling=\"no\"),t(n).attr({src:O.href,name:(new Date).getTime(),\"class\":te+\"Iframe\",allowFullScreen:!0,webkitAllowFullScreen:!0,mozallowfullscreen:!0}).one(\"load\",l).appendTo(W),se.one(he,function(){n.src=\"//about:blank\"}),O.fastIframe&&t(n).trigger(\"load\")):l(),\"fade\"===O.transition?v.fadeTo(d,1,i):i())},\"fade\"===O.transition?v.fadeTo(d,0,function(){J.position(0,a)}):J.position(d,a)}},J.next=function(){!q&&E[1]&&(O.loop||E[j+1])&&(j=r(1),p(E[j]))},J.prev=function(){!q&&E[1]&&(O.loop||j)&&(j=r(-1),p(E[j]))},J.close=function(){$&&!G&&(G=!0,$=!1,c(re,O.onCleanup),H.unbind(\".\"+te),g.fadeTo(O.fadeOut||0,0),v.stop().fadeTo(O.fadeOut||0,0,function(){v.add(g).css({opacity:1,cursor:\"auto\"}).hide(),c(he),W.empty().remove(),setTimeout(function(){G=!1,c(le,O.onClosed)},1)}))},J.remove=function(){v&&(v.stop(),t.colorbox.close(),v.stop().remove(),g.remove(),G=!1,v=null,t(\".\"+ee).removeData(Z).removeClass(ee),t(e).unbind(\"click.\"+te))},J.element=function(){return t(A)},J.settings=Y)})(jQuery,document,window);"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/js/jquery.dataTables.bootstrap.js",
    "content": "//http://datatables.net/plug-ins/pagination#bootstrap\n$.extend( true, $.fn.dataTable.defaults, {\n\t\"sDom\": \"<'row'<'col-sm-6'l><'col-sm-6'f>r>t<'row'<'col-sm-6'i><'col-sm-6'p>>\",\n\t\"sPaginationType\": \"bootstrap\",\n\t\"oLanguage\": {\n\t\t\"sLengthMenu\": \"Display _MENU_ records\"\n\t}\n} );\n\n\n/* API method to get paging information */\n$.fn.dataTableExt.oApi.fnPagingInfo = function ( oSettings )\n{\n    return {\n        \"iStart\":         oSettings._iDisplayStart,\n        \"iEnd\":           oSettings.fnDisplayEnd(),\n        \"iLength\":        oSettings._iDisplayLength,\n        \"iTotal\":         oSettings.fnRecordsTotal(),\n        \"iFilteredTotal\": oSettings.fnRecordsDisplay(),\n        \"iPage\":          Math.ceil( oSettings._iDisplayStart / oSettings._iDisplayLength ),\n        \"iTotalPages\":    Math.ceil( oSettings.fnRecordsDisplay() / oSettings._iDisplayLength )\n    };\n}\n \n/* Bootstrap style pagination control */\n$.extend( $.fn.dataTableExt.oPagination, {\n    \"bootstrap\": {\n        \"fnInit\": function( oSettings, nPaging, fnDraw ) {\n            var oLang = oSettings.oLanguage.oPaginate;\n            var fnClickHandler = function ( e ) {\n                e.preventDefault();\n                if ( oSettings.oApi._fnPageChange(oSettings, e.data.action) ) {\n                    fnDraw( oSettings );\n                }\n            };\n \n            $(nPaging).append(\n                '<ul class=\"pagination\">'+\n                    '<li class=\"prev disabled\"><a href=\"#\"><i class=\"icon-double-angle-left\"></i></a></li>'+\n                    '<li class=\"next disabled\"><a href=\"#\"><i class=\"icon-double-angle-right\"></i></a></li>'+\n                '</ul>'\n            );\n            var els = $('a', nPaging);\n            $(els[0]).bind( 'click.DT', { action: \"previous\" }, fnClickHandler );\n            $(els[1]).bind( 'click.DT', { action: \"next\" }, fnClickHandler );\n        },\n \n        \"fnUpdate\": function ( oSettings, fnDraw ) {\n            var iListLength = 5;\n            var oPaging = oSettings.oInstance.fnPagingInfo();\n            var an = oSettings.aanFeatures.p;\n            var i, j, sClass, iStart, iEnd, iHalf=Math.floor(iListLength/2);\n \n            if ( oPaging.iTotalPages < iListLength) {\n                iStart = 1;\n                iEnd = oPaging.iTotalPages;\n            }\n            else if ( oPaging.iPage <= iHalf ) {\n                iStart = 1;\n                iEnd = iListLength;\n            } else if ( oPaging.iPage >= (oPaging.iTotalPages-iHalf) ) {\n                iStart = oPaging.iTotalPages - iListLength + 1;\n                iEnd = oPaging.iTotalPages;\n            } else {\n                iStart = oPaging.iPage - iHalf + 1;\n                iEnd = iStart + iListLength - 1;\n            }\n \n            for ( i=0, iLen=an.length ; i<iLen ; i++ ) {\n                // Remove the middle elements\n                $('li:gt(0)', an[i]).filter(':not(:last)').remove();\n \n                // Add the new list items and their event handlers\n                for ( j=iStart ; j<=iEnd ; j++ ) {\n                    sClass = (j==oPaging.iPage+1) ? 'class=\"active\"' : '';\n                    $('<li '+sClass+'><a href=\"#\">'+j+'</a></li>')\n                        .insertBefore( $('li:last', an[i])[0] )\n                        .bind('click', function (e) {\n                            e.preventDefault();\n                            oSettings._iDisplayStart = (parseInt($('a', this).text(),10)-1) * oPaging.iLength;\n                            fnDraw( oSettings );\n                        } );\n                }\n \n                // Add / remove disabled classes from the static elements\n                if ( oPaging.iPage === 0 ) {\n                    $('li:first', an[i]).addClass('disabled');\n                } else {\n                    $('li:first', an[i]).removeClass('disabled');\n                }\n \n                if ( oPaging.iPage === oPaging.iTotalPages-1 || oPaging.iTotalPages === 0 ) {\n                    $('li:last', an[i]).addClass('disabled');\n                } else {\n                    $('li:last', an[i]).removeClass('disabled');\n                }\n            }\n        }\n    }\n} );"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/js/jquery.form.js",
    "content": "/*!\n * jQuery Form Plugin\n * version: 4.2.1\n * Requires jQuery v1.7 or later\n * Copyright 2017 Kevin Morris\n * Copyright 2006 M. Alsup\n * Project repository: https://github.com/jquery-form/form\n * Dual licensed under the MIT and LGPLv3 licenses.\n * https://github.com/jquery-form/form#license\n */\n/* global ActiveXObject */\n\n/* eslint-disable */\n(function (factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine(['jquery'], factory);\n\t} else if (typeof module === 'object' && module.exports) {\n\t\t// Node/CommonJS\n\t\tmodule.exports = function( root, jQuery ) {\n\t\t\tif (typeof jQuery === 'undefined') {\n\t\t\t\t// require('jQuery') returns a factory that requires window to build a jQuery instance, we normalize how we use modules\n\t\t\t\t// that require this pattern but the window provided is a noop if it's defined (how jquery works)\n\t\t\t\tif (typeof window !== 'undefined') {\n\t\t\t\t\tjQuery = require('jquery');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tjQuery = require('jquery')(root);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfactory(jQuery);\n\t\t\treturn jQuery;\n\t\t};\n\t} else {\n\t\t// Browser globals\n\t\tfactory(jQuery);\n\t}\n\n}(function ($) {\n/* eslint-enable */\n\t'use strict';\n\n\t/*\n\t\tUsage Note:\n\t\t-----------\n\t\tDo not use both ajaxSubmit and ajaxForm on the same form. These\n\t\tfunctions are mutually exclusive. Use ajaxSubmit if you want\n\t\tto bind your own submit handler to the form. For example,\n\n\t\t$(document).ready(function() {\n\t\t\t$('#myForm').on('submit', function(e) {\n\t\t\t\te.preventDefault(); // <-- important\n\t\t\t\t$(this).ajaxSubmit({\n\t\t\t\t\ttarget: '#output'\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\tUse ajaxForm when you want the plugin to manage all the event binding\n\t\tfor you. For example,\n\n\t\t$(document).ready(function() {\n\t\t\t$('#myForm').ajaxForm({\n\t\t\t\ttarget: '#output'\n\t\t\t});\n\t\t});\n\n\t\tYou can also use ajaxForm with delegation (requires jQuery v1.7+), so the\n\t\tform does not have to exist when you invoke ajaxForm:\n\n\t\t$('#myForm').ajaxForm({\n\t\t\tdelegation: true,\n\t\t\ttarget: '#output'\n\t\t});\n\n\t\tWhen using ajaxForm, the ajaxSubmit function will be invoked for you\n\t\tat the appropriate time.\n\t*/\n\n\tvar rCRLF = /\\r?\\n/g;\n\n\t/**\n\t * Feature detection\n\t */\n\tvar feature = {};\n\n\tfeature.fileapi = $('<input type=\"file\">').get(0).files !== undefined;\n\tfeature.formdata = (typeof window.FormData !== 'undefined');\n\n\tvar hasProp = !!$.fn.prop;\n\n\t// attr2 uses prop when it can but checks the return type for\n\t// an expected string. This accounts for the case where a form\n\t// contains inputs with names like \"action\" or \"method\"; in those\n\t// cases \"prop\" returns the element\n\t$.fn.attr2 = function() {\n\t\tif (!hasProp) {\n\t\t\treturn this.attr.apply(this, arguments);\n\t\t}\n\n\t\tvar val = this.prop.apply(this, arguments);\n\n\t\tif ((val && val.jquery) || typeof val === 'string') {\n\t\t\treturn val;\n\t\t}\n\n\t\treturn this.attr.apply(this, arguments);\n\t};\n\n\t/**\n\t * ajaxSubmit() provides a mechanism for immediately submitting\n\t * an HTML form using AJAX.\n\t *\n\t * @param\t{object|string}\toptions\t\tjquery.form.js parameters or custom url for submission\n\t * @param\t{object}\t\tdata\t\textraData\n\t * @param\t{string}\t\tdataType\tajax dataType\n\t * @param\t{function}\t\tonSuccess\tajax success callback function\n\t */\n\t$.fn.ajaxSubmit = function(options, data, dataType, onSuccess) {\n\t\t// fast fail if nothing selected (http://dev.jquery.com/ticket/2752)\n\t\tif (!this.length) {\n\t\t\tlog('ajaxSubmit: skipping submit process - no element selected');\n\n\t\t\treturn this;\n\t\t}\n\n\t\t/* eslint consistent-this: [\"error\", \"$form\"] */\n\t\tvar method, action, url, $form = this;\n\n\t\tif (typeof options === 'function') {\n\t\t\toptions = {success: options};\n\n\t\t} else if (typeof options === 'string' || (options === false && arguments.length > 0)) {\n\t\t\toptions = {\n\t\t\t\t'url'      : options,\n\t\t\t\t'data'     : data,\n\t\t\t\t'dataType' : dataType\n\t\t\t};\n\n\t\t\tif (typeof onSuccess === 'function') {\n\t\t\t\toptions.success = onSuccess;\n\t\t\t}\n\n\t\t} else if (typeof options === 'undefined') {\n\t\t\toptions = {};\n\t\t}\n\n\t\tmethod = options.method || options.type || this.attr2('method');\n\t\taction = options.url || this.attr2('action');\n\n\t\turl = (typeof action === 'string') ? $.trim(action) : '';\n\t\turl = url || window.location.href || '';\n\t\tif (url) {\n\t\t\t// clean url (don't include hash vaue)\n\t\t\turl = (url.match(/^([^#]+)/) || [])[1];\n\t\t}\n\n\t\toptions = $.extend(true, {\n\t\t\turl       : url,\n\t\t\tsuccess   : $.ajaxSettings.success,\n\t\t\ttype      : method || $.ajaxSettings.type,\n\t\t\tiframeSrc : /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'\t\t// eslint-disable-line no-script-url\n\t\t}, options);\n\n\t\t// hook for manipulating the form data before it is extracted;\n\t\t// convenient for use with rich editors like tinyMCE or FCKEditor\n\t\tvar veto = {};\n\n\t\tthis.trigger('form-pre-serialize', [this, options, veto]);\n\n\t\tif (veto.veto) {\n\t\t\tlog('ajaxSubmit: submit vetoed via form-pre-serialize trigger');\n\n\t\t\treturn this;\n\t\t}\n\n\t\t// provide opportunity to alter form data before it is serialized\n\t\tif (options.beforeSerialize && options.beforeSerialize(this, options) === false) {\n\t\t\tlog('ajaxSubmit: submit aborted via beforeSerialize callback');\n\n\t\t\treturn this;\n\t\t}\n\n\t\tvar traditional = options.traditional;\n\n\t\tif (typeof traditional === 'undefined') {\n\t\t\ttraditional = $.ajaxSettings.traditional;\n\t\t}\n\n\t\tvar elements = [];\n\t\tvar qx, a = this.formToArray(options.semantic, elements, options.filtering);\n\n\t\tif (options.data) {\n\t\t\tvar optionsData = $.isFunction(options.data) ? options.data(a) : options.data;\n\n\t\t\toptions.extraData = optionsData;\n\t\t\tqx = $.param(optionsData, traditional);\n\t\t}\n\n\t\t// give pre-submit callback an opportunity to abort the submit\n\t\tif (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {\n\t\t\tlog('ajaxSubmit: submit aborted via beforeSubmit callback');\n\n\t\t\treturn this;\n\t\t}\n\n\t\t// fire vetoable 'validate' event\n\t\tthis.trigger('form-submit-validate', [a, this, options, veto]);\n\t\tif (veto.veto) {\n\t\t\tlog('ajaxSubmit: submit vetoed via form-submit-validate trigger');\n\n\t\t\treturn this;\n\t\t}\n\n\t\tvar q = $.param(a, traditional);\n\n\t\tif (qx) {\n\t\t\tq = (q ? (q + '&' + qx) : qx);\n\t\t}\n\n\t\tif (options.type.toUpperCase() === 'GET') {\n\t\t\toptions.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;\n\t\t\toptions.data = null;\t// data is null for 'get'\n\t\t} else {\n\t\t\toptions.data = q;\t\t// data is the query string for 'post'\n\t\t}\n\n\t\tvar callbacks = [];\n\n\t\tif (options.resetForm) {\n\t\t\tcallbacks.push(function() {\n\t\t\t\t$form.resetForm();\n\t\t\t});\n\t\t}\n\n\t\tif (options.clearForm) {\n\t\t\tcallbacks.push(function() {\n\t\t\t\t$form.clearForm(options.includeHidden);\n\t\t\t});\n\t\t}\n\n\t\t// perform a load on the target only if dataType is not provided\n\t\tif (!options.dataType && options.target) {\n\t\t\tvar oldSuccess = options.success || function(){};\n\n\t\t\tcallbacks.push(function(data, textStatus, jqXHR) {\n\t\t\t\tvar successArguments = arguments,\n\t\t\t\t\tfn = options.replaceTarget ? 'replaceWith' : 'html';\n\n\t\t\t\t$(options.target)[fn](data).each(function(){\n\t\t\t\t\toldSuccess.apply(this, successArguments);\n\t\t\t\t});\n\t\t\t});\n\n\t\t} else if (options.success) {\n\t\t\tif ($.isArray(options.success)) {\n\t\t\t\t$.merge(callbacks, options.success);\n\t\t\t} else {\n\t\t\t\tcallbacks.push(options.success);\n\t\t\t}\n\t\t}\n\n\t\toptions.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg\n\t\t\tvar context = options.context || this;\t\t// jQuery 1.4+ supports scope context\n\n\t\t\tfor (var i = 0, max = callbacks.length; i < max; i++) {\n\t\t\t\tcallbacks[i].apply(context, [data, status, xhr || $form, $form]);\n\t\t\t}\n\t\t};\n\n\t\tif (options.error) {\n\t\t\tvar oldError = options.error;\n\n\t\t\toptions.error = function(xhr, status, error) {\n\t\t\t\tvar context = options.context || this;\n\n\t\t\t\toldError.apply(context, [xhr, status, error, $form]);\n\t\t\t};\n\t\t}\n\n\t\tif (options.complete) {\n\t\t\tvar oldComplete = options.complete;\n\n\t\t\toptions.complete = function(xhr, status) {\n\t\t\t\tvar context = options.context || this;\n\n\t\t\t\toldComplete.apply(context, [xhr, status, $form]);\n\t\t\t};\n\t\t}\n\n\t\t// are there files to upload?\n\n\t\t// [value] (issue #113), also see comment:\n\t\t// https://github.com/malsup/form/commit/588306aedba1de01388032d5f42a60159eea9228#commitcomment-2180219\n\t\tvar fileInputs = $('input[type=file]:enabled', this).filter(function() {\n\t\t\treturn $(this).val() !== '';\n\t\t});\n\t\tvar hasFileInputs = fileInputs.length > 0;\n\t\tvar mp = 'multipart/form-data';\n\t\tvar multipart = ($form.attr('enctype') === mp || $form.attr('encoding') === mp);\n\t\tvar fileAPI = feature.fileapi && feature.formdata;\n\n\t\tlog('fileAPI :' + fileAPI);\n\n\t\tvar shouldUseFrame = (hasFileInputs || multipart) && !fileAPI;\n\t\tvar jqxhr;\n\n\t\t// options.iframe allows user to force iframe mode\n\t\t// 06-NOV-09: now defaulting to iframe mode if file input is detected\n\t\tif (options.iframe !== false && (options.iframe || shouldUseFrame)) {\n\t\t\t// hack to fix Safari hang (thanks to Tim Molendijk for this)\n\t\t\t// see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d\n\t\t\tif (options.closeKeepAlive) {\n\t\t\t\t$.get(options.closeKeepAlive, function() {\n\t\t\t\t\tjqxhr = fileUploadIframe(a);\n\t\t\t\t});\n\n\t\t\t} else {\n\t\t\t\tjqxhr = fileUploadIframe(a);\n\t\t\t}\n\n\t\t} else if ((hasFileInputs || multipart) && fileAPI) {\n\t\t\tjqxhr = fileUploadXhr(a);\n\n\t\t} else {\n\t\t\tjqxhr = $.ajax(options);\n\t\t}\n\n\t\t$form.removeData('jqxhr').data('jqxhr', jqxhr);\n\n\t\t// clear element array\n\t\tfor (var k = 0; k < elements.length; k++) {\n\t\t\telements[k] = null;\n\t\t}\n\n\t\t// fire 'notify' event\n\t\tthis.trigger('form-submit-notify', [this, options]);\n\n\t\treturn this;\n\n\t\t// utility fn for deep serialization\n\t\tfunction deepSerialize(extraData) {\n\t\t\tvar serialized = $.param(extraData, options.traditional).split('&');\n\t\t\tvar len = serialized.length;\n\t\t\tvar result = [];\n\t\t\tvar i, part;\n\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t// #252; undo param space replacement\n\t\t\t\tserialized[i] = serialized[i].replace(/\\+/g, ' ');\n\t\t\t\tpart = serialized[i].split('=');\n\t\t\t\t// #278; use array instead of object storage, favoring array serializations\n\t\t\t\tresult.push([decodeURIComponent(part[0]), decodeURIComponent(part[1])]);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\n\t\t// XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz)\n\t\tfunction fileUploadXhr(a) {\n\t\t\tvar formdata = new FormData();\n\n\t\t\tfor (var i = 0; i < a.length; i++) {\n\t\t\t\tformdata.append(a[i].name, a[i].value);\n\t\t\t}\n\n\t\t\tif (options.extraData) {\n\t\t\t\tvar serializedData = deepSerialize(options.extraData);\n\n\t\t\t\tfor (i = 0; i < serializedData.length; i++) {\n\t\t\t\t\tif (serializedData[i]) {\n\t\t\t\t\t\tformdata.append(serializedData[i][0], serializedData[i][1]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\toptions.data = null;\n\n\t\t\tvar s = $.extend(true, {}, $.ajaxSettings, options, {\n\t\t\t\tcontentType : false,\n\t\t\t\tprocessData : false,\n\t\t\t\tcache       : false,\n\t\t\t\ttype        : method || 'POST'\n\t\t\t});\n\n\t\t\tif (options.uploadProgress) {\n\t\t\t\t// workaround because jqXHR does not expose upload property\n\t\t\t\ts.xhr = function() {\n\t\t\t\t\tvar xhr = $.ajaxSettings.xhr();\n\n\t\t\t\t\tif (xhr.upload) {\n\t\t\t\t\t\txhr.upload.addEventListener('progress', function(event) {\n\t\t\t\t\t\t\tvar percent = 0;\n\t\t\t\t\t\t\tvar position = event.loaded || event.position;\t\t\t/* event.position is deprecated */\n\t\t\t\t\t\t\tvar total = event.total;\n\n\t\t\t\t\t\t\tif (event.lengthComputable) {\n\t\t\t\t\t\t\t\tpercent = Math.ceil(position / total * 100);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\toptions.uploadProgress(event, position, total, percent);\n\t\t\t\t\t\t}, false);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn xhr;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\ts.data = null;\n\n\t\t\tvar beforeSend = s.beforeSend;\n\n\t\t\ts.beforeSend = function(xhr, o) {\n\t\t\t\t// Send FormData() provided by user\n\t\t\t\tif (options.formData) {\n\t\t\t\t\to.data = options.formData;\n\t\t\t\t} else {\n\t\t\t\t\to.data = formdata;\n\t\t\t\t}\n\n\t\t\t\tif (beforeSend) {\n\t\t\t\t\tbeforeSend.call(this, xhr, o);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\treturn $.ajax(s);\n\t\t}\n\n\t\t// private function for handling file uploads (hat tip to YAHOO!)\n\t\tfunction fileUploadIframe(a) {\n\t\t\tvar form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle;\n\t\t\tvar deferred = $.Deferred();\n\n\t\t\t// #341\n\t\t\tdeferred.abort = function(status) {\n\t\t\t\txhr.abort(status);\n\t\t\t};\n\n\t\t\tif (a) {\n\t\t\t\t// ensure that every serialized input is still enabled\n\t\t\t\tfor (i = 0; i < elements.length; i++) {\n\t\t\t\t\tel = $(elements[i]);\n\t\t\t\t\tif (hasProp) {\n\t\t\t\t\t\tel.prop('disabled', false);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tel.removeAttr('disabled');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ts = $.extend(true, {}, $.ajaxSettings, options);\n\t\t\ts.context = s.context || s;\n\t\t\tid = 'jqFormIO' + new Date().getTime();\n\t\t\tvar ownerDocument = form.ownerDocument;\n\t\t\tvar $body = $form.closest('body');\n\n\t\t\tif (s.iframeTarget) {\n\t\t\t\t$io = $(s.iframeTarget, ownerDocument);\n\t\t\t\tn = $io.attr2('name');\n\t\t\t\tif (!n) {\n\t\t\t\t\t$io.attr2('name', id);\n\t\t\t\t} else {\n\t\t\t\t\tid = n;\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\t$io = $('<iframe name=\"' + id + '\" src=\"' + s.iframeSrc + '\" />', ownerDocument);\n\t\t\t\t$io.css({position: 'absolute', top: '-1000px', left: '-1000px'});\n\t\t\t}\n\t\t\tio = $io[0];\n\n\n\t\t\txhr = { // mock object\n\t\t\t\taborted               : 0,\n\t\t\t\tresponseText          : null,\n\t\t\t\tresponseXML           : null,\n\t\t\t\tstatus                : 0,\n\t\t\t\tstatusText            : 'n/a',\n\t\t\t\tgetAllResponseHeaders : function() {},\n\t\t\t\tgetResponseHeader     : function() {},\n\t\t\t\tsetRequestHeader      : function() {},\n\t\t\t\tabort                 : function(status) {\n\t\t\t\t\tvar e = (status === 'timeout' ? 'timeout' : 'aborted');\n\n\t\t\t\t\tlog('aborting upload... ' + e);\n\t\t\t\t\tthis.aborted = 1;\n\n\t\t\t\t\ttry { // #214, #257\n\t\t\t\t\t\tif (io.contentWindow.document.execCommand) {\n\t\t\t\t\t\t\tio.contentWindow.document.execCommand('Stop');\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (ignore) {}\n\n\t\t\t\t\t$io.attr('src', s.iframeSrc); // abort op in progress\n\t\t\t\t\txhr.error = e;\n\t\t\t\t\tif (s.error) {\n\t\t\t\t\t\ts.error.call(s.context, xhr, e, status);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (g) {\n\t\t\t\t\t\t$.event.trigger('ajaxError', [xhr, s, e]);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (s.complete) {\n\t\t\t\t\t\ts.complete.call(s.context, xhr, e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tg = s.global;\n\t\t\t// trigger ajax global events so that activity/block indicators work like normal\n\t\t\tif (g && $.active++ === 0) {\n\t\t\t\t$.event.trigger('ajaxStart');\n\t\t\t}\n\t\t\tif (g) {\n\t\t\t\t$.event.trigger('ajaxSend', [xhr, s]);\n\t\t\t}\n\n\t\t\tif (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {\n\t\t\t\tif (s.global) {\n\t\t\t\t\t$.active--;\n\t\t\t\t}\n\t\t\t\tdeferred.reject();\n\n\t\t\t\treturn deferred;\n\t\t\t}\n\n\t\t\tif (xhr.aborted) {\n\t\t\t\tdeferred.reject();\n\n\t\t\t\treturn deferred;\n\t\t\t}\n\n\t\t\t// add submitting element to data if we know it\n\t\t\tsub = form.clk;\n\t\t\tif (sub) {\n\t\t\t\tn = sub.name;\n\t\t\t\tif (n && !sub.disabled) {\n\t\t\t\t\ts.extraData = s.extraData || {};\n\t\t\t\t\ts.extraData[n] = sub.value;\n\t\t\t\t\tif (sub.type === 'image') {\n\t\t\t\t\t\ts.extraData[n + '.x'] = form.clk_x;\n\t\t\t\t\t\ts.extraData[n + '.y'] = form.clk_y;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar CLIENT_TIMEOUT_ABORT = 1;\n\t\t\tvar SERVER_ABORT = 2;\n\n\t\t\tfunction getDoc(frame) {\n\t\t\t\t/* it looks like contentWindow or contentDocument do not\n\t\t\t\t * carry the protocol property in ie8, when running under ssl\n\t\t\t\t * frame.document is the only valid response document, since\n\t\t\t\t * the protocol is know but not on the other two objects. strange?\n\t\t\t\t * \"Same origin policy\" http://en.wikipedia.org/wiki/Same_origin_policy\n\t\t\t\t */\n\n\t\t\t\tvar doc = null;\n\n\t\t\t\t// IE8 cascading access check\n\t\t\t\ttry {\n\t\t\t\t\tif (frame.contentWindow) {\n\t\t\t\t\t\tdoc = frame.contentWindow.document;\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\t// IE8 access denied under ssl & missing protocol\n\t\t\t\t\tlog('cannot get iframe.contentWindow document: ' + err);\n\t\t\t\t}\n\n\t\t\t\tif (doc) { // successful getting content\n\t\t\t\t\treturn doc;\n\t\t\t\t}\n\n\t\t\t\ttry { // simply checking may throw in ie8 under ssl or mismatched protocol\n\t\t\t\t\tdoc = frame.contentDocument ? frame.contentDocument : frame.document;\n\t\t\t\t} catch (err) {\n\t\t\t\t\t// last attempt\n\t\t\t\t\tlog('cannot get iframe.contentDocument: ' + err);\n\t\t\t\t\tdoc = frame.document;\n\t\t\t\t}\n\n\t\t\t\treturn doc;\n\t\t\t}\n\n\t\t\t// Rails CSRF hack (thanks to Yvan Barthelemy)\n\t\t\tvar csrf_token = $('meta[name=csrf-token]').attr('content');\n\t\t\tvar csrf_param = $('meta[name=csrf-param]').attr('content');\n\n\t\t\tif (csrf_param && csrf_token) {\n\t\t\t\ts.extraData = s.extraData || {};\n\t\t\t\ts.extraData[csrf_param] = csrf_token;\n\t\t\t}\n\n\t\t\t// take a breath so that pending repaints get some cpu time before the upload starts\n\t\t\tfunction doSubmit() {\n\t\t\t\t// make sure form attrs are set\n\t\t\t\tvar t = $form.attr2('target'),\n\t\t\t\t\ta = $form.attr2('action'),\n\t\t\t\t\tmp = 'multipart/form-data',\n\t\t\t\t\tet = $form.attr('enctype') || $form.attr('encoding') || mp;\n\n\t\t\t\t// update form attrs in IE friendly way\n\t\t\t\tform.setAttribute('target', id);\n\t\t\t\tif (!method || /post/i.test(method)) {\n\t\t\t\t\tform.setAttribute('method', 'POST');\n\t\t\t\t}\n\t\t\t\tif (a !== s.url) {\n\t\t\t\t\tform.setAttribute('action', s.url);\n\t\t\t\t}\n\n\t\t\t\t// ie borks in some cases when setting encoding\n\t\t\t\tif (!s.skipEncodingOverride && (!method || /post/i.test(method))) {\n\t\t\t\t\t$form.attr({\n\t\t\t\t\t\tencoding : 'multipart/form-data',\n\t\t\t\t\t\tenctype  : 'multipart/form-data'\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// support timout\n\t\t\t\tif (s.timeout) {\n\t\t\t\t\ttimeoutHandle = setTimeout(function() {\n\t\t\t\t\t\ttimedOut = true; cb(CLIENT_TIMEOUT_ABORT);\n\t\t\t\t\t}, s.timeout);\n\t\t\t\t}\n\n\t\t\t\t// look for server aborts\n\t\t\t\tfunction checkState() {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvar state = getDoc(io).readyState;\n\n\t\t\t\t\t\tlog('state = ' + state);\n\t\t\t\t\t\tif (state && state.toLowerCase() === 'uninitialized') {\n\t\t\t\t\t\t\tsetTimeout(checkState, 50);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tlog('Server abort: ', e, ' (', e.name, ')');\n\t\t\t\t\t\tcb(SERVER_ABORT);\t\t\t\t// eslint-disable-line callback-return\n\t\t\t\t\t\tif (timeoutHandle) {\n\t\t\t\t\t\t\tclearTimeout(timeoutHandle);\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttimeoutHandle = undefined;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// add \"extra\" data to form if provided in options\n\t\t\t\tvar extraInputs = [];\n\n\t\t\t\ttry {\n\t\t\t\t\tif (s.extraData) {\n\t\t\t\t\t\tfor (var n in s.extraData) {\n\t\t\t\t\t\t\tif (s.extraData.hasOwnProperty(n)) {\n\t\t\t\t\t\t\t\t// if using the $.param format that allows for multiple values with the same name\n\t\t\t\t\t\t\t\tif ($.isPlainObject(s.extraData[n]) && s.extraData[n].hasOwnProperty('name') && s.extraData[n].hasOwnProperty('value')) {\n\t\t\t\t\t\t\t\t\textraInputs.push(\n\t\t\t\t\t\t\t\t\t$('<input type=\"hidden\" name=\"' + s.extraData[n].name + '\">', ownerDocument).val(s.extraData[n].value)\n\t\t\t\t\t\t\t\t\t\t.appendTo(form)[0]);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\textraInputs.push(\n\t\t\t\t\t\t\t\t\t$('<input type=\"hidden\" name=\"' + n + '\">', ownerDocument).val(s.extraData[n])\n\t\t\t\t\t\t\t\t\t\t.appendTo(form)[0]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!s.iframeTarget) {\n\t\t\t\t\t\t// add iframe to doc and submit the form\n\t\t\t\t\t\t$io.appendTo($body);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (io.attachEvent) {\n\t\t\t\t\t\tio.attachEvent('onload', cb);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tio.addEventListener('load', cb, false);\n\t\t\t\t\t}\n\n\t\t\t\t\tsetTimeout(checkState, 15);\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tform.submit();\n\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t// just in case form has element with name/id of 'submit'\n\t\t\t\t\t\tvar submitFn = document.createElement('form').submit;\n\n\t\t\t\t\t\tsubmitFn.apply(form);\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\t\t\t\t\t// reset attrs and remove \"extra\" input elements\n\t\t\t\t\tform.setAttribute('action', a);\n\t\t\t\t\tform.setAttribute('enctype', et); // #380\n\t\t\t\t\tif (t) {\n\t\t\t\t\t\tform.setAttribute('target', t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$form.removeAttr('target');\n\t\t\t\t\t}\n\t\t\t\t\t$(extraInputs).remove();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (s.forceSync) {\n\t\t\t\tdoSubmit();\n\t\t\t} else {\n\t\t\t\tsetTimeout(doSubmit, 10); // this lets dom updates render\n\t\t\t}\n\n\t\t\tvar data, doc, domCheckCount = 50, callbackProcessed;\n\n\t\t\tfunction cb(e) {\n\t\t\t\tif (xhr.aborted || callbackProcessed) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdoc = getDoc(io);\n\t\t\t\tif (!doc) {\n\t\t\t\t\tlog('cannot access response document');\n\t\t\t\t\te = SERVER_ABORT;\n\t\t\t\t}\n\t\t\t\tif (e === CLIENT_TIMEOUT_ABORT && xhr) {\n\t\t\t\t\txhr.abort('timeout');\n\t\t\t\t\tdeferred.reject(xhr, 'timeout');\n\n\t\t\t\t\treturn;\n\n\t\t\t\t} else if (e === SERVER_ABORT && xhr) {\n\t\t\t\t\txhr.abort('server abort');\n\t\t\t\t\tdeferred.reject(xhr, 'error', 'server abort');\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!doc || doc.location.href === s.iframeSrc) {\n\t\t\t\t\t// response not received yet\n\t\t\t\t\tif (!timedOut) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (io.detachEvent) {\n\t\t\t\t\tio.detachEvent('onload', cb);\n\t\t\t\t} else {\n\t\t\t\t\tio.removeEventListener('load', cb, false);\n\t\t\t\t}\n\n\t\t\t\tvar status = 'success', errMsg;\n\n\t\t\t\ttry {\n\t\t\t\t\tif (timedOut) {\n\t\t\t\t\t\tthrow 'timeout';\n\t\t\t\t\t}\n\n\t\t\t\t\tvar isXml = s.dataType === 'xml' || doc.XMLDocument || $.isXMLDoc(doc);\n\n\t\t\t\t\tlog('isXml=' + isXml);\n\n\t\t\t\t\tif (!isXml && window.opera && (doc.body === null || !doc.body.innerHTML)) {\n\t\t\t\t\t\tif (--domCheckCount) {\n\t\t\t\t\t\t\t// in some browsers (Opera) the iframe DOM is not always traversable when\n\t\t\t\t\t\t\t// the onload callback fires, so we loop a bit to accommodate\n\t\t\t\t\t\t\tlog('requeing onLoad callback, DOM not available');\n\t\t\t\t\t\t\tsetTimeout(cb, 250);\n\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// let this fall through because server response could be an empty document\n\t\t\t\t\t\t// log('Could not access iframe DOM after mutiple tries.');\n\t\t\t\t\t\t// throw 'DOMException: not available';\n\t\t\t\t\t}\n\n\t\t\t\t\t// log('response detected');\n\t\t\t\t\tvar docRoot = doc.body ? doc.body : doc.documentElement;\n\n\t\t\t\t\txhr.responseText = docRoot ? docRoot.innerHTML : null;\n\t\t\t\t\txhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;\n\t\t\t\t\tif (isXml) {\n\t\t\t\t\t\ts.dataType = 'xml';\n\t\t\t\t\t}\n\t\t\t\t\txhr.getResponseHeader = function(header){\n\t\t\t\t\t\tvar headers = {'content-type': s.dataType};\n\n\t\t\t\t\t\treturn headers[header.toLowerCase()];\n\t\t\t\t\t};\n\t\t\t\t\t// support for XHR 'status' & 'statusText' emulation :\n\t\t\t\t\tif (docRoot) {\n\t\t\t\t\t\txhr.status = Number(docRoot.getAttribute('status')) || xhr.status;\n\t\t\t\t\t\txhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar dt = (s.dataType || '').toLowerCase();\n\t\t\t\t\tvar scr = /(json|script|text)/.test(dt);\n\n\t\t\t\t\tif (scr || s.textarea) {\n\t\t\t\t\t\t// see if user embedded response in textarea\n\t\t\t\t\t\tvar ta = doc.getElementsByTagName('textarea')[0];\n\n\t\t\t\t\t\tif (ta) {\n\t\t\t\t\t\t\txhr.responseText = ta.value;\n\t\t\t\t\t\t\t// support for XHR 'status' & 'statusText' emulation :\n\t\t\t\t\t\t\txhr.status = Number(ta.getAttribute('status')) || xhr.status;\n\t\t\t\t\t\t\txhr.statusText = ta.getAttribute('statusText') || xhr.statusText;\n\n\t\t\t\t\t\t} else if (scr) {\n\t\t\t\t\t\t\t// account for browsers injecting pre around json response\n\t\t\t\t\t\t\tvar pre = doc.getElementsByTagName('pre')[0];\n\t\t\t\t\t\t\tvar b = doc.getElementsByTagName('body')[0];\n\n\t\t\t\t\t\t\tif (pre) {\n\t\t\t\t\t\t\t\txhr.responseText = pre.textContent ? pre.textContent : pre.innerText;\n\t\t\t\t\t\t\t} else if (b) {\n\t\t\t\t\t\t\t\txhr.responseText = b.textContent ? b.textContent : b.innerText;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if (dt === 'xml' && !xhr.responseXML && xhr.responseText) {\n\t\t\t\t\t\txhr.responseXML = toXml(xhr.responseText);\t\t\t// eslint-disable-line no-use-before-define\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tdata = httpData(xhr, dt, s);\t\t\t\t\t\t// eslint-disable-line no-use-before-define\n\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tstatus = 'parsererror';\n\t\t\t\t\t\txhr.error = errMsg = (err || status);\n\t\t\t\t\t}\n\n\t\t\t\t} catch (err) {\n\t\t\t\t\tlog('error caught: ', err);\n\t\t\t\t\tstatus = 'error';\n\t\t\t\t\txhr.error = errMsg = (err || status);\n\t\t\t\t}\n\n\t\t\t\tif (xhr.aborted) {\n\t\t\t\t\tlog('upload aborted');\n\t\t\t\t\tstatus = null;\n\t\t\t\t}\n\n\t\t\t\tif (xhr.status) { // we've set xhr.status\n\t\t\t\t\tstatus = ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) ? 'success' : 'error';\n\t\t\t\t}\n\n\t\t\t\t// ordering of these callbacks/triggers is odd, but that's how $.ajax does it\n\t\t\t\tif (status === 'success') {\n\t\t\t\t\tif (s.success) {\n\t\t\t\t\t\ts.success.call(s.context, data, 'success', xhr);\n\t\t\t\t\t}\n\n\t\t\t\t\tdeferred.resolve(xhr.responseText, 'success', xhr);\n\n\t\t\t\t\tif (g) {\n\t\t\t\t\t\t$.event.trigger('ajaxSuccess', [xhr, s]);\n\t\t\t\t\t}\n\n\t\t\t\t} else if (status) {\n\t\t\t\t\tif (typeof errMsg === 'undefined') {\n\t\t\t\t\t\terrMsg = xhr.statusText;\n\t\t\t\t\t}\n\t\t\t\t\tif (s.error) {\n\t\t\t\t\t\ts.error.call(s.context, xhr, status, errMsg);\n\t\t\t\t\t}\n\t\t\t\t\tdeferred.reject(xhr, 'error', errMsg);\n\t\t\t\t\tif (g) {\n\t\t\t\t\t\t$.event.trigger('ajaxError', [xhr, s, errMsg]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (g) {\n\t\t\t\t\t$.event.trigger('ajaxComplete', [xhr, s]);\n\t\t\t\t}\n\n\t\t\t\tif (g && !--$.active) {\n\t\t\t\t\t$.event.trigger('ajaxStop');\n\t\t\t\t}\n\n\t\t\t\tif (s.complete) {\n\t\t\t\t\ts.complete.call(s.context, xhr, status);\n\t\t\t\t}\n\n\t\t\t\tcallbackProcessed = true;\n\t\t\t\tif (s.timeout) {\n\t\t\t\t\tclearTimeout(timeoutHandle);\n\t\t\t\t}\n\n\t\t\t\t// clean up\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tif (!s.iframeTarget) {\n\t\t\t\t\t\t$io.remove();\n\t\t\t\t\t} else { // adding else to clean up existing iframe response.\n\t\t\t\t\t\t$io.attr('src', s.iframeSrc);\n\t\t\t\t\t}\n\t\t\t\t\txhr.responseXML = null;\n\t\t\t\t}, 100);\n\t\t\t}\n\n\t\t\tvar toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)\n\t\t\t\tif (window.ActiveXObject) {\n\t\t\t\t\tdoc = new ActiveXObject('Microsoft.XMLDOM');\n\t\t\t\t\tdoc.async = 'false';\n\t\t\t\t\tdoc.loadXML(s);\n\n\t\t\t\t} else {\n\t\t\t\t\tdoc = (new DOMParser()).parseFromString(s, 'text/xml');\n\t\t\t\t}\n\n\t\t\t\treturn (doc && doc.documentElement && doc.documentElement.nodeName !== 'parsererror') ? doc : null;\n\t\t\t};\n\t\t\tvar parseJSON = $.parseJSON || function(s) {\n\t\t\t\t/* jslint evil:true */\n\t\t\t\treturn window['eval']('(' + s + ')');\t\t\t// eslint-disable-line dot-notation\n\t\t\t};\n\n\t\t\tvar httpData = function(xhr, type, s) { // mostly lifted from jq1.4.4\n\n\t\t\t\tvar ct = xhr.getResponseHeader('content-type') || '',\n\t\t\t\t\txml = ((type === 'xml' || !type) && ct.indexOf('xml') >= 0),\n\t\t\t\t\tdata = xml ? xhr.responseXML : xhr.responseText;\n\n\t\t\t\tif (xml && data.documentElement.nodeName === 'parsererror') {\n\t\t\t\t\tif ($.error) {\n\t\t\t\t\t\t$.error('parsererror');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (s && s.dataFilter) {\n\t\t\t\t\tdata = s.dataFilter(data, type);\n\t\t\t\t}\n\t\t\t\tif (typeof data === 'string') {\n\t\t\t\t\tif ((type === 'json' || !type) && ct.indexOf('json') >= 0) {\n\t\t\t\t\t\tdata = parseJSON(data);\n\t\t\t\t\t} else if ((type === 'script' || !type) && ct.indexOf('javascript') >= 0) {\n\t\t\t\t\t\t$.globalEval(data);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\t\t\t};\n\n\t\t\treturn deferred;\n\t\t}\n\t};\n\n\t/**\n\t * ajaxForm() provides a mechanism for fully automating form submission.\n\t *\n\t * The advantages of using this method instead of ajaxSubmit() are:\n\t *\n\t * 1: This method will include coordinates for <input type=\"image\"> elements (if the element\n\t *\tis used to submit the form).\n\t * 2. This method will include the submit element's name/value data (for the element that was\n\t *\tused to submit the form).\n\t * 3. This method binds the submit() method to the form for you.\n\t *\n\t * The options argument for ajaxForm works exactly as it does for ajaxSubmit. ajaxForm merely\n\t * passes the options argument along after properly binding events for submit elements and\n\t * the form itself.\n\t */\n\t$.fn.ajaxForm = function(options, data, dataType, onSuccess) {\n\t\tif (typeof options === 'string' || (options === false && arguments.length > 0)) {\n\t\t\toptions = {\n\t\t\t\t'url'      : options,\n\t\t\t\t'data'     : data,\n\t\t\t\t'dataType' : dataType\n\t\t\t};\n\n\t\t\tif (typeof onSuccess === 'function') {\n\t\t\t\toptions.success = onSuccess;\n\t\t\t}\n\t\t}\n\n\t\toptions = options || {};\n\t\toptions.delegation = options.delegation && $.isFunction($.fn.on);\n\n\t\t// in jQuery 1.3+ we can fix mistakes with the ready state\n\t\tif (!options.delegation && this.length === 0) {\n\t\t\tvar o = {s: this.selector, c: this.context};\n\n\t\t\tif (!$.isReady && o.s) {\n\t\t\t\tlog('DOM not ready, queuing ajaxForm');\n\t\t\t\t$(function() {\n\t\t\t\t\t$(o.s, o.c).ajaxForm(options);\n\t\t\t\t});\n\n\t\t\t\treturn this;\n\t\t\t}\n\n\t\t\t// is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()\n\t\t\tlog('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));\n\n\t\t\treturn this;\n\t\t}\n\n\t\tif (options.delegation) {\n\t\t\t$(document)\n\t\t\t\t.off('submit.form-plugin', this.selector, doAjaxSubmit)\n\t\t\t\t.off('click.form-plugin', this.selector, captureSubmittingElement)\n\t\t\t\t.on('submit.form-plugin', this.selector, options, doAjaxSubmit)\n\t\t\t\t.on('click.form-plugin', this.selector, options, captureSubmittingElement);\n\n\t\t\treturn this;\n\t\t}\n\n\t\treturn this.ajaxFormUnbind()\n\t\t\t.on('submit.form-plugin', options, doAjaxSubmit)\n\t\t\t.on('click.form-plugin', options, captureSubmittingElement);\n\t};\n\n\t// private event handlers\n\tfunction doAjaxSubmit(e) {\n\t\t/* jshint validthis:true */\n\t\tvar options = e.data;\n\n\t\tif (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed\n\t\t\te.preventDefault();\n\t\t\t$(e.target).closest('form').ajaxSubmit(options); // #365\n\t\t}\n\t}\n\n\tfunction captureSubmittingElement(e) {\n\t\t/* jshint validthis:true */\n\t\tvar target = e.target;\n\t\tvar $el = $(target);\n\n\t\tif (!$el.is('[type=submit],[type=image]')) {\n\t\t\t// is this a child element of the submit el?  (ex: a span within a button)\n\t\t\tvar t = $el.closest('[type=submit]');\n\n\t\t\tif (t.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttarget = t[0];\n\t\t}\n\n\t\tvar form = target.form;\n\n\t\tform.clk = target;\n\n\t\tif (target.type === 'image') {\n\t\t\tif (typeof e.offsetX !== 'undefined') {\n\t\t\t\tform.clk_x = e.offsetX;\n\t\t\t\tform.clk_y = e.offsetY;\n\n\t\t\t} else if (typeof $.fn.offset === 'function') {\n\t\t\t\tvar offset = $el.offset();\n\n\t\t\t\tform.clk_x = e.pageX - offset.left;\n\t\t\t\tform.clk_y = e.pageY - offset.top;\n\n\t\t\t} else {\n\t\t\t\tform.clk_x = e.pageX - target.offsetLeft;\n\t\t\t\tform.clk_y = e.pageY - target.offsetTop;\n\t\t\t}\n\t\t}\n\t\t// clear form vars\n\t\tsetTimeout(function() {\n\t\t\tform.clk = form.clk_x = form.clk_y = null;\n\t\t}, 100);\n\t}\n\n\n\t// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm\n\t$.fn.ajaxFormUnbind = function() {\n\t\treturn this.off('submit.form-plugin click.form-plugin');\n\t};\n\n\t/**\n\t * formToArray() gathers form element data into an array of objects that can\n\t * be passed to any of the following ajax functions: $.get, $.post, or load.\n\t * Each object in the array has both a 'name' and 'value' property. An example of\n\t * an array for a simple login form might be:\n\t *\n\t * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]\n\t *\n\t * It is this array that is passed to pre-submit callback functions provided to the\n\t * ajaxSubmit() and ajaxForm() methods.\n\t */\n\t$.fn.formToArray = function(semantic, elements, filtering) {\n\t\tvar a = [];\n\n\t\tif (this.length === 0) {\n\t\t\treturn a;\n\t\t}\n\n\t\tvar form = this[0];\n\t\tvar formId = this.attr('id');\n\t\tvar els = (semantic || typeof form.elements === 'undefined') ? form.getElementsByTagName('*') : form.elements;\n\t\tvar els2;\n\n\t\tif (els) {\n\t\t\tels = $.makeArray(els); // convert to standard array\n\t\t}\n\n\t\t// #386; account for inputs outside the form which use the 'form' attribute\n\t\t// FinesseRus: in non-IE browsers outside fields are already included in form.elements.\n\t\tif (formId && (semantic || /(Edge|Trident)\\//.test(navigator.userAgent))) {\n\t\t\tels2 = $(':input[form=\"' + formId + '\"]').get(); // hat tip @thet\n\t\t\tif (els2.length) {\n\t\t\t\tels = (els || []).concat(els2);\n\t\t\t}\n\t\t}\n\n\t\tif (!els || !els.length) {\n\t\t\treturn a;\n\t\t}\n\n\t\tif ($.isFunction(filtering)) {\n\t\t\tels = $.map(els, filtering);\n\t\t}\n\n\t\tvar i, j, n, v, el, max, jmax;\n\n\t\tfor (i = 0, max = els.length; i < max; i++) {\n\t\t\tel = els[i];\n\t\t\tn = el.name;\n\t\t\tif (!n || el.disabled) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (semantic && form.clk && el.type === 'image') {\n\t\t\t\t// handle image inputs on the fly when semantic == true\n\t\t\t\tif (form.clk === el) {\n\t\t\t\t\ta.push({name: n, value: $(el).val(), type: el.type});\n\t\t\t\t\ta.push({name: n + '.x', value: form.clk_x}, {name: n + '.y', value: form.clk_y});\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tv = $.fieldValue(el, true);\n\t\t\tif (v && v.constructor === Array) {\n\t\t\t\tif (elements) {\n\t\t\t\t\telements.push(el);\n\t\t\t\t}\n\t\t\t\tfor (j = 0, jmax = v.length; j < jmax; j++) {\n\t\t\t\t\ta.push({name: n, value: v[j]});\n\t\t\t\t}\n\n\t\t\t} else if (feature.fileapi && el.type === 'file') {\n\t\t\t\tif (elements) {\n\t\t\t\t\telements.push(el);\n\t\t\t\t}\n\n\t\t\t\tvar files = el.files;\n\n\t\t\t\tif (files.length) {\n\t\t\t\t\tfor (j = 0; j < files.length; j++) {\n\t\t\t\t\t\ta.push({name: n, value: files[j], type: el.type});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// #180\n\t\t\t\t\ta.push({name: n, value: '', type: el.type});\n\t\t\t\t}\n\n\t\t\t} else if (v !== null && typeof v !== 'undefined') {\n\t\t\t\tif (elements) {\n\t\t\t\t\telements.push(el);\n\t\t\t\t}\n\t\t\t\ta.push({name: n, value: v, type: el.type, required: el.required});\n\t\t\t}\n\t\t}\n\n\t\tif (!semantic && form.clk) {\n\t\t\t// input type=='image' are not found in elements array! handle it here\n\t\t\tvar $input = $(form.clk), input = $input[0];\n\n\t\t\tn = input.name;\n\n\t\t\tif (n && !input.disabled && input.type === 'image') {\n\t\t\t\ta.push({name: n, value: $input.val()});\n\t\t\t\ta.push({name: n + '.x', value: form.clk_x}, {name: n + '.y', value: form.clk_y});\n\t\t\t}\n\t\t}\n\n\t\treturn a;\n\t};\n\n\t/**\n\t * Serializes form data into a 'submittable' string. This method will return a string\n\t * in the format: name1=value1&amp;name2=value2\n\t */\n\t$.fn.formSerialize = function(semantic) {\n\t\t// hand off to jQuery.param for proper encoding\n\t\treturn $.param(this.formToArray(semantic));\n\t};\n\n\t/**\n\t * Serializes all field elements in the jQuery object into a query string.\n\t * This method will return a string in the format: name1=value1&amp;name2=value2\n\t */\n\t$.fn.fieldSerialize = function(successful) {\n\t\tvar a = [];\n\n\t\tthis.each(function() {\n\t\t\tvar n = this.name;\n\n\t\t\tif (!n) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar v = $.fieldValue(this, successful);\n\n\t\t\tif (v && v.constructor === Array) {\n\t\t\t\tfor (var i = 0, max = v.length; i < max; i++) {\n\t\t\t\t\ta.push({name: n, value: v[i]});\n\t\t\t\t}\n\n\t\t\t} else if (v !== null && typeof v !== 'undefined') {\n\t\t\t\ta.push({name: this.name, value: v});\n\t\t\t}\n\t\t});\n\n\t\t// hand off to jQuery.param for proper encoding\n\t\treturn $.param(a);\n\t};\n\n\t/**\n\t * Returns the value(s) of the element in the matched set. For example, consider the following form:\n\t *\n\t *\t<form><fieldset>\n\t *\t\t<input name=\"A\" type=\"text\">\n\t *\t\t<input name=\"A\" type=\"text\">\n\t *\t\t<input name=\"B\" type=\"checkbox\" value=\"B1\">\n\t *\t\t<input name=\"B\" type=\"checkbox\" value=\"B2\">\n\t *\t\t<input name=\"C\" type=\"radio\" value=\"C1\">\n\t *\t\t<input name=\"C\" type=\"radio\" value=\"C2\">\n\t *\t</fieldset></form>\n\t *\n\t *\tvar v = $('input[type=text]').fieldValue();\n\t *\t// if no values are entered into the text inputs\n\t *\tv === ['','']\n\t *\t// if values entered into the text inputs are 'foo' and 'bar'\n\t *\tv === ['foo','bar']\n\t *\n\t *\tvar v = $('input[type=checkbox]').fieldValue();\n\t *\t// if neither checkbox is checked\n\t *\tv === undefined\n\t *\t// if both checkboxes are checked\n\t *\tv === ['B1', 'B2']\n\t *\n\t *\tvar v = $('input[type=radio]').fieldValue();\n\t *\t// if neither radio is checked\n\t *\tv === undefined\n\t *\t// if first radio is checked\n\t *\tv === ['C1']\n\t *\n\t * The successful argument controls whether or not the field element must be 'successful'\n\t * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).\n\t * The default value of the successful argument is true. If this value is false the value(s)\n\t * for each element is returned.\n\t *\n\t * Note: This method *always* returns an array. If no valid value can be determined the\n\t *\tarray will be empty, otherwise it will contain one or more values.\n\t */\n\t$.fn.fieldValue = function(successful) {\n\t\tfor (var val = [], i = 0, max = this.length; i < max; i++) {\n\t\t\tvar el = this[i];\n\t\t\tvar v = $.fieldValue(el, successful);\n\n\t\t\tif (v === null || typeof v === 'undefined' || (v.constructor === Array && !v.length)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (v.constructor === Array) {\n\t\t\t\t$.merge(val, v);\n\t\t\t} else {\n\t\t\t\tval.push(v);\n\t\t\t}\n\t\t}\n\n\t\treturn val;\n\t};\n\n\t/**\n\t * Returns the value of the field element.\n\t */\n\t$.fieldValue = function(el, successful) {\n\t\tvar n = el.name, t = el.type, tag = el.tagName.toLowerCase();\n\n\t\tif (typeof successful === 'undefined') {\n\t\t\tsuccessful = true;\n\t\t}\n\n\t\t/* eslint-disable no-mixed-operators */\n\t\tif (successful && (!n || el.disabled || t === 'reset' || t === 'button' ||\n\t\t\t(t === 'checkbox' || t === 'radio') && !el.checked ||\n\t\t\t(t === 'submit' || t === 'image') && el.form && el.form.clk !== el ||\n\t\t\ttag === 'select' && el.selectedIndex === -1)) {\n\t\t/* eslint-enable no-mixed-operators */\n\t\t\treturn null;\n\t\t}\n\n\t\tif (tag === 'select') {\n\t\t\tvar index = el.selectedIndex;\n\n\t\t\tif (index < 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tvar a = [], ops = el.options;\n\t\t\tvar one = (t === 'select-one');\n\t\t\tvar max = (one ? index + 1 : ops.length);\n\n\t\t\tfor (var i = (one ? index : 0); i < max; i++) {\n\t\t\t\tvar op = ops[i];\n\n\t\t\t\tif (op.selected && !op.disabled) {\n\t\t\t\t\tvar v = op.value;\n\n\t\t\t\t\tif (!v) { // extra pain for IE...\n\t\t\t\t\t\tv = (op.attributes && op.attributes.value && !(op.attributes.value.specified)) ? op.text : op.value;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (one) {\n\t\t\t\t\t\treturn v;\n\t\t\t\t\t}\n\n\t\t\t\t\ta.push(v);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn a;\n\t\t}\n\n\t\treturn $(el).val().replace(rCRLF, '\\r\\n');\n\t};\n\n\t/**\n\t * Clears the form data. Takes the following actions on the form's input fields:\n\t *  - input text fields will have their 'value' property set to the empty string\n\t *  - select elements will have their 'selectedIndex' property set to -1\n\t *  - checkbox and radio inputs will have their 'checked' property set to false\n\t *  - inputs of type submit, button, reset, and hidden will *not* be effected\n\t *  - button elements will *not* be effected\n\t */\n\t$.fn.clearForm = function(includeHidden) {\n\t\treturn this.each(function() {\n\t\t\t$('input,select,textarea', this).clearFields(includeHidden);\n\t\t});\n\t};\n\n\t/**\n\t * Clears the selected form elements.\n\t */\n\t$.fn.clearFields = $.fn.clearInputs = function(includeHidden) {\n\t\tvar re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i; // 'hidden' is not in this list\n\n\t\treturn this.each(function() {\n\t\t\tvar t = this.type, tag = this.tagName.toLowerCase();\n\n\t\t\tif (re.test(t) || tag === 'textarea') {\n\t\t\t\tthis.value = '';\n\n\t\t\t} else if (t === 'checkbox' || t === 'radio') {\n\t\t\t\tthis.checked = false;\n\n\t\t\t} else if (tag === 'select') {\n\t\t\t\tthis.selectedIndex = -1;\n\n\t\t\t} else if (t === 'file') {\n\t\t\t\tif (/MSIE/.test(navigator.userAgent)) {\n\t\t\t\t\t$(this).replaceWith($(this).clone(true));\n\t\t\t\t} else {\n\t\t\t\t\t$(this).val('');\n\t\t\t\t}\n\n\t\t\t} else if (includeHidden) {\n\t\t\t\t// includeHidden can be the value true, or it can be a selector string\n\t\t\t\t// indicating a special test; for example:\n\t\t\t\t// $('#myForm').clearForm('.special:hidden')\n\t\t\t\t// the above would clean hidden inputs that have the class of 'special'\n\t\t\t\tif ((includeHidden === true && /hidden/.test(t)) ||\n\t\t\t\t\t(typeof includeHidden === 'string' && $(this).is(includeHidden))) {\n\t\t\t\t\tthis.value = '';\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\n\t/**\n\t * Resets the form data or individual elements. Takes the following actions\n\t * on the selected tags:\n\t * - all fields within form elements will be reset to their original value\n\t * - input / textarea / select fields will be reset to their original value\n\t * - option / optgroup fields (for multi-selects) will defaulted individually\n\t * - non-multiple options will find the right select to default\n\t * - label elements will be searched against its 'for' attribute\n\t * - all others will be searched for appropriate children to default\n\t */\n\t$.fn.resetForm = function() {\n\t\treturn this.each(function() {\n\t\t\tvar el = $(this);\n\t\t\tvar tag = this.tagName.toLowerCase();\n\n\t\t\tswitch (tag) {\n\t\t\tcase 'input':\n\t\t\t\tthis.checked = this.defaultChecked;\n\t\t\t\t\t// fall through\n\n\t\t\tcase 'textarea':\n\t\t\t\tthis.value = this.defaultValue;\n\n\t\t\t\treturn true;\n\n\t\t\tcase 'option':\n\t\t\tcase 'optgroup':\n\t\t\t\tvar select = el.parents('select');\n\n\t\t\t\tif (select.length && select[0].multiple) {\n\t\t\t\t\tif (tag === 'option') {\n\t\t\t\t\t\tthis.selected = this.defaultSelected;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tel.find('option').resetForm();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tselect.resetForm();\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\tcase 'select':\n\t\t\t\tel.find('option').each(function(i) {\t\t\t\t// eslint-disable-line consistent-return\n\t\t\t\t\tthis.selected = this.defaultSelected;\n\t\t\t\t\tif (this.defaultSelected && !el[0].multiple) {\n\t\t\t\t\t\tel[0].selectedIndex = i;\n\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn true;\n\n\t\t\tcase 'label':\n\t\t\t\tvar forEl = $(el.attr('for'));\n\t\t\t\tvar list = el.find('input,select,textarea');\n\n\t\t\t\tif (forEl[0]) {\n\t\t\t\t\tlist.unshift(forEl[0]);\n\t\t\t\t}\n\n\t\t\t\tlist.resetForm();\n\n\t\t\t\treturn true;\n\n\t\t\tcase 'form':\n\t\t\t\t\t// guard against an input with the name of 'reset'\n\t\t\t\t\t// note that IE reports the reset function as an 'object'\n\t\t\t\tif (typeof this.reset === 'function' || (typeof this.reset === 'object' && !this.reset.nodeType)) {\n\t\t\t\t\tthis.reset();\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\tdefault:\n\t\t\t\tel.find('form,input,label,select,textarea').resetForm();\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n\t * Enables or disables any matching elements.\n\t */\n\t$.fn.enable = function(b) {\n\t\tif (typeof b === 'undefined') {\n\t\t\tb = true;\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tthis.disabled = !b;\n\t\t});\n\t};\n\n\t/**\n\t * Checks/unchecks any matching checkboxes or radio buttons and\n\t * selects/deselects and matching option elements.\n\t */\n\t$.fn.selected = function(select) {\n\t\tif (typeof select === 'undefined') {\n\t\t\tselect = true;\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar t = this.type;\n\n\t\t\tif (t === 'checkbox' || t === 'radio') {\n\t\t\t\tthis.checked = select;\n\n\t\t\t} else if (this.tagName.toLowerCase() === 'option') {\n\t\t\t\tvar $sel = $(this).parent('select');\n\n\t\t\t\tif (select && $sel[0] && $sel[0].type === 'select-one') {\n\t\t\t\t\t// deselect all other options\n\t\t\t\t\t$sel.find('option').selected(false);\n\t\t\t\t}\n\n\t\t\t\tthis.selected = select;\n\t\t\t}\n\t\t});\n\t};\n\n\t// expose debug var\n\t$.fn.ajaxSubmit.debug = false;\n\n\t// helper fn for console logging\n\tfunction log() {\n\t\tif (!$.fn.ajaxSubmit.debug) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar msg = '[jquery.form] ' + Array.prototype.join.call(arguments, '');\n\n\t\tif (window.console && window.console.log) {\n\t\t\twindow.console.log(msg);\n\n\t\t} else if (window.opera && window.opera.postError) {\n\t\t\twindow.opera.postError(msg);\n\t\t}\n\t}\n}));\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/assets/js/multiple-select.js",
    "content": "/**\n * @author zhixin wen <wenzhixin2010@gmail.com>\n * @version 1.2.1\n *\n * http://wenzhixin.net.cn/p/multiple-select/\n */\n\n(function ($) {\n\n    'use strict';\n\n    // it only does '%s', and return '' when arguments are undefined\n    var sprintf = function (str) {\n        var args = arguments,\n            flag = true,\n            i = 1;\n\n        str = str.replace(/%s/g, function () {\n            var arg = args[i++];\n\n            if (typeof arg === 'undefined') {\n                flag = false;\n                return '';\n            }\n            return arg;\n        });\n        return flag ? str : '';\n    };\n\n    var removeDiacritics = function (str) {\n        var defaultDiacriticsRemovalMap = [\n            {'base':'A', 'letters':/[\\u0041\\u24B6\\uFF21\\u00C0\\u00C1\\u00C2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\u00C3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\u00C4\\u01DE\\u1EA2\\u00C5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F]/g},\n            {'base':'AA','letters':/[\\uA732]/g},\n            {'base':'AE','letters':/[\\u00C6\\u01FC\\u01E2]/g},\n            {'base':'AO','letters':/[\\uA734]/g},\n            {'base':'AU','letters':/[\\uA736]/g},\n            {'base':'AV','letters':/[\\uA738\\uA73A]/g},\n            {'base':'AY','letters':/[\\uA73C]/g},\n            {'base':'B', 'letters':/[\\u0042\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181]/g},\n            {'base':'C', 'letters':/[\\u0043\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\u00C7\\u1E08\\u0187\\u023B\\uA73E]/g},\n            {'base':'D', 'letters':/[\\u0044\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779]/g},\n            {'base':'DZ','letters':/[\\u01F1\\u01C4]/g},\n            {'base':'Dz','letters':/[\\u01F2\\u01C5]/g},\n            {'base':'E', 'letters':/[\\u0045\\u24BA\\uFF25\\u00C8\\u00C9\\u00CA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\u00CB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E]/g},\n            {'base':'F', 'letters':/[\\u0046\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B]/g},\n            {'base':'G', 'letters':/[\\u0047\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E]/g},\n            {'base':'H', 'letters':/[\\u0048\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D]/g},\n            {'base':'I', 'letters':/[\\u0049\\u24BE\\uFF29\\u00CC\\u00CD\\u00CE\\u0128\\u012A\\u012C\\u0130\\u00CF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197]/g},\n            {'base':'J', 'letters':/[\\u004A\\u24BF\\uFF2A\\u0134\\u0248]/g},\n            {'base':'K', 'letters':/[\\u004B\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2]/g},\n            {'base':'L', 'letters':/[\\u004C\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780]/g},\n            {'base':'LJ','letters':/[\\u01C7]/g},\n            {'base':'Lj','letters':/[\\u01C8]/g},\n            {'base':'M', 'letters':/[\\u004D\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C]/g},\n            {'base':'N', 'letters':/[\\u004E\\u24C3\\uFF2E\\u01F8\\u0143\\u00D1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4]/g},\n            {'base':'NJ','letters':/[\\u01CA]/g},\n            {'base':'Nj','letters':/[\\u01CB]/g},\n            {'base':'O', 'letters':/[\\u004F\\u24C4\\uFF2F\\u00D2\\u00D3\\u00D4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\u00D5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\u00D6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\u00D8\\u01FE\\u0186\\u019F\\uA74A\\uA74C]/g},\n            {'base':'OI','letters':/[\\u01A2]/g},\n            {'base':'OO','letters':/[\\uA74E]/g},\n            {'base':'OU','letters':/[\\u0222]/g},\n            {'base':'P', 'letters':/[\\u0050\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754]/g},\n            {'base':'Q', 'letters':/[\\u0051\\u24C6\\uFF31\\uA756\\uA758\\u024A]/g},\n            {'base':'R', 'letters':/[\\u0052\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782]/g},\n            {'base':'S', 'letters':/[\\u0053\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784]/g},\n            {'base':'T', 'letters':/[\\u0054\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786]/g},\n            {'base':'TZ','letters':/[\\uA728]/g},\n            {'base':'U', 'letters':/[\\u0055\\u24CA\\uFF35\\u00D9\\u00DA\\u00DB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\u00DC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244]/g},\n            {'base':'V', 'letters':/[\\u0056\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245]/g},\n            {'base':'VY','letters':/[\\uA760]/g},\n            {'base':'W', 'letters':/[\\u0057\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72]/g},\n            {'base':'X', 'letters':/[\\u0058\\u24CD\\uFF38\\u1E8A\\u1E8C]/g},\n            {'base':'Y', 'letters':/[\\u0059\\u24CE\\uFF39\\u1EF2\\u00DD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE]/g},\n            {'base':'Z', 'letters':/[\\u005A\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762]/g},\n            {'base':'a', 'letters':/[\\u0061\\u24D0\\uFF41\\u1E9A\\u00E0\\u00E1\\u00E2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\u00E3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\u00E4\\u01DF\\u1EA3\\u00E5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250]/g},\n            {'base':'aa','letters':/[\\uA733]/g},\n            {'base':'ae','letters':/[\\u00E6\\u01FD\\u01E3]/g},\n            {'base':'ao','letters':/[\\uA735]/g},\n            {'base':'au','letters':/[\\uA737]/g},\n            {'base':'av','letters':/[\\uA739\\uA73B]/g},\n            {'base':'ay','letters':/[\\uA73D]/g},\n            {'base':'b', 'letters':/[\\u0062\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253]/g},\n            {'base':'c', 'letters':/[\\u0063\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\u00E7\\u1E09\\u0188\\u023C\\uA73F\\u2184]/g},\n            {'base':'d', 'letters':/[\\u0064\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A]/g},\n            {'base':'dz','letters':/[\\u01F3\\u01C6]/g},\n            {'base':'e', 'letters':/[\\u0065\\u24D4\\uFF45\\u00E8\\u00E9\\u00EA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\u00EB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD]/g},\n            {'base':'f', 'letters':/[\\u0066\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C]/g},\n            {'base':'g', 'letters':/[\\u0067\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F]/g},\n            {'base':'h', 'letters':/[\\u0068\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265]/g},\n            {'base':'hv','letters':/[\\u0195]/g},\n            {'base':'i', 'letters':/[\\u0069\\u24D8\\uFF49\\u00EC\\u00ED\\u00EE\\u0129\\u012B\\u012D\\u00EF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131]/g},\n            {'base':'j', 'letters':/[\\u006A\\u24D9\\uFF4A\\u0135\\u01F0\\u0249]/g},\n            {'base':'k', 'letters':/[\\u006B\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3]/g},\n            {'base':'l', 'letters':/[\\u006C\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u017F\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747]/g},\n            {'base':'lj','letters':/[\\u01C9]/g},\n            {'base':'m', 'letters':/[\\u006D\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F]/g},\n            {'base':'n', 'letters':/[\\u006E\\u24DD\\uFF4E\\u01F9\\u0144\\u00F1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5]/g},\n            {'base':'nj','letters':/[\\u01CC]/g},\n            {'base':'o', 'letters':/[\\u006F\\u24DE\\uFF4F\\u00F2\\u00F3\\u00F4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\u00F5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\u00F6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\u00F8\\u01FF\\u0254\\uA74B\\uA74D\\u0275]/g},\n            {'base':'oi','letters':/[\\u01A3]/g},\n            {'base':'ou','letters':/[\\u0223]/g},\n            {'base':'oo','letters':/[\\uA74F]/g},\n            {'base':'p','letters':/[\\u0070\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755]/g},\n            {'base':'q','letters':/[\\u0071\\u24E0\\uFF51\\u024B\\uA757\\uA759]/g},\n            {'base':'r','letters':/[\\u0072\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783]/g},\n            {'base':'s','letters':/[\\u0073\\u24E2\\uFF53\\u00DF\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B]/g},\n            {'base':'t','letters':/[\\u0074\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787]/g},\n            {'base':'tz','letters':/[\\uA729]/g},\n            {'base':'u','letters':/[\\u0075\\u24E4\\uFF55\\u00F9\\u00FA\\u00FB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\u00FC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289]/g},\n            {'base':'v','letters':/[\\u0076\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C]/g},\n            {'base':'vy','letters':/[\\uA761]/g},\n            {'base':'w','letters':/[\\u0077\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73]/g},\n            {'base':'x','letters':/[\\u0078\\u24E7\\uFF58\\u1E8B\\u1E8D]/g},\n            {'base':'y','letters':/[\\u0079\\u24E8\\uFF59\\u1EF3\\u00FD\\u0177\\u1EF9\\u0233\\u1E8F\\u00FF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF]/g},\n            {'base':'z','letters':/[\\u007A\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763]/g}\n        ];\n\n        for (var i = 0; i < defaultDiacriticsRemovalMap.length; i++) {\n            str = str.replace(defaultDiacriticsRemovalMap[i].letters, defaultDiacriticsRemovalMap[i].base);\n        }\n\n        return str;\n\n   };\n\n    function MultipleSelect($el, options) {\n        var that = this,\n            name = $el.attr('name') || options.name || '';\n\n        this.options = options;\n\n        // hide select element\n        this.$el = $el.hide();\n\n        // label element\n        this.$label = this.$el.closest('label');\n        if (this.$label.length === 0 && this.$el.attr('id')) {\n            this.$label = $(sprintf('label[for=\"%s\"]', this.$el.attr('id').replace(/:/g, '\\\\:')));\n        }\n\n        // restore class and title from select element\n        this.$parent = $(sprintf(\n            '<div class=\"ms-parent %s\" %s/>',\n            $el.attr('class') || '',\n            sprintf('title=\"%s\"', $el.attr('title'))));\n\n        // add placeholder to choice button\n        this.$choice = $(sprintf([\n                '<button type=\"button\" class=\"ms-choice\">',\n                '<span class=\"placeholder\">%s</span>',\n                '<div></div>',\n                '</button>'\n            ].join(''),\n            this.options.placeholder));\n\n        // default position is bottom\n        this.$drop = $(sprintf('<div class=\"ms-drop %s\"%s></div>',\n            this.options.position,\n            sprintf(' style=\"width: %s\"', this.options.dropWidth)));\n\n        this.$el.after(this.$parent);\n        this.$parent.append(this.$choice);\n        this.$parent.append(this.$drop);\n\n        if (this.$el.prop('disabled')) {\n            this.$choice.addClass('disabled');\n        }\n        this.$parent.css('width',\n            this.options.width ||\n            this.$el.css('width') ||\n            this.$el.outerWidth() + 20);\n\n        this.selectAllName = 'data-name=\"selectAll' + name + '\"';\n        this.selectGroupName = 'data-name=\"selectGroup' + name + '\"';\n        this.selectItemName = 'data-name=\"selectItem' + name + '\"';\n\n        if (!this.options.keepOpen) {\n            $(document).click(function (e) {\n                if ($(e.target)[0] === that.$choice[0] ||\n                    $(e.target).parents('.ms-choice')[0] === that.$choice[0]) {\n                    return;\n                }\n                if (($(e.target)[0] === that.$drop[0] ||\n                    $(e.target).parents('.ms-drop')[0] !== that.$drop[0] && e.target !== $el[0]) &&\n                    that.options.isOpen) {\n                    that.close();\n                }\n            });\n        }\n    }\n\n    MultipleSelect.prototype = {\n        constructor: MultipleSelect,\n\n        init: function () {\n            var that = this,\n                $ul = $('<ul></ul>');\n\n            this.$drop.html('');\n\n            if (this.options.filter) {\n                this.$drop.append([\n                    '<div class=\"ms-search\">',\n                    '<input type=\"text\" autocomplete=\"off\" autocorrect=\"off\" autocapitilize=\"off\" spellcheck=\"false\">',\n                    '</div>'].join('')\n                );\n            }\n\n            if (this.options.selectAll && !this.options.single) {\n                $ul.append([\n                    '<li class=\"ms-select-all\">',\n                    '<label>',\n                    sprintf('<input type=\"checkbox\" %s /> ', this.selectAllName),\n                    this.options.selectAllDelimiter[0],\n                    this.options.selectAllText,\n                    this.options.selectAllDelimiter[1],\n                    '</label>',\n                    '</li>'\n                ].join(''));\n            }\n\n            $.each(this.$el.children(), function (i, elm) {\n                $ul.append(that.optionToHtml(i, elm));\n            });\n            $ul.append(sprintf('<li class=\"ms-no-results\">%s</li>', this.options.noMatchesFound));\n            this.$drop.append($ul);\n\n            this.$drop.find('ul').css('max-height', this.options.maxHeight + 'px');\n            this.$drop.find('.multiple').css('width', this.options.multipleWidth + 'px');\n\n            this.$searchInput = this.$drop.find('.ms-search input');\n            this.$selectAll = this.$drop.find('input[' + this.selectAllName + ']');\n            this.$selectGroups = this.$drop.find('input[' + this.selectGroupName + ']');\n            this.$selectItems = this.$drop.find('input[' + this.selectItemName + ']:enabled');\n            this.$disableItems = this.$drop.find('input[' + this.selectItemName + ']:disabled');\n            this.$noResults = this.$drop.find('.ms-no-results');\n\n            this.events();\n            this.updateSelectAll(true);\n            this.update(true);\n\n            if (this.options.isOpen) {\n                this.open();\n            }\n        },\n\n        optionToHtml: function (i, elm, group, groupDisabled) {\n            var that = this,\n                $elm = $(elm),\n                classes = $elm.attr('class') || '',\n                title = sprintf('title=\"%s\"', $elm.attr('title')),\n                multiple = this.options.multiple ? 'multiple' : '',\n                disabled,\n                type = this.options.single ? 'radio' : 'checkbox';\n\n            if ($elm.is('option')) {\n                var value = $elm.val(),\n                    text = that.options.textTemplate($elm),\n                    selected = $elm.prop('selected'),\n                    style = sprintf('style=\"%s\"', this.options.styler(value)),\n                    $el;\n\n                disabled = groupDisabled || $elm.prop('disabled');\n\n                $el = $([\n                    sprintf('<li class=\"%s %s\" %s %s>', multiple, classes, title, style),\n                    sprintf('<label class=\"%s\">', disabled ? 'disabled' : ''),\n                    sprintf('<input type=\"%s\" %s%s%s%s>',\n                        type, this.selectItemName,\n                        selected ? ' checked=\"checked\"' : '',\n                        disabled ? ' disabled=\"disabled\"' : '',\n                        sprintf(' data-group=\"%s\"', group)),\n                    sprintf('<span>%s</span>', text),\n                    '</label>',\n                    '</li>'\n                ].join(''));\n                $el.find('input').val(value);\n                return $el;\n            }\n            if ($elm.is('optgroup')) {\n                var label = that.options.labelTemplate($elm),\n                    $group = $('<div/>');\n\n                group = 'group_' + i;\n                disabled = $elm.prop('disabled');\n\n                $group.append([\n                    '<li class=\"group\">',\n                    sprintf('<label class=\"optgroup %s\" data-group=\"%s\">', disabled ? 'disabled' : '', group),\n                    this.options.hideOptgroupCheckboxes || this.options.single ? '' :\n                        sprintf('<input type=\"checkbox\" %s %s>',\n                        this.selectGroupName, disabled ? 'disabled=\"disabled\"' : ''),\n                    label,\n                    '</label>',\n                    '</li>'\n                ].join(''));\n\n                $.each($elm.children(), function (i, elm) {\n                    $group.append(that.optionToHtml(i, elm, group, disabled));\n                });\n                return $group.html();\n            }\n        },\n\n        events: function () {\n            var that = this,\n                toggleOpen = function (e) {\n                    e.preventDefault();\n                    that[that.options.isOpen ? 'close' : 'open']();\n                };\n\n            if (this.$label) {\n                this.$label.off('click').on('click', function (e) {\n                    if (e.target.nodeName.toLowerCase() !== 'label' || e.target !== this) {\n                        return;\n                    }\n                    toggleOpen(e);\n                    if (!that.options.filter || !that.options.isOpen) {\n                        that.focus();\n                    }\n                    e.stopPropagation(); // Causes lost focus otherwise\n                });\n            }\n\n            this.$choice.off('click').on('click', toggleOpen)\n                .off('focus').on('focus', this.options.onFocus)\n                .off('blur').on('blur', this.options.onBlur);\n\n            this.$parent.off('keydown').on('keydown', function (e) {\n                switch (e.which) {\n                    case 27: // esc key\n                        that.close();\n                        that.$choice.focus();\n                        break;\n                }\n            });\n\n            this.$searchInput.off('keydown').on('keydown',function (e) {\n                // Ensure shift-tab causes lost focus from filter as with clicking away\n                if (e.keyCode === 9 && e.shiftKey) {\n                    that.close();\n                }\n            }).off('keyup').on('keyup', function (e) {\n                // enter or space\n                // Avoid selecting/deselecting if no choices made\n                if (that.options.filterAcceptOnEnter && (e.which === 13 || e.which == 32) && that.$searchInput.val()) {\n                    that.$selectAll.click();\n                    that.close();\n                    that.focus();\n                    return;\n                }\n                that.filter();\n            });\n\n            this.$selectAll.off('click').on('click', function () {\n                var checked = $(this).prop('checked'),\n                    $items = that.$selectItems.filter(':visible');\n\n                if ($items.length === that.$selectItems.length) {\n                    that[checked ? 'checkAll' : 'uncheckAll']();\n                } else { // when the filter option is true\n                    that.$selectGroups.prop('checked', checked);\n                    $items.prop('checked', checked);\n                    that.options[checked ? 'onCheckAll' : 'onUncheckAll']();\n                    that.update();\n                }\n            });\n            this.$selectGroups.off('click').on('click', function () {\n                var group = $(this).parent().attr('data-group'),\n                    $items = that.$selectItems.filter(':visible'),\n                    $children = $items.filter(sprintf('[data-group=\"%s\"]', group)),\n                    checked = $children.length !== $children.filter(':checked').length;\n\n                $children.prop('checked', checked);\n                that.updateSelectAll();\n                that.update();\n                that.options.onOptgroupClick({\n                    label: $(this).parent().text(),\n                    checked: checked,\n                    children: $children.get(),\n                    instance: that\n                });\n            });\n            this.$selectItems.off('click').on('click', function () {\n                that.updateSelectAll();\n                that.update();\n                that.updateOptGroupSelect();\n                that.options.onClick({\n                    label: $(this).parent().text(),\n                    value: $(this).val(),\n                    checked: $(this).prop('checked'),\n                    instance: that\n                });\n\n                if (that.options.single && that.options.isOpen && !that.options.keepOpen) {\n                    that.close();\n                }\n\n                if (that.options.single) {\n                    var clickedVal = $(this).val();\n                    that.$selectItems.filter(function() {\n                        return $(this).val() !== clickedVal;\n                    }).each(function() {\n                        $(this).prop('checked', false);\n                    });\n                    that.update();\n                }\n            });\n        },\n\n        open: function () {\n            if (this.$choice.hasClass('disabled')) {\n                return;\n            }\n            this.options.isOpen = true;\n            this.$choice.find('>div').addClass('open');\n            this.$drop[this.animateMethod('show')]();\n\n            // fix filter bug: no results show\n            this.$selectAll.parent().show();\n            this.$noResults.hide();\n\n            // Fix #77: 'All selected' when no options\n            if (!this.$el.children().length) {\n                this.$selectAll.parent().hide();\n                this.$noResults.show();\n            }\n\n            if (this.options.container) {\n                var offset = this.$drop.offset();\n                this.$drop.appendTo($(this.options.container));\n                this.$drop.offset({\n                    top: offset.top,\n                    left: offset.left\n                });\n            }\n\n            if (this.options.filter) {\n                this.$searchInput.val('');\n                this.$searchInput.focus();\n                this.filter();\n            }\n            this.options.onOpen();\n        },\n\n        close: function () {\n            this.options.isOpen = false;\n            this.$choice.find('>div').removeClass('open');\n            this.$drop[this.animateMethod('hide')]();\n            if (this.options.container) {\n                this.$parent.append(this.$drop);\n                this.$drop.css({\n                    'top': 'auto',\n                    'left': 'auto'\n                });\n            }\n            this.options.onClose();\n        },\n\n        animateMethod: function (method) {\n            var methods = {\n                show: {\n                    fade: 'fadeIn',\n                    slide: 'slideDown'\n                },\n                hide: {\n                    fade: 'fadeOut',\n                    slide: 'slideUp'\n                }\n            };\n\n            return methods[method][this.options.animate] || method;\n        },\n\n        update: function (isInit) {\n            var selects = this.options.displayValues ? this.getSelects() : this.getSelects('text'),\n                $span = this.$choice.find('>span'),\n                sl = selects.length;\n\n            if (sl === 0) {\n                $span.addClass('placeholder').html(this.options.placeholder);\n            } else if (this.options.allSelected && sl === this.$selectItems.length + this.$disableItems.length) {\n                $span.removeClass('placeholder').html(this.options.allSelected);\n            } else if (this.options.ellipsis && sl > this.options.minimumCountSelected) {\n                $span.removeClass('placeholder').text(selects.slice(0, this.options.minimumCountSelected)\n                    .join(this.options.delimiter) + '...');\n            } else if (this.options.countSelected && sl > this.options.minimumCountSelected) {\n                $span.removeClass('placeholder').html(this.options.countSelected\n                    .replace('#', selects.length)\n                    .replace('%', this.$selectItems.length + this.$disableItems.length));\n            } else {\n                $span.removeClass('placeholder').text(selects.join(this.options.delimiter));\n            }\n\n            if (this.options.addTitle) {\n                $span.prop('title', this.getSelects('text'));\n            }\n\n            // set selects to select\n            this.$el.val(this.getSelects()).trigger('change');\n\n            // add selected class to selected li\n            this.$drop.find('li').removeClass('selected');\n            this.$drop.find('input:checked').each(function () {\n                $(this).parents('li').first().addClass('selected');\n            });\n\n            // trigger <select> change event\n            if (!isInit) {\n                this.$el.trigger('change');\n            }\n        },\n\n        updateSelectAll: function (isInit) {\n            var $items = this.$selectItems;\n\n            if (!isInit) {\n                $items = $items.filter(':visible');\n            }\n            this.$selectAll.prop('checked', $items.length &&\n                $items.length === $items.filter(':checked').length);\n            if (!isInit && this.$selectAll.prop('checked')) {\n                this.options.onCheckAll();\n            }\n        },\n\n        updateOptGroupSelect: function () {\n            var $items = this.$selectItems.filter(':visible');\n            $.each(this.$selectGroups, function (i, val) {\n                var group = $(val).parent().attr('data-group'),\n                    $children = $items.filter(sprintf('[data-group=\"%s\"]', group));\n                $(val).prop('checked', $children.length &&\n                    $children.length === $children.filter(':checked').length);\n            });\n        },\n\n        //value or text, default: 'value'\n        getSelects: function (type) {\n            var that = this,\n                texts = [],\n                values = [];\n            this.$drop.find(sprintf('input[%s]:checked', this.selectItemName)).each(function () {\n                texts.push($(this).parents('li').first().text());\n                values.push($(this).val());\n            });\n\n            if (type === 'text' && this.$selectGroups.length) {\n                texts = [];\n                this.$selectGroups.each(function () {\n                    var html = [],\n                        text = $.trim($(this).parent().text()),\n                        group = $(this).parent().data('group'),\n                        $children = that.$drop.find(sprintf('[%s][data-group=\"%s\"]', that.selectItemName, group)),\n                        $selected = $children.filter(':checked');\n\n                    if (!$selected.length) {\n                        return;\n                    }\n\n                    html.push('[');\n                    html.push(text);\n                    if ($children.length > $selected.length) {\n                        var list = [];\n                        $selected.each(function () {\n                            list.push($(this).parent().text());\n                        });\n                        html.push(': ' + list.join(', '));\n                    }\n                    html.push(']');\n                    texts.push(html.join(''));\n                });\n            }\n            return type === 'text' ? texts : values;\n        },\n\n        setSelects: function (values) {\n            var that = this;\n            this.$selectItems.prop('checked', false);\n            this.$disableItems.prop('checked', false);\n            $.each(values, function (i, value) {\n                that.$selectItems.filter(sprintf('[value=\"%s\"]', value)).prop('checked', true);\n                that.$disableItems.filter(sprintf('[value=\"%s\"]', value)).prop('checked', true);\n            });\n            this.$selectAll.prop('checked', this.$selectItems.length ===\n                this.$selectItems.filter(':checked').length + this.$disableItems.filter(':checked').length);\n\n            $.each(that.$selectGroups, function (i, val) {\n                var group = $(val).parent().attr('data-group'),\n                    $children = that.$selectItems.filter('[data-group=\"' + group + '\"]');\n                $(val).prop('checked', $children.length &&\n                    $children.length === $children.filter(':checked').length);\n            });\n\n            this.update();\n        },\n\n        enable: function () {\n            this.$choice.removeClass('disabled');\n        },\n\n        disable: function () {\n            this.$choice.addClass('disabled');\n        },\n\n        checkAll: function () {\n            this.$selectItems.prop('checked', true);\n            this.$selectGroups.prop('checked', true);\n            this.$selectAll.prop('checked', true);\n            this.update();\n            this.options.onCheckAll();\n        },\n\n        uncheckAll: function () {\n            this.$selectItems.prop('checked', false);\n            this.$selectGroups.prop('checked', false);\n            this.$selectAll.prop('checked', false);\n            this.update();\n            this.options.onUncheckAll();\n        },\n\n        focus: function () {\n            this.$choice.focus();\n            this.options.onFocus();\n        },\n\n        blur: function () {\n            this.$choice.blur();\n            this.options.onBlur();\n        },\n\n        refresh: function () {\n            this.init();\n        },\n\n        filter: function () {\n            var that = this,\n                text = $.trim(this.$searchInput.val()).toLowerCase();\n\n            if (text.length === 0) {\n                this.$selectAll.parent().show();\n                this.$selectItems.parent().show();\n                this.$disableItems.parent().show();\n                this.$selectGroups.parent().show();\n                this.$noResults.hide();\n            } else {\n                this.$selectItems.each(function () {\n                    var $parent = $(this).parent();\n                    $parent[removeDiacritics($parent.text().toLowerCase()).indexOf(removeDiacritics(text)) < 0 ? 'hide' : 'show']();\n                });\n                this.$disableItems.parent().hide();\n                this.$selectGroups.each(function () {\n                    var $parent = $(this).parent();\n                    var group = $parent.attr('data-group'),\n                        $items = that.$selectItems.filter(':visible');\n                    $parent[$items.filter(sprintf('[data-group=\"%s\"]', group)).length ? 'show' : 'hide']();\n                });\n\n                //Check if no matches found\n                if (this.$selectItems.parent().filter(':visible').length) {\n                    this.$selectAll.parent().show();\n                    this.$noResults.hide();\n                } else {\n                    this.$selectAll.parent().hide();\n                    this.$noResults.show();\n                }\n            }\n            this.updateOptGroupSelect();\n            this.updateSelectAll();\n            this.options.onFilter(text);\n        }\n    };\n\n    $.fn.multipleSelect = function () {\n        var option = arguments[0],\n            args = arguments,\n\n            value,\n            allowedMethods = [\n                'getSelects', 'setSelects',\n                'enable', 'disable',\n                'open', 'close',\n                'checkAll', 'uncheckAll',\n                'focus', 'blur',\n                'refresh', 'close'\n            ];\n\n        this.each(function () {\n            var $this = $(this),\n                data = $this.data('multipleSelect'),\n                options = $.extend({}, $.fn.multipleSelect.defaults,\n                    $this.data(), typeof option === 'object' && option);\n\n            if (!data) {\n                data = new MultipleSelect($this, options);\n                $this.data('multipleSelect', data);\n            }\n\n            if (typeof option === 'string') {\n                if ($.inArray(option, allowedMethods) < 0) {\n                    throw 'Unknown method: ' + option;\n                }\n                value = data[option](args[1]);\n            } else {\n                data.init();\n                if (args[1]) {\n                    value = data[args[1]].apply(data, [].slice.call(args, 2));\n                }\n            }\n        });\n\n        return typeof value !== 'undefined' ? value : this;\n    };\n\n    $.fn.multipleSelect.defaults = {\n        name: '',\n        isOpen: false,\n        placeholder: '',\n        selectAll: true,\n        selectAllDelimiter: ['[', ']'],\n        minimumCountSelected: 3,\n        ellipsis: false,\n        multiple: false,\n        multipleWidth: 80,\n        single: false,\n        filter: false,\n        width: undefined,\n        dropWidth: undefined,\n        maxHeight: 250,\n        container: null,\n        position: 'bottom',\n        keepOpen: false,\n        animate: 'none', // 'none', 'fade', 'slide'\n        displayValues: false,\n        delimiter: ', ',\n        addTitle: false,\n        filterAcceptOnEnter: false,\n        hideOptgroupCheckboxes: false,\n\n        selectAllText: 'Select all',\n        allSelected: 'All selected',\n        countSelected: '# of % selected',\n        noMatchesFound: 'No matches found',\n\n        styler: function () {\n            return false;\n        },\n        textTemplate: function ($elm) {\n            return $elm.html();\n        },\n        labelTemplate: function ($elm) {\n            return $elm.attr('label');\n        },\n\n        onOpen: function () {\n            return false;\n        },\n        onClose: function () {\n            return false;\n        },\n        onCheckAll: function () {\n            return false;\n        },\n        onUncheckAll: function () {\n            return false;\n        },\n        onFocus: function () {\n            return false;\n        },\n        onBlur: function () {\n            return false;\n        },\n        onOptgroupClick: function () {\n            return false;\n        },\n        onClick: function () {\n            return false;\n        },\n        onFilter: function () {\n            return false;\n        }\n    };\n})(jQuery);\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/js/JGridUtils.js",
    "content": "var  JGridUtils = function (){\n}\n\n//时间格式化的方式\nJGridUtils.dateTimeFormat = function(cellvalue, options, rowObject){\n    var html = \"\";\n    if(cellvalue==undefined || cellvalue==null){\n    \t  return html;\n    \t}\n    var dateTime = new Date(Date.parse(cellvalue));\n    html = dateTime.format(\"yyyy-MM-dd hh:mm:ss\");\n    return html;\n}\n\n\n//isUser字段的中文渲染\nJGridUtils.isUseRender = function(cellvalue, options, rowObject){\n\t   var html = \"\";\n\t   if (cellvalue == \"1\") {\n\t\t   html = \"使用中\";\n\t   } else if (cellvalue == \"0\"){\n\t\t   html = \"无效\";\n\t   } else {\n\t\t   html = \"\";\n\t   }\n\t   return html;\n}\n\n\nJGridUtils.enableTooltips = function(table){\n    $('.navtable .ui-pg-button').tooltip({container:'body'});\n    $(table).find('.ui-pg-div').tooltip({container:'body'});\n}\n//replace icons with FontAwesome icons like above\nJGridUtils.updatePagerIcons =  function (table) {\n    var replacement = \n    {\n        'ui-icon-seek-first' : 'icon-double-angle-left bigger-140',\n        'ui-icon-seek-prev' : 'icon-angle-left bigger-140',\n        'ui-icon-seek-next' : 'icon-angle-right bigger-140',\n        'ui-icon-seek-end' : 'icon-double-angle-right bigger-140'\n    };\n    $('.ui-pg-table:not(.navtable) > tbody > tr > .ui-pg-button > .ui-icon').each(function(){\n        var icon = $(this);\n        var $class = $.trim(icon.attr('class').replace('ui-icon', ''));\n        \n        if($class in replacement) icon.attr('class', 'ui-icon '+replacement[$class]);\n    })\n}\n\n//unlike navButtons icons, action icons in rows seem to be hard-coded\n//you can change them like this in here if you want\nJGridUtils.updateActionIcons = function (table) {\n    /**\n    var replacement = \n    {\n        'ui-icon-pencil' : 'icon-pencil blue',\n        'ui-icon-trash' : 'icon-trash red',\n        'ui-icon-disk' : 'icon-ok green',\n        'ui-icon-cancel' : 'icon-remove red'\n    };\n    $(table).find('.ui-pg-div span.ui-icon').each(function(){\n        var icon = $(this);\n        var $class = $.trim(icon.attr('class').replace('ui-icon', ''));\n        if($class in replacement) icon.attr('class', 'ui-icon '+replacement[$class]);\n    })\n    */\n}\n\n//it causes some flicker when reloading or navigating grid\n//it may be possible to have some custom formatter to do this as the grid is being created to prevent this\n//or go back to default browser checkbox styles for the grid\nJGridUtils.styleCheckbox = function (table) {\n/**\n    $(table).find('input:checkbox').addClass('ace')\n    .wrap('<label />')\n    .after('<span class=\"lbl align-top\" />')\n\n\n    $('.ui-jqgrid-labels th[id*=\"_cb\"]:first-child')\n    .find('input.cbox[type=checkbox]').addClass('ace')\n    .wrap('<label />').after('<span class=\"lbl align-top\" />');\n*/\n}\n\n//switch element when editing inline\nJGridUtils.aceSwitch = function ( cellvalue, options, cell ) {\n\tsetTimeout(function(){\n\t\t$(cell) .find('input[type=checkbox]')\n\t\t\t\t.wrap('<label class=\"inline\" />')\n\t\t\t.addClass('ace ace-switch ace-switch-5')\n\t\t\t.after('<span class=\"lbl\"></span>');\n\t}, 0);\n}\n//enable datepicker\nJGridUtils.pickDate = function ( cellvalue, options, cell ) {\n\tsetTimeout(function(){\n\t\t$(cell) .find('input[type=text]')\n\t\t\t\t.datepicker({format:'yyyy-mm-dd' , autoclose:true}); \n\t}, 0);\n}\nJGridUtils.style_edit_form = function (form) {\n    //enable datepicker on \"sdate\" field and switches for \"stock\" field\n    form.find('input[name=sdate]').datepicker({format:'yyyy-mm-dd' , autoclose:true})\n        .end().find('input[name=stock]')\n              .addClass('ace ace-switch ace-switch-5').wrap('<label class=\"inline\" />').after('<span class=\"lbl\"></span>');\n\n    //update buttons classes\n    var buttons = form.next().find('.EditButton .fm-button');\n    buttons.addClass('btn btn-sm').find('[class*=\"-icon\"]').remove();//ui-icon, s-icon\n    buttons.eq(0).addClass('btn-primary').prepend('<i class=\"icon-ok\"></i>');\n    buttons.eq(1).prepend('<i class=\"icon-remove\"></i>')\n    \n    buttons = form.next().find('.navButton a');\n    buttons.find('.ui-icon').remove();\n    buttons.eq(0).append('<i class=\"icon-chevron-left\"></i>');\n    buttons.eq(1).append('<i class=\"icon-chevron-right\"></i>');     \n}\n\nJGridUtils.style_delete_form = function (form) {\n    var buttons = form.next().find('.EditButton .fm-button');\n    buttons.addClass('btn btn-sm').find('[class*=\"-icon\"]').remove();//ui-icon, s-icon\n    buttons.eq(0).addClass('btn-danger').prepend('<i class=\"icon-trash\"></i>');\n    buttons.eq(1).prepend('<i class=\"icon-remove\"></i>')\n}\n\nJGridUtils.style_search_filters = function (form) {\n    form.find('.delete-rule').val('X');\n    form.find('.add-rule').addClass('btn btn-xs btn-primary');\n    form.find('.add-group').addClass('btn btn-xs btn-success');\n    form.find('.delete-group').addClass('btn btn-xs btn-danger');\n}\n\n\nJGridUtils.style_search_form  = function (form) {\n    var dialog = form.closest('.ui-jqdialog');\n    var buttons = dialog.find('.EditTable')\n    buttons.find('.EditButton a[id*=\"_reset\"]').addClass('btn btn-sm btn-info').find('.ui-icon').attr('class', 'icon-retweet');\n    buttons.find('.EditButton a[id*=\"_query\"]').addClass('btn btn-sm btn-inverse').find('.ui-icon').attr('class', 'icon-comment-alt');\n    buttons.find('.EditButton a[id*=\"_search\"]').addClass('btn btn-sm btn-purple').find('.ui-icon').attr('class', 'icon-search');\n}\n\n\nJGridUtils.beforeDeleteCallback = function (e) {\n    var form = $(e[0]);\n    if(form.data('styled')) return false;\n    \n    form.closest('.ui-jqdialog').find('.ui-jqdialog-titlebar').wrapInner('<div class=\"widget-header\" />')\n    JGridUtils.style_delete_form(form);\n    \n    form.data('styled', true);\n}\n\n\nJGridUtils.beforeEditCallback = function (e) {\n    var form = $(e[0]);\n    form.closest('.ui-jqdialog').find('.ui-jqdialog-titlebar').wrapInner('<div class=\"widget-header\" />')\n    JGridUtils.style_edit_form(form);\n}\n\n\n\n\nJGridUtils.alert = function (title , msg){\n\t bootbox.dialog({  \n         message: msg,  \n         title: title,  \n         buttons: {    OK: {  \n                 label: \"确定\",  \n                 className: \"btn-primary\"\n             }  \n         }  \n     });\n}\n\nJGridUtils.renderNav = function(grid_selector, pager_selector) {\n\t\n    //navButtons\n    jQuery(grid_selector).jqGrid('navGrid',pager_selector,\n        {   //navbar options\n            edit: false,\n            editicon : 'icon-pencil blue',\n            add: false,\n            addicon : 'icon-plus-sign purple',\n            del: false,\n            delicon : 'icon-trash red',\n            search: false,\n            searchicon : 'icon-search orange',\n            refresh: true,\n            refreshicon : 'icon-refresh green',\n            view: true,\n            viewicon : 'icon-zoom-in grey',\n        },\n        {\n            //edit record form\n            //closeAfterEdit: true,\n            recreateForm: true,\n            beforeShowForm : function(e) {\n                var form = $(e[0]);\n                form.closest('.ui-jqdialog').find('.ui-jqdialog-titlebar').wrapInner('<div class=\"widget-header\" />')\n                JGridUtils.style_edit_form(form);\n            }\n        },\n        {\n            //new record form\n            closeAfterAdd: true,\n            recreateForm: true,\n            viewPagerButtons: false,\n            beforeShowForm : function(e) {\n                var form = $(e[0]);\n                form.closest('.ui-jqdialog').find('.ui-jqdialog-titlebar').wrapInner('<div class=\"widget-header\" />')\n                JGridUtils.style_edit_form(form);\n            }\n        },\n        {\n            //delete record form\n            recreateForm: true,\n            beforeShowForm : function(e) {\n                var form = $(e[0]);\n                if(form.data('styled')) return false;\n                \n                form.closest('.ui-jqdialog').find('.ui-jqdialog-titlebar').wrapInner('<div class=\"widget-header\" />')\n                JGridUtils.style_delete_form(form);\n                \n                form.data('styled', true);\n            },\n            onClick : function(e) {\n                alert(1);\n            }\n        },\n        {\n            //search form\n            recreateForm: true,\n            afterShowSearch: function(e){\n                var form = $(e[0]);\n                form.closest('.ui-jqdialog').find('.ui-jqdialog-title').wrap('<div class=\"widget-header\" />')\n                JGridUtils.style_search_form(form);\n            },\n            afterRedraw: function(){\n                JGridUtils.style_search_filters($(this));\n            }\n            ,\n            multipleSearch: true,\n            /**\n            multipleGroup:true,\n            showQuery: true\n            */\n        },\n        {\n            //view record form\n            recreateForm: true,\n            beforeShowForm: function(e){\n                var form = $(e[0]);\n                form.closest('.ui-jqdialog').find('.ui-jqdialog-title').wrap('<div class=\"widget-header\" />')\n            }\n        }\n    );\n}"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/js/Nora.js",
    "content": "/**\n * Nora工具包.<br>\n * 请放在jq后加载.\n */\n\nvar Nora = window.Nora || {\n\t/**\n\t * 返回整响应结果.\n\t * @param url\n\t * @param prams\n\t * @param successFun\n\t * @param failFun\n\t */\n\t\"Ajax\":  function(url, prams, successFun, failFun) {\n\t    $.ajax({\n\t        type : \"POST\",\n\t        url : url,\n\t        data: prams,\n\t        success : function(result){\n\t        \tif (typeof(successFun) == \"function\") {\n\t        \t\tsuccessFun(result);\n\t        \t}\n\t        },\n\t        error: function(xhr, msg, e) {\n\t        \tif (typeof(failFun) == \"function\") {\n\t        \t\tfailFun(xhr, msg, e);\n\t        \t} else {\n\t        \t\talert(\"Nora.request函数调用出错：\" + msg + \" \" + e);\n\t        \t}\n\t        }\n\t    });\n\t},\n\t/**\n\t * 只返回数据部分.\n\t * @param url\n\t * @param prams\n\t * @param successFun\n\t * @param failFun\n\t */\n\t\"Request\":  function(url, prams, successFun, failFun) {\n\t\t$.ajax({\n\t\t\ttype : \"POST\",\n\t\t\turl : url,\n\t\t\tdata: prams,\n\t\t\tsuccess : function(result){\n\t\t\t\tif (typeof(successFun) == \"function\") {\n\t\t\t\t\tsuccessFun(result.data);\n\t\t\t\t}\n\t\t\t},\n\t\t\terror: function(xhr, msg, e) {\n\t\t\t\tif (typeof(failFun) == \"function\") {\n\t\t\t\t\tfailFun(xhr, msg, e);\n\t\t\t\t} else {\n\t\t\t\t\talert(\"Nora.request函数调用出错：\" + msg + \" \" + e);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\t\"Util\": {\n\t\t\"StringUtil\": {\n\t\t\t\"format\": function(source, args) {\n\t\t\t\tvar result = source;\n\t\t\t\tif (arguments.length > 1) {\n\t\t\t\t\tfor (var i = 1; i < arguments.length; i++) {\n\t\t\t\t\t\tif (arguments[i] != undefined) {\n\t\t\t\t\t\t\tresult = result.replace(\"{}\", arguments[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t}\n\t\t},\n\t\t\"DateUtil\": {\n\t\t\t\"format\": function(source, pattern) {\n\t\t\t\t var o = {\n\t\t\t\t\t     \"M+\": source.getMonth() + 1, //月份 \n\t\t\t\t\t     \"d+\": source.getDate(), //日 \n\t\t\t\t\t     \"h+\": source.getHours(), //小时 \n\t\t\t\t\t     \"m+\": source.getMinutes(), //分 \n\t\t\t\t\t     \"s+\": source.getSeconds(), //秒 \n\t\t\t\t\t     \"q+\": Math.floor((source.getMonth() + 3) / 3), //季度 \n\t\t\t\t\t     \"S\": source.getMilliseconds() //毫秒 \n\t\t\t\t\t };\n\t\t\t\t if (/(y+)/.test(pattern)) pattern = pattern.replace(RegExp.$1, (source.getFullYear() + \"\").substr(4 - RegExp.$1.length));\n\t\t\t\t for (var k in o)\n\t\t\t\t\t if (new RegExp(\"(\" + k + \")\").test(pattern)) \n\t\t\t\t\t\t pattern = pattern.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : ((\"00\" + o[k]).substr((\"\" + o[k]).length)));\n\t\t\t\t return pattern; \n\t\t\t}\n\t\t},\n\t\t\"TemplateUtil\": {\n\t\t\t\"formate\": function(dta, tmpl) {\n\t\t\t    var format = {  \n\t\t\t            name: function(x) {  \n\t\t\t                return x  \n\t\t\t            }  \n\t\t\t        };  \n\t\t        return tmpl.replace(/{(\\w+)}/g, function(m1, m2) {  \n\t\t            if (!m2)  \n\t\t                return \"\";  \n\t\t            return (format && format[m2]) ? format[m2](dta[m2]) : dta[m2];  \n\t\t        });  \n\t\t\t}\n\t\t}\n\t}\n};\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/js/core.js",
    "content": "/** 自定占位符 **/\nString.prototype.format=function()  \n{  \n  if(arguments.length==0) return this;  \n  for(var s=this, i=0; i<arguments.length; i++)  \n    s=s.replace(new RegExp(\"\\\\{\"+i+\"\\\\}\",\"g\"), arguments[i]);  \n  return s;  \n};\n//对Date的扩展，将 Date 转化为指定格式的String\n//月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符， \n//年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字) \n//例子： \n//(new Date()).Format(\"yyyy-MM-dd hh:mm:ss.S\") ==> 2006-07-02 08:09:04.423 \n//(new Date()).Format(\"yyyy-M-d h:m:s.S\")      ==> 2006-7-2 8:9:4.18 \nDate.prototype.format = function (fmt) { //author: meizz \n var o = {\n     \"M+\": this.getMonth() + 1, //月份 \n     \"d+\": this.getDate(), //日 \n     \"h+\": this.getHours(), //小时 \n     \"m+\": this.getMinutes(), //分 \n     \"s+\": this.getSeconds(), //秒 \n     \"q+\": Math.floor((this.getMonth() + 3) / 3), //季度 \n     \"S\": this.getMilliseconds() //毫秒 \n };\n if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + \"\").substr(4 - RegExp.$1.length));\n for (var k in o)\n if (new RegExp(\"(\" + k + \")\").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : ((\"00\" + o[k]).substr((\"\" + o[k]).length)));\n return fmt; \n}\nDate.prototype.addDays = function(d) {\n\tthis.setDate(this.getDate() + d);\n\treturn this;\n};\n//定义一个全局的关联数组;\nmenuNodes = new Array();\nfunction buildTree(data, pmenuId){\n\tmenuNodes = new Array(); // 每次都清空.构建树的时候,顺便保留一份nodes数组\n    var result = [] , temp;\n    for (var i = 0; i < data.length; i++) {\n    \tmenuNodes[data[i].menuId] = data[i]; // 以menuId为key,自身为value\n        if (data[i].pmenuId == pmenuId) {\n            result.push(data[i]);\n            temp = buildTree(data, data[i].menuId);           \n            if (temp.length > 0) {\n                data[i].children = temp;\n            }           \n        }       \n    }\n    return result;\n}\n\n//非递归广度优先实现\nvar iterator1 = function (elmId, treeNodes) {\n    if (!treeNodes || !treeNodes.length) return;\n\n    var stack = [];\n\n    //先将第一层节点放入栈\n    for (var i = 0, len = treeNodes.length; i < len; i++) {\n        stack.push(treeNodes[i]);\n    }\n\n    var item;\n\n    while (stack.length) {\n        item = stack.shift();\n        if (-1 == item.pmenuId) {\n            var html = '<ul id=\"{0}\" class=\"nav nav-list\"></ul>';\n            html = html.format(item.menuId);\n            $(\"#\" + elmId).append(html);\n            // elmId = item.menuId;\n        } else {\n        \tif (item.children && item.children.length) {\n        \t\t\n        \t\tvar html = '\\\n        \t\t\t<li id=\"f{0}\" > \\\n\t                    <a href=\"#\" class=\"dropdown-toggle\"> \\\n\t                    <i class=\"{1}\"></i> \\\n\t                    <span class=\"menu-text\"> {2} </span> \\\n\t                    <b class=\"arrow icon-angle-down\"></b> \\\n\t                    </a> \\\n        \t\t\t\t<ul id=\"{0}\" class=\"submenu\"></ul>\\\n        \t\t\t</li>\\\n        \t\t\t';\n        \t\thtml = html.format(item.menuId, item.menuStyle, item.menuName);\n        \t\t$(\"#\" + item.pmenuId).append(html);\n                // elmId = item.menuId;\n        \t\t\n        \t} else {\n        \t\tvar html = '\\\n        \t\t\t<li id=\"f{0}\"> \\\n        \t\t\t<a href=\"{1}\"> \\\n        \t\t\t<i class=\"{2}\"></i> \\\n        \t\t\t{3}\\\n        \t\t\t</a> \\\n        \t\t\t</li> \\\n        \t\t\t';\n        \t\t//var theRealMenuUrl = item.menuUrl;\n        \t\t//if(theRealMenuUrl != '#'){\n        \t\t//\ttheRealMenuUrl = \"javascript:loadMenuPage(\"+item.menuId+\");\"\n        \t\t//}\n        \t\thtml = html.format(item.menuId, item.menuUrl, item.menuStyle, item.menuName);\n        \t\t$(\"#\" + item.pmenuId).append(html);\n        \t\t//$(\"#\" + elmId).append(html);\n        \t}\n        }\n\n        //如果该节点有子节点，继续添加进入栈底\n        if (item.children && item.children.length) {\n            stack = stack.concat(item.children);\n        }\n    }\n};\n\nfunction viewTree(elmId, datas) {\n\titerator1(elmId, datas);\n}\n\n\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/js/echartUtils.js",
    "content": "/**\n * \n */\n\n\tfunction initLine(divid,name,data,data2) {\n\t            require([ 'echarts', 'echarts/chart/line' // 使用柱状图就加载bar模块，按需加载\n\t            ], function(ec) {\n\t\t            var dataArray = [];\n\t\t            var cityName = [];\n\t\t            for(var i=0;i<data.length;i++){\n\t\t            \tdataArray.push(data[i].rate);\n\t\t            \tcityName.push(data[i].name);\n\t\t            }\n\t                // 基于准备好的dom，初始化echarts图表\n\t                var detailChart = ec.init(document.getElementById(divid));\n\t                var option = {\n\t                    tooltip : {\n\t                        trigger : 'axis',\n\t                        formatter: \"{b} <br/>{a}: {c}%\"\n\t                    },\n\t                    legend : {\n\t                        data : [name]\n\t                    },\n\t                    toolbox : {\n\t                        feature : {\n\t                            saveAsImage : {}\n\t                        }\n\t                    },\n\t                    grid : {\n\t                        left : '3%',\n\t                        right : '4%',\n\t                        bottom : '3%',\n\t                        containLabel : true\n\t                    },\n\t                    xAxis : [ {\n\t                        type : 'category',\n\t                        boundaryGap : false,\n\t                        axisLabel: {\n\t                            interval: 0,\n\t                            rotate: 0,\n\t                            formatter:function(val){\n\t                            \treturn val.split(\"\").join(\"\\n\"); //横轴信息文字竖直显示\n\t                            }\n\t                        },\n\t                        data : cityName\n\t                    } ],\n\t                    yAxis : [ {\n\t                         type : 'value',\n\t                         name : '同比:%'\n\t                         \n\t                     }],\n\t                    series : [ {\n\t                        name : name,\n\t                        type : 'line',\n\t                        data : dataArray\n\t                    },{\n\t                        name : \"汇总线\",\n\t                        type : 'line',\n\t                        label: \"汇总线\",\n\t                        symbolSize:0,  //图标尺寸\n\t                        markPoint: {\n\t                        \tsymbolSize: 15,\n\t                        \tdata: [{name: '汇总线', value: data2*100, xAxis: dataArray.length, yAxis: data2*100}]\n\t                        },\n\t                        itemStyle:{\n\t                            normal:{\n\t                            \tlineStyle: {\n\t                            \t\ttype: \"dashed\",\n\t                            \t\tcolor: \"#F00\", //图标颜色\n\t                            \t\twidth: 2\n\t                            \t}\n\t                            }\n\t                        },\n\t                        data : drawSumline(dataArray, data2)\n\t                    }\n\n\t                    ]\n\t                };\n\t                // 为echarts对象加载数据 \n\t                detailChart.setOption(option,true);\n\t            });\n\n\t        }\n\t\n\tfunction drawSumline(dataArray, data2) {\n\t\tvar data = [];\n\t\tfor (var i = 0; i < dataArray.length; i++) {\n\t\t\tdata[i] = data2 * 100;\n\t\t}\n\t\treturn data;\n\t}\n\t\n\t"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/js/jquery.jsonEdit.js",
    "content": "(function($){\n    $.fn.extend({\n        jsonEdit: function(options) {\n\n            //参数绑定\n            var params = {\n                debug:false\n                ,className:'jsonEdit'\n                ,buttonSelector:''\n                ,height:100\n                ,html:false //TODO 是否html转义\n                ,highlight:false //TODO 是否高亮\n                ,dynamic:false\n                ,tabIndent:true\n                ,errorAlert:false\n                ,onSuccess:null       \n                ,onError:null       \n            };\n            $.extend(params,options);\n\n            //Console\n            if(typeof console === \"undefined\"){\n                console = {log:function(){\n                    //TODO\n                    for(var i in arguments){\n                        var elem = arguments[i],\n                            type = (typeof elem),\n                            info = '===Log Info===\\n';\n                        switch(type){\n                            case \"string\":\n                                info += elem;\n                                break;\n                            case \"object\":\n                                info += (JSON.stringify(elem));\n                                break;\n                            case \"number\":\n                                info += elem;\n                                break;\n                            default:\n                        }\n                        alert(info);\n                    }\n                }};\n            }\n\n            var pasteHtmlAtCaret = function(html){\n                var sel, range;\n                if (window.getSelection) {\n                    // IE9 and non-IE\n                    sel = window.getSelection();\n                    if (sel.getRangeAt && sel.rangeCount) {\n                        range = sel.getRangeAt(0);\n                        range.deleteContents();\n\n                        // Range.createContextualFragment() would be useful here but is\n                        // non-standard and not supported in all browsers (IE9, for one)\n                        var el = document.createElement(\"div\");\n                        el.innerHTML = html;\n                        var frag = document.createDocumentFragment(), node, lastNode;\n                        while ((node = el.firstChild)) {\n                            lastNode = frag.appendChild(node);\n                        }\n                        range.insertNode(frag);\n\n                        // Preserve the selection\n                        if (lastNode) {\n                            range = range.cloneRange();\n                            range.setStartAfter(lastNode);\n                            range.collapse(true);\n                            sel.removeAllRanges();\n                            sel.addRange(range);\n                        }\n                    }\n                } else if (document.selection && document.selection.type != \"Control\") {\n                    // IE < 9\n                    sel = document.selection;\n                    sel.createRange().pasteHTML(html);\n                }\n            };\n\n            //Construct\n            var JsonEdit = function( $target,$edit,params ){\n                this.$target = $target;\n                this.$edit = $edit;\n                this.params = params;\n            };\n\n            JsonEdit.prototype = {\n                init:function(){\n                    var $edit = this.$edit,\n                        $target = this.$target,\n                        params = this.params,\n                        that = this;\n\n                    //input bindding\n                    $edit.bind('input propertychange paste',function(e){\n                        //延迟以接收paste\n                        setTimeout(function(){\n                            //调试输出\n                            if( params.debug === true ){\n                                //console.log('HTML \\n'+$edit.html());\n                                console.log('TEXT \\n'+$edit.text());\n                            }\n\n                            //动态格式化\n                            if( params.dynamic === true ){\n                                that.doFormat();\n                            }\n                        },10);\n\n                    });\n\n                    //button bindding\n                    if( params.buttonSelector ){\n                        var $btn = $(params.buttonSelector);\n                        if( $btn.length >0 ){\n                            $btn.bind('click',function(e){\n                                e.preventDefault();\n                                that.doFormat();\n                            });\n                        }\n                    }\n\n                    //keydown bindding\n                    $edit.bind('keydown',function(e){\n                        //var obj = document.activeElement;\n\n                        //tabIndent bindding\n                        if( params.tabIndent && e.keyCode == 9){\n                            e.preventDefault();\n                            pasteHtmlAtCaret('\\t');\n                            $edit.trigger('input');\n                        }\n\n                    });\n\n                    //onpaste filter\n                    $edit.bind('paste',function(e){\n                        e.preventDefault();\n                        var pastedText;\n                    if (window.clipboardData && window.clipboardData.getData) { // IE\n                        pastedText = window.clipboardData.getData('Text');\n                    } else if (e.originalEvent.clipboardData && e.originalEvent.clipboardData.getData) {\n                        pastedText = e.originalEvent.clipboardData.getData('text/plain');\n                    }\n                        pasteHtmlAtCaret(pastedText);\n\n                    });\n\n                    //value Init\n                    var oVal = $target.val();\n                    if( oVal ){\n                        $edit.text(oVal);\n                        this.doFormat();\n                    }\n\n                    if( params.debug === true ){\n                        console.log('JsonEdit Ready!');\n                    }\n\n\n                }\n\n                //获取当前输入文本\n                ,getValue:function(){\n                    var text = this.$edit.text();\n                    return text;\n                }\n                //设置文本\n                ,setValue:function(val){\n\n                    this.$edit.text(val);\n                }\n\n                //执行格式化\n                ,doFormat:function(){\n                    var result = this.jsonFormat();\n                    if( result ){\n                        if( this.params.debug === true ){\n                            console.log( 'FORMAT \\n'+result );\n                        }\n                        this.setValue( result );\n\n                        if( this.params.onSuccess ){\n                            this.params.onSuccess();\n                        }\n                    }\n                }\n\n                //格式化\n                ,jsonFormat:function(){\n                    var text = this.getValue(),\n                        format = \"\";\n                    if( text !== \"\" ){\n                        var parse = \"\";\n                        try{\n                            parse = JSON.parse(text);\n                            format = JSON.stringify(parse,null,2);\n\n                        }catch(e){\n                            this.errorHandle(1,e);\n                        }\n\n                        return format;\n                    }\n                }\n\n                ,errorHandle:function(type,event){\n                    var info = \"\";\n                    switch(type){\n                        case 1:\n                            info = 'Json Syntax Error!';\n                            break;\n                        default:\n                            info = 'Error!';\n                    }\n\n                    if( this.params.onError ){\n                        this.params.onError();\n                    }\n\n                    else if( this.params.errorAlert === true ){\n                        alert(info);\n                    }\n                    if( this.params.debug === true ){\n                        console.log(info ,event);\n                    }\n                }\n\n            //TODO htmlEncode        \n            //TODO saveValue        \n            //TODO prettify        \n\n            };\n\n\n            var endResult = [];\n            this.each(function() {\n                var $target = $(this);\n\n                //创建编辑器区域\n                var $edit = $(\"<pre contenteditable></pre>\");\n                //$edit.addClass('prettyprint');\n                $edit.addClass(params.className);\n                $edit.css('height',parseInt(params.height)+'px');\n                $edit.css('padding','10px');\n                $target.before($edit).hide();\n\n                /*\n                $hint = $(\"<p></p>\");\n                $hint.css({\n                    'display':'block',\n                    'width':\n                });\n                */\n\n                var Edit = new JsonEdit($target,$edit,params);\n\n                Edit.init();\n\n                endResult.push(Edit);\n\n            });\n\n            return (endResult.length==1?endResult[0]:endResult);\n        }\n    });\n})(jQuery);\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/static/v3/js/pom.js",
    "content": ""
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/templates/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Title</title>\n</head>\n<body>\nwelcome to doe.<br>\n\n<a href=\"/doe/home/connect\">连接管理</a> <br>\n<a href=\"/doe/home/addJar\">增加JAR向导</a> <br>\n\n\n</body>\n</html>"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/templates/pages/tpl/bread.html",
    "content": " <div class=\"breadcrumbs\" th:fragment=\"breader\" xmlns:th=\"http://www.thymeleaf.org\">\n     <script type=\"text/javascript\">\n         try{ace.settings.check('breadcrumbs' , 'fixed')}catch(e){}\n     </script>\n\n     <ul id=\"breadcrumb\" class=\"breadcrumb\">\n         <li>\n             <i class=\"icon-home home-icon\"></i>\n             <a href=\"#\">首页 </a>\n         </li>\n     </ul><!-- .breadcrumb -->\n\n     <span class=\"hidden\" id=\"xxxMenuId\" th:text=\"${mid}\"></span>\n     <script type=\"text/javascript\">\n         jQuery(function($) {\n\n             var mid = $(\"#xxxMenuId\").text();\n\n             // 如果没有参数，直接打开第一个\n             if (\"\" == mid || mid.length <= 0) {\n                 mid = $(\".submenu > li:first\").attr(\"id\");\n                 openMenu(mid);\n             } else {\n                 openMenu(mid);\n             }\n\n\n         });\n         function openMenu(menuId) {\n             if (null == menuId || undefined == menuId) {\n                 return;\n             }\n             // 顺序添加样式\n             $(\"#\" + menuId).addClass(\"open active\");\n             var $pMenu = $(\"#\" + menuId).parent().parent();\n             var pId = $pMenu.attr(\"id\");\n             openMenu(pId);\n\n\n         }\n     </script>\n\n </div>"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/templates/pages/tpl/foot.html",
    "content": "<div th:fragment=\"footer\" xmlns:th=\"http://www.thymeleaf.org\">\n\n        <!-- ace settings handler -->\n        <script th:src=\"@{~/v3/assets/js/ace-extra.min.js}\"></script>\n\n\n        <script type=\"text/javascript\">\n            if(\"ontouchend\" in document) document.write(\"<script src='statics/v3/assets/js/jquery.mobile.custom.min.js'>\"+\"<\"+\"script>\");\n        </script>\n        <script th:src=\"@{~/v3/assets/js/bootstrap.min.js}\"></script>\n        <script th:src=\"@{~/v3/assets/js/typeahead-bs2.min.js}\"></script>\n\n\n        <!-- page specific plugin scripts -->\n\n        <script th:src=\"@{~/v3/assets/js/date-time/bootstrap-datepicker.min.js}\"></script>\n        <script th:src=\"@{~/v3/assets/js/jqGrid/jquery.jqGrid.src.js}\"></script>\n        <script th:src=\"@{~/v3/assets/js/jqGrid/i18n/grid.locale-en.js}\"></script>\n\n        <!-- ace scripts -->\n\n        <script th:src=\"@{~/v3/assets/js/ace-elements.min.js}\"></script>\n        <script th:src=\"@{~/v3/assets/js/ace.min.js}\"></script>\n\n        <!-- 自定义的jgrid工具类 -->\n        <script th:src=\"@{~/v3/js/JGridUtils.js}\"></script>\n        <!-- 弹框工具 -->\n        <script th:src=\"@{~/v3/assets/js/bootbox.min.js}\"></script>\n        <!-- 共用类 -->\n        <script th:src=\"@{~/v3/js/core.js}\"></script>\n        <script th:src=\"@{~/v3/js/Nora.js}\"></script>\n\n</div>"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/templates/pages/tpl/head.html",
    "content": "<div th:fragment=\"header\" xmlns:th=\"http://www.thymeleaf.org\">\n\n        <meta name=\"keywords\" content=\"Bootstrap模版,Bootstrap模版下载,Bootstrap教程,Bootstrap中文\" />\n        <meta name=\"description\" content=\"站长素材提供Bootstrap模版,Bootstrap教程,Bootstrap中文翻译等相关Bootstrap插件下载\" />\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n        <!-- basic styles -->\n        <link th:href=\"@{~/v3/assets/css/bootstrap.min.css}\" rel=\"stylesheet\" />\n        <link rel=\"stylesheet\" th:href=\"@{~/v3/assets/css/font-awesome.min.css}\" />\n\n        <!-- page specific plugin styles -->\n        <link rel=\"stylesheet\" th:href=\"@{~/v3/assets/css/jquery-ui-1.10.3.full.min.css}\" />\n        <link rel=\"stylesheet\" th:href=\"@{~/v3/assets/css/datepicker.css}\" />\n        <link rel=\"stylesheet\" th:href=\"@{~/v3/assets/css/ui.jqgrid.css}\" />\n\n        <!-- ace styles -->\n        <link rel=\"stylesheet\" th:href=\"@{~/v3/assets/css/ace.min.css}\" />\n        <link rel=\"stylesheet\" th:href=\"@{~/v3/assets/css/ace-rtl.min.css}\" />\n        <link rel=\"stylesheet\" th:href=\"@{~/v3/assets/css/ace-skins.min.css}\" />\n\n        <script th:src=\"@{~/v3/assets/js/jquery-2.0.3.min.js}\"></script>\n\n</div>\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/templates/pages/tpl/left.html",
    "content": "<div class=\"sidebar\" id=\"sidebar\" th:fragment=\"lefter\" xmlns:th=\"http://www.thymeleaf.org\">\n    <script type=\"text/javascript\">\n        try{ace.settings.check('sidebar' , 'fixed')}catch(e){}\n    </script>\n\n    <div class=\"sidebar-shortcuts\" id=\"sidebar-shortcuts\">\n        <div class=\"sidebar-shortcuts-large\" id=\"sidebar-shortcuts-large\">\n            <button class=\"btn btn-success\">\n                <i class=\"icon-signal\"></i>\n            </button>\n\n            <button class=\"btn btn-info\">\n                <i class=\"icon-pencil\"></i>\n            </button>\n\n            <button class=\"btn btn-warning\">\n                <i class=\"icon-group\"></i>\n            </button>\n\n            <button class=\"btn btn-danger\">\n                <i class=\"icon-cogs\"></i>\n            </button>\n        </div>\n\n        <div class=\"sidebar-shortcuts-mini\" id=\"sidebar-shortcuts-mini\">\n            <span class=\"btn btn-success\"></span>\n\n            <span class=\"btn btn-info\"></span>\n\n            <span class=\"btn btn-warning\"></span>\n\n            <span class=\"btn btn-danger\"></span>\n        </div>\n    </div><!-- #sidebar-shortcuts -->\n\n    <ul class=\"nav nav-list\">\n        <li class=\"open active\">\n\n            <a href=\"#\" class=\"dropdown-toggle\">\n                <i class=\"icon-list\"></i>\n                <span class=\"menu-text\"> 连接发送 </span>\n\n                <b class=\"arrow icon-angle-down\"></b>\n            </a>\n\n            <ul class=\"submenu open \">\n                <li>\n                    <a href=\"easyCnt\">\n                        <i class=\"icon-double-angle-right\"></i>\n                        极简模式\n                    </a>\n                </li>\n                <li>\n                    <a href=\"normalCnt\">\n                        <i class=\"icon-double-angle-right\"></i>\n                        普通模式\n                    </a>\n                </li>\n\n\n                <li>\n                    <a href=\"caseCnt\">\n                        <i class=\"icon-double-angle-right\"></i>\n                        用例模式\n                    </a>\n                </li>\n\n            </ul>\n        </li>\n\n        <li >\n            <a href=\"#\" class=\"dropdown-toggle open\">\n                <i class=\"icon-exchange\"></i>\n                <span class=\"menu-text\"> 依赖管理 </span>\n\n                <b class=\"arrow icon-angle-down\"></b>\n            </a>\n\n            <ul class=\"submenu\">\n                <li>\n                    <a href=\"addJar\">\n                        <i class=\"icon-double-angle-right\"></i>\n                        增加依赖\n                    </a>\n                </li>\n\n                <li>\n                    <a href=\"listJar\">\n                        <i class=\"icon-double-angle-right\"></i>\n                        依赖列表\n                    </a>\n                </li>\n                <li>\n                    <a href=\"editPom\">\n                        <i class=\"icon-double-angle-right\"></i>\n                        依赖编辑\n                    </a>\n                </li>\n            </ul>\n        </li>\n\n        <li>\n            <a href=\"#\" class=\"dropdown-toggle open\">\n                <i class=\"icon-cogs\"></i>\n                <span class=\"menu-text\"> 系统管理 </span>\n\n                <b class=\"arrow icon-angle-down\"></b>\n            </a>\n\n            <ul class=\"submenu\">\n                <li>\n                    <a href=\"listZk\">\n                        <i class=\"icon-double-angle-right\"></i>\n                        注册中心\n                    </a>\n                </li>\n                <li>\n                    <a href=\"sys\">\n                        <i class=\"icon-double-angle-right\"></i>\n                        系统配置\n                    </a>\n                </li>\n\n            </ul>\n        </li>\n\n    </ul><!-- /.nav-list -->\n\n    <div class=\"sidebar-collapse\" id=\"sidebar-collapse\">\n        <i class=\"icon-double-angle-left\" data-icon1=\"icon-double-angle-left\" data-icon2=\"icon-double-angle-right\"></i>\n    </div>\n\n    <script type=\"text/javascript\">\n        try{ace.settings.check('sidebar' , 'collapsed')}catch(e){}\n    </script>\n</div>"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/templates/pages/tpl/top.html",
    "content": "\n<div class=\"navbar navbar-default\" th:fragment=\"topper\" xmlns:th=\"http://www.thymeleaf.org\">\n    <script type=\"text/javascript\">\n        try {\n            ace.settings.check('navbar', 'fixed')\n        } catch (e) {\n        }\n    </script>\n\n    <div class=\"navbar-container\" id=\"navbar-container\">\n        <div class=\"navbar-header pull-left\">\n            <a class=\"navbar-brand\">\n                <small>\n                    <i class=\"icon-leaf\"></i>\n                    Doe\n                </small>\n                <small style=\"font-size: 14px;margin-left: 10px;\"> where amazing happens.</small>\n            </a><!-- /.brand -->\n        </div><!-- /.navbar-header -->\n\n        <div class=\"navbar-header pull-right\" role=\"navigation\">\n            <ul class=\"nav ace-nav\">\n\n\n                <li class=\"light-blue\">\n                    <a data-toggle=\"dropdown\" href=\"#\" class=\"dropdown-toggle\">\n                        <img class=\"nav-user-photo\" th:src=\"@{~/v3/assets/avatars/avatar2.png}\" alt=\"photo\"/>\n                        <span class=\"user-info\">\n                                    <small>欢迎光临,</small>\n                                    <!--${sessionScope.NORA_SESSION_NAME.userName}-->\n                                    Admin\n                                </span>\n\n                        <i class=\"icon-caret-down\"></i>\n                    </a>\n\n                    <ul class=\"user-menu pull-right dropdown-menu dropdown-yellow dropdown-caret dropdown-close\">\n                        <li>\n                            <a>\n                                <i class=\"icon-cog\"></i>\n                                权限设置\n                            </a>\n                        </li>\n                        <li>\n                            <a>\n                                <i class=\"icon-user\"></i>\n                                版本说明\n                            </a>\n                        </li>\n                        <li class=\"divider\"></li>\n                        <li>\n                            <a>\n                                <i class=\"icon-off\"></i>\n                                退出\n                            </a>\n                        </li>\n                    </ul>\n                </li>\n            </ul><!-- /.ace-nav -->\n        </div><!-- /.navbar-header -->\n    </div><!-- /.container -->\n</div>\n\n\n"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/templates/pages/v3/addJar.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"utf-8\" />\n    <title>Doe</title>\n    <!-- 导入头部 ,统一引用那些静态资源  -->\n    <link rel=\"stylesheet\" th:href=\"@{~/v3/assets/css/dropzone.css}\" />\n    <script th:replace=\"/pages/tpl/head::header\"></script>\n</head>\n<body>\n\n<div th:replace=\"/pages/tpl/top::topper\"></div>\n\n\n<div class=\"main-container\" id=\"main-container\">\n    <script type=\"text/javascript\">\n        try {\n            ace.settings.check('main-container', 'fixed')\n        } catch (e) {\n        }\n    </script>\n\n    <div class=\"main-container-inner\">\n\n        <!-- useless when you run doe in the jar way, so comment these code. -->\n        <!--<div th:replace=\"/pages/v3/menu::lefter\"></div>-->\n        <div th:utext=\"${menuHtml}\"></div>\n\n        <div class=\"main-content\">\n            <div th:replace=\"/pages/tpl/bread::breader\"></div>\n\n            <div class=\"page-content\">\n                <div class=\"page-header\">\n                    <h1>\n                        增加接口依赖向导\n                    </h1>\n                </div>\n                <!-- /.page-header -->\n\n                <div class=\"row\">\n                    <div class=\"col-xs-12\">\n                        <!-- PAGE CONTENT BEGINS -->\n\n                        <div class=\"row-fluid\">\n                            <div class=\"span12\">\n                                <div class=\"widget-box\">\n                                    <div class=\"widget-header widget-header-blue widget-header-flat\">\n                                        <h4 class=\"lighter\">向导</h4>\n\n                                        <div class=\"widget-toolbar\">\n                                        </div>\n                                    </div>\n\n                                    <div class=\"widget-body\">\n                                        <div class=\"widget-main\">\n                                            <div id=\"fuelux-wizard\" class=\"row-fluid\" data-target=\"#step-container\">\n                                                <ul class=\"wizard-steps\">\n                                                    <li data-target=\"#step1\" class=\"active\">\n                                                        <span class=\"step\">1</span>\n                                                        <span class=\"title\">填写POM</span>\n                                                    </li>\n\n                                                    <li data-target=\"#step2\">\n                                                        <span class=\"step\">2</span>\n                                                        <span class=\"title\">解析POM</span>\n                                                    </li>\n\n                                                    <li data-target=\"#step3\">\n                                                        <span class=\"step\">3</span>\n                                                        <span class=\"title\">加载JAR</span>\n                                                    </li>\n\n                                                    <li data-target=\"#step4\">\n                                                        <span class=\"step\">4</span>\n                                                        <span class=\"title\">完成</span>\n                                                    </li>\n                                                </ul>\n                                            </div>\n\n                                            <hr />\n                                            <div class=\"step-content row-fluid position-relative\"\n                                                 id=\"step-container\">\n\n                                                <div class=\"step-pane active\" id=\"step1\">\n                                                    <h5 class=\"lighter block green\" >\n                                                        请按提示的格式填写GAV依赖。\n                                                    </h5>\n                                                    <br>\n                                                    <div class=\"center\">\n                                                        <textarea class=\"form-control\" id=\"txtPomContent\" rows=\"15\"\n                                                                  placeholder=\"        <dependency>\n            <groupId>mmc-dubbo</groupId>\n            <artifactId>api</artifactId>\n            <version>1.0-SNAPSHOT</version>\n        </dependency>\"></textarea>\n                                                    </div>\n\n                                                </div>\n\n                                                <div class=\"step-pane\" id=\"step2\">\n                                                    <div class=\"row\">\n                                                        <div class=\"col-xs-12\">\n                                                            <div class=\"widget-box\">\n                                                                <div class=\"widget-header widget-header-flat\">\n                                                                    <h4 class=\"smaller\" id=\"lblTitle\">请点击解析按钮</h4>\n\n                                                                    <div class=\"widget-toolbar\">\n                                                                        <p>\n                                                                            <span class=\"btn btn-success btn-sm tooltip-success\" data-rel=\"popover\" data-placement=\"right\" onclick=\"doParsePom();\"\n                                                                                  data-content=\"Well done! You successfully read this important alert message.\">开始解析</span> </p>\n                                                                    </div>\n                                                                </div>\n\n                                                                <div class=\"widget-body\">\n                                                                    <div class=\"widget-main\">\n\n                                                                        <dl id=\"txtParseConsole\" style=\"overflow-y: scroll;height: 300px;\">\n\n                                                                        </dl>\n                                                                    </div>\n                                                                </div>\n                                                            </div>\n                                                        </div>\n                                                    </div>\n                                                </div>\n\n                                                <div class=\"step-pane\" id=\"step3\">\n                                                    <div class=\"page-content\">\n                                                        <div class=\"row\">\n                                                            <div class=\"col-xs-12\">\n                                                                <!-- PAGE CONTENT BEGINS -->\n\n                                                                <div class=\"col-xs-12\">\n                                                                    <div class=\"center\">\n\n                                                                        <a href=\"#\" class=\"btn btn-app btn-success\" onclick=\"doReload();\">\n                                                                            <i class=\"icon-refresh bigger-230\"></i>\n                                                                            Reload\n                                                                        </a>\n\n                                                                    </div>\n                                                                </div>\n\n                                                                <div class=\"row\">\n                                                                    <div class=\"space-6\"></div>\n\n                                                                    <div class=\"vspace-sm\"></div>\n\n                                                                </div>\n                                                                <!-- /row -->\n\n                                                                <!-- PAGE CONTENT ENDS -->\n                                                            </div>\n                                                            <!-- /.col -->\n                                                        </div>\n                                                        <!-- /.row -->\n\n                                                    </div>\n\n                                                </div>\n                                                <div class=\"step-pane\" id=\"step4\">\n                                                    <div class=\"hide\">\n                                                        <form id=\"applyForm\" action=\"/doe/home/index\">\n\n                                                        </form>\n                                                    </div>\n                                                    <div class=\"center\">\n                                                        <h3 class=\"green\">确认提交!</h3>\n                                                        确认无误后点击完成提交。\n                                                    </div>\n                                                </div>\n                                            </div>\n\n                                            <hr />\n                                            <div class=\"row-fluid wizard-actions\">\n                                                <button class=\"btn btn-prev\">\n                                                    <i class=\"icon-arrow-left\"></i>\n                                                    上一步\n                                                </button>\n\n                                                <button class=\"btn btn-success btn-next\" data-last=\"完成\">\n                                                    下一步\n                                                    <i class=\"icon-arrow-right icon-on-right\"></i>\n                                                </button>\n                                            </div>\n                                        </div><!-- /widget-main -->\n                                    </div><!-- /widget-body -->\n                                </div>\n                            </div>\n                        </div>\n\n                    </div><!-- /.col -->\n                </div>\n\n                <!-- /.row -->\n            </div>\n            <!-- /.page-content -->\n        </div>\n        <!-- /.main-content -->\n\n    </div>\n    <!-- /.main-container-inner -->\n\n    <a href=\"#\" id=\"btn-scroll-up\"\n       class=\"btn-scroll-up btn btn-sm btn-inverse\"> <i\n            class=\"icon-double-angle-up icon-only bigger-110\"></i>\n    </a>\n</div>\n<!-- /.main-container -->\n<script type=\"text/javascript\">\n    if(\"ontouchend\" in document) document.write(\"<script src='assets/js/jquery.mobile.custom.min.js'>\"+\"<\"+\"/script>\");\n</script>\n\n<script th:src=\"@{~/v3/assets/js/fuelux/fuelux.wizard.min.js}\"></script>\n<script th:src=\"@{~/v3/assets/js/bootbox.min.js}\"></script>\n<script th:replace=\"/pages/tpl/foot::footer\"></script>\n\n<script type=\"text/javascript\">\n\n    var jobRef = \"\"; // 定时任务引用\n\n    function doReload() {\n\n        var param = {};\n        Nora.Ajax(\"/doe/pom/doLoad\", param, function (data) {\n\n            bootbox.alert(data.msg);\n\n        }, function (data) {\n            bootbox.alert(data.msg);\n        });\n    }\n\n    function doRequest(requestId) {\n\n        var param = {\"requestId\": requestId};\n\n        Nora.Ajax(\"/doe/pom/doMsg\", param, function (data) {\n            if (data.success) {\n                // on success\n                if (data.code == 1) {\n                    // continue get message\n                    var message = data.data;\n                    $(\"#txtParseConsole\").append(\"<dd>\" + message + \"</dd>\");\n\n\n                } else if (data.code == 2) {\n                    // complete\n                    var message = data.data;\n                    // 替换所有的换行符\n                    message = message.replace(/\\r\\n/g, \"<br>\")\n                    message = message.replace(/\\n/g, \"<br>\");\n                    $(\"#txtParseConsole\").append(\"<dd>\" + message + \"</dd>\");\n                    $(\"#lblTitle\").text(data.msg);\n\n                    clearInterval(jobRef);\n\n                } else {\n\n                    // 阻止定时刷新\n                    clearInterval(jobRef);\n                }\n\n            } else {\n                // on fail\n                // 阻止定时刷新\n                clearInterval(jobRef);\n                bootbox.alert(data.msg);\n            }\n\n        }, function (data) {\n            // on fail\n            // 阻止定时刷新\n            clearInterval(jobRef);\n            bootbox.alert(data.msg);\n        });\n    }\n    function getRealTimeMessage(requestId) {\n\n        if (null == requestId || requestId.length <= 0) {\n            bootbox.alert(\"获取不到请求ID！\");\n            return;\n        }\n\n        // 设置定时刷新\n        jobRef = setInterval(function(){\n            doRequest(requestId);\n        },1000);\n\n    }\n    function doParsePom() {\n\n        var pom = $(\"#txtPomContent\").val();\n        if (null == pom || pom.length <= 0) {\n            bootbox.alert(\"请输入POM依赖！\");\n            return;\n        }\n        pom = $(\"<span/>\").text(pom).html(); // 转码一下\n        var param = {\"pom\": pom};\n\n        Nora.Ajax(\"/doe/pom/doParse\", param, function (data) {\n            if (data.success) {\n                // on success\n                var msg = data.msg;\n                $(\"#lblTitle\").text(msg);\n                var requestId = data.data.requestId;\n\n                getRealTimeMessage(requestId);\n\n            } else {\n                bootbox.alert(data.msg);\n            }\n\n        }, function (data) {\n           // on fail\n            bootbox.alert(data.msg);\n        });\n    }\n\n    jQuery(function($) {\n\n        $('[data-rel=tooltip]').tooltip();\n\n        var $validation = true;\n        $('#fuelux-wizard').ace_wizard().on('change' , function(e, info){\n\n        }).on('finished', function(e) {\n\n            window.location.href = \"/doe/home/listJar\";\n\n        }).on('stepclick', function(e, info){\n\n\n        });\n\n        /*\n        var html = \"        <dependency>\\n\" +\n            \"        <groupId>org.apache.commons</groupId>\\n\" +\n            \"        <artifactId>commons-lang3</artifactId>\\n\" +\n            \"        <version>3.7</version>\\n\" +\n            \"        </dependency>\\n\";\n\n        $(\"#txtPomContent\").val(html);\n        */\n\n    });\n</script>\n\n</body>\n</html>"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/templates/pages/v3/caseCnt.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"utf-8\" />\n    <title>Doe</title>\n    <!-- 导入头部 ,统一引用那些静态资源  -->\n    <link rel=\"stylesheet\" th:href=\"@{~/v3/assets/css/chosen.css}\" />\n    <script th:replace=\"/pages/tpl/head::header\"></script>\n</head>\n<body>\n\n<div th:replace=\"/pages/tpl/top::topper\"></div>\n\n\n<div class=\"main-container\" id=\"main-container\">\n    <script type=\"text/javascript\">\n        try {\n            ace.settings.check('main-container', 'fixed')\n        } catch (e) {\n        }\n    </script>\n\n    <div class=\"main-container-inner\">\n\n        <div th:utext=\"${menuHtml}\"></div>\n\n        <div class=\"main-content\">\n            <div th:replace=\"/pages/tpl/bread::breader\"></div>\n\n            <div class=\"page-content\">\n\n                <!-- /.page-header -->\n\n                <div class=\"row\">\n                    <div class=\"col-xs-12\">\n                        <!-- PAGE CONTENT BEGINS -->\n\n                        <div class=\"row\">\n\n                            <div class=\"col-xs-12\">\n                                <h3 class=\"header smaller lighter blue\">保存的用例</h3>\n                                <div class=\"table-responsive\">\n\n                                    <table id=\"grid-table\"></table>\n                                    <div id=\"grid-pager\"></div>\n                                </div>\n\n\n                            </div>\n                        </div>\n\n                        <div class=\"hr hr-24\"></div>\n\n\n                        <div class=\"row\">\n\n                            <div class=\"col-xs-12 col-sm-4\">\n                                <div class=\"widget-box\">\n                                    <div class=\"widget-header\">\n                                        <h4>方法名称</h4>\n\n                                        <span class=\"widget-toolbar\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"collapse\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-chevron-up\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"close\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-remove\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n                                    </div>\n\n                                    <div class=\"widget-body\">\n                                        <div class=\"widget-main\">\n\n                                            <div class=\"row-fluid\" style=\"height: 300px; overflow-scrolling: auto;\">\n                                                <div class=\"control-group\" id=\"txtMethods\">\n\n\n\n                                                </div>\n                                                <div style=\"display:none;\" id=\"tplMethod\">\n                                                    <div class=\"radio\">\n                                                        <label>\n                                                            <input name=\"rdMethodKey\" type=\"radio\" class=\"ace\" value=\"{}\" checked=\"true\"/>\n                                                            <span class=\"lbl\" style=\"font-size: 10px;\"> {} </span>\n                                                        </label>\n                                                    </div>\n                                                </div>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div><!-- /span -->\n\n                            <div class=\"col-xs-12 col-sm-4\">\n                                <div class=\"widget-box\">\n                                    <div class=\"widget-header\">\n                                        <h4>方法参数</h4>\n\n                                        <span class=\"widget-toolbar\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"collapse\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-chevron-up\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"close\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-remove\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n                                    </div>\n\n                                    <div class=\"widget-body\">\n                                        <div class=\"widget-main\">\n                                                <textarea class=\"form-control\" id=\"txtParams\" rows=\"15\"\n                                                          placeholder=\"\"></textarea>\n\n                                        </div>\n                                    </div>\n                                </div>\n                            </div><!-- /span -->\n\n                            <div class=\"col-xs-12 col-sm-4\">\n                                <div class=\"widget-box\">\n                                    <div class=\"widget-header\">\n                                        <h4>响应结果</h4>\n\n                                        <span class=\"widget-toolbar\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"collapse\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-chevron-up\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"close\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-remove\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n                                    </div>\n\n                                    <div class=\"widget-body\">\n                                        <div class=\"widget-main\">\n                                                <textarea id=\"txtResult\" class=\"form-control\"  rows=\"15\"></textarea>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div><!-- /span -->\n\n                        </div><!-- /row -->\n\n                        <div class=\"row\">\n                            <div class=\"clearfix form-actions\">\n                                <div class=\"col-md-offset-3 col-md-9\">\n                                    <button class=\"btn btn-info\" type=\"button\" onclick=\"doSend();\">\n                                        <i class=\"icon-ok bigger-110\"></i>\n                                        发送\n                                    </button>\n\n                                    &nbsp; &nbsp; &nbsp;\n                                    <button class=\"btn\" type=\"reset\">\n                                        <i class=\"icon-undo bigger-110\"></i>\n                                        重置\n                                    </button>\n                                </div>\n                            </div>\n\n                        </div>\n\n                    </div><!-- /.col -->\n                </div>\n\n                <!-- /.row -->\n            </div>\n            <!-- /.page-content -->\n        </div>\n        <!-- /.main-content -->\n\n    </div>\n    <!-- /.main-container-inner -->\n\n    <a href=\"#\" id=\"btn-scroll-up\"\n       class=\"btn-scroll-up btn btn-sm btn-inverse\"> <i\n            class=\"icon-double-angle-up icon-only bigger-110\"></i>\n    </a>\n</div>\n<!-- /.main-container -->\n<script type=\"text/javascript\">\n    if(\"ontouchend\" in document) document.write(\"<script src='assets/js/jquery.mobile.custom.min.js'>\"+\"<\"+\"/script>\");\n</script>\n\n<script th:src=\"@{~/v3/assets/js/chosen.jquery.min.js}\"></script>\n<script th:src=\"@{~/v3/assets/js/bootbox.min.js}\"></script>\n<script th:replace=\"/pages/tpl/foot::footer\"></script>\n<script th:src=\"@{~/v3/js/jquery.jsonEdit.js}\"></script>\n\n<script type=\"text/javascript\">\n\n    function doSend() {\n\n        var methodKey = $(\"input[name='rdMethodKey']:checked\").val();\n        var json = $(\"#txtParams\").val();\n\n        if (null == providerKey || providerKey.length <= 0) {\n            return;\n        }\n        if (null == json || json.length <= 0) {\n            return;\n        }\n        var params = {\"providerKey\": providerKey, \"json\": json, \"methodKey\": methodKey};\n        Nora.Ajax(\"/doe/dubbo/doSend\", params, function (data) {\n\n            if (data.success && null != data.data && data.data.length > 0) {\n\n                // on success\n                $(\"#txtResult\").val(data.data); // clear\n\n            } else {\n                // on fail\n                bootbox.alert(null == data ? \"操作失败！\" : data.msg);\n            }\n\n        }, function (data) {\n            // on error\n            bootbox.alert(null == data ? \"操作异常!\" : data.msg);\n        });\n\n    }\n\n    function doPrepareMethodParams(json) {\n        $(\"#txtParams\").val(json);\n    }\n\n    function doListMethods(methodKey, methodText) {\n\n        var html = Nora.Util.StringUtil.format($(\"#tplMethod\").html(), methodKey, methodText);\n        $(\"#txtMethods\").html(html);\n    }\n\n    function doReset() {\n\n        $(\"#txtMethods\").html(\"\"); // clear\n        $(\"#cboProviders\").html(\"\"); // clear\n    }\n\n    jQuery(function($) {\n\n        var grid_selector = \"#grid-table\";\n        var pager_selector = \"#grid-pager\";\n\n        jQuery(grid_selector).jqGrid({\n            url : \"/doe/case/doList\",\n            datatype : \"json\",\n            height : 300,\n            rownumbers: true,\n            colNames : [ '流水号', '插入时间', '用例名称', '提供者地址', '接口名称', '方法名称', 'providerKey', 'methodKey', 'json', '用例描述'],\n            colModel:[\n                {name: 'caseId', index: 'caseId', width: 50, editable: false, hidden: true},\n                {name: 'insertTime', index: 'insertTime', width: 80, editable: false, formatter: JGridUtils.dateTimeFormat},\n                {name: 'caseName', index: 'caseName',  editable: false, edittype: \"text\"},\n                {name: 'address', index: 'address', width: 80,  editable: false},\n                {name: 'interfaceName', index: 'interfaceName',  editable: false, edittype: \"text\"},\n                {name: 'methodText', index: 'methodText', hidden: false, edittype: \"text\"},\n                {name: 'providerKey', index: 'providerKey',  hidden: true, edittype: \"text\"},\n                {name: 'methodKey', index: 'methodKey', hidden: true, edittype: \"text\"},\n                {name: 'json', index: 'json', hidden: true, edittype: \"text\"},\n                {name: 'caseDesc', index: 'caseDesc', hidden: true, editable: false, edittype: \"text\"}\n            ],\n\n            viewrecords : true,\n            rowNum : 500,\n            rowList : [ 100, 200, 300 ],\n            pager : pager_selector,\n            altRows : true,\n            //toppager: true,\n            multiselect : false,\n            //multikey: \"ctrlKey\",\n            multiboxonly : true,\n            loadComplete : function() {\n                var table = this;\n                setTimeout(function() {\n                    JGridUtils.styleCheckbox(table);\n                    JGridUtils.updateActionIcons(table);\n                    JGridUtils.updatePagerIcons(table);\n                    JGridUtils.enableTooltips(table);\n                }, 0);\n            },\n            onSelectRow : function(ids) {\n                if( ids != null){\n                    var methodText = jQuery(grid_selector).jqGrid('getRowData', ids)['methodText'];\n                    var json = jQuery(grid_selector).jqGrid('getRowData', ids)['json'];\n                    methodKey = jQuery(grid_selector).jqGrid('getRowData', ids)['methodKey'];\n                    providerKey = jQuery(grid_selector).jqGrid('getRowData', ids)['providerKey'];\n                    doListMethods(methodKey, methodText);\n                    doPrepareMethodParams(json);\n                }\n            },\n            autowidth : true\n        });\n\n        // 渲染导航\n        JGridUtils.renderNav(grid_selector, pager_selector);\n\n    });\n</script>\n\n</body>\n</html>"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/templates/pages/v3/easyCnt.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"utf-8\" />\n    <title>Doe</title>\n    <!-- 导入头部 ,统一引用那些静态资源  -->\n    <link rel=\"stylesheet\" th:href=\"@{~/v3/assets/css/chosen.css}\" />\n    <script th:replace=\"/pages/tpl/head::header\"></script>\n</head>\n<body>\n\n<div th:replace=\"/pages/tpl/top::topper\"></div>\n\n\n<div class=\"main-container\" id=\"main-container\">\n    <script type=\"text/javascript\">\n        try {\n            ace.settings.check('main-container', 'fixed')\n        } catch (e) {\n        }\n    </script>\n\n    <div class=\"main-container-inner\">\n\n        <div th:utext=\"${menuHtml}\"></div>\n\n        <div class=\"main-content\">\n            <div th:replace=\"/pages/tpl/bread::breader\"></div>\n\n            <div class=\"page-content\">\n                <div class=\"page-header\">\n                    <h1>\n                        连接管理\n                    </h1>\n                </div>\n                <!-- /.page-header -->\n\n                <div class=\"row\">\n                    <div class=\"col-xs-12\">\n                        <!-- PAGE CONTENT BEGINS -->\n\n                        <div class=\"row\">\n\n                            <div class=\"col-xs-12 col-sm-4\">\n\n                                <div class=\"widget-box\">\n                                    <div class=\"widget-header\">\n                                        <h4>提供者地址</h4>\n\n                                        <span class=\"widget-toolbar\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"collapse\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-chevron-up\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"close\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-remove\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n                                    </div>\n                                    <div class=\"widget-body\">\n                                        <div class=\"widget-main\">\n                                            <textarea class=\"form-control\" id=\"txtConnect\" rows=\"5\"\n                                                      placeholder=\"127.0.0.1:20880\"></textarea>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n\n                            <div class=\"col-xs-12 col-sm-4\">\n                                <div class=\"widget-box\">\n                                    <div class=\"widget-header\">\n                                        <h4>接口名称</h4>\n\n                                        <span class=\"widget-toolbar\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"collapse\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-chevron-up\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"close\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-remove\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n                                    </div>\n\n                                    <div class=\"widget-body\">\n                                        <div class=\"widget-main\">\n\n                                            <textarea class=\"form-control\" id=\"txtInterfaces\" rows=\"5\"\n                                                      placeholder=\"com.mmc.dubbo.api.user.UserService\"></textarea>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div><!-- /span -->\n                            <div class=\"col-xs-12 col-sm-4\">\n                                <div class=\"widget-box\">\n                                    <div class=\"widget-header\">\n                                        <h4>方法名称</h4>\n\n                                        <span class=\"widget-toolbar\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"collapse\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-chevron-up\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"close\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-remove\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n                                    </div>\n\n                                    <div class=\"widget-body\">\n                                        <div class=\"widget-main\">\n\n                                            <textarea class=\"form-control\" id=\"txtMethods\" rows=\"5\"\n                                                      placeholder=\"getCurrentById\"></textarea>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div><!-- /span -->\n\n                        </div>\n\n                        <div class=\"hr hr-24\"></div>\n\n                        <div class=\"row\">\n\n\n                            <div class=\"col-xs-12 col-sm-4\">\n                                <div class=\"widget-box\">\n                                    <div class=\"widget-header\">\n                                        <h4>方法参数</h4>\n\n                                        <span class=\"widget-toolbar\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"collapse\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-chevron-up\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"close\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-remove\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n                                    </div>\n\n                                    <div class=\"widget-body\">\n                                        <div class=\"widget-main\">\n                                                <textarea class=\"form-control\" id=\"txtParams\" rows=\"15\"\n                                                          placeholder=\"\"></textarea>\n\n                                        </div>\n                                    </div>\n                                </div>\n                            </div><!-- /span -->\n\n                            <div class=\"col-xs-12 col-sm-4\">\n                                <div class=\"widget-box\">\n                                    <div class=\"widget-header\">\n                                        <h4>响应结果</h4>\n\n                                        <span class=\"widget-toolbar\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"collapse\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-chevron-up\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"close\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-remove\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n                                    </div>\n\n                                    <div class=\"widget-body\">\n                                        <div class=\"widget-main\">\n                                                <textarea id=\"txtResult\" class=\"form-control\"  rows=\"15\"></textarea>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div><!-- /span -->\n\n                        </div><!-- /row -->\n\n                        <div class=\"row\">\n                            <div class=\"clearfix form-actions\">\n                                <div class=\"col-md-offset-3 col-md-9\">\n                                    <button class=\"btn btn-info\" type=\"button\" onclick=\"doSend();\">\n                                        <i class=\"icon-ok bigger-110\"></i>\n                                        发送\n                                    </button>\n\n                                    &nbsp; &nbsp; &nbsp;\n                                    <button class=\"btn\" type=\"reset\">\n                                        <i class=\"icon-undo bigger-110\"></i>\n                                        重置\n                                    </button>\n                                </div>\n                            </div>\n\n                        </div>\n\n                    </div><!-- /.col -->\n                </div>\n\n                <!-- /.row -->\n            </div>\n            <!-- /.page-content -->\n        </div>\n        <!-- /.main-content -->\n\n    </div>\n    <!-- /.main-container-inner -->\n\n    <a href=\"#\" id=\"btn-scroll-up\"\n       class=\"btn-scroll-up btn btn-sm btn-inverse\"> <i\n            class=\"icon-double-angle-up icon-only bigger-110\"></i>\n    </a>\n</div>\n<!-- /.main-container -->\n<script type=\"text/javascript\">\n    if(\"ontouchend\" in document) document.write(\"<script src='assets/js/jquery.mobile.custom.min.js'>\"+\"<\"+\"/script>\");\n</script>\n\n<script th:src=\"@{~/v3/assets/js/chosen.jquery.min.js}\"></script>\n<script th:src=\"@{~/v3/assets/js/bootbox.min.js}\"></script>\n<script th:replace=\"/pages/tpl/foot::footer\"></script>\n<script th:src=\"@{~/v3/js/jquery.jsonEdit.js}\"></script>\n\n<script type=\"text/javascript\">\n\n    function doSend() {\n\n        var conn = $(\"#txtConnect\").val();\n        var serviceName = $(\"#txtInterfaces\").val();\n        var methodName = $(\"#txtMethods\").val();\n        var json = $(\"#txtParams\").val();\n\n        if (null == conn || conn.length <= 0) {\n            return;\n        }\n        if (null == serviceName || serviceName.length <= 0) {\n            return;\n        }\n        if (null == methodName || methodName.length <= 0) {\n            return;\n        }\n        if (null == json || json.length <= 0) {\n            return;\n        }\n        var params = {\"conn\": conn, \"json\": json, \"serviceName\": serviceName, \"methodName\": methodName};\n        Nora.Ajax(\"/doe/dubbo/doSendWithTelnet\", params, function (data) {\n\n            if (data.success && null != data.data && data.data.length > 0) {\n\n                // on success\n                $(\"#txtResult\").val(data.data); // clear\n\n            } else {\n                // on fail\n                bootbox.alert(null == data ? \"操作失败！\" : data.msg);\n            }\n\n        }, function (data) {\n            // on error\n            bootbox.alert(null == data ? \"操作异常!\" : data.msg);\n        });\n\n    }\n\n    function doReset() {\n\n        $(\"#txtMethods\").val(\"\"); // clear\n        $(\"#txtInterfaces\").val(\"\"); // clear\n    }\n\n    jQuery(function($) {\n\n\n    });\n</script>\n\n</body>\n</html>"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/templates/pages/v3/editPom.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"utf-8\" />\n    <title>Doe</title>\n    <!-- 导入头部 ,统一引用那些静态资源  -->\n    <link rel=\"stylesheet\" th:href=\"@{~/v3/assets/css/dropzone.css}\" />\n    <script th:replace=\"/pages/tpl/head::header\"></script>\n</head>\n<body>\n\n<div th:replace=\"/pages/tpl/top::topper\"></div>\n\n\n<div class=\"main-container\" id=\"main-container\">\n    <script type=\"text/javascript\">\n        try {\n            ace.settings.check('main-container', 'fixed')\n        } catch (e) {\n        }\n    </script>\n\n    <div class=\"main-container-inner\">\n\n        <div th:utext=\"${menuHtml}\"></div>\n\n        <div class=\"main-content\">\n            <div th:replace=\"/pages/tpl/bread::breader\"></div>\n\n            <div class=\"page-content\">\n                <div class=\"page-header\">\n                    <h1>\n                        编辑依赖\n                    </h1>\n                </div>\n                <!-- /.page-header -->\n\n                <div class=\"row\">\n                    <div class=\"col-xs-12\">\n                        <!-- PAGE CONTENT BEGINS -->\n                        <div class=\"row\">\n                            <div class=\"col-xs-12\">\n\n                                <h4 class=\"smaller green\" id=\"lblTitle\"></h4>\n\n                                <textarea class=\"form-control\" id=\"txtParams\" rows=\"20\"\n                                          placeholder=\"\"></textarea>\n                                    <!--<span class=\"smaller-20 lighter green\">编辑pom文件后，或可以在系统管理->系统配置->重新加载生效.</span>-->\n\n                            </div>\n                        </div>\n\n\n                        <div class=\"row\">\n                            <div class=\"clearfix form-actions\">\n                                <div class=\"col-md-offset-3 col-md-9\">\n                                    <button class=\"btn btn-success\" id=\"bootbox-regular\" onclick=\"doSave();\">保存POM文件</button>\n                                    &nbsp; &nbsp; &nbsp;\n                                    <button class=\"btn btn-info\" type=\"button\" onclick=\"doParsePom();\">\n                                        <i class=\"icon-ok bigger-110\"></i>\n                                        解析POM文件\n                                    </button>\n                                    &nbsp; &nbsp; &nbsp;\n                                    <button class=\"btn btn-info\" type=\"button\" onclick=\"doReload();\">\n                                        <i class=\"icon-ok bigger-110\"></i>\n                                        重新加载JAR\n                                    </button>\n                                    &nbsp; &nbsp; &nbsp;\n                                    <button class=\"btn\" type=\"reset\" onclick=\"doClear();\">\n                                        <i class=\"icon-undo bigger-110\"></i>\n                                        重置\n                                    </button>\n                                </div>\n                            </div>\n\n                        </div>\n\n\n                    </div><!-- /.col -->\n                </div>\n\n                <!-- /.row -->\n            </div>\n            <!-- /.page-content -->\n        </div>\n        <!-- /.main-content -->\n\n    </div>\n    <!-- /.main-container-inner -->\n\n    <a href=\"#\" id=\"btn-scroll-up\"\n       class=\"btn-scroll-up btn btn-sm btn-inverse\"> <i\n            class=\"icon-double-angle-up icon-only bigger-110\"></i>\n    </a>\n</div>\n<!-- /.main-container -->\n<script type=\"text/javascript\">\n    if(\"ontouchend\" in document) document.write(\"<script src='assets/js/jquery.mobile.custom.min.js'>\"+\"<\"+\"/script>\");\n</script>\n\n<script th:src=\"@{~/v3/assets/js/fuelux/fuelux.wizard.min.js}\"></script>\n<script th:src=\"@{~/v3/assets/js/bootbox.min.js}\"></script>\n<script th:replace=\"/pages/tpl/foot::footer\"></script>\n\n<script type=\"text/javascript\">\n\n    var jobRef = \"\"; // 定时任务引用\n\n    function doClear() {\n\n        $(\"#txtParams\").val(\"\");\n\n    }\n    function doRequest(requestId) {\n\n        var param = {\"requestId\": requestId};\n\n        Nora.Ajax(\"/doe/pom/doMsg\", param, function (data) {\n            if (data.success) {\n                // on success\n                $(\"#txtParams\").scrollTop(500000);\n                if (data.code == 1) {\n                    // continue get message\n                    var message = data.data;\n                    $(\"#txtParams\").val($(\"#txtParams\").val() + \"\\n\" + message);\n\n\n                } else if (data.code == 2) {\n                    // complete\n                    var message = data.data;\n                    // 替换所有的换行符\n                    $(\"#txtParams\").val($(\"#txtParams\").val() + \"\\n\" + message);\n                    $(\"#lblTitle\").text(data.msg);\n\n                    clearInterval(jobRef);\n\n                } else {\n\n                    // 阻止定时刷新\n                    clearInterval(jobRef);\n                }\n\n            } else {\n                // on fail\n                // 阻止定时刷新\n                clearInterval(jobRef);\n                bootbox.alert(data.msg);\n            }\n\n        }, function (data) {\n            // on fail\n            // 阻止定时刷新\n            clearInterval(jobRef);\n            bootbox.alert(data.msg);\n        });\n    }\n    function doParsePom() {\n\n        var param = {};\n\n        Nora.Ajax(\"/doe/pom/doReparse\", param, function (data) {\n            if (data.success) {\n                // on success\n                var msg = data.msg;\n                $(\"#txtParams\").val(\"\");\n                $(\"#lblTitle\").text(msg);\n                var requestId = data.data.requestId;\n\n                getRealTimeMessage(requestId);\n\n            } else {\n                bootbox.alert(data.msg);\n            }\n\n        }, function (data) {\n            // on fail\n            bootbox.alert(data.msg);\n        });\n    }\n    function getRealTimeMessage(requestId) {\n\n        if (null == requestId || requestId.length <= 0) {\n            bootbox.alert(\"获取不到请求ID！\");\n            return;\n        }\n\n        // 设置定时刷新\n        jobRef = setInterval(function(){\n            doRequest(requestId);\n        },1000);\n\n    }\n    function doReload() {\n\n        var param = {};\n        Nora.Ajax(\"/doe/pom/doLoad\", param, function (data) {\n\n            bootbox.alert(data.msg);\n\n        }, function (data) {\n            bootbox.alert(data.msg);\n        });\n    }\n    function doSave() {\n\n        var content = $(\"#txtParams\").val();\n        if (null == content || content.length <= 0) {\n            return;\n        }\n\n        var params = {\"content\": content};\n\n        Nora.Ajax(\"/doe/pom/doOverridePomFile\", params, function (data) {\n\n            if (data.success && data.data) {\n\n                // on success\n                // $(\"#txtParams\").val(\"success\"); // clear\n                bootbox.alert(\"sucuss\");\n\n            } else {\n                // on fail\n                bootbox.alert(null == data ? \"操作失败！\" : null != data.msg ? data.msg : data.remark);\n            }\n\n        }, function (data) {\n            // on error\n            bootbox.alert(null == data ? \"操作失败！\" : null != data.msg ? data.msg : data.remark);\n        });\n\n    }\n    function doLoad() {\n\n        var params = {};\n        Nora.Ajax(\"/doe/pom/doLoadPomFile\", params, function (data) {\n\n            if (data.success && null != data.data && data.data.length > 0) {\n\n                // on success\n                $(\"#txtParams\").val(data.data); // clear\n\n            } else {\n                // on fail\n                bootbox.alert(null == data ? \"操作失败！\" : null != data.msg ? data.msg : data.remark);\n            }\n\n        }, function (data) {\n            // on error\n            bootbox.alert(null == data ? \"操作失败！\" : null != data.msg ? data.msg : data.remark);\n        });\n\n    }\n\n    jQuery(function($) {\n\n        doLoad();\n\n    });\n</script>\n\n</body>\n</html>"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/templates/pages/v3/listJar.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"utf-8\" />\n    <title>Doe</title>\n    <!-- 导入头部 ,统一引用那些静态资源  -->\n    <link rel=\"stylesheet\" th:href=\"@{~/v3/assets/css/chosen.css}\" />\n    <script th:replace=\"/pages/tpl/head::header\"></script>\n    <style>\n        .scroll { overflow-y: scroll; overflow-x: scroll;}\n    </style>\n</head>\n<body>\n\n<div th:replace=\"/pages/tpl/top::topper\"></div>\n\n\n<div class=\"main-container\" id=\"main-container\">\n    <script type=\"text/javascript\">\n        try {\n            ace.settings.check('main-container', 'fixed')\n        } catch (e) {\n        }\n    </script>\n\n    <div class=\"main-container-inner\">\n\n        <div th:utext=\"${menuHtml}\"></div>\n\n        <div class=\"main-content\">\n            <div th:replace=\"/pages/tpl/bread::breader\"></div>\n\n            <div class=\"page-content\">\n                <div class=\"page-header\">\n                    <h1>\n                        依赖列表\n                    </h1>\n                </div>\n                <!-- /.page-header -->\n\n                <div class=\"row\">\n                    <div class=\"col-xs-12\" >\n                        <!-- PAGE CONTENT BEGINS -->\n\n                        <div class=\"row\">\n\n                            <div class=\"col-xs-12\">\n                                <div class=\"table-responsive\">\n\n                                    <table id=\"grid-table\"></table>\n                                    <div id=\"grid-pager\"></div>\n                                </div>\n\n\n                            </div>\n                        </div>\n\n\n\n                        <div class=\"hr hr-24\"></div>\n\n\n                    </div><!-- /.col -->\n                </div>\n\n                <!-- /.row -->\n            </div>\n            <!-- /.page-content -->\n        </div>\n        <!-- /.main-content -->\n\n    </div>\n    <!-- /.main-container-inner -->\n\n    <a href=\"#\" id=\"btn-scroll-up\"\n       class=\"btn-scroll-up btn btn-sm btn-inverse\"> <i\n            class=\"icon-double-angle-up icon-only bigger-110\"></i>\n    </a>\n</div>\n<!-- /.main-container -->\n<script type=\"text/javascript\">\n    if(\"ontouchend\" in document) document.write(\"<script src='assets/js/jquery.mobile.custom.min.js'>\"+\"<\"+\"/script>\");\n</script>\n\n<script th:src=\"@{~/v3/assets/js/chosen.jquery.min.js}\"></script>\n<script th:src=\"@{~/v3/assets/js/bootbox.min.js}\"></script>\n<script th:replace=\"/pages/tpl/foot::footer\"></script>\n\n<script type=\"text/javascript\">\n\n\n    jQuery(function($) {\n\n        var grid_selector = \"#grid-table\";\n        var pager_selector = \"#grid-pager\";\n\n        jQuery(grid_selector).jqGrid({\n            url : \"/doe/pom/doListJars\",\n            datatype : \"json\",\n            height : 300,\n            rownumbers: true,\n            colNames : [ 'groupId', 'artifactId', 'version', '操作'],\n            colModel:[\n                {name: 'groupId', index: 'groupId',  editable: false, edittype: \"text\"},\n                {name: 'artifactId', index: 'artifactId', width: 80,  editable: false},\n                {name: 'version', index: 'version', hidden: false, edittype: \"text\"},\n                {name: '', index: '', hidden: false, editable: false, edittype: \"text\"}\n            ],\n\n            viewrecords : true,\n            rowNum : 500,\n            rowList : [ 100, 200, 300 ],\n            pager : pager_selector,\n            altRows : true,\n            //toppager: true,\n            multiselect : false,\n            //multikey: \"ctrlKey\",\n            multiboxonly : true,\n            loadComplete : function() {\n                var table = this;\n                setTimeout(function() {\n                    JGridUtils.styleCheckbox(table);\n                    JGridUtils.updateActionIcons(table);\n                    JGridUtils.updatePagerIcons(table);\n                    JGridUtils.enableTooltips(table);\n                }, 0);\n            },\n            onSelectRow : function(ids) {\n\n            },\n            autowidth : true\n        });\n\n        // 渲染导航\n        JGridUtils.renderNav(grid_selector, pager_selector);\n\n    });\n\n</script>\n\n</body>\n</html>"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/templates/pages/v3/listZk.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"utf-8\" />\n    <title>Doe</title>\n    <!-- 导入头部 ,统一引用那些静态资源  -->\n    <link rel=\"stylesheet\" th:href=\"@{~/v3/assets/css/chosen.css}\" />\n    <script th:replace=\"/pages/tpl/head::header\"></script>\n    <style>\n        .scroll { overflow-y: scroll; overflow-x: scroll;}\n    </style>\n</head>\n<body>\n\n<div th:replace=\"/pages/tpl/top::topper\"></div>\n\n\n<div class=\"main-container\" id=\"main-container\">\n    <script type=\"text/javascript\">\n        try {\n            ace.settings.check('main-container', 'fixed')\n        } catch (e) {\n        }\n    </script>\n\n    <div class=\"main-container-inner\">\n\n        <div th:utext=\"${menuHtml}\"></div>\n\n        <div class=\"main-content\">\n            <div th:replace=\"/pages/tpl/bread::breader\"></div>\n\n            <div class=\"page-content\">\n                <div class=\"page-header\">\n                    <h1>\n                        依赖列表\n                    </h1>\n                </div>\n                <!-- /.page-header -->\n\n                <div class=\"row\">\n                    <div class=\"col-xs-12\" >\n                        <!-- PAGE CONTENT BEGINS -->\n\n                        <div class=\"row\">\n\n                            <div class=\"col-xs-12\">\n                                <div id=\"widgetBox\" class=\"widget-box\">\n                                    <div class=\"widget-header\">\n                                        <h4 onclick=\"doCollapsed()\">新增地址</h4>\n\n                                        <span class=\"widget-toolbar\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t<a id=\"collapseSwitch\" href=\"#\" data-action=\"collapse\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-chevron-up\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"close\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-remove\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n                                    </div>\n\n                                    <div class=\"widget-body\">\n                                        <div class=\"widget-main\">\n\n                                            <label for=\"form-field-1\">地址</label>\n                                            <div class=\"row\">\n                                                <div class=\"col-sm-11\">\n                                                    <input type=\"text\" id=\"form-field-1\" placeholder=\"----请输入----\" class=\"col-sm-12\">\n                                                </div>\n                                            </div>\n                                            <br>\n                                            <label class=\"control-label no-padding-right\" for=\"form-field-2\"> 描述 </label>\n                                            <div class=\"row\">\n                                                <div class=\"col-sm-11\">\n                                                    <input type=\"text\" id=\"form-field-2\" placeholder=\"----请输入----\" class=\"col-sm-12\">\n                                                </div>\n                                            </div>\n                                            <br>\n                                            <div class=\"row\">\n                                                <div class=\"col-sm-11\">\n                                                    <button class=\"btn btn-info\" type=\"button\" onclick=\"doSave();\">\n                                                        <i class=\"icon-ok bigger-110\"></i>\n                                                        新增\n                                                    </button>\n                                                    &nbsp; &nbsp;\n                                                    <button class=\"btn\" type=\"reset\" onclick=\"doCollapsed();\">\n                                                        <i class=\"icon-undo bigger-110\"></i>\n                                                        收起\n                                                    </button>\n\n                                                </div>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"col-xs-12\">\n                                <div class=\"table-responsive\">\n\n                                    <table id=\"grid-table\"></table>\n                                    <div id=\"grid-pager\"></div>\n                                </div>\n\n\n                            </div>\n                        </div>\n\n\n\n                        <div class=\"hr hr-24\"></div>\n\n\n                    </div><!-- /.col -->\n                </div>\n\n                <!-- /.row -->\n            </div>\n            <!-- /.page-content -->\n        </div>\n        <!-- /.main-content -->\n\n    </div>\n    <!-- /.main-container-inner -->\n\n    <a href=\"#\" id=\"btn-scroll-up\"\n       class=\"btn-scroll-up btn btn-sm btn-inverse\"> <i\n            class=\"icon-double-angle-up icon-only bigger-110\"></i>\n    </a>\n</div>\n<!-- /.main-container -->\n<script type=\"text/javascript\">\n    if(\"ontouchend\" in document) document.write(\"<script src='assets/js/jquery.mobile.custom.min.js'>\"+\"<\"+\"/script>\");\n</script>\n\n<script th:src=\"@{~/v3/assets/js/chosen.jquery.min.js}\"></script>\n<script th:src=\"@{~/v3/assets/js/bootbox.min.js}\"></script>\n<script th:replace=\"/pages/tpl/foot::footer\"></script>\n\n<script type=\"text/javascript\">\n\n    function doSave() {\n\n        var registryKey = $(\"#form-field-1\").val();\n        var registryDesc = $(\"#form-field-2\").val();\n        var params = {\"registryKey\": registryKey, \"registryDesc\": registryDesc};\n\n        // 新增\n        Nora.Ajax(\"/doe/zk/addRegistry\", params, function(data){\n\n            if (data.success) {\n\n                reloadGrid();\n\n            } else {\n                bootbox.alert(data.msg);\n            }\n        });\n    }\n\n    function doCollapsed() {\n        $(\"#collapseSwitch\").click();\n    }\n\n    function reloadGrid() {\n\n        var grid_selector = \"#grid-table\";\n        var pager_selector = \"#grid-pager\";\n        jQuery(grid_selector).jqGrid().trigger('reloadGrid');\n    }\n\n    function doDelete(sender) {\n\n        var registryKey = $(sender).attr(\"data-key\");\n        var registryDesc = $(sender).attr(\"data-value\");\n        var params = {\"registryKey\": registryKey, \"registryDesc\": registryDesc};\n\n        // 删除\n        Nora.Ajax(\"/doe/zk/delRegistry\", params, function(data){\n            reloadGrid();\n        });\n\n    }\n\n    function deleteRender(cellvalue, options, rowObject) {\n\n        return \"<div onclick='doDelete(this)' data-key='\" + rowObject.registryKey + \"' data-value='\" + rowObject.registryDesc + \"'>删除</div>\";\n    }\n    jQuery(function($) {\n\n        var grid_selector = \"#grid-table\";\n        var pager_selector = \"#grid-pager\";\n\n        jQuery(grid_selector).jqGrid({\n            url : \"/doe/zk/doListZk\",\n            datatype : \"json\",\n            height : 300,\n            colNames : [ '地址', '备注', '操作'],\n            rownumbers: true,\n            colModel:[\n                {name: 'registryKey', index: 'groupId',  editable: false, edittype: \"text\"},\n                {name: 'registryDesc', index: 'artifactId', editable: false},\n                {name: '', index: '', hidden: false, editable: false, edittype: \"text\", formatter: deleteRender}\n            ],\n            viewrecords : true,\n            rowNum : 500,\n            rowList : [ 100, 200, 300 ],\n            pager : pager_selector,\n            altRows : true,\n            //toppager: true,\n            multiselect : false,\n            //multikey: \"ctrlKey\",\n            multiboxonly : true,\n            loadComplete : function() {\n                var table = this;\n                setTimeout(function() {\n                    JGridUtils.styleCheckbox(table);\n                    JGridUtils.updateActionIcons(table);\n                    JGridUtils.updatePagerIcons(table);\n                    JGridUtils.enableTooltips(table);\n                }, 0);\n            },\n            onSelectRow : function(ids) {\n\n            },\n            autowidth : true\n        });\n\n        // 渲染导航\n        JGridUtils.renderNav(grid_selector, pager_selector);\n\n        // 默认收起\n        doCollapsed();\n    });\n\n</script>\n\n</body>\n</html>"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/templates/pages/v3/normalCnt.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"utf-8\" />\n    <title>Doe</title>\n    <!-- 导入头部 ,统一引用那些静态资源  -->\n    <link rel=\"stylesheet\" th:href=\"@{~/v3/assets/css/chosen.css}\" />\n    <style>\n        .scroll { overflow-y: scroll; overflow-x: scroll;}\n    </style>\n    <script th:replace=\"/pages/tpl/head :: header\"></script>\n</head>\n<body>\n\n<div th:replace=\"/pages/tpl/top :: topper\"></div>\n\n\n<div class=\"main-container\" id=\"main-container\">\n    <script type=\"text/javascript\">\n        try {\n            ace.settings.check('main-container', 'fixed')\n        } catch (e) {\n        }\n    </script>\n\n    <div class=\"main-container-inner\">\n\n        <div th:utext=\"${menuHtml}\"></div>\n\n        <div class=\"main-content\">\n            <div th:replace=\"/pages/tpl/bread :: breader\"></div>\n\n            <div class=\"page-content\">\n                <div class=\"page-header\">\n                    <h1>\n                        连接管理\n                    </h1>\n                </div>\n                <!-- /.page-header -->\n\n                <div class=\"row\">\n                    <div class=\"col-xs-12\">\n                        <!-- PAGE CONTENT BEGINS -->\n\n                        <div class=\"widget-box\">\n                            <div class=\"widget-header widget-header-small\">\n                                <h5 class=\"lighter\">注册中心</h5>\n                            </div>\n\n                            <div class=\"widget-body\">\n                                <div class=\"widget-main\">\n                                    <form class=\"form-search\">\n                                        <div class=\"row\">\n                                            <div class=\"col-xs-12 col-sm-8\">\n                                                <div class=\"input-group\">\n                                                    <select class=\"chosen-select width-95\" id=\"txtConnect\" data-placeholder=\"127.0.0.1:2181\">\n\n                                                    </select>\n                                                    <span class=\"input-group-btn\">\n                                                        <button type=\"button\" class=\"btn btn-purple btn-sm\" onclick=\"doConnect();\">\n                                                            连接\n                                                            <!--<i class=\"icon-search icon-on-right bigger-110\"></i>-->\n                                                        </button>\n                                                    </span>\n                                                </div>\n                                                <span class=\"smaller-20 lighter blue\">如有需要，请先设置group和version，再连接zk.</span>\n                                            </div>\n                                        </div>\n                                    </form>\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"hr hr-24\"></div>\n\n                        <div class=\"row\">\n                            <div class=\"col-xs-12 col-sm-4\">\n                                <div class=\"widget-box\">\n                                    <div class=\"widget-header\">\n                                        <h4>接口名称</h4>\n\n                                    </div>\n\n                                    <div class=\"widget-body\">\n                                        <div class=\"widget-main\">\n                                            <div class=\"row-fluid\">\n                                                <br />\n                                                <select class=\"width-90 chosen-select\" id=\"cboInterfaces\" data-placeholder=\"请选择接口\">\n\n                                                </select>\n                                                <br>&nbsp;\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"col-xs-12 col-sm-4\">\n                                <div class=\"widget-box\">\n                                    <div class=\"widget-header\">\n                                        <h4>提供者地址</h4>\n\n                                    </div>\n\n                                    <div class=\"widget-body\">\n                                        <div class=\"widget-main\">\n                                            <div class=\"row-fluid\">\n                                                <br />\n                                                <select class=\"width-90 chosen-select\" id=\"cboProviders\" data-placeholder=\"请选择提供者\">\n\n                                                </select>\n                                                <br>&nbsp;\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n\n                            <div class=\"col-xs-12 col-sm-4\">\n                                <div class=\"col-xs-5\">\n                                    <form class=\"form-horizontal\">\n                                        <div class=\"control-group\">\n                                            <label class=\"control-label\" for=\"txtVersion\">接口版本</label>\n\n                                            <div class=\"controls\">\n                                                <input type=\"text\" id=\"txtVersion\" placeholder=\"\" />\n                                            </div>\n                                        </div>\n\n                                        <div class=\"control-group\">\n                                            <label class=\"control-label\" for=\"txtGroup\">接口分组</label>\n\n                                            <div class=\"controls\">\n                                                <input type=\"text\" id=\"txtGroup\" placeholder=\"\" />\n                                            </div>\n                                        </div>\n                                    </form>\n                                </div>\n                                <div class=\"col-xs-5\">\n                                    <button class=\"btn btn-app btn-pink btn-sm\" onclick=\"doListMethods();\">\n                                        <i class=\"icon-share-alt bigger-200\"></i>\n                                        拉取方法\n                                    </button>\n\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"hr hr-24\"></div>\n\n                        <div class=\"row\">\n\n                            <div class=\"col-xs-12 col-sm-4\">\n                                <div class=\"widget-box\">\n                                    <div class=\"widget-header\">\n                                        <h4>方法名称</h4>\n\n                                        <span class=\"widget-toolbar\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"collapse\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-chevron-up\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"close\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-remove\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n                                    </div>\n\n                                    <div class=\"widget-body\">\n                                        <div class=\"widget-main\">\n\n                                            <div class=\"row-fluid\" style=\"height: 300px; overflow-scrolling: auto;\">\n                                                <div class=\"control-group\" id=\"txtMethods\" style=\"height: 300px; overflow-y: scroll;\">\n\n\n                                                </div>\n                                                <div style=\"display:none;\" id=\"tplMethod\">\n                                                    <div class=\"radio\">\n                                                        <label>\n                                                            <input name=\"rdMethodKey\" type=\"radio\" class=\"ace rdMethod\" value=\"{}\"/>\n                                                            <span class=\"lbl\" style=\"font-size: 10px;\"> {} </span>\n                                                        </label>\n                                                    </div>\n                                                </div>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div><!-- /span -->\n\n                            <div class=\"col-xs-12 col-sm-4\">\n                                <div class=\"widget-box\">\n                                    <div class=\"widget-header\">\n                                        <h4>方法参数</h4>\n\n                                        <span class=\"widget-toolbar\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"settings\" id=\"formatParam\" onclick=\"doFormatParam();\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-eye-open\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"collapse\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-chevron-up\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"close\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-remove\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n                                    </div>\n\n                                    <div class=\"widget-body\">\n                                        <div class=\"widget-main\">\n                                                <textarea class=\"form-control\" id=\"txtParams\" rows=\"15\"\n                                                          placeholder=\"\"></textarea>\n\n                                        </div>\n                                    </div>\n                                </div>\n                            </div><!-- /span -->\n\n                            <div class=\"col-xs-12 col-sm-4\">\n                                <div class=\"widget-box\">\n                                    <div class=\"widget-header\">\n                                        <h4>响应结果</h4>\n\n                                        <span class=\"widget-toolbar\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"settings\" id=\"formatResult\" onclick=\"doFormatResult();\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-eye-open\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"collapse\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-chevron-up\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" data-action=\"close\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"icon-remove\"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n                                    </div>\n\n                                    <div class=\"widget-body\">\n                                        <div class=\"widget-main\">\n                                            <div class=\"row-fluid\">\n                                                <textarea id=\"txtResult\" name=\"txtResult\" rows=\"30\"></textarea>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div><!-- /span -->\n\n                        </div><!-- /row -->\n\n                        <div class=\"row\">\n                            <div class=\"clearfix form-actions\">\n                                <div class=\"col-md-offset-3 col-md-9\">\n                                    <button class=\"btn btn-info\" type=\"button\" onclick=\"doSend();\">\n                                        <i class=\"icon-ok bigger-110\"></i>\n                                        发送\n                                    </button>\n                                    &nbsp; &nbsp; &nbsp;\n                                    <button class=\"btn\" id=\"bootbox-regular\">保存</button>\n                                    &nbsp; &nbsp; &nbsp;\n                                    <button class=\"btn\" type=\"reset\">\n                                        <i class=\"icon-undo bigger-110\"></i>\n                                        重置\n                                    </button>\n                                </div>\n                            </div>\n\n                        </div>\n\n                    </div><!-- /.col -->\n                </div>\n\n                <!-- /.row -->\n            </div>\n            <!-- /.page-content -->\n        </div>\n        <!-- /.main-content -->\n\n    </div>\n    <!-- /.main-container-inner -->\n\n    <a href=\"#\" id=\"btn-scroll-up\"\n       class=\"btn-scroll-up btn btn-sm btn-inverse\"> <i\n            class=\"icon-double-angle-up icon-only bigger-110\"></i>\n    </a>\n</div>\n<!-- /.main-container -->\n<script type=\"text/javascript\">\n    if(\"ontouchend\" in document) document.write(\"<script src='assets/js/jquery.mobile.custom.min.js'>\"+\"<\"+\"/script>\");\n</script>\n\n<script th:src=\"@{~/v3/assets/js/chosen.jquery.min.js}\"></script>\n<script th:src=\"@{~/v3/assets/js/bootbox.min.js}\"></script>\n<script th:replace=\"/pages/tpl/foot :: footer\"></script>\n<script th:src=\"@{~/v3/js/jquery.jsonEdit.js}\"></script>\n\n\n<script type=\"text/javascript\">\n\n    var resultEditor;\n    var paramEditor;\n\n    function doFormatResult() {\n        resultEditor.doFormat();\n        $(\".resultJsonEditor\").addClass(\"scroll\");\n    }\n    function doFormatParam() {\n        paramEditor.doFormat();\n        $(\".paramJsonEditor\").addClass(\"scroll\");\n    }\n    function doSend() {\n\n        var providerKey = $(\"#cboProviders\").val();\n        var methodKey = $(\"input[name='rdMethodKey']:checked\").val();\n        var json = paramEditor.getValue();\n        var version = $(\"#txtVersion\").val();\n        var group = $(\"#txtGroup\").val();\n\n        if (null == providerKey || providerKey.length <= 0) {\n            return;\n        }\n        if (null == json || json.length <= 0) {\n            return;\n        }\n\n        var params = {\"providerKey\": providerKey, \"json\": json, \"methodKey\": methodKey, \"version\": version, \"group\": group};\n        Nora.Ajax(\"/doe/dubbo/doSend\", params, function (data) {\n\n            if (data.success && null != data.data && data.data.length > 0) {\n\n                // on success\n                $(\".resultJsonEditor\").html(data.data); // clear\n                doFormatResult();\n\n            } else {\n                // on fail\n                bootbox.alert(null == data ? \"操作失败！\" : null != data.msg ? data.msg : data.remark);\n            }\n\n        }, function (data) {\n            // on error\n            bootbox.alert(null == data ? \"操作失败！\" : null != data.msg ? data.msg : data.remark);\n        });\n\n    }\n    \n    function doPrepareMethodParams() {\n\n        $(\":radio\").click(function() {\n\n            var methodKey = $(this).val();\n\n            var params = { \"methodKey\": methodKey};\n            Nora.Ajax(\"/doe/dubbo/doListParams\", params, function (data) {\n\n                if (data.success && null != data.data && data.data.length > 0) {\n\n                    // on success\n                    // $(\"#txtParams\").val(data.data);\n                    $(\".paramJsonEditor\").html(data.data); // clear\n                    doFormatParam();\n\n                } else {\n                    // on fail\n                    bootbox.alert(null == data ? \"操作失败！\" : null != data.msg ? data.msg : data.remark);\n                }\n\n            }, function (data) {\n                // on error\n                bootbox.alert(null == data ? \"操作失败！\" : null != data.msg ? data.msg : data.remark);\n            });\n        });\n    }\n\n    function doListMethods() {\n\n        var providerKey = $(\"#cboProviders\").val();// 这就是selected的值\n        var interfaceName = $(\"#cboInterfaces\").val();\n\n\n        var params = {\"providerKey\": providerKey, \"serviceName\": interfaceName};\n        Nora.Ajax(\"/doe/dubbo/doListMethods\", params, function (data) {\n\n            if (data.success && null != data.data && data.data.length > 0) {\n\n                // on success\n                $(\"#txtMethods\").html(\"\"); // clear\n\n                for (var i = 0; i < data.data.length; i++) {\n\n                    var d = data.data[i];\n                    var html = Nora.Util.StringUtil.format($(\"#tplMethod\").html(), d.methodKey, d.methodText);\n                    $(html).appendTo(\"#txtMethods\");\n\n                }\n\n                // bind the click event and prepare method params.\n                doPrepareMethodParams()\n\n            } else {\n                // on fail\n                bootbox.alert(data.msg);\n            }\n\n        }, function (data) {\n            // on error\n            bootbox.alert(data.msg);\n        });\n    }\n\n    function doListProviders(serviceName) {\n\n        var conn = $(\"#txtConnect\").val();// 这就是selected的值\n        var version = $(\"#txtVersion\").val();\n        var group = $(\"#txtGroup\").val();\n\n        var params = {\"conn\": conn, \"serviceName\": serviceName, \"version\": version, \"group\": group};\n        var cboProvider = $(\"#cboProviders\");\n        Nora.Ajax(\"/doe/dubbo/doListProviders\", params, function (data) {\n\n            if (data.success && null != data.data && data.data.length > 0) {\n\n                // on success\n                cboProvider.html(\"<option value=\\\"\\\">&nbsp;</option>\"); // clear\n                for (var i = 0; i < data.data.length; i++) {\n\n                    var d = data.data[i];\n\n                    var html = Nora.Util.StringUtil.format(\"<option value='{}'>{}:{}</option>\", d.key, d.host, d.port);\n                    cboProvider.append(html);\n                }\n\n                cboProvider.chosen();\n                cboProvider.trigger(\"chosen:updated\"); // 渲染\n\n            } else {\n                // on fail\n                cboProvider.html(\"<option value=\\\"\\\">&nbsp;</option>\"); // clear\n                cboProvider.chosen();\n                cboProvider.trigger(\"chosen:updated\"); // 渲染\n                bootbox.alert(data.msg);\n            }\n\n        }, function (data) {\n            // on error\n            cboProvider.html(\"\"); // clear\n            bootbox.alert(data.msg);\n        });\n    }\n\n    function doConnect() {\n\n        var conn = $(\"#txtConnect\").val();\n        if (null == conn || conn.length <= 0) {\n            bootbox.alert(\"请输入连接地址！\");\n            return;\n        }\n\n        var params = {\"conn\": conn};\n        var cboInterfaces = $(\"#cboInterfaces\");\n        // 绑定事件\n        cboInterfaces.change(function () {\n            var serviceName = $(this).children('option:selected').val();// 这就是selected的值\n            doReset();\n            doListProviders(serviceName);\n        });\n        Nora.Ajax(\"/doe/dubbo/doConnect\", params, function (data) {\n\n            if (data.success && null != data.data && data.data.length > 0) {\n\n                // on success\n                cboInterfaces.html(\"<option value=\\\"\\\">&nbsp;</option>\"); // clear\n                var keyWordSearch = \"\";\n                var wholeWordSearch = \"\";\n                for (var i = 0; i < data.data.length; i++) {\n\n                    var d = data.data[i];\n\n                    // for whole input search\n                    wholeWordSearch += Nora.Util.StringUtil.format(\"<option value='{}'>{}</option>\", d.serviceName, d.serviceName);\n\n                    // for key word search\n                    var text = d.serviceName.replace(/\\./g, \" \");\n                    keyWordSearch += Nora.Util.StringUtil.format(\"<option value='{}'>{}</option>\", d.serviceName, text);\n\n                }\n\n                if (wholeWordSearch.length > 0) {\n                    cboInterfaces.append(wholeWordSearch);\n                    cboInterfaces.append(keyWordSearch);\n                }\n\n                cboInterfaces.chosen(); // 渲染\n                cboInterfaces.trigger(\"chosen:updated\"); // 渲染\n\n\n            } else {\n                // on fail\n                cboInterfaces.html(\"\"); // clear\n                cboInterfaces.chosen(); // 渲染\n                cboInterfaces.trigger(\"chosen:updated\"); // 渲染\n                bootbox.alert(data.msg);\n            }\n\n        }, function (data) {\n            // on error\n            bootbox.alert(data.msg);\n        });\n    }\n\n    function doReset() {\n\n        $(\"#txtMethods\").html(\"\"); // clear\n        $(\"#cboProviders\").html(\"\"); // clear\n    }\n\n    function doSave(caseName) {\n\n        var providerKey = $(\"#cboProviders\").val();\n        var methodKey = $(\"input[name='rdMethodKey']:checked\").val();\n        var json = paramEditor.getValue();\n\n        if (null == providerKey || providerKey.length <= 0) {\n            bootbox.error(\"请选择提供者！\");\n            return;\n        }\n        if (null == json || json.length <= 0) {\n            bootbox.error(\"请输入合法参数！\");\n            return;\n        }\n\n        var params = {\"providerKey\": providerKey, \"json\": json, \"methodKey\": methodKey, \"caseName\": caseName};\n        Nora.Ajax(\"/doe/case/doSave\", params, function (data) {\n\n            if (data.success && null != data.data && data.data.length > 0) {\n\n                // on success\n                bootbox.alert(data.msg);\n\n            } else {\n                // on fail\n                bootbox.alert(null == data ? \"操作失败！\" : null != data.msg ? data.msg : data.remark);\n            }\n\n        }, function (data) {\n            // on error\n            bootbox.alert(null == data ? \"操作失败！\" : null != data.msg ? data.msg : data.remark);\n        });\n    }\n\n    function initConnection() {\n\n        var txtConnect = $(\"#txtConnect\");\n        var params = {};\n        Nora.Ajax(\"/doe/zk/doListRegistry\", params, function (data) {\n\n            if (data.success && null != data.data && data.data.length > 0) {\n\n                // on success\n                var html = \"\";\n                for (var i = 0; i < data.data.length; i++) {\n\n                    var d = data.data[i];\n\n                    // for whole input search\n                    html += Nora.Util.StringUtil.format(\"<option value='{}'>{}</option>\", d.registryKey, d.registryDesc);\n                }\n                txtConnect.append(html);\n                txtConnect.chosen(); // 渲染\n\n            } else {\n                // on fail\n                bootbox.alert(null == data ? \"操作失败！\" : null != data.msg ? data.msg : data.remark);\n            }\n\n        }, function (data) {\n            // on error\n            bootbox.alert(null == data ? \"操作失败！\" : null != data.msg ? data.msg : data.remark);\n        });\n\n    }\n    jQuery(function($) {\n\n        initConnection();\n\n        resultEditor = $(\"#txtResult\").jsonEdit({\n            debug: false\n            , dynamic: false\n            , buttonSelector: '#formatResult'\n            , height: 300\n            , className: 'resultJsonEditor'\n            , onError: function () {\n            }\n        });\n        paramEditor = $(\"#txtParams\").jsonEdit({\n            debug: false\n            , dynamic: false\n            , buttonSelector: '#formatParam'\n            , height: 300\n            , className: 'paramJsonEditor'\n            , onError: function () {\n            }\n        });\n        $(\"#bootbox-regular\").on('click', function() {\n            bootbox.prompt(\"请填写用例名称\", function(result) {\n                if (result === null) {\n                    //Example.show(\"Prompt dismissed\");\n                } else {\n                    doSave(result);\n                }\n            });\n        });\n    });\n</script>\n\n</body>\n</html>"
  },
  {
    "path": "mmc-dubbo-doe/src/main/resources/templates/pages/v3/sys.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"utf-8\" />\n    <title>Doe</title>\n    <!-- 导入头部 ,统一引用那些静态资源  -->\n    <link rel=\"stylesheet\" th:href=\"@{~/v3/assets/css/chosen.css}\" />\n    <script th:replace=\"/pages/tpl/head::header\"></script>\n    <style>\n        .scroll { overflow-y: scroll; overflow-x: scroll;}\n    </style>\n</head>\n<body>\n\n<div th:replace=\"/pages/tpl/top::topper\"></div>\n\n\n<div class=\"main-container\" id=\"main-container\">\n    <script type=\"text/javascript\">\n        try {\n            ace.settings.check('main-container', 'fixed')\n        } catch (e) {\n        }\n    </script>\n\n    <div class=\"main-container-inner\">\n\n        <div th:utext=\"${menuHtml}\"></div>\n\n        <div class=\"main-content\">\n            <div th:replace=\"/pages/tpl/bread::breader\"></div>\n\n            <div class=\"page-content\">\n                <div class=\"page-header\">\n                    <h1>\n                        系统管理\n                    </h1>\n                </div>\n                <!-- /.page-header -->\n\n                <div class=\"row\">\n                    <div class=\"col-xs-12\" >\n                        <!-- PAGE CONTENT BEGINS -->\n\n                        <div class=\"row-fluid\">\n                            <h5 class=\"header smaller lighter green\">重新加载jar包.</h5>\n                            <p>\n\n                                <a id=\"btnReload\" href=\"/doe/sys/doReload\" class=\"btn btn-app btn-warning\" >\n                                    <i class=\"icon-undo\"></i>\n                                    重新加载\n                                </a>\n\n\n                            </p>\n                        </div>\n                        <div class=\"row-fluid\">\n                            <h5 class=\"header smaller lighter green\">清空所有jar包.</h5>\n                            <p>\n\n                                <a id=\"btnClear\" href=\"/doe/sys/doRepublish\" class=\"btn btn-app btn-success\">\n                                    <i class=\"icon-refresh\"></i>\n                                    清空JAR\n                                </a>\n\n                            </p>\n                        </div>\n\n\n\n                        <div class=\"hr hr-24\"></div>\n\n\n                    </div><!-- /.col -->\n                </div>\n\n                <!-- /.row -->\n            </div>\n            <!-- /.page-content -->\n        </div>\n        <!-- /.main-content -->\n\n    </div>\n    <!-- /.main-container-inner -->\n\n    <a href=\"#\" id=\"btn-scroll-up\"\n       class=\"btn-scroll-up btn btn-sm btn-inverse\"> <i\n            class=\"icon-double-angle-up icon-only bigger-110\"></i>\n    </a>\n</div>\n<!-- /.main-container -->\n<script type=\"text/javascript\">\n    if(\"ontouchend\" in document) document.write(\"<script src='assets/js/jquery.mobile.custom.min.js'>\"+\"<\"+\"/script>\");\n</script>\n\n<script th:src=\"@{~/v3/assets/js/chosen.jquery.min.js}\"></script>\n<script th:src=\"@{~/v3/assets/js/bootbox.min.js}\"></script>\n<script th:replace=\"/pages/tpl/foot::footer\"></script>\n\n<script type=\"text/javascript\">\n\n    jQuery(function($) {\n\n        $(\"#btnReload\").click(function(e){\n\n            var params = {};\n            Nora.Ajax(\"/doe/sys/doReload\", params, function (data) {\n\n                if (data.success && null != data.data && data.data.length > 0) {\n\n                    bootbox.alert(null == data ? \"操作失败！\" : null != data.msg ? data.msg : data.remark);\n\n                } else {\n                    // on fail\n                    bootbox.alert(null == data ? \"操作失败！\" : null != data.msg ? data.msg : data.remark);\n                }\n\n            }, function (data) {\n                // on error\n                bootbox.alert(null == data ? \"操作失败！\" : null != data.msg ? data.msg : data.remark);\n            });\n\n            return false;\n        });\n        $(\"#btnClear\").click(function(e){\n\n            var params = {};\n            Nora.Ajax(\"/doe/sys/doRepublish\", params, function (data) {\n\n                if (data.success && null != data.data && data.data.length > 0) {\n\n                    bootbox.alert(null == data ? \"操作失败！\" : null != data.msg ? data.msg : data.remark);\n\n                } else {\n                    // on fail\n                    bootbox.alert(null == data ? \"操作失败！\" : null != data.msg ? data.msg : data.remark);\n                }\n\n            }, function (data) {\n                // on error\n                bootbox.alert(null == data ? \"操作失败！\" : null != data.msg ? data.msg : data.remark);\n            });\n\n            return false;\n        });\n    });\n\n</script>\n\n</body>\n</html>"
  },
  {
    "path": "mmc-dubbo-doe/src/test/java/com/mmc/dubbo/doe/DubboDoeApplicationTests.java",
    "content": "package com.mmc.dubbo.doe;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class DubboDoeApplicationTests {\n\n\n    @Test\n    public void contextLoads() {\n\n        System.out.println(\"begin.\");\n\n\n        System.out.println(\"done.\");\n    }\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/test/java/com/mmc/dubbo/doe/test/TestCaseService.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.test;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.serializer.SerializerFeature;\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.model.CaseModel;\nimport com.mmc.dubbo.doe.service.CaseService;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.List;\n\n/**\n * @author Joey\n * @date 2018/6/29 15:44\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class TestCaseService {\n\n    @Autowired\n    private CaseService caseService;\n\n    @Test\n    public void testSave() {\n\n        CaseModel model = new CaseModel();\n        model.setCaseId(1);\n        model.setCaseName(\"demo case\");\n        model.setProviderKey(\"com.mmc.dubbo.api.user.UserService#172.26.246.1#30880#\");\n        model.setMethodKey(\"com.mmc.dubbo.api.user.UserService#6A365B586448DD533E9F474672D657CE\");\n        model.setJson(\"[{\\\"height\\\":165,\\\"id\\\":490,\\\"name\\\":\\\"sally\\\",\\\"sex\\\":0},\\\"sally\\\",0]\");\n\n        ResultDTO<CaseModel> ret = caseService.save(model);\n\n        Assert.assertTrue(ret.isSuccess());\n\n    }\n\n    @Test\n    public void testListAll() {\n\n        List<Object> list = caseService.listAll();\n\n        String json = JSON.toJSONString(list, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue,\n                SerializerFeature.WriteDateUseDateFormat);\n\n        System.out.println(json);\n\n    }\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/test/java/com/mmc/dubbo/doe/test/TestClassService.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.test;\n\nimport com.alibaba.fastjson.JSON;\nimport com.mmc.dubbo.api.user.UserService;\nimport com.mmc.dubbo.doe.dto.ConnectDTO;\nimport com.mmc.dubbo.doe.dto.MethodModelDTO;\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.service.ClassService;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.List;\n\n/**\n * @author Joey\n * @date 2018/6/27 17:17\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class TestClassService {\n\n    @Autowired\n    private ClassService classService;\n\n    @Test\n    public void testGenerateMethodParamsJsonString() throws InstantiationException, IllegalAccessException, ClassNotFoundException {\n\n        System.out.println(\"begin.\");\n\n        MethodModelDTO dto = new MethodModelDTO();\n        dto.setInterfaceName(\"com.mmc.dubbo.doe.service.ConnectService\");\n        dto.setMethodName(\"send\");\n        ResultDTO<String> ret = classService.generateMethodParamsJsonString(dto);\n\n        Assert.assertTrue(ret.isSuccess());\n        System.out.println(ret.getData());\n\n        System.out.println(\"-----------------------------\");\n\n        dto.setInterfaceName(\"com.mmc.dubbo.doe.service.PomService\");\n        dto.setMethodName(\"appendPom\");\n\n        ret = classService.generateMethodParamsJsonString(dto);\n        Assert.assertTrue(ret.isSuccess());\n        System.out.println(ret.getData());\n\n        System.out.println(\"done.\");\n    }\n\n    @Test\n    public void testListMethods() {\n\n        System.out.println(\"begin.\");\n\n        ConnectDTO dto = new ConnectDTO();\n        dto.setServiceName(UserService.class.getName());\n\n        List<MethodModelDTO> ret = classService.listMethods(dto);\n\n        Assert.assertFalse(ret.isEmpty());\n\n        System.out.println(JSON.toJSONString(ret));\n\n        System.out.println(\"------------------------\");\n\n        ret = classService.listMethods(dto);\n\n        System.out.println(JSON.toJSONString(ret));\n\n\n        System.out.println(\"done.\");\n\n    }\n\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/test/java/com/mmc/dubbo/doe/test/TestConfigService.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.test;\n\nimport com.alibaba.fastjson.JSON;\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.model.RegistryModel;\nimport com.mmc.dubbo.doe.service.ConfigService;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.List;\n\n/**\n * @author Joey\n * @date 2018/7/10 11:15\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class TestConfigService {\n\n    @Autowired\n    private ConfigService configService;\n\n    @Test\n    public void testListRegistry() {\n\n        List<RegistryModel> list = configService.listRegistry();\n\n        Assert.assertFalse(list.isEmpty());\n\n        int size = list.size();\n\n        list.stream().forEach(l -> {\n            System.out.println(JSON.toJSONString(l));\n        });\n\n        System.out.println(\"-------------------------------\");\n\n        configService.loadZkConfigFromResource();\n\n        list = configService.listRegistry();\n\n        Assert.assertEquals(size, list.size());\n\n        list.stream().forEach(l -> {\n            System.out.println(JSON.toJSONString(l));\n        });\n\n    }\n\n    @Test\n    public void testAddRegistry() {\n\n        RegistryModel model = new RegistryModel();\n        model.setRegistryDesc(\"test registry\");\n        model.setRegistryKey(\"test address\");\n\n        ResultDTO<RegistryModel> ret = configService.addRegistry(model);\n        System.out.println(JSON.toJSONString(ret));\n\n        List<RegistryModel> list = configService.listRegistry();\n        list.stream().forEach(l -> {\n            System.out.println(JSON.toJSONString(l));\n        });\n\n        Assert.assertTrue(list.contains(model));\n\n\n    }\n\n    @Test\n    public void testDelRegistry() {\n\n        RegistryModel model = new RegistryModel();\n        model.setRegistryDesc(\"test registry\");\n        model.setRegistryKey(\"test address\");\n\n        ResultDTO<RegistryModel> ret = configService.delRegistry(model);\n        System.out.println(JSON.toJSONString(ret));\n\n        List<RegistryModel> list = configService.listRegistry();\n        list.stream().forEach(l -> {\n            System.out.println(JSON.toJSONString(l));\n        });\n\n        Assert.assertFalse(list.contains(model));\n\n    }\n\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/test/java/com/mmc/dubbo/doe/test/TestConnectService.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.test;\n\nimport com.alibaba.fastjson.JSON;\nimport com.mmc.dubbo.doe.dto.ConnectDTO;\nimport com.mmc.dubbo.doe.dto.MethodModelDTO;\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.dto.UrlModelDTO;\nimport com.mmc.dubbo.doe.model.ServiceModel;\nimport com.mmc.dubbo.doe.service.ClassService;\nimport com.mmc.dubbo.doe.service.ConnectService;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.List;\n\n/**\n * @author Joey\n * @date 2018/6/29 10:17\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class TestConnectService {\n\n    @Autowired\n    private ConnectService connectService;\n    @Autowired\n    private ClassService classService;\n\n    @Test\n    public void testSend() throws Exception {\n\n        String conn = \"127.0.0.1:2181\";\n\n        // connect to zk\n        List<ServiceModel> models = connectService.connect(conn);\n\n        String interfaceName = \"com.mmc.dubbo.api.user.UserService\";\n        ServiceModel model = new ServiceModel();\n        model.setServiceName(interfaceName);\n\n        Assert.assertTrue(models.contains(model));\n\n        // list all providers\n        ConnectDTO connectDTO = new ConnectDTO();\n        connectDTO.setServiceName(interfaceName);\n        connectDTO.setConn(conn);\n        List<UrlModelDTO> providers = connectService.listProviders(connectDTO);\n\n        Assert.assertFalse(providers.isEmpty());\n\n        // list all method\n        List<MethodModelDTO> methods = classService.listMethods(connectDTO);\n\n        Assert.assertFalse(methods.isEmpty());\n\n        // get the expected method\n        MethodModelDTO methodModelDTO = methods.stream().filter(m ->  m.getMethodName().equals(\"insert\") ).findAny().orElse(null);\n\n        Assert.assertNotNull(methodModelDTO);\n\n        // send request\n        UrlModelDTO provider = providers.get(0);\n        connectDTO.setProviderKey(provider.getKey());\n        connectDTO.setMethodKey(methodModelDTO.getMethodKey());\n        connectDTO.setJson(\"[{\\\"id\\\": 88888}, \\\"sally\\\", 1]\");\n        ResultDTO<String> ret = connectService.send(connectDTO);\n\n        Assert.assertTrue(ret.isSuccess());\n\n        System.out.println(JSON.toJSONString(ret));\n\n    }\n\n\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/test/java/com/mmc/dubbo/doe/test/TestCuratorHandler.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.test;\n\nimport com.mmc.dubbo.doe.dto.ConnectDTO;\nimport com.mmc.dubbo.doe.handler.CuratorHandler;\nimport com.mmc.dubbo.doe.dto.MethodModelDTO;\nimport com.mmc.dubbo.doe.model.ServiceModel;\nimport com.mmc.dubbo.doe.model.UrlModel;\nimport org.junit.Assert;\nimport org.junit.Before;\nimport org.junit.Test;\n\nimport java.util.List;\n\n/**\n * @author Joey\n * @date 2018/6/14 19:40\n */\npublic class TestCuratorHandler {\n\n\n    private CuratorHandler client;\n\n    @Before\n    public void testConnect() throws NoSuchFieldException, IllegalAccessException {\n\n        client = new CuratorHandler(\"zookeeper\", \"127.0.0.1\", 2181);\n        client.doConnect();\n\n    }\n\n    @Test\n    public void testGetInterfaces() {\n\n        List<ServiceModel> list = client.getInterfaces();\n        Assert.assertFalse(list.isEmpty());\n\n        System.out.println(\"----------------------------------------------------------------\");\n        list.forEach(l -> {\n            System.out.println(l);\n        });\n\n    }\n\n    @Test\n    public void testGetProviders() {\n\n        String interfaceName = \"com.mmc.dubbo.api.user.UserService\";\n\n        ConnectDTO dto = new ConnectDTO();\n        dto.setServiceName(interfaceName);\n\n        List<UrlModel> list = client.getProviders(dto);\n        Assert.assertTrue(list.size() <= 1);\n\n        dto.setVersion(\"2.0.0\");\n        dto.setGroup(\"mmcgroup\");\n        list = client.getProviders(dto);\n        Assert.assertTrue(list.size() == 0);\n\n        System.out.println(\"----------------------------------------------------------------\");\n        list.forEach(l -> {\n            System.out.println(l);\n        });\n    }\n\n    @Test\n    public void testGetMethods() throws ClassNotFoundException {\n\n        String interfaceName = \"com.mmc.dubbo.api.user.UserService\";\n        List<MethodModelDTO> list = client.getMethods(interfaceName);\n        Assert.assertFalse(list.isEmpty());\n\n        System.out.println(\"----------------------------------------------------------------\");\n        list.forEach(l -> {\n            System.out.println(l);\n        });\n    }\n\n\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/test/java/com/mmc/dubbo/doe/test/TestDemo.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.test;\n\nimport com.alibaba.dubbo.common.Constants;\nimport com.alibaba.dubbo.common.URL;\nimport com.alibaba.dubbo.remoting.exchange.Request;\nimport com.alibaba.dubbo.rpc.RpcInvocation;\nimport com.alibaba.dubbo.rpc.RpcResult;\nimport com.mmc.dubbo.api.user.UserFact;\nimport com.mmc.dubbo.doe.client.DoeClient;\nimport com.mmc.dubbo.doe.context.ResponseDispatcher;\nimport com.mmc.dubbo.doe.dto.ConnectDTO;\nimport com.mmc.dubbo.doe.handler.CuratorHandler;\nimport com.mmc.dubbo.doe.model.UrlModel;\nimport com.mmc.dubbo.doe.util.ParamUtil;\nimport org.junit.Assert;\nimport org.junit.Test;\n\nimport java.lang.reflect.Method;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * @author Joey\n * @date 2018/6/15 13:45\n */\npublic class TestDemo {\n\n    @Test\n    public void testDemo() throws Exception {\n\n        String protocol = \"dubbo\";\n        String host = \"127.0.0.1\";\n        int port = 2181;\n\n        String interfaceName = \"com.mmc.dubbo.api.user.UserService\";\n        String jsonStr = String.valueOf(8888);\n\n        CuratorHandler curatorHandler = new CuratorHandler(protocol, host, port);\n        curatorHandler.doConnect();\n        ConnectDTO conn = new ConnectDTO();\n        conn.setServiceName(interfaceName);\n        List<UrlModel> urls = curatorHandler.getProviders(conn);\n\n        URL url = urls.get(0).getUrl();\n        url = url.addParameter(Constants.CODEC_KEY, protocol); // 非常重要，必须要设置编码器协议类型\n        DoeClient client = new DoeClient(url);\n        client.doConnect();\n\n        HashMap<String, String> map = ParamUtil.getAttachmentFromUrl(url);\n        Class<?> clazz = Class.forName(interfaceName);\n        Method[] methods = clazz.getMethods();\n        Method method = methods[0];\n        Object[] params = ParamUtil.parseJson(jsonStr, method);\n\n        // create request.\n        Request req = new Request();\n        req.setVersion(\"2.0.0\");\n        req.setTwoWay(true);\n        req.setData(new RpcInvocation(method, params, map));\n\n        client.send(req);\n\n        CompletableFuture<RpcResult> future = ResponseDispatcher.getDispatcher().getFuture(req);\n        RpcResult result = future.get(10, TimeUnit.SECONDS);\n        UserFact fact = (UserFact) result.getValue();\n\n        Assert.assertEquals(\"SUCCESS\", fact.getName());\n\n    }\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/test/java/com/mmc/dubbo/doe/test/TestDoeClassLoader.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.test;\n\nimport com.mmc.dubbo.doe.context.DoeClassLoader;\nimport org.junit.Test;\n\n/**\n * @author Joey\n * @date 2019/6/28 14:54\n */\npublic class TestDoeClassLoader {\n\n    @Test\n    public void testLoad() throws Exception {\n\n        String path = \"F:\\\\app\\\\doe\\\\lib\";\n\n        DoeClassLoader doeClassLoader = new DoeClassLoader(path);\n\n        doeClassLoader.loadJars();\n        doeClassLoader.loadClassFile();\n        Class<?> clazz = doeClassLoader.loadClass(\"com.fcbox.edms.terminal.api.CabinetServiceFacade\");\n\n\n        System.out.println(clazz.getClassLoader());\n\n    }\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/test/java/com/mmc/dubbo/doe/test/TestDoeClient.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.test;\n\nimport com.alibaba.dubbo.common.URL;\nimport com.alibaba.dubbo.remoting.exchange.Request;\nimport com.alibaba.dubbo.rpc.RpcInvocation;\nimport com.alibaba.dubbo.rpc.RpcResult;\nimport com.mmc.dubbo.api.user.UserFact;\nimport com.mmc.dubbo.api.user.UserService;\nimport com.mmc.dubbo.doe.context.ResponseDispatcher;\nimport com.mmc.dubbo.doe.client.DoeClient;\nimport com.mmc.dubbo.doe.util.ParamUtil;\nimport org.junit.Assert;\nimport org.junit.Before;\nimport org.junit.Test;\n\nimport java.lang.reflect.Method;\nimport java.util.HashMap;\nimport java.util.concurrent.CompletableFuture;\n\n/**\n * @author Joey\n * @date 2018/6/6 20:18\n */\npublic class TestDoeClient {\n\n    private URL url = URL.valueOf(\"dubbo://10.204.240.75:30880/com.mmc.dubbo.api.user.UserService?anyhost=true&application=dubboConsumer&async=false&check=false&codec=dubbo&dubbo=2.6.1&generic=false&heartbeat=60000&interface=com.mmc.dubbo.api.user.UserService&methods=getCurrentById&pid=23984&register.ip=10.204.240.75&remote.timestamp=1527252773377&revision=1.0-SNAPSHOT&side=consumer&timeout=30000&timestamp=1527254250379\");\n    private DoeClient client;\n\n    @Before\n    public void testConnect() {\n\n        client = new DoeClient(url);\n        client.doConnect();\n    }\n\n    @Test\n    public void testSend() throws Exception {\n\n        Class<?> clazz = UserService.class;\n        Method method = clazz.getDeclaredMethod(\"getCurrentById\", new Class[]{long.class});\n\n        HashMap<String, String> map = ParamUtil.getAttachmentFromUrl(url);\n\n        // create request.\n        Request req = new Request();\n        req.setVersion(\"2.0.0\");\n        req.setTwoWay(true);\n        req.setData(new RpcInvocation(method, new Object[] {1111}, map));\n\n        client.send(req);\n\n        CompletableFuture<RpcResult> future = ResponseDispatcher.getDispatcher().getFuture(req);\n        RpcResult result = future.get();\n        UserFact fact = (UserFact) result.getValue();\n\n        Assert.assertEquals(\"SUCCESS\", fact.getName());\n\n        System.out.println(\"done.\");\n    }\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/test/java/com/mmc/dubbo/doe/test/TestFuture.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.test;\n\nimport org.junit.Test;\n\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.ExecutionException;\n\n/**\n * @author Joey\n * @date 2018/6/12 13:54\n */\npublic class TestFuture {\n\n    @Test\n    public void test() throws ExecutionException, InterruptedException {\n\n        CompletableFuture<String>  future = new CompletableFuture<>();\n\n        System.out.println(\"do something.\");\n\n        new Thread(() -> {\n\n            try {\n                Thread.sleep(5000);\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n            future.complete(\"World\");\n\n        }).start();\n\n        System.out.println(future.get());\n\n        System.out.println(\"done.\");\n    }\n\n\n}"
  },
  {
    "path": "mmc-dubbo-doe/src/test/java/com/mmc/dubbo/doe/test/TestLogback.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.test;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.junit.Test;\n\n/**\n * @author Joey\n * @date 2018/6/27 18:19\n */\n@Slf4j\npublic class TestLogback {\n\n    @Test\n    public void test() {\n\n        log.info(\"what are you dong ? \");\n\n    }\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/test/java/com/mmc/dubbo/doe/test/TestNumber.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.test;\n\nimport org.junit.Test;\n\n/**\n * @author Joey\n * @date 2018/7/27 17:04\n */\npublic class TestNumber {\n\n    @Test\n    public void testPercent() {\n\n        int a = 19;\n        int b = 17;\n\n        double c = ((double) a) * 100 / b;\n\n        System.out.println(String.format(\"%.0f%s\", c, \"%\"));\n    }\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/test/java/com/mmc/dubbo/doe/test/TestParam.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.test;\n\nimport org.junit.Test;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\n/**\n * @author Joey\n * @date 2018/8/6 14:10\n */\npublic class TestParam {\n\n    @Test\n    public void testMethodPassValue() {\n\n\n        List<String> list = new ArrayList<>();\n        list.add(\"a\");\n        list.add(\"b\");\n        list.add(\"c\");\n        list.add(\"d\");\n        list.add(\"e\");\n\n        new TestParam().print(list.toArray(new String[0]));\n\n    }\n\n    private void print(String... values) {\n\n        Arrays.stream(values).forEach(System.out::println);\n    }\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/test/java/com/mmc/dubbo/doe/test/TestPomService.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.test;\n\nimport com.alibaba.fastjson.JSON;\nimport com.mmc.dubbo.doe.context.Const;\nimport com.mmc.dubbo.doe.dto.PomDTO;\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.model.PomModel;\nimport com.mmc.dubbo.doe.service.PomService;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.xml.sax.SAXException;\n\nimport javax.xml.parsers.ParserConfigurationException;\nimport java.io.IOException;\nimport java.net.MalformedURLException;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\n/**\n * @author Joey\n * @date 2018/6/15 20:27\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class TestPomService {\n\n    @Autowired\n    private PomService pomService;\n\n    @Test\n    public void testPath() {\n\n        String path = TestPomService.class.getResource(\"\").getPath();\n        System.out.println(path);\n        String path2 = TestPomService.class.getResource(\"/test-pom.xml\").getPath();\n        System.out.println(path2);\n\n    }\n\n    @Test\n    public void testParse() throws IOException, SAXException {\n\n        String xml = \"\\t\\t<dependency>\\n\" +\n                \"\\t\\t\\t<groupId>mmc-dubbo</groupId>\\n\" +\n                \"\\t\\t\\t<artifactId>api</artifactId>\\n\" +\n                \"\\t\\t\\t<version>1.0-SNAPSHOT</version>\\n\" +\n                \"\\t\\t</dependency>\";\n\n\n        List<PomModel> models = pomService.parsePom(xml);\n        Assert.assertFalse(models.isEmpty());\n\n        models.forEach(m -> {\n\n            Assert.assertFalse(m.isBroken());\n            System.out.println(JSON.toJSONString(m));\n        });\n    }\n\n    @Test\n    public void testAppend() throws Exception {\n\n        String groupId = \"com.mmc\";\n        String artifactId = \"mybatis\";\n        String version = \"1.0-SNAPSHOT\";\n\n        String path2 = TestPomService.class.getResource(\"/test-pom.xml\").getPath();\n        System.out.println(path2);\n\n        List<PomModel> models = new ArrayList<>();\n        PomModel aModel = new PomModel();\n        aModel.setGroupId(groupId);\n        aModel.setArtifactId(artifactId);\n        aModel.setVersion(version);\n        models.add(aModel);\n\n        PomModel bModel = new PomModel();\n        bModel.setGroupId(groupId);\n        bModel.setArtifactId(artifactId);\n        bModel.setVersion(version);\n        models.add(bModel);\n\n        pomService.appendPom(models, path2);\n\n    }\n\n    @Test\n    public void testLoad() throws NoSuchMethodException, MalformedURLException, ClassNotFoundException {\n\n        String className = \"com.nora.interfaces.auth.UserFact\";\n\n        ResultDTO<String> ret = pomService.loadJars(\"\");\n\n\n        Assert.assertTrue(ret.isSuccess());\n\n        Class<?> clazz = Class.forName(className);\n\n        Assert.assertNotNull(clazz);\n\n        Arrays.stream(clazz.getMethods()).forEach(m -> {\n\n            System.out.println(m.getName());\n\n        });\n\n    }\n\n    @Test\n    public void testListJars() throws IOException, SAXException, ParserConfigurationException {\n\n        PomDTO dto = new PomDTO();\n        String pomPath = TestPomService.class.getResource(\"/test-pom.xml\").getPath();\n        dto.setPath(pomPath);\n\n        List<PomModel> list = pomService.listJars(dto);\n\n        System.out.println(JSON.toJSONString(list));\n    }\n\n    @Test\n    public void testInvoke() throws Exception {\n\n        String xml = \"\\t\\t<dependency>\\n\" +\n                \"\\t\\t\\t<groupId>mmc-dubbo</groupId>\\n\" +\n                \"\\t\\t\\t<artifactId>api</artifactId>\\n\" +\n                \"\\t\\t\\t<version>1.0-SNAPSHOT</version>\\n\" +\n                \"\\t\\t</dependency>\";\n\n        PomDTO dto = new PomDTO();\n        dto.setPom(xml);\n\n        ResultDTO<PomDTO> ret = pomService.invoke(dto);\n        System.out.println(\"ret: \" + JSON.toJSONString(ret));\n\n        if (!ret.isSuccess()) {\n            System.out.println(ret.getMsg());\n            return;\n        }\n\n        String requestId = ret.getData().getRequestId();\n        ResultDTO<String> msgRet = new ResultDTO<>();\n\n        while (msgRet.getCode() != Const.COMPLETE_FLAG) {\n\n            msgRet = pomService.getRealTimeMsg(requestId);\n            System.out.println(JSON.toJSONString(msgRet));\n\n            Thread.sleep(1000);\n        }\n\n    }\n\n    @Test\n    public void testLoadPomFile() {\n\n        String pomXmlPath = TestPomService.class.getResource(\"/test-pom.xml\").getPath();\n        String content = pomService.loadPomFile(pomXmlPath);\n\n        Assert.assertNotNull(content);\n        System.out.println(content);\n\n\n    }\n\n    @Test\n    public void testOverridePomFile() {\n\n        String pomXmlPath = TestPomService.class.getResource(\"/test-pom.xml\").getPath();\n        String content = pomService.loadPomFile(pomXmlPath) + \"\\r\\naaa\";\n\n        boolean flag = pomService.overridePomFile(pomXmlPath, content);\n\n        Assert.assertTrue(flag);\n\n    }\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/test/java/com/mmc/dubbo/doe/test/TestProcessClient.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.test;\n\nimport com.mmc.dubbo.doe.cache.RedisResolver;\nimport com.mmc.dubbo.doe.client.ProcessClient;\nimport com.mmc.dubbo.doe.dto.PomDTO;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n/**\n * @author Joey\n * @date 2018/6/15 18:51\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class TestProcessClient {\n\n    @Autowired\n    private RedisResolver redisResolver;\n\n    @Test\n    public void testDownload() throws InterruptedException {\n\n\n        String pomXml = TestProcessClient.class.getResource(\"/test-pom.xml\").getPath();\n        pomXml = pomXml.substring(1);\n        System.out.println(pomXml);\n\n        String libPath = pomXml.substring(0, pomXml.lastIndexOf(\"/\")) + \"lib\";\n        System.out.println(libPath);\n\n        PomDTO dto = new PomDTO();\n        ProcessClient client = new ProcessClient(dto, redisResolver, pomXml, libPath);\n        client.start();\n        client.join();\n\n        Assert.assertTrue(client.isDone());\n\n    }\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/test/java/com/mmc/dubbo/doe/test/TestRedisResolver.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.test;\n\nimport com.mmc.dubbo.doe.cache.RedisResolver;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * @author Joey\n * @date 2018/6/17 17:24\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class TestRedisResolver {\n\n    @Autowired\n    private RedisResolver redisResolver;\n\n    @Test\n    public void testString() {\n\n        System.out.println(\"begin.\");\n\n        redisResolver.set(\"testKey\", \"testValue\", 1, TimeUnit.HOURS);\n\n        String value = (String) redisResolver.get(\"testKey\");\n\n        Assert.assertTrue(\"testValue\".equals(value));\n\n\n        System.out.println(\"done.\");\n\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/test/java/com/mmc/dubbo/doe/test/TestRedisTemplate.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.test;\n\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * @author Joey\n * @date 2018/6/17 17:24\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class TestRedisTemplate {\n\n    @Autowired\n    private RedisTemplate<String, String> redisTemplate;\n\n    @Test\n    public void testRedis() {\n\n        System.out.println(\"begin.\");\n\n        redisTemplate.opsForValue().set(\"testKey\", \"testValue\", 1, TimeUnit.HOURS);\n\n        String value = redisTemplate.opsForValue().get(\"testKey\");\n\n        Assert.assertTrue(\"testValue\".equals(value));\n\n\n        System.out.println(\"done.\");\n\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/test/java/com/mmc/dubbo/doe/test/TestTelnetService.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.test;\n\nimport com.alibaba.fastjson.JSON;\nimport com.mmc.dubbo.doe.dto.ConnectDTO;\nimport com.mmc.dubbo.doe.dto.ResultDTO;\nimport com.mmc.dubbo.doe.service.TelnetService;\nimport com.mmc.dubbo.doe.service.impl.TelnetServiceImpl;\nimport org.apache.commons.net.telnet.TelnetClient;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.PrintStream;\nimport java.net.SocketException;\n\n/**\n * @author Joey\n * @date 2018/7/5 14:57\n */\npublic class TestTelnetService {\n\n    private TelnetService telnetService = new TelnetServiceImpl();\n\n    @Test\n    public void testSend() {\n\n        ConnectDTO dto = new ConnectDTO();\n\n        dto.setConn(\"127.0.0.1:30880\");\n        dto.setServiceName(\"com.mmc.dubbo.api.user.UserService\");\n        dto.setMethodName(\"getCurrentById\");\n        dto.setJson(\"22222\");\n\n        ResultDTO<String> ret = telnetService.send(dto);\n\n        Assert.assertTrue(ret.isSuccess());\n\n        System.out.println(ret.getData());\n    }\n\n\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/test/java/com/mmc/dubbo/doe/test/TestTime.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.doe.test;\n\nimport com.alibaba.dubbo.common.utils.StringUtils;\n\nimport java.time.LocalDate;\nimport java.time.LocalTime;\nimport java.time.temporal.ChronoUnit;\n\n/**\n * @author Joey\n * @date 2018/6/12 21:05\n */\npublic class TestTime {\n\n    public static void main(String[] args) {\n\n        System.out.println(isRestTime(LocalTime.now()));\n        System.out.println(isRestTime(LocalTime.parse(\"23:00\")));\n        System.out.println(isRestTime(LocalTime.parse(\"01:00\")));\n        System.out.println(isRestTime(LocalTime.parse(\"07:00\")));\n        System.out.println(isRestTime(LocalTime.parse(\"09:00\")));\n        System.out.println(isRestTime(LocalTime.parse(\"12:00\")));\n\n        System.out.println(\"----------------------------\");\n\n        System.out.println(isMoreThanDiffDay(\"\", \"\", 31));\n        System.out.println(isMoreThanDiffDay(\"2018-07-25\", \"2018-07-25\", 31));\n        System.out.println(isMoreThanDiffDay(\"2018-08-27\", \"2018-07-25\", 31));\n        System.out.println(isMoreThanDiffDay(\"2018-07-10\", \"2018-07-25\", 31));\n        System.out.println(isMoreThanDiffDay(\"2018-07-10\", \"2018-08-10\", 31));\n        System.out.println(isMoreThanDiffDay(\"2018-07-10\", \"2018-08-11\", 31));\n        System.out.println(isMoreThanDiffDay(\"2018-01-25\", \"2018-07-25\", 31));\n        System.out.println(isMoreThanDiffDay(\"2018-07-10\", \"2018-08-25\", 31));\n    }\n\n    private static boolean isRestTime(LocalTime now) {\n\n        boolean open = true;\n        boolean ret;\n\n        LocalTime begin = LocalTime.parse(\"22:00\"); // begin\n        LocalTime end = LocalTime.parse(\"08:00\"); // end\n\n        if (begin.isBefore(end)) {\n            // 开始时间小于结束时间\n            ret = (begin.isBefore(now) && now.isBefore(end));\n\n        } else {\n            // 开始时间大于结束时间\n            ret = (begin.isBefore(now) || now.isBefore(end));\n        }\n\n        return open && ret;\n\n    }\n\n    /**\n     * 判断两日期字符串是否超过指定天数.\n     * @param tmStartStr 开始日期\n     * @param tmEndStr 结束日期\n     * @param days 指定天数\n     * @return 如果传入参数不为空且超过指定天数返回true，否则返回false\n     */\n    public static boolean isMoreThanDiffDay(String tmStartStr, String tmEndStr, int days) {\n        if (days <= 0) {\n            return false;\n        }\n        if (StringUtils.isEmpty(tmEndStr) || StringUtils.isEmpty(tmEndStr)) {\n            return false;\n        }\n        LocalDate startDate = LocalDate.parse(tmStartStr);\n        LocalDate endDate = LocalDate.parse(tmEndStr);\n\n        return startDate.until(endDate, ChronoUnit.DAYS) > days;\n    }\n\n}\n"
  },
  {
    "path": "mmc-dubbo-doe/src/test/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration scan=\"true\" scanPeriod=\"60 seconds\" debug=\"false\">\n\n\n    <property name=\"APP_NAME\" value=\"doe\" />\n    <property name=\"LOG_PATH\" value=\"/app/applogs/${APP_NAME}\" />\n\n\n    <appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n            <!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度%msg：日志消息，%n是换行符-->\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>\n        </encoder>\n    </appender>\n    <appender name=\"INFO\"  class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_PATH}/info.log</file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <!--日志文件输出的文件名-->\n            <FileNamePattern>${LOG_PATH}/info.%d{yyyy-MM-dd}.%i.log.zip</FileNamePattern>\n            <!--日志文件保留天数-->\n            <maxHistory>60</maxHistory>\n            <totalSizeCap>30GB</totalSizeCap>\n            <timeBasedFileNamingAndTriggeringPolicy class=\"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP\">\n                <!--文件达到 最大128MB时会被压缩和切割 -->\n                <maxFileSize>128MB</maxFileSize>\n            </timeBasedFileNamingAndTriggeringPolicy>\n        </rollingPolicy>\n        <encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>\n        </encoder>\n        <filter class=\"ch.qos.logback.classic.filter.LevelFilter\">\n            <level>INFO</level>\n            <onMatch>ACCEPT</onMatch>\n            <onMismatch>DENY</onMismatch>\n        </filter>\n    </appender>\n    <appender name=\"WARN\"  class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_PATH}/warn.log</file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <!--日志文件输出的文件名-->\n            <FileNamePattern>${LOG_PATH}/warn.%d{yyyy-MM-dd}.%i.log.zip</FileNamePattern>\n            <!--日志文件保留天数-->\n            <maxHistory>60</maxHistory>\n            <totalSizeCap>30GB</totalSizeCap>\n            <timeBasedFileNamingAndTriggeringPolicy class=\"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP\">\n                <!--文件达到 最大128MB时会被压缩和切割 -->\n                <maxFileSize>128MB</maxFileSize>\n            </timeBasedFileNamingAndTriggeringPolicy>\n        </rollingPolicy>\n        <encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>\n        </encoder>\n        <filter class=\"ch.qos.logback.classic.filter.LevelFilter\">\n            <level>WARN</level>\n            <onMatch>ACCEPT</onMatch>\n            <onMismatch>DENY</onMismatch>\n        </filter>\n    </appender>\n    <appender name=\"ERROR\"  class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_PATH}/error.log</file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <!--日志文件输出的文件名-->\n            <FileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.%i.log.zip</FileNamePattern>\n            <!--日志文件保留天数-->\n            <maxHistory>60</maxHistory>\n            <totalSizeCap>30GB</totalSizeCap>\n            <timeBasedFileNamingAndTriggeringPolicy class=\"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP\">\n                <!--文件达到 最大128MB时会被压缩和切割 -->\n                <maxFileSize>128MB</maxFileSize>\n            </timeBasedFileNamingAndTriggeringPolicy>\n        </rollingPolicy>\n        <encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>\n        </encoder>\n        <filter class=\"ch.qos.logback.classic.filter.LevelFilter\">\n            <level>ERROR</level>\n            <onMatch>ACCEPT</onMatch>\n            <onMismatch>DENY</onMismatch>\n        </filter>\n    </appender>\n    <appender name=\"asyncFileAppender\" class=\"ch.qos.logback.classic.AsyncAppender\">\n        <discardingThreshold>0</discardingThreshold>\n        <queueSize>512</queueSize>\n        <appender-ref ref=\"INFO\" />\n    </appender>\n\n\n    <!-- 单独文件 -->\n    <!--<appender></appender>-->\n\n\n    <!-- 开发环境 -->\n    <springProfile name=\"dev\">\n        <root level=\"INFO\">\n            <appender-ref ref=\"STDOUT\" />\n        </root>\n    </springProfile>\n\n\n    <!-- 生产环境 -->\n    <springProfile name=\"prd\">\n        <!--<include resource=\"org/springframework/boot/logging/logback/base.xml\" />-->\n        <root level=\"INFO\">\n            <appender-ref ref=\"asyncFileAppender\" />\n            <appender-ref ref=\"ERROR\" />\n            <appender-ref ref=\"WARN\" />\n        </root>\n    </springProfile>\n\n\n</configuration>"
  },
  {
    "path": "mmc-dubbo-doe/src/test/resources/test-pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>mmc-dubbo</groupId>\n    <artifactId>doe</artifactId>\n    <version>1.0-SNAPSHOT</version>\n\n    <dependencies>\n        <dependency>\n            <groupId>mmc-dubbo</groupId>\n            <artifactId>api</artifactId>\n            <version>1.0-SNAPSHOT</version>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <defaultGoal>compile</defaultGoal>\n        <plugins>\n            <plugin>\n                <artifactId>maven-dependency-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <phase>process-sources</phase>\n\n                        <goals>\n                            <goal>copy-dependencies</goal>\n                        </goals>\n\n                        <configuration>\n                            <outputDirectory>/app/doe/lib</outputDirectory>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>\n"
  },
  {
    "path": "mmc-dubbo-provider/.gitignore",
    "content": "##ignore this file##\n.idea/\ntarget\ntarget/\n*.iml\n"
  },
  {
    "path": "mmc-dubbo-provider/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <parent>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>2.0.2.RELEASE</version>\n        <relativePath/> <!-- lookup parent from repository -->\n    </parent>\n\n    <groupId>mmc-dubbo</groupId>\n    <artifactId>provider</artifactId>\n    <version>1.3-SNAPSHOT</version>\n    <packaging>jar</packaging>\n\n    <name>mmc-dubbo-provider</name>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <maven.compiler.source>1.8</maven.compiler.source>\n        <maven.compiler.target>1.8</maven.compiler.target>\n        <!-- springboot 整合 dubbo -->\n        <version.starter.dubbo>0.2.0</version.starter.dubbo>\n        <!-- fastjson -->\n        <version.fastjson>1.2.51</version.fastjson>\n    </properties>\n\n    <dependencies>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.alibaba.boot</groupId>\n            <artifactId>dubbo-spring-boot-starter</artifactId>\n            <version>${version.starter.dubbo}</version>\n        </dependency>\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <optional>true</optional>\n            <scope>compile</scope>\n        </dependency>\n        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->\n        <dependency>\n            <groupId>com.alibaba</groupId>\n            <artifactId>fastjson</artifactId>\n            <version>${version.fastjson}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>mmc-dubbo</groupId>\n            <artifactId>api</artifactId>\n            <version>1.0-RELEASE</version>\n        </dependency>\n\n    </dependencies>\n\n    <build>\n        <finalName>provider</finalName>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n                <configuration>\n                    <mainClass>com.fcbox.conf.server.ConfServerApplication</mainClass>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "mmc-dubbo-provider/src/main/java/com/mmc/dubbo/provider/DubboProviderApplication.java",
    "content": "package com.mmc.dubbo.provider;\n\nimport com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@EnableDubbo\n@SpringBootApplication\npublic class DubboProviderApplication {\n\n    public static void main(String[] args) {\n\n        SpringApplication springApplication = new SpringApplication(DubboProviderApplication.class);\n        springApplication.run(args);\n    }\n}\n\n"
  },
  {
    "path": "mmc-dubbo-provider/src/main/java/com/mmc/dubbo/provider/user/UserFeedbackServiceImpl.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.provider.user;\n\nimport com.alibaba.fastjson.JSON;\nimport com.mmc.dubbo.api.user.GenericReq;\nimport com.mmc.dubbo.api.user.GenericResp;\nimport com.mmc.dubbo.api.user.UserFact;\nimport com.mmc.dubbo.api.user.UserService;\nimport org.springframework.beans.BeanUtils;\n\n/**\n * @author Joey\n * @date 2018/5/8 20:31\n */\n@com.alibaba.dubbo.config.annotation.Service(version = \"2.0.0\", group = \"mmcgroup\")\npublic class UserFeedbackServiceImpl implements UserService {\n\n    /**\n     * 测试方法一（单参数）.\n     *\n     * @param id\n     * @return\n     */\n    @Override\n    public UserFact getCurrentById(long id) {\n\n        System.out.println(\"default provider UserFeedbackServiceImpl.getCurrentById()\");\n\n        UserFact user = new UserFact();\n        user.setId(id);\n        user.setName(\"mmcgroup\");\n\n        return user;\n    }\n\n    /**\n     * 测试方法二（多参数）.\n     *\n     * @param u\n     * @param name\n     * @param sex\n     * @return\n     */\n    @Override\n    public UserFact insert(UserFact u, String name, int sex) {\n\n        UserFact userFact = new UserFact();\n        userFact.setName(name);\n        userFact.setSex(sex);\n        userFact.setId(u.getId());\n\n        return userFact;\n    }\n\n    /**\n     * 泛型测试.\n     *\n     * @param user\n     * @return\n     */\n    @Override\n    public GenericResp<UserFact> echo(GenericReq<UserFact> user) {\n        System.out.println(JSON.toJSONString(user));\n\n        GenericResp<UserFact> resp = new GenericResp<>();\n        BeanUtils.copyProperties(user, resp);\n\n        return resp;\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-provider/src/main/java/com/mmc/dubbo/provider/user/UserMemberServiceImpl.java",
    "content": "/*\n * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.\n *\n * This software is the confidential and proprietary information of\n * Founder. You shall not disclose such Confidential Information\n * and shall use it only in accordance with the terms of the agreements\n * you entered into with Founder.\n *\n */\npackage com.mmc.dubbo.provider.user;\n\nimport com.alibaba.fastjson.JSON;\nimport com.mmc.dubbo.api.user.GenericReq;\nimport com.mmc.dubbo.api.user.GenericResp;\nimport com.mmc.dubbo.api.user.UserFact;\nimport com.mmc.dubbo.api.user.UserService;\nimport org.slf4j.MDC;\nimport org.springframework.beans.BeanUtils;\n\n/**\n * @author Joey\n * @date 2018/5/8 20:31\n */\n@com.alibaba.dubbo.config.annotation.Service\npublic class UserMemberServiceImpl implements UserService {\n\n\n    @Override\n    public UserFact getCurrentById(long id) {\n\n        System.out.println(\"UserMemberServiceImpl.getCurrentById\");\n\n        UserFact user = new UserFact();\n        user.setId(id);\n        user.setName(\"SUCCESS\");\n\n        return user;\n\n    }\n\n    @Override\n    public UserFact insert(UserFact u, String name, int sex) {\n\n        System.out.println(\"UserMemberServiceImpl.insert\");\n\n        UserFact userFact = new UserFact();\n        userFact.setName(name);\n        userFact.setSex(sex);\n        userFact.setId(u.getId());\n\n        return userFact;\n\n    }\n\n    /**\n     * 泛型测试.\n     *\n     * @param user\n     * @return\n     */\n    @Override\n    public GenericResp<UserFact> echo(GenericReq<UserFact> user) {\n\n        System.out.println(JSON.toJSONString(user));\n\n        System.out.println(\"msp: \" + MDC.getCopyOfContextMap());\n\n        GenericResp<UserFact> resp = new GenericResp<>();\n        BeanUtils.copyProperties(user, resp);\n\n        return resp;\n    }\n}\n"
  },
  {
    "path": "mmc-dubbo-provider/src/main/resources/application.yml",
    "content": "# ====================server====================\nserver:\n  port: 8080\nspring:\n  application:\n    name: mmc-dubbo-provider\ndubbo:\n    application:\n        id: mmc-dubbo-provider\n        name: mmc-dubbo-provider\n    protocol:\n        id: dubbo\n        name: dubbo\n        port: 30880\n    registry:\n        address: zookeeper://127.0.0.1:2181\n        id: mmc-dubbo-provider-registry\n    scan:\n        base-packages: com.mmc.dubbo.provider"
  }
]