# Source: HighChart.js

    (function () {
        "use strict";
        /**
         * Creates new HighChart
         * @class HighChart
         */
        var HighChart = function () {
            var helper = require("./TestHelper");
            var TestHelperPO = require("./TestHelperPO");
            var logger = require("./Logger.js");
            var fs = require("fs");
            var Promise = require("bluebird");

            var section, container, svg, tooltip;
            var EC = protractor.ExpectedConditions;
            return {
                /**
                 * set Chart Elements
                 * @method setChartElements
                 * @param {object} sectionElement
                 */
                setChartElements: function (sectionElement) {
                    section = sectionElement;
                    container = section.element(by.css("div.highcharts-container"));
                    svg = container.element(by.css("svg"));
                    logger.info("chart elements set for section " + sectionElement)
                },
                /**
                 * set svg element
                 * @method setSVG
                 * @param {object} svgElement
                 */
                setSVG: function (svgElement) {
                    svg = svgElement;
                    logger.info("svg element set " + svgElement)
                },
                /**
                 * get svg element
                 * @method getSVG
                 * @return {object} svg
                 */
                getSVG: function () {
                    return svg
                },
                /**
                 * set container element
                 * @method setContianer
                 * @param {object} containerElement
                 */
                setContainer: function (containerElement) {
                    container = containerElement;
                    logger.info("container set " + containerElement)
                },
                /**
                 * get container element
                 * @method getContainer
                 * @return {object} container
                 */
                getContainer: function () {
                    return container
                },
                /**
                 * check if chart is displayed
                 * @method isChartDisplayed
                 * @return {boolean}
                 */
                isChartDisplayed: function () {
                    return svg.isPresent()
                },

                /**
                 * get text displayed in x-axis or y-axis
                 * @method getAxisText
                 * @param {int} index
                 * @return {string}
                 */
                getAxisText: function (index) {
                    logger.info("get axis text using index " + index);
                    return this.getAxisTextByIndex(index)
                },

                /**
                 * get text displayed in x-axis
                 * @method getXaxisText
                 * @return {string}
                 */
                getXaxisText: function () {
                    logger.info("get x-axis text");
                    return this.getAxisTextByIndex(1)
                },

                /**
                 * get text displayed in y-axis
                 * @method getYaxisText
                 * @return {string}
                 */
                getYaxisText: function () {
                    logger.info("get y-axis text");
                    return this.getAxisTextByIndex(2)
                },

                /**
                 * get text displayed in axis
                 * @method getAxisTextByIndex
                 * @param {int} index (1 for x-axis, 2 for y-axis)
                 * @return {string}
                 */
                getAxisTextByIndex: function (index) {
                    logger.info("get axis text by index " + index);
                    var deferred = protractor.promise.defer();
                    index = index - 1;
                    this.waitForChartElement("svg g.highcharts-axis");
                    svg = section.element(by.css("svg"));
                    svg.all(by.css("g.highcharts-axis")).filter(function (li, id) {
                        return id === index
                    }).then(function (texts) {
                        if (texts.length === 1) {
                            texts[0].getText().then(function (text) {
                                deferred.fulfill(text)
                            })
                        } else {
                            deferred.reject(new Error("axis text not found for given index!"));
                            logger.info("axis text not found for given index!")
                        }
                    });
                    return deferred.promise
                },

                /**
                 * get labels displayed in x-axis
                 * @method getXaxisLabels
                 * @return {list}
                 */
                getXaxisLabels: function () {
                    logger.info("get x-axis labels");
                    return this.getAxisLabels("x")
                },
                /**
                 * get labels displayed in y-axis
                 * @method getYaxisLabels
                 * @return {list}
                 */
                getYaxisLabels: function () {
                    logger.info("get y-axis labels");
                    return this.getAxisLabels("y")
                },
                /**
                 * get labels displayed in x-axis or y-axis
                 * @param axis
                 * @method getAxisLabels
                 * @return {list}
                 */
                getAxisLabels: function (axis, index) {
                    logger.info("get axis labels");
                    var deferred = protractor.promise.defer();

                    function querytext(x, y) {
                        return new Promise(function (resolve, reject) {
                            resolve(robot.moveMouse(x, y))
                        })
                    }

                    if (index === undefined)index = 0; else index = index - 1;
                    var txtList = svg.all(by.css("svg g.highcharts-" + axis + "axis-labels")).get(index);
                    txtList.all(by.css("text")).then(function (list) {
                        var items = new Array;
                        list.forEach(function (li, index) {
                            li.getText().then(function (text) {
                                if (text.trim().length > 0) {
                                    items.push(text)
                                }
                            })
                        });
                        return items
                    }).then(function (items) {
                        if (items.length > 0)deferred.fulfill(items); else {
                            deferred.reject(new Error(axis + "-axis labels list is empty!"));
                            logger.info(axis + "-axis labels list is empty!")
                        }
                    });
                    return deferred.promise
                },
                /**
                 * get legends displayed in section (outside svg element)
                 * @method getLegendsFromSection
                 * @return {list}
                 */
                getLegendsFromSection: function () {
                    logger.info("get legends from section div");
                    var deferred = protractor.promise.defer();
                    this.waitForChartElement("div.highcharts-legend-item");
                    section.all(by.css("div.highcharts-legend-item")).then(function (list) {
                        var items = new Array;
                        list.forEach(function (item, index) {
                            item.getText().then(function (text) {
                                items.push(text)
                            })
                        });
                        return items
                    }).then(function (legends) {
                        if (legends.length > 0)deferred.fulfill(legends); else deferred.reject("No legends!")
                    });
                    return deferred.promise
                },

                /** get highchart data in highchart demo website based on the tooltip
                 * @method getChartData
                 * @parameter index_data if set to null it will return the whole data for the highcharts
                 *                       if it is not null, it will check whehther the tooltipdata exit in the highchart,
                 *                                          the mouse will stay on that point if fount it.
                 * @return the whole data string and also save the data in csv file.
                 * */
                getChartData: function (index_data) {
                    var deferred = protractor.promise.defer();
                    if (process.env.highchart === "true") {
                        logger.info("get data from section svg");
                        robot.setMouseDelay(0);
                        function querytext(x, y) {
                            return new Promise(function (resolve, reject) {
                                resolve(robot.moveMouse(x, y))
                            })
                        }

                        return TestHelperPO.isElementPresent(element(by.xpath('//*[@id="menu-second"]/ul/li[1]/a'))).then(function () {
                            var mouse = robot.getMousePos();
                            console.log("Mouse is at x:" + mouse.x + " y:" + mouse.y);
                            var screenSize = robot.getScreenSize();
                            var width = screenSize.width;
                            var text_results = new Array;
                            var items = new Array;
                            var ind = index_data;

                            function querylist() {
                                return new Promise(function (resolve, reject) {
                                    resolve(svg.all(by.css("g.highcharts-tooltip")).then(function (list) {
                                        if (typeof list != "undefined" && list) {
                                            console.log("list: " + list);
                                            console.log("list length: " + list.length);
                                            list[0].getText().then(function (text) {
                                                if (typeof text != "undefined" && text) {
                                                    console.log("in get tooltip 4");
                                                    list[0].getText().then(function (text) {
                                                        console.log("in get tooltip 5" + text);
                                                        var result = text.replace(/,\s/g, " ");
                                                        result = result.replace(/[^\w\s("|,|:|(.\d)|-]/g, "");
                                                        items.push(result);
                                                        console.log("text is" + text);
                                                        console.log("index_data is" + ind);
                                                        if (result.toString() === ind.toString()) {
                                                            browser.sleep(3e3).then(function () {
                                                                deferred.fulfill(true);
                                                                return deferred.promise
                                                            })
                                                        }
                                                    }).catch(function (error) {
                                                        console.log("error in querrylist 1:" + error)
                                                    })
                                                } else {
                                                    throw new Error("oh no! text is null")
                                                }
                                            })
                                        } else {
                                            throw new Error("oh no! list is null")
                                        }
                                    }))
                                })
                            }

                            console.log("w: " + width);
                            var step = function (i, done) {
                                console.log("I start is: " + i);
                                if (i <= width) {
                                    console.log("i is: " + i + "width is: " + width);
                                    querytext(i, 350).then(function () {
                                        querylist().then(function (text) {
                                            if (typeof text != "undefined" && text) {
                                                console.log("text is:" + text);
                                                console.log("I in queryList: " + i)
                                            }
                                            step(i + 1)
                                        }).catch(function (error) {
                                            console.log("error in svg all:" + error);
                                            step(i + 1)
                                        })
                                    })
                                } else {
                                    console.log("should not print");
                                    var uniqueArray = items.filter(function (elem, pos) {
                                        return items.indexOf(elem) == pos
                                    });
                                    var datetime = new Date;
                                    var res_string = uniqueArray.join();
                                    res_string = res_string.replace(/,/g, "\n");
                                    fs.writeFile("./testchartdata" + datetime + ".csv", res_string, function (err) {
                                        if (err)console.log(err); else {
                                            deferred.fulfill(res_string)
                                        }
                                    })
                                }
                                console.log("Test")
                            };
                            step(330);
                            console.log("post for loop");
                            return deferred.promise
                        })
                    }
                    else {
                        logger.info("Highchart disabled. Please enable highchart in .env to use functions. Make 'highchart=true'");
                        console.log("Highchart disabled. Please enable highchart in .env to use functions. Make 'highchart=true'");
                        throw new Error("Highchart disabled. Please enable highchart in .env to use functions. Make 'highchart=true'")
                    }
                },

                /** get apm chart data based on the tooltip
                 * @method getChartData
                 * @parameter   startx the start x position for mouse to start
                 *              starty the start y position for mouse to start
                 *              endx the end x position will be screenwidth-endx
                 *              index_data if set to null it will return the whole data for the highcharts
                 *                       if it is not null, it will check whehther the tooltipdata exit in the highchart,
                 *                                          the mouse will stay on that point if fount it
                 *              rollrange the scroll range for page
                 *              rolldirection the scroll direction for page
                 * @return the whole data string and also save the data in csv file.
                 * */
                getApmChartData: function (startx, starty, endx, index_data, rollrange, rolldirection) {
                    var deferred = protractor.promise.defer();
                    console.log("Here is the value for highchart: "+process.env.highchart);
                    if (process.env.highchart === "true") {
                        var robot = require("robotjs");
                        logger.info("get data from section svg");
                        robot.setMouseDelay(0);
                        function querytext(x, y) {
                            return new Promise(function (resolve, reject) {
                                resolve(robot.moveMouse(x, y))
                            })
                        }

                        return TestHelperPO.isElementPresent(element(by.xpath('//*[@id="highcharts-0"]'))).then(function () {
                            var mouse = robot.getMousePos();
                            var screenSize = robot.getScreenSize();
                            var width = screenSize.width;
                            var text_results = new Array;
                            var items = new Array;
                            var tooltip = container.element(by.css("div.highcharts-tooltip"));

                            function querylist() {
                                return new Promise(function (resolve, reject) {
                                    resolve(tooltip.all(by.css("span")).then(function (list) {
                                        if (typeof list != "undefined" && list) {
                                            list[0].getText().then(function (text) {
                                                if (typeof text != "undefined" && text) {
                                                    list[0].getText().then(function (text) {
                                                        var editdata = text.split("\n");
                                                        var editdata_1 = editdata.join();
                                                        editdata = editdata_1 + "\n";
                                                        items.push(editdata);
                                                        if (editdata_1.toString() === index_data.toString()) {
                                                            browser.sleep(3e3).then(function () {
                                                                items = [];
                                                                items.push(true)
                                                            })
                                                        } else {
                                                            var int_1 = string_1.replace(/\.[0-9]\d*/g, " ");
                                                            var int_2 = string_2.replace(/\.[0-9]\d*/g, " ");
                                                            int_1 = int_1.toString();
                                                            int_2 = int_2.toString();
                                                            if (int_1 != null && int_2 != null && int_1.valueOf() === int_2.valueOf()) {
                                                                browser.sleep(3e3).then(function () {
                                                                    items = [];
                                                                    items.push(true)
                                                                })
                                                            }
                                                        }
                                                    })
                                                }
                                            })
                                        }
                                    }))
                                })
                            }

                            console.log("w: " + width);
                            querytext(startx, starty).then(function () {
                                robot.mouseClick();
                                if(rollrange != null && rolldirection != null)
                                robot.scrollMouse(rollrange, rolldirection)
                            });
                            var step = function (i, done) {
                                if (i <= width - endx) {
                                    querytext(i, starty).then(function () {
                                        querylist().then(function () {
                                            if (typeof items[0] === "boolean") {
                                                deferred.fulfill(items[0]);
                                                return deferred.promise;
                                                i = width
                                            } else {
                                                step(i + 1)
                                            }
                                        }).catch(function (error) {
                                            step(i + 1)
                                        })
                                    })
                                } else {
                                    var uniqueArray = items.filter(function (elem, pos) {
                                        return items.indexOf(elem) == pos
                                    });
                                    var result = uniqueArray.join(" ");
                                    fs.writeFile("./testcharhhihiiktdata.csv", result, function (err) {
                                        if (err)console.log(err); else {
                                            deferred.fulfill(result)
                                        }
                                    })
                                }
                            };
                            step(startx);
                            return deferred.promise
                        })
                    }
                    else {
                        logger.info("Highchart disabled. Please enable highchart in .env to use functions. Make 'highchart=true'");
                        console.error("Highchart disabled. Please enable highchart in .env to use functions. Make 'highchart=true'");
                        throw new Error("Highchart disabled. Please enable highchart in .env to use functions. Make 'highchart=true'")
                    }
                },
                /** get BM chart data based on the tooltip
                 * @method getBMChartData
                 * @parameter   startx the start x position for mouse to start
                 *              starty the start y position for mouse to start
                 *              endx the end x position will be screenwidth-endx
                 *              index_data if set to null it will return the whole data for the highcharts
                 *                       if it is not null, it will check whehther the tooltipdata exit in the highchart,
                 *                                          the mouse will stay on that point if fount it
                 *              rollrange the scroll range for page
                 *              rolldirection the scroll direction for page
                 * @return the whole data string and also save the data in csv file.
                 * */
                getBMChartData: function (startx, starty, endx, index_data, rollrange, rolldirection) {
                    var deferred = protractor.promise.defer();
                    console.log("Here is the value for highchart: " + process.env.highchart);
                    if (process.env.highchart === "true") {
                        var robot = require("robotjs");
                        logger.info("get data from section svg");
                        robot.setMouseDelay(0);
                        function querytext(x, y) {
                            return new Promise(function (resolve, reject) {
                                console.log("moving the mouse")
                                resolve(robot.moveMouse(x, y))
                            })
                        }
                        // console.log("I need to get High Chart : ");
                        return TestHelperPO.isElementPresent(element(by.css('#container > div.highcharts-container'))).then(function () {
                            var mouse = robot.getMousePos();
                            var screenSize = robot.getScreenSize();
                            var width = screenSize.width;
                            console.log("width is "+width)
                            var text_results = new Array;
                            var items = new Array;
                            var tooltip = container.element(by.css("g.highcharts-tooltip"));

                            function querylist() {
                                return new Promise(function (resolve, reject) {
                                    resolve(tooltip.all(by.css("tspan")).then(function (list) {
                                        //console.log("list is" +list)
                                        if (typeof list != "undefined" && list) {
                                            tooltip.getText().then(function (text) {
                                                if (typeof text != "undefined" && text) {
                                                    //list.getText().then(function (text) {
                                                    var editdata = text.split("\n");
                                                    var editdata_1 = editdata.join();
                                                    editdata = editdata_1 + "\n";
                                                    console.log("list length is "+list.length);
                                                    editdata = editdata.replace(/\d+/g, '$&,');
                                                    console.log("editdata is : "+editdata)
                                                    items.push(editdata);
                                                    if (editdata_1.toString() === index_data.toString()) {
                                                        browser.sleep(3e3).then(function () {
                                                            items = [];
                                                            items.push(true)
                                                        })
                                                    } else {
                                                        var int_1 = string_1.replace(/\.[0-9]\d*/g, " ");
                                                        var int_2 = string_2.replace(/\.[0-9]\d*/g, " ");
                                                        int_1 = int_1.toString();
                                                        int_2 = int_2.toString();
                                                        if (int_1 != null && int_2 != null && int_1.valueOf() === int_2.valueOf()) {
                                                            browser.sleep(3e3).then(function () {
                                                                items = [];
                                                                items.push(true)
                                                            })
                                                        }
                                                    }
                                                    //})
                                                }
                                            })

                                        }
                                    }))
                                })
                            }

                            console.log("w: " + width);
                            querytext(startx, starty).then(function () {
                                robot.mouseClick();
                                console.log("Here is the start")
                                console.log("rollrange is "+rollrange)
                                console.log("rolldirection is " +rolldirection)
                                //robot.scrollMouse(rollrange, rolldirection)
                            });
                            var step = function (i, done) {
                                if (i <= width - endx) {
                                    console.log("into step"+ i)
                                    querytext(i, starty).then(function () {
                                        querylist().then(function () {
                                            if (typeof items[0] === "boolean") {
                                                deferred.fulfill(items[0]);
                                                return deferred.promise;
                                                i = width
                                            } else {
                                                step(i + 10)
                                            }
                                        }).catch(function (error) {
                                            step(i + 10)
                                        })
                                    })
                                } else {
                                    var uniqueArray = items.filter(function (elem, pos) {
                                        return items.indexOf(elem) == pos
                                    });
                                    var result = uniqueArray.join(" ");
                                    fs.writeFile("./testcharhhihiiktdata.csv", result, function (err) {
                                        if (err)console.log(err); else {
                                            deferred.fulfill(result)
                                        }
                                    })
                                }
                            };
                            step(startx);
                            return deferred.promise
                        })
                    } else {
                        logger.info("Highchart disabled. Please enable highchart in .env to use functions. Make 'highchart=true'");
                        console.error("Highchart disabled. Please enable highchart in .env to use functions. Make 'highchart=true'");
                        throw new Error("Highchart disabled. Please enable highchart in .env to use functions. Make 'highchart=true'")
                    }
                },
                /** get OO chart data based on the tooltip
                 * @method getOOChartData
                 * @parameter time_stamp, the time you want to get the tooltip data, it can be a single time or a time range
                 *                        seperated by comma i.e."Monday,Thursday" which means Monday to Friday
                 *            loopTime,   the maximam loop time for user to find the time stamp, if the program does not find
                 *                        the time stamp after the maximum loopTimes it will quit.
                 *            startx,     the start x pixel value for the mouse to start
                 *            starty,     the start y pixel value for the mouse to start
                 *            endx,       the mouse will move horizontally, the endx is the pixel value to the right edge of
                 *                        the screen
                 *            rollrange the scroll range for page
                 *            rolldirection the scroll direction for page
                 * @return the whole data string and also save the data in csv file.
                 * */

                getOOChartData: function (time_stamp, loopTime, startx, starty, endx, rollrange, rolldirection) {
                    var deferred = protractor.promise.defer();
                    if (process.env.highchart === "true") {
                        logger.info("get data from section svg");
                        time_stamp = time_stamp.split(",");
                        robot.setMouseDelay(0);
                        function querytext(x, y) {
                            return new Promise(function (resolve, reject) {
                                resolve(robot.moveMouse(x, y))
                            })
                        }

                        return TestHelperPO.isElementPresent(element(by.xpath('//*[@id="r2d1"]/div/section'))).then(function () {
                            var mouse = robot.getMousePos();
                            var screenSize = robot.getScreenSize();
                            var width = screenSize.width;
                            var text_results = new Array;
                            var items = new Array;
                            var found = new Array;
                            var loopcount = 0;
                            var tooltip = container.element(by.css("div.highcharts-tooltip"));

                            function querylist() {
                                return new Promise(function (resolve, reject) {
                                    resolve(tooltip.all(by.css("span")).then(function (list) {
                                        if (typeof list != "undefined" && list) {
                                            list[0].getText().then(function (text) {
                                                if (typeof text != "undefined" && text) {
                                                    list[0].getText().then(function (text) {
                                                        var editdata = text.split("\n");
                                                        editdata[3] = editdata[3].replace(/,/g, " ");
                                                        var temptagtime = (editdata[2] + editdata[3]).toString();
                                                        editdata = (editdata[0] + " " + editdata[1]).toString() + "," + (editdata[2] + editdata[3]).toString();
                                                        editdata += "\n";
                                                        items.push(editdata);
                                                        if (temptagtime == time_stamp[0] || temptagtime == time_stamp[1] || loopcount === loopTime) {
                                                            found.push(true)
                                                        }
                                                    })
                                                }
                                            })
                                        }
                                    }))
                                })
                            }

                            querytext(300, 450).then(function () {
                                robot.mouseClick();
                                robot.scrollMouse(rollrange, rolldirection)
                            });
                            var step = function (i, done) {
                                if (i <= width - endx) {
                                    querytext(i, starty).then(function () {
                                        querylist().then(function () {
                                            if (found[0] === true) {
                                                var uniqueArray = items.filter(function (elem, pos) {
                                                    return items.indexOf(elem) == pos
                                                });
                                                var result = uniqueArray.join(" ");
                                                fs.writeFile("./testOOhighchartdata.csv", result, function (err) {
                                                    if (err)console.log(err); else {
                                                        deferred.fulfill(result)
                                                    }
                                                })
                                            } else {
                                                step(i + 1)
                                            }
                                        }).catch(function (error) {
                                            step(i + 1)
                                        })
                                    })
                                } else {
                                    loopcount++;
                                    step(startx)
                                }
                            };
                            step(startx);

                        })
                    }
                    else {
                        logger.info("Highchart disabled. Please enable highchart in .env to use functions. Make 'highchart=true'");
                        console.error("Highchart disabled. Please enable highchart in .env to use functions. Make 'highchart=true'");
                        throw new Error("Highchart disabled. Please enable highchart in .env to use functions. Make 'highchart=true'");
                    }
                },

                /** get the tooltip information for apmhighchart
                 * @method getTooltipInfo
                 * @parameter Timestamp,  the timerange you want to get for the tooltip, if set to null will print no data.
                 *            Tagname,    the tagname or tagname list  you want to get for highchart, if set to null,
                 *                        will print all tag
                 *            startx,     the start x pixel value for the mouse to start
                 *            starty,     the start y pixel value for the mouse to start
                 *            endx,       the mouse will move horizontally, the endx is the pixel value to the right edge of
                 *                        the screen
                 *            rollrange the scroll range for page
                 *            rolldirection the scroll direction for page
                 *            needVerify,  if set to true, it will verify the tagname exits in the tooltip,
                 *                                        return ture if the tag exit and
                 *                                      return false if the tag is not exit
                 *                         if set to false, it will return the value under the tag name,
                 *                         if the tag does not exit, it will put "no data" under that tag
                 */
                getTooltipInfo: function (Timestamp, Tagname, needVerify, startx, starty, endx, rollrange, rolldirection) {
                    var deferred = protractor.promise.defer();
                    if (process.env.highchart === "true") {
                        logger.info("get data from section svg");
                        console.log("rollrange" + rollrange);
                        console.log("rolldirection" + rolldirection);
                        robot.setMouseDelay(0);
                        function querytext(x, y) {
                            return new Promise(function (resolve, reject) {
                                resolve(robot.moveMouse(x, y))
                            })
                        }

                        function scrollpage(x, y) {
                            return new Promise(function (resolve, reject) {
                                resolve(robot.scrollMouse(x, y))
                            })
                        }

                        scrollpage(rollrange, rolldirection);
                        if (!Timestamp || 0 === Timestamp.length) {
                            Timestamp = " "
                        }
                        if (!Tagname || 0 === Tagname.length) {
                            Tagname = " "
                        }
                        var timevalue = Timestamp.split(",");
                        var tagvaule = Tagname.split(",");
                        var timeindex = 0;
                        return TestHelperPO.isElementPresent(element(by.xpath('//*[@id="highcharts-0"]'))).then(function () {
                            var mouse = robot.getMousePos();
                            var screenSize = robot.getScreenSize();
                            var width = screenSize.width;
                            var text_results = new Array;
                            var items = new Array;
                            var tooltip = container.element(by.css("div.highcharts-tooltip"));

                            function querylist() {
                                return new Promise(function (resolve, reject) {
                                    resolve(tooltip.all(by.css("span")).then(function (list) {
                                        if (typeof list != "undefined" && list) {
                                            list[0].getText().then(function (text) {
                                                if (typeof text != "undefined" && text) {
                                                    list[0].getText().then(function (text) {
                                                        if (timeindex < 2) {
                                                            var res = new Array;
                                                            var editdata = text.split("\n");
                                                            res.push(editdata[0].toString());
                                                            if (timevalue.length > 1 && timeindex > 0 || editdata[0].toString() === timevalue[timeindex].toString()) {
                                                                browser.sleep(1e3).then(function () {
                                                                    var getValue = function (m, j) {
                                                                        if (m < editdata.length && j < tagvaule.length) {
                                                                            var insideloop = function (m) {
                                                                                var temptag = editdata[m].split(":");
                                                                                if (temptag[0].toString() === tagvaule[j].toString()) {
                                                                                    res.push(temptag[1].toString());
                                                                                    getValue(1, j + 1)
                                                                                } else {
                                                                                    if (m === editdata.length - 1) {
                                                                                        if (needVerify === false) {
                                                                                            var missingtag = "no data";
                                                                                            res.push(missingtag);
                                                                                            getValue(1, j + 1)
                                                                                        } else {
                                                                                            items = [];
                                                                                            items.push(false)
                                                                                        }
                                                                                    } else {
                                                                                        getValue(m + 1, j)
                                                                                    }
                                                                                }
                                                                            };
                                                                            insideloop(m)
                                                                        } else {
                                                                            if (needVerify === false) {
                                                                                items.push(res.join());
                                                                                if (editdata[0].toString() === timevalue[timeindex].toString()) {
                                                                                    timeindex++;
                                                                                    return items
                                                                                }
                                                                            } else {
                                                                                items = [];
                                                                                items.push(true)
                                                                            }
                                                                        }
                                                                    };
                                                                    getValue(1, 0)
                                                                })
                                                            }
                                                        }
                                                    })
                                                }
                                            })
                                        }
                                    }))
                                })
                            }

                            querytext(300, 450).then(function () {
                                robot.mouseClick()
                            });
                            var step = function (i, done) {
                                if (i <= width - endx) {
                                    querytext(i, starty).then(function () {
                                        querylist().then(function () {
                                            if (typeof items[0] === "boolean") {
                                                deferred.fulfill(items[0]);
                                                return deferred.promise;
                                                i = width
                                            } else if (needVerify === false && timeindex === timevalue.length) {
                                                var uniqueArray = items.filter(function (elem, pos) {
                                                    return items.indexOf(elem) == pos
                                                });
                                                deferred.fulfill(uniqueArray);
                                                return deferred.promise;
                                                i = width
                                            } else {
                                                step(i + 1)
                                            }
                                        }).catch(function (error) {
                                            step(i + 1)
                                        })
                                    })
                                } else {
                                    var uniqueArray = items.filter(function (elem, pos) {
                                        return items.indexOf(elem) == pos
                                    });
                                    var result = uniqueArray.join(" ");
                                    fs.writeFile("./testcharhhihiiktdata.csv", result, function (err) {
                                        if (err)console.log(err); else {
                                            deferred.fulfill(items)
                                        }
                                    })
                                }
                            };
                            step(startx);
                            return deferred.promise
                        })
                    }
                    else {
                        logger.info("Highchart disabled. Please enable highchart in .env to use functions. Make 'highchart=true'");
                        console.log("Highchart disabled. Please enable highchart in .env to use functions. Make 'highchart=true'");
                        throw new Error("Highchart disabled. Please enable highchart in .env to use functions. Make 'highchart=true'")
                    }
                },

                /** compare the data with the data in the file line by line with only the integer part
                 * @method compareData
                 * @parameter testdata, the string of the data you get
                 ordfile, the path for the file that contains data
                 * @return boolean value if the similarity is over 95% then true, else false
                 */
                compareData: function (testdata, orgfile) {
                    var deferred = protractor.promise.defer();
                    console.log("type of testdata " + typeof testdata);
                    testdata = testdata.toString();
                    console.log("type of testdata " + typeof testdata);
                    fs.readFile(orgfile, "utf8", function (err, contents) {
                        if (err)throw err;
                        var arr_now = testdata.split("\n");
                        var arr_org = contents.split("\n");
                        var count = 0;
                        for (var i = 0, j = 0; i < arr_now.length && j < arr_org.length;) {
                            var string_1 = arr_now[i].toString().trim();
                            var string_2 = arr_org[j].toString().trim();
                            if (string_1.valueOf() === string_2.valueOf()) {
                                count++;
                                i++;
                                j++;
                                continue
                            } else {
                                var int_1 = string_1.replace(/\.[0-9]\d*/g, " ");
                                var int_2 = string_2.replace(/\.[0-9]\d*/g, " ");
                                int_1 = int_1.toString();
                                int_2 = int_2.toString();
                                if (int_1 != null && int_2 != null && int_1.valueOf() === int_2.valueOf()) {
                                    count++;
                                    i++;
                                    j++;
                                    continue
                                } else {
                                    console.log("int_1 is " + int_1);
                                    console.log("int_2 is " + int_2);
                                    i++;
                                    j++;
                                    continue
                                }
                            }
                        }
                        var res = count / arr_org.length;
                        console.log("res is " + res);
                        console.log("count is " + count);
                        if (res >= .9) {
                            deferred.fulfill(true)
                        } else {
                            deferred.fulfill(false)
                        }
                    });
                    return deferred.promise
                },
                getLegendsFromSVG: function () {
                    logger.info("get legends from section svg");
                    var deferred = protractor.promise.defer();
                    this.waitForChartElement("svg g.highcharts-legend-item");
                    svg.all(by.css("g.highcharts-legend-item")).then(function (list) {
                        var items = new Array;
                        list.forEach(function (item, index) {
                            item.getText().then(function (text) {
                                items.push(text);
                                deferred.fulfill(items)
                            })
                        })
                    });
                    return deferred.promise
                },

                getParallelAxiesOrder: function () {
                    var deferred = protractor.promise.defer();
                    logger.info("get parallel axies order from left to right");
                    this.waitForChartElement(element.all("#chartSVG > g:nth-child(2) > g").get(1));
                    var axises = element.all(by.css("#chartSVG > g:nth-child(2) > g"));
                    axises.count().then(function (len) {
                        console.log("axises length is" + len)
                        var i = 0;
                        var res = new Array()
                        var step = function (i, done) {
                            if (i < len - 1) {
                                var curaxis = axises.get(i)
                                curaxis.getAttribute("transform").then(function (translate) {
                                    console.log(" I am here")
                                    var temp = new Array();
                                    translate = translate.toString()
                                    console.log("translate is " + translate)
                                    var start = translate.indexOf("(")
                                    console.log("start is " + start)
                                    var end = translate.indexOf(")")
                                    console.log("end is " + end)
                                    var numbers_string = translate.substring(start + 1, end)
                                    var x = Number(numbers_string.split(",")[0])
                                    console.log("x is " + x)
                                    element.all(by.css('#chartSVG > g:nth-child(2) > g #message')).get(i).getInnerHtml().then(function (text) {
                                        //console.log("text is " + text)
                                        var atext = text.toString();
                                        //console.log("atext is " + atext)
                                        var btext = atext.replace(/<.*>/g, "");
                                        //console.log("btext is " + btext)
                                        temp.push(x)
                                        temp.push(btext)
                                        res.push(temp)
                                        step(i + 1)
                                        //})
                                    })

                                })
                                // })
                            } else {
                                var sortedRes = res.sort(function (a, b) {
                                    return a[0] - b[0];
                                });
                                deferred.fulfill(sortedRes);
                            }

                        };
                        step(0)

                    })
                    return deferred.promise
                },

                verifyParellelTimerangecoverall: function(){
                    var deferred = protractor.promise.defer();
                    logger.info("get parallel axies order from left to right");
                    this.waitForChartElement(element.all("#chartSVG > g:nth-child(2) > g").last());
                    var axises = element.all(by.css("#chartSVG > g:nth-child(2) > g"));
                    var brush = element(by.css("#chartSVG > g:nth-child(2) > g > rect.overlay"));
                    var res;
                    brush.getAttribute("x").then(function(start){
                        console.log("start "+ start)
                        var select_range = element(by.css("#chartSVG > g:nth-child(2) > g > rect.selection"))
                        select_range.getAttribute("x").then(function(start_position){
                            if(start == start_position){
                                brush.getAttribute("width").then(function(length){
                                    console.log("end_position "+ length)
                                    var select_range = element(by.css("#chartSVG > g:nth-child(2) > g > rect.selection"))
                                    select_range.getAttribute("width").then(function(end_position){
                                        if(length == end_position){
                                            deferred.fulfill(false)
                                        }
                                    })
                                })
                            }else{
                                deferred.fulfill(false)
                            }
                        })
                    })
                    return deferred.promise

                },
                waitForChartElement: function (element) {
                    browser.wait(EC.presenceOf(section.element(by.css(element))), 6e4)
                }
            }
        };
        module.exports = new HighChart
    })();