private static void HandleGVSEndElement(string element)
        {
            switch (element.ToLower())
            {
            case "visualgroup":
                if (group != null && group.Count > 0)
                {
                    groups.Add(group);
                    group     = null;
                    vselement = null;
                }
                break;

            case "visualelement":
                if (!vselement.IsValid())
                {
                    throw new InvalidDataException("Invalid VisualElement, must contain a path to the file, coordinates, and a trigger key");
                }
                if (group == null)     // elements do not have to be grouped
                {
                    group = new List <VisualScriptElement>();
                    group.Add(vselement);
                    groups.Add(group);
                }
                else
                {
                    group.Add(vselement);
                }
                vselement = new VisualScriptElement();
                break;
            }
        }
        private static void HandleGVSElement(string element)
        {
            switch (element.ToLower())
            {
            case "scriptname":
                xmlReader.Read();
                gvsName = xmlReader.Value;
                break;

            case "scriptauthor":
                xmlReader.Read();
                gvsAuthor = xmlReader.Value;
                break;

            case "visualgroup":
                group = new List <VisualScriptElement>();
                break;

            case "visualelement":
                vselement = new VisualScriptElement();
                break;

            case "imgpath":
                xmlReader.Read();
                String path = Path.GetDirectoryName(gvsPath) + "\\" + xmlReader.Value.Replace('/', '\\');
                if (!File.Exists(path))
                {
                    throw new FileNotFoundException();
                }
                vselement.Image = new Bitmap(Image.FromFile(path));
                break;

            case "coords":
                xmlReader.Read();
                String[] xy = xmlReader.Value.Split(',');
                if (xy.Length != 2)
                {
                    throw new InvalidDataException("Coordinate elements must have 2 coordinates seperated by a ','");
                }
                vselement.AddCoordinates(new Point(Int32.Parse(xy[0]), Int32.Parse(xy[1])));
                break;

            case "trigkey":
                xmlReader.Read();
                vselement.TriggerKey = xmlReader.Value;
                break;

            case "comparemethod":
                xmlReader.Read();
                vselement.CompareMethod = (ImageCompareMethod)Int32.Parse(xmlReader.Value);
                break;

            case "tolerancelevel":
                xmlReader.Read();
                vselement.ToleranceLevel = Double.Parse(xmlReader.Value);
                break;
            }
        }