public void Parse(string path)
    {
        XmlDocument xmld = new XmlDocument ();

        string xml = "";
        switch (ResourceManager.Instance.getLoadingType ()) {
        case ResourceManager.LoadingType.RESOURCES_LOAD:
            directory = path.Split ('/') [0] + "/";
            if (path.Contains (".xml")) {
                path = path.Replace (".xml", "");
            }
            TextAsset ta = Resources.Load (path) as TextAsset;
            if (ta == null) {
                Debug.Log ("Can't load Descriptor file: " + path);
                return;
            } else
                xml = ta.text;
            break;
        case ResourceManager.LoadingType.SYSTEM_IO:
            xml = System.IO.File.ReadAllText(path);

            directory = "";
            string[] parts = path.Split ('/');

            for(int i = 0; i < parts.Length-1; i++)
                directory += parts[i] + "/";

            break;
        }

        xmld.LoadXml(xml);

        XmlElement element = xmld.DocumentElement
            ,descriptor     = (XmlElement) element.SelectSingleNode ("/game-descriptor")
            ,title          = (XmlElement) descriptor.SelectSingleNode ("title")
            ,description    = (XmlElement) descriptor.SelectSingleNode ("description")
            ,configuration  = (XmlElement) descriptor.SelectSingleNode ("configuration")
            ,contents       = (XmlElement) descriptor.SelectSingleNode ("contents");

        if (descriptor != null) {
            tmpString = descriptor.GetAttribute ("versionNumber");

            if (!string.IsNullOrEmpty(tmpString))
            {
                adventureData.setVersionNumber (tmpString);
            }
        }

        if (title != null) {
            tmpString = title.InnerText;

            if (!string.IsNullOrEmpty(tmpString))
            {
                adventureData.setTitle (tmpString);
            }
        }

        if (description != null) {
            tmpString = description.InnerText;

            if (!string.IsNullOrEmpty(tmpString))
            {
                adventureData.setDescription (tmpString);
            }
        }

        if (configuration != null)
        {
            tmpString = configuration.GetAttribute ("keepShowing");
            if (!string.IsNullOrEmpty(tmpString))
            {
                adventureData.setKeepShowing (tmpString.Equals("yes"));
            }

            tmpString = configuration.GetAttribute ("keyboard-navigation");
            if (!string.IsNullOrEmpty(tmpString))
            {
                adventureData.setKeyboardNavigation (tmpString.Equals("enabled"));
            }

            tmpString = configuration.GetAttribute ("defaultClickAction");
            if (!string.IsNullOrEmpty(tmpString))
            {
                if(tmpString.Equals("showDetails"))
                    adventureData.setDeafultClickAction(DescriptorData.DefaultClickAction.SHOW_DETAILS);
                else if(tmpString.Equals("showDetails"))
                    adventureData.setDeafultClickAction(DescriptorData.DefaultClickAction.SHOW_ACTIONS);
            }

            tmpString = configuration.GetAttribute ("perspective");
            if (!string.IsNullOrEmpty(tmpString))
            {
                if(tmpString.Equals("regular"))
                    adventureData.setPerspective(DescriptorData.Perspective.REGULAR);
                else if(tmpString.Equals("isometric"))
                    adventureData.setPerspective(DescriptorData.Perspective.ISOMETRIC);
            }

            tmpString = configuration.GetAttribute ("dragBehaviour");
            if (!string.IsNullOrEmpty(tmpString))
            {
                if(tmpString.Equals("considerNonTargets"))
                    adventureData.setDragBehaviour(DescriptorData.DragBehaviour.CONSIDER_NON_TARGETS);
                else if(tmpString.Equals("ignoreNonTargets"))
                    adventureData.setDragBehaviour(DescriptorData.DragBehaviour.IGNORE_NON_TARGETS);
            }

            XmlElement gui = (XmlElement) configuration.SelectSingleNode ("gui");
            if (gui != null)
            {
                tmpString = gui.GetAttribute ("type");
                if (!string.IsNullOrEmpty(tmpString))
                {
                    if(tmpString.Equals("traditional"))
                        adventureData.setGUIType(DescriptorData.GUI_TRADITIONAL);
                    else if(tmpString.Equals("contextual"))
                        adventureData.setGUIType(DescriptorData.GUI_CONTEXTUAL);
                }

                tmpString = gui.GetAttribute ("customized");
                if (!string.IsNullOrEmpty(tmpString))
                {
                    adventureData.setGUI(adventureData.getGUIType(), tmpString.Equals("yes"));
                }

                tmpString = gui.GetAttribute ("inventoryPosition");
                if (!string.IsNullOrEmpty(tmpString))
                {
                    switch (tmpString) {
                    case "none":            adventureData.setInventoryPosition(DescriptorData.INVENTORY_NONE); break;
                    case "top_bottom":      adventureData.setInventoryPosition(DescriptorData.INVENTORY_TOP_BOTTOM); break;
                    case "top":             adventureData.setInventoryPosition(DescriptorData.INVENTORY_TOP); break;
                    case "bottom":          adventureData.setInventoryPosition(DescriptorData.INVENTORY_BOTTOM); break;
                    case "fixed_top":       adventureData.setInventoryPosition(DescriptorData.INVENTORY_FIXED_TOP); break;
                    case "fixed_bottom":    adventureData.setInventoryPosition(DescriptorData.INVENTORY_FIXED_BOTTOM); break;
                    }
                }

                XmlNodeList cursors = gui.SelectNodes ("cursors/cursor");
                foreach (XmlElement cursor in cursors) {
                    string type = ""; string uri = "";

                    tmpString = cursor.GetAttribute ("type");
                    if (!string.IsNullOrEmpty(tmpString)){
                        type = tmpString;
                    }

                    tmpString = cursor.GetAttribute ("uri");
                    if (!string.IsNullOrEmpty(tmpString)){
                        uri = tmpString;
                    }

                    adventureData.addCursor(type, uri);
                }

                XmlNodeList buttons = gui.SelectNodes ("buttons/button");
                foreach (XmlElement button in buttons) {
                    string type = ""; string uri = ""; string action = "";

                    tmpString = button.GetAttribute ("type");
                    if (!string.IsNullOrEmpty(tmpString)){
                        type = tmpString;
                    }

                    tmpString = button.GetAttribute ("uri");
                    if (!string.IsNullOrEmpty(tmpString)){
                        uri = tmpString;
                    }

                    tmpString = button.GetAttribute ("action");
                    if (!string.IsNullOrEmpty(tmpString)){
                        action = tmpString;
                    }

                    adventureData.addButton(action, type, uri);
                }

                XmlNodeList arrows = gui.SelectNodes ("cursors/cursor");
                foreach (XmlElement arrow in arrows) {
                    string type = ""; string uri = "";

                    tmpString = arrow.GetAttribute ("type");
                    if (!string.IsNullOrEmpty(tmpString)){
                        type = tmpString;
                    }

                    tmpString = arrow.GetAttribute ("uri");
                    if (!string.IsNullOrEmpty(tmpString)){
                        uri = tmpString;
                    }

                    adventureData.addArrow(type, uri);
                }
            }

            XmlElement mode = (XmlElement) configuration.SelectSingleNode ("mode");
            if (mode != null)
            {
                tmpString = mode.GetAttribute ("playerTransparent");
                if (!string.IsNullOrEmpty(tmpString)){
                    adventureData.setPlayerMode (tmpString.Equals ("yes") ? DescriptorData.MODE_PLAYER_1STPERSON : DescriptorData.MODE_PLAYER_3RDPERSON);
                }
            }

            XmlElement graphics = (XmlElement) configuration.SelectSingleNode ("graphics");
            if (graphics != null)
            {
                tmpString = graphics.GetAttribute ("playerTransparent");
                if (!string.IsNullOrEmpty(tmpString)){
                    switch (tmpString) {
                    case "windowed":    adventureData.setGraphicConfig(DescriptorData.GRAPHICS_WINDOWED); break;
                    case "fullscreen":  adventureData.setGraphicConfig(DescriptorData.GRAPHICS_FULLSCREEN); break;
                    case "blackbkg":    adventureData.setGraphicConfig(DescriptorData.GRAPHICS_BLACKBKG); break;
                    }
                }
            }
        }

        if (contents != null) {
            Chapter currentChapter;

            XmlNodeList chapters = contents.SelectNodes ("chapter");
            foreach (XmlElement chapter in chapters) {
                currentChapter = new Chapter ();

                string chapterPath = "";
                tmpString = chapter.GetAttribute ("path");
                if (!string.IsNullOrEmpty(tmpString)){
                    chapterPath = tmpString;
                }
                currentChapter.setChapterPath(directory + chapterPath);

                ChapterHandler_ chapterParser = new ChapterHandler_(currentChapter);
                chapterParser.Parse (directory + chapterPath);

                title = (XmlElement) chapter.SelectSingleNode ("title");
                if (title != null) {
                    tmpString = title.InnerText;

                    if (!string.IsNullOrEmpty(tmpString))
                    {
                        currentChapter.setTitle (tmpString);
                    }
                }

                description = (XmlElement) chapter.SelectSingleNode ("description");
                if (description != null) {
                    tmpString = title.InnerText;

                    if (!string.IsNullOrEmpty(tmpString))
                    {
                        currentChapter.setDescription (tmpString);
                    }
                }

                XmlElement adaptation = (XmlElement) chapter.SelectSingleNode ("adaptation-configuration");
                if (adaptation != null) {
                    tmpString = adaptation.GetAttribute ("path");
                    if (!string.IsNullOrEmpty (tmpString)) {
                        string adaptationName = tmpString;
                        // delete the path's characteristics
                        adaptationName = adaptationName.Substring (adaptationName.IndexOf ("/") + 1);
                        adaptationName = adaptationName.Substring (0, adaptationName.IndexOf ("."));
                        currentChapter.setAdaptationName (adaptationName);
                    }
                }

                XmlElement assestment = (XmlElement) chapter.SelectSingleNode ("assessment-configuration");
                if (adaptation != null) {
                    tmpString = adaptation.GetAttribute ("path");
                    if (!string.IsNullOrEmpty (tmpString)) {
                        string assessmentName = tmpString;
                        // delete the path's characteristics
                        assessmentName = assessmentName.Substring(assessmentName.IndexOf("/") + 1);
                        assessmentName = assessmentName.Substring(0, assessmentName.IndexOf("."));
                        currentChapter.setAssessmentName(assessmentName);
                    }
                }

                adventureData.addChapter (currentChapter);
            }
        }

        /*if (qName.EndsWith("automatic-commentaries"))
        {
            adventureData.setCommentaries(true);
        }*/
    }
    public override void startElement(string namespaceURI, string sName, string qName, Dictionary <string, string> attrs)
    {
        if (qName.Equals("game-descriptor"))
        {
            foreach (KeyValuePair <string, string> entry in attrs)
            {
                if (entry.Key.Equals("versionNumber"))
                {
                    adventureData.setVersionNumber(entry.Value.ToString());
                }
            }
        }

        if (qName.Equals("configuration"))
        {
            foreach (KeyValuePair <string, string> entry in attrs)
            {
                if (entry.Key.Equals("keepShowing"))
                {
                    adventureData.setKeepShowing(entry.Value.ToString().Equals("yes"));
                }
                if (entry.Key.Equals("keyboard-navigation"))
                {
                    adventureData.setKeyboardNavigation(entry.Value.ToString().Equals("enabled"));
                }

                if (entry.Key.Equals("defaultClickAction"))
                {
                    if (entry.Value.ToString().Equals("showDetails"))
                    {
                        adventureData.setDeafultClickAction(DescriptorData.DefaultClickAction.SHOW_DETAILS);
                    }
                    if (entry.Value.ToString().Equals("showActions"))
                    {
                        adventureData.setDeafultClickAction(DescriptorData.DefaultClickAction.SHOW_ACTIONS);
                    }
                }
                if (entry.Key.Equals("perspective"))
                {
                    if (entry.Value.ToString().Equals("regular"))
                    {
                        adventureData.setPerspective(DescriptorData.Perspective.REGULAR);
                    }
                    if (entry.Value.ToString().Equals("isometric"))
                    {
                        adventureData.setPerspective(DescriptorData.Perspective.ISOMETRIC);
                    }
                }
                if (entry.Key.Equals("dragBehaviour"))
                {
                    if (entry.Value.ToString().Equals("considerNonTargets"))
                    {
                        adventureData.setDragBehaviour(DescriptorData.DragBehaviour.CONSIDER_NON_TARGETS);
                    }
                    if (entry.Value.ToString().Equals("ignoreNonTargets"))
                    {
                        adventureData.setDragBehaviour(DescriptorData.DragBehaviour.IGNORE_NON_TARGETS);
                    }
                }
            }
        }


        // If reading a title, empty the current string
        if (qName.Equals("title") || qName.Equals("description"))
        {
            currentstring = string.Empty;
        }

        if (qName.EndsWith("automatic-commentaries"))
        {
            adventureData.setCommentaries(true);
        }

        // If reading the GUI tag, store the settings
        if (qName.Equals("gui"))
        {
            foreach (KeyValuePair <string, string> entry in attrs)
            {
                if (entry.Key.Equals("type"))
                {
                    if (entry.Value.ToString().Equals("traditional"))
                    {
                        adventureData.setGUIType(DescriptorData.GUI_TRADITIONAL);
                    }
                    else if (attrs["type"].Equals("contextual"))
                    {
                        adventureData.setGUIType(DescriptorData.GUI_CONTEXTUAL);
                    }
                }
                if (entry.Key.Equals("customized"))
                {
                    if (entry.Value.ToString().Equals("yes"))
                    {
                        adventureData.setGUI(adventureData.getGUIType(), true);
                    }
                    else
                    {
                        adventureData.setGUI(adventureData.getGUIType(), false);
                    }
                }
                if (entry.Key.Equals("inventoryPosition"))
                {
                    if (entry.Value.ToString().Equals("none"))
                    {
                        adventureData.setInventoryPosition(DescriptorData.INVENTORY_NONE);
                    }
                    else if (entry.Value.ToString().Equals("top_bottom"))
                    {
                        adventureData.setInventoryPosition(DescriptorData.INVENTORY_TOP_BOTTOM);
                    }
                    else if (entry.Value.ToString().Equals("top"))
                    {
                        adventureData.setInventoryPosition(DescriptorData.INVENTORY_TOP);
                    }
                    else if (entry.Value.ToString().Equals("bottom"))
                    {
                        adventureData.setInventoryPosition(DescriptorData.INVENTORY_BOTTOM);
                    }
                    else if (entry.Value.ToString().Equals("fixed_top"))
                    {
                        adventureData.setInventoryPosition(DescriptorData.INVENTORY_FIXED_TOP);
                    }
                    else if (entry.Value.ToString().Equals("fixed_bottom"))
                    {
                        adventureData.setInventoryPosition(DescriptorData.INVENTORY_FIXED_BOTTOM);
                    }
                }
            }
        }

        //Cursor
        if (qName.Equals("cursor"))
        {
            string type = ""; string uri = "";
            foreach (KeyValuePair <string, string> entry in attrs)
            {
                if (entry.Key.Equals("type"))
                {
                    type = entry.Value.ToString();
                }
                else if (entry.Key.Equals("uri"))
                {
                    uri = entry.Value.ToString();
                }
            }
            adventureData.addCursor(type, uri);
        }

        //Button
        if (qName.Equals("button"))
        {
            string type = ""; string uri = ""; string action = "";
            foreach (KeyValuePair <string, string> entry in attrs)
            {
                if (entry.Key.Equals("type"))
                {
                    type = entry.Value.ToString();
                }
                else if (entry.Key.Equals("uri"))
                {
                    uri = entry.Value.ToString();
                }
                else if (entry.Key.Equals("action"))
                {
                    action = entry.Value.ToString();
                }
            }
            adventureData.addButton(action, type, uri);
        }

        if (qName.Equals("arrow"))
        {
            string type = ""; string uri = "";
            foreach (KeyValuePair <string, string> entry in attrs)
            {
                if (entry.Key.Equals("type"))
                {
                    type = entry.Value.ToString();
                }
                else if (entry.Key.Equals("uri"))
                {
                    uri = entry.Value.ToString();
                }
            }
            adventureData.addArrow(type, uri);
        }

        // If reading the mode tag:
        if (qName.Equals("mode"))
        {
            foreach (KeyValuePair <string, string> entry in attrs)
            {
                if (entry.Key.Equals("playerTransparent"))
                {
                    if (entry.Value.ToString().Equals("yes"))
                    {
                        adventureData.setPlayerMode(DescriptorData.MODE_PLAYER_1STPERSON);
                    }
                    else if (entry.Value.ToString().Equals("no"))
                    {
                        adventureData.setPlayerMode(DescriptorData.MODE_PLAYER_3RDPERSON);
                    }
                }
            }
        }

        if (qName.Equals("graphics"))
        {
            foreach (KeyValuePair <string, string> entry in attrs)
            {
                if (entry.Key.Equals("mode"))
                {
                    if (entry.Value.ToString().Equals("windowed"))
                    {
                        adventureData.setGraphicConfig(DescriptorData.GRAPHICS_WINDOWED);
                    }
                    else if (entry.Value.ToString().Equals("fullscreen"))
                    {
                        adventureData.setGraphicConfig(DescriptorData.GRAPHICS_FULLSCREEN);
                    }
                    else if (entry.Value.ToString().Equals("blackbkg"))
                    {
                        adventureData.setGraphicConfig(DescriptorData.GRAPHICS_BLACKBKG);
                    }
                }
            }
        }


        // If reading the contents tag, switch to the chapters mode
        else if (qName.Equals("contents"))
        {
            reading = READING_CHAPTER;
        }

        // If reading the contents of a chapter, create a new one to store the data
        else if (qName.Equals("chapter"))
        {
            // Create the chapter
            currentChapter = new Chapter();

            // Search and store the path of the file
            string chapterPath = null;
            foreach (KeyValuePair <string, string> entry in attrs)
            {
                if (entry.Key.Equals("path"))
                {
                    chapterPath = entry.Value.ToString();
                }
            }

            if (chapterPath != null)
            {
                currentChapter.setChapterPath(chapterPath);
            }
            else
            {
                currentChapter.setChapterPath("");
            }

            // Open the file and load the data
            try
            {
                // Set the chapter handler
                // ChapterHandler chapterParser = new ChapterHandler(isCreator, currentChapter);
                ChapterHandler_ chapterParser = new ChapterHandler_(currentChapter);
                Debug.Log(currentChapter.getBooks().Count);
                //// Create a new factory
                //SAXParserFactory factory = SAXParserFactory.newInstance();
                ////factory.setValidating( validate );
                //factory.setValidating(false);
                //SAXParser saxParser = factory.newSAXParser();

                //// Set the input stream with the file
                //InputStream chapterIS = isCreator.buildInputStream(chapterPath);

                //// Parse the data and close the data
                //saxParser.parse(chapterIS, chapterParser);
                //chapterIS.close();
                string chapterIS = isCreator.buildInputStream(chapterPath);
                chapterParser.Parse(chapterIS);
            }
            catch (Exception e) { Debug.LogError(e); }
            //catch (ParserConfigurationException e)
            //{
            //    incidences.add(Incidence.createChapterIncidence(Language.GetText("Error.LoadData.SAX"), chapterPath, e));
            //}
            //catch (SAXException e)
            //{
            //    incidences.add(Incidence.createChapterIncidence(Language.GetText("Error.LoadData.SAX"), chapterPath, e));
            //}
            //catch (IOException e)
            //{
            //    incidences.add(Incidence.createChapterIncidence(Language.GetText("Error.LoadData.IO"), chapterPath, e));
            //}
        }
        // If reading the adaptation configuration, store it
        // With last profile modifications, only old games includes that information in its descriptor file.
        // For that reason, the next "path" info is the name of the profile, and it is necessary to eliminate the path's characteristic
        // such as / and .xml
        else if (qName.Equals("adaptation-configuration"))
        {
            foreach (KeyValuePair <string, string> entry in attrs)
            {
                if (entry.Key.Equals("path"))
                {
                    string adaptationName = entry.Value.ToString();
                    // delete the path's characteristics
                    adaptationName = adaptationName.Substring(adaptationName.IndexOf("/") + 1);
                    adaptationName = adaptationName.Substring(0, adaptationName.IndexOf("."));
                    currentChapter.setAdaptationName(adaptationName);
                    // Search in incidences. If an adaptation incidence was related to this profile, the error is more relevant
                    for (int j = 0; j < incidences.Count; j++)
                    {
                        Incidence current = incidences[j];
                        if (current.getAffectedArea() == Incidence.ADAPTATION_INCIDENCE && current.getAffectedResource().Equals(adaptationName))
                        {
                            string message = current.getMessage();
                            incidences.RemoveAt(j);
                            incidences.Insert(j, Incidence.createAdaptationIncidence(true, message + "Error.LoadAdaptation.Referenced", adaptationName, null));
                        }
                    }
                }
            }
        }
        // If reading the assessment configuration, store it
        // With last profile modifications, only old games includes that information in its descriptor file.
        // For that reason, the next "path" info is the name of the profile, and it is necessary to eliminate the path's characteristic
        // such as / and .xml
        else if (qName.Equals("assessment-configuration"))
        {
            foreach (KeyValuePair <string, string> entry in attrs)
            {
                if (entry.Key.Equals("path"))
                {
                    string assessmentName = entry.Value.ToString();
                    // delete the path's characteristics
                    assessmentName = assessmentName.Substring(assessmentName.IndexOf("/") + 1);
                    assessmentName = assessmentName.Substring(0, assessmentName.IndexOf("."));
                    currentChapter.setAssessmentName(assessmentName);
                    // Search in incidences. If an adaptation incidence was related to this profile, the error is more relevant
                    for (int j = 0; j < incidences.Count; j++)
                    {
                        Incidence current = incidences[j];
                        if (current.getAffectedArea() == Incidence.ASSESSMENT_INCIDENCE && current.getAffectedResource().Equals(assessmentName))
                        {
                            string message = current.getMessage();
                            incidences.RemoveAt(j);
                            incidences.Insert(j, Incidence.createAssessmentIncidence(true, message + "Error.LoadAssessment.Referenced", assessmentName, null));
                        }
                    }
                }
            }
        }
    }
    public void Parse(string path)
    {
        XmlDocument xmld = new XmlDocument();

        string xml = "";

        switch (ResourceManager.Instance.getLoadingType())
        {
        case ResourceManager.LoadingType.RESOURCES_LOAD:
            directory = path.Split('/') [0] + "/";
            if (path.Contains(".xml"))
            {
                path = path.Replace(".xml", "");
            }
            TextAsset ta = Resources.Load(path) as TextAsset;
            if (ta == null)
            {
                Debug.Log("Can't load Descriptor file: " + path);
                return;
            }
            else
            {
                xml = ta.text;
            }
            break;

        case ResourceManager.LoadingType.SYSTEM_IO:
            xml = System.IO.File.ReadAllText(path);

            directory = "";
            string[] parts = path.Split('/');

            for (int i = 0; i < parts.Length - 1; i++)
            {
                directory += parts[i] + "/";
            }

            break;
        }

        xmld.LoadXml(xml);

        XmlElement element = xmld.DocumentElement
        , descriptor       = (XmlElement)element.SelectSingleNode("/game-descriptor")
        , title            = (XmlElement)descriptor.SelectSingleNode("title")
        , description      = (XmlElement)descriptor.SelectSingleNode("description")
        , configuration    = (XmlElement)descriptor.SelectSingleNode("configuration")
        , contents         = (XmlElement)descriptor.SelectSingleNode("contents");



        if (descriptor != null)
        {
            tmpString = descriptor.GetAttribute("versionNumber");

            if (!string.IsNullOrEmpty(tmpString))
            {
                adventureData.setVersionNumber(tmpString);
            }
        }

        if (title != null)
        {
            tmpString = title.InnerText;

            if (!string.IsNullOrEmpty(tmpString))
            {
                adventureData.setTitle(tmpString);
            }
        }

        if (description != null)
        {
            tmpString = description.InnerText;

            if (!string.IsNullOrEmpty(tmpString))
            {
                adventureData.setDescription(tmpString);
            }
        }

        if (configuration != null)
        {
            tmpString = configuration.GetAttribute("keepShowing");
            if (!string.IsNullOrEmpty(tmpString))
            {
                adventureData.setKeepShowing(tmpString.Equals("yes"));
            }

            tmpString = configuration.GetAttribute("keyboard-navigation");
            if (!string.IsNullOrEmpty(tmpString))
            {
                adventureData.setKeyboardNavigation(tmpString.Equals("enabled"));
            }

            tmpString = configuration.GetAttribute("defaultClickAction");
            if (!string.IsNullOrEmpty(tmpString))
            {
                if (tmpString.Equals("showDetails"))
                {
                    adventureData.setDeafultClickAction(DescriptorData.DefaultClickAction.SHOW_DETAILS);
                }
                else if (tmpString.Equals("showDetails"))
                {
                    adventureData.setDeafultClickAction(DescriptorData.DefaultClickAction.SHOW_ACTIONS);
                }
            }

            tmpString = configuration.GetAttribute("perspective");
            if (!string.IsNullOrEmpty(tmpString))
            {
                if (tmpString.Equals("regular"))
                {
                    adventureData.setPerspective(DescriptorData.Perspective.REGULAR);
                }
                else if (tmpString.Equals("isometric"))
                {
                    adventureData.setPerspective(DescriptorData.Perspective.ISOMETRIC);
                }
            }

            tmpString = configuration.GetAttribute("dragBehaviour");
            if (!string.IsNullOrEmpty(tmpString))
            {
                if (tmpString.Equals("considerNonTargets"))
                {
                    adventureData.setDragBehaviour(DescriptorData.DragBehaviour.CONSIDER_NON_TARGETS);
                }
                else if (tmpString.Equals("ignoreNonTargets"))
                {
                    adventureData.setDragBehaviour(DescriptorData.DragBehaviour.IGNORE_NON_TARGETS);
                }
            }


            XmlElement gui = (XmlElement)configuration.SelectSingleNode("gui");
            if (gui != null)
            {
                tmpString = gui.GetAttribute("type");
                if (!string.IsNullOrEmpty(tmpString))
                {
                    if (tmpString.Equals("traditional"))
                    {
                        adventureData.setGUIType(DescriptorData.GUI_TRADITIONAL);
                    }
                    else if (tmpString.Equals("contextual"))
                    {
                        adventureData.setGUIType(DescriptorData.GUI_CONTEXTUAL);
                    }
                }

                tmpString = gui.GetAttribute("customized");
                if (!string.IsNullOrEmpty(tmpString))
                {
                    adventureData.setGUI(adventureData.getGUIType(), tmpString.Equals("yes"));
                }

                tmpString = gui.GetAttribute("inventoryPosition");
                if (!string.IsNullOrEmpty(tmpString))
                {
                    switch (tmpString)
                    {
                    case "none":            adventureData.setInventoryPosition(DescriptorData.INVENTORY_NONE); break;

                    case "top_bottom":      adventureData.setInventoryPosition(DescriptorData.INVENTORY_TOP_BOTTOM); break;

                    case "top":             adventureData.setInventoryPosition(DescriptorData.INVENTORY_TOP); break;

                    case "bottom":          adventureData.setInventoryPosition(DescriptorData.INVENTORY_BOTTOM); break;

                    case "fixed_top":       adventureData.setInventoryPosition(DescriptorData.INVENTORY_FIXED_TOP); break;

                    case "fixed_bottom":    adventureData.setInventoryPosition(DescriptorData.INVENTORY_FIXED_BOTTOM); break;
                    }
                }

                XmlNodeList cursors = gui.SelectNodes("cursors/cursor");
                foreach (XmlElement cursor in cursors)
                {
                    string type = ""; string uri = "";

                    tmpString = cursor.GetAttribute("type");
                    if (!string.IsNullOrEmpty(tmpString))
                    {
                        type = tmpString;
                    }

                    tmpString = cursor.GetAttribute("uri");
                    if (!string.IsNullOrEmpty(tmpString))
                    {
                        uri = tmpString;
                    }

                    adventureData.addCursor(type, uri);
                }

                XmlNodeList buttons = gui.SelectNodes("buttons/button");
                foreach (XmlElement button in buttons)
                {
                    string type = ""; string uri = ""; string action = "";

                    tmpString = button.GetAttribute("type");
                    if (!string.IsNullOrEmpty(tmpString))
                    {
                        type = tmpString;
                    }

                    tmpString = button.GetAttribute("uri");
                    if (!string.IsNullOrEmpty(tmpString))
                    {
                        uri = tmpString;
                    }

                    tmpString = button.GetAttribute("action");
                    if (!string.IsNullOrEmpty(tmpString))
                    {
                        action = tmpString;
                    }

                    adventureData.addButton(action, type, uri);
                }

                XmlNodeList arrows = gui.SelectNodes("cursors/cursor");
                foreach (XmlElement arrow in arrows)
                {
                    string type = ""; string uri = "";

                    tmpString = arrow.GetAttribute("type");
                    if (!string.IsNullOrEmpty(tmpString))
                    {
                        type = tmpString;
                    }

                    tmpString = arrow.GetAttribute("uri");
                    if (!string.IsNullOrEmpty(tmpString))
                    {
                        uri = tmpString;
                    }

                    adventureData.addArrow(type, uri);
                }
            }

            XmlElement mode = (XmlElement)configuration.SelectSingleNode("mode");
            if (mode != null)
            {
                tmpString = mode.GetAttribute("playerTransparent");
                if (!string.IsNullOrEmpty(tmpString))
                {
                    adventureData.setPlayerMode(tmpString.Equals("yes") ? DescriptorData.MODE_PLAYER_1STPERSON : DescriptorData.MODE_PLAYER_3RDPERSON);
                }
            }

            XmlElement graphics = (XmlElement)configuration.SelectSingleNode("graphics");
            if (graphics != null)
            {
                tmpString = graphics.GetAttribute("playerTransparent");
                if (!string.IsNullOrEmpty(tmpString))
                {
                    switch (tmpString)
                    {
                    case "windowed":    adventureData.setGraphicConfig(DescriptorData.GRAPHICS_WINDOWED); break;

                    case "fullscreen":  adventureData.setGraphicConfig(DescriptorData.GRAPHICS_FULLSCREEN); break;

                    case "blackbkg":    adventureData.setGraphicConfig(DescriptorData.GRAPHICS_BLACKBKG); break;
                    }
                }
            }
        }

        if (contents != null)
        {
            Chapter currentChapter;

            XmlNodeList chapters = contents.SelectNodes("chapter");
            foreach (XmlElement chapter in chapters)
            {
                currentChapter = new Chapter();

                string chapterPath = "";
                tmpString = chapter.GetAttribute("path");
                if (!string.IsNullOrEmpty(tmpString))
                {
                    chapterPath = tmpString;
                }
                currentChapter.setChapterPath(directory + chapterPath);

                ChapterHandler_ chapterParser = new ChapterHandler_(currentChapter);
                chapterParser.Parse(directory + chapterPath);

                title = (XmlElement)chapter.SelectSingleNode("title");
                if (title != null)
                {
                    tmpString = title.InnerText;

                    if (!string.IsNullOrEmpty(tmpString))
                    {
                        currentChapter.setTitle(tmpString);
                    }
                }

                description = (XmlElement)chapter.SelectSingleNode("description");
                if (description != null)
                {
                    tmpString = title.InnerText;

                    if (!string.IsNullOrEmpty(tmpString))
                    {
                        currentChapter.setDescription(tmpString);
                    }
                }


                XmlElement adaptation = (XmlElement)chapter.SelectSingleNode("adaptation-configuration");
                if (adaptation != null)
                {
                    tmpString = adaptation.GetAttribute("path");
                    if (!string.IsNullOrEmpty(tmpString))
                    {
                        string adaptationName = tmpString;
                        // delete the path's characteristics
                        adaptationName = adaptationName.Substring(adaptationName.IndexOf("/") + 1);
                        adaptationName = adaptationName.Substring(0, adaptationName.IndexOf("."));
                        currentChapter.setAdaptationName(adaptationName);
                    }
                }

                XmlElement assestment = (XmlElement)chapter.SelectSingleNode("assessment-configuration");
                if (adaptation != null)
                {
                    tmpString = adaptation.GetAttribute("path");
                    if (!string.IsNullOrEmpty(tmpString))
                    {
                        string assessmentName = tmpString;
                        // delete the path's characteristics
                        assessmentName = assessmentName.Substring(assessmentName.IndexOf("/") + 1);
                        assessmentName = assessmentName.Substring(0, assessmentName.IndexOf("."));
                        currentChapter.setAssessmentName(assessmentName);
                    }
                }

                adventureData.addChapter(currentChapter);
            }
        }

        /*if (qName.EndsWith("automatic-commentaries"))
         * {
         *  adventureData.setCommentaries(true);
         * }*/
    }
    public override void startElement(string namespaceURI, string sName, string qName, Dictionary<string, string> attrs)
    {
        if (qName.Equals("game-descriptor"))
        {
            foreach (KeyValuePair<string, string> entry in attrs)
                if (entry.Key.Equals("versionNumber"))
                {
                    adventureData.setVersionNumber(entry.Value.ToString());
                }
        }

        if (qName.Equals("configuration"))
        {
            foreach (KeyValuePair<string, string> entry in attrs)
            {

                if (entry.Key.Equals("keepShowing"))
                    adventureData.setKeepShowing(entry.Value.ToString().Equals("yes"));
                if (entry.Key.Equals("keyboard-navigation"))
                    adventureData.setKeyboardNavigation(entry.Value.ToString().Equals("enabled"));

                if (entry.Key.Equals("defaultClickAction"))
                {
                    if (entry.Value.ToString().Equals("showDetails"))
                        adventureData.setDeafultClickAction(DescriptorData.DefaultClickAction.SHOW_DETAILS);
                    if (entry.Value.ToString().Equals("showActions"))
                        adventureData.setDeafultClickAction(DescriptorData.DefaultClickAction.SHOW_ACTIONS);
                }
                if (entry.Key.Equals("perspective"))
                {
                    if (entry.Value.ToString().Equals("regular"))
                        adventureData.setPerspective(DescriptorData.Perspective.REGULAR);
                    if (entry.Value.ToString().Equals("isometric"))
                        adventureData.setPerspective(DescriptorData.Perspective.ISOMETRIC);
                }
                if (entry.Key.Equals("dragBehaviour"))
                {
                    if (entry.Value.ToString().Equals("considerNonTargets"))
                        adventureData.setDragBehaviour(DescriptorData.DragBehaviour.CONSIDER_NON_TARGETS);
                    if (entry.Value.ToString().Equals("ignoreNonTargets"))
                        adventureData.setDragBehaviour(DescriptorData.DragBehaviour.IGNORE_NON_TARGETS);
                }

            }
        }

        // If reading a title, empty the current string
        if (qName.Equals("title") || qName.Equals("description"))
        {
            currentstring = string.Empty;
        }

        if (qName.EndsWith("automatic-commentaries"))
        {
            adventureData.setCommentaries(true);
        }

        // If reading the GUI tag, store the settings
        if (qName.Equals("gui"))
        {
            foreach (KeyValuePair<string, string> entry in attrs)
            {
                if (entry.Key.Equals("type"))
                {
                    if (entry.Value.ToString().Equals("traditional"))
                        adventureData.setGUIType(DescriptorData.GUI_TRADITIONAL);
                    else if (attrs["type"].Equals("contextual"))
                        adventureData.setGUIType(DescriptorData.GUI_CONTEXTUAL);
                }
                if (entry.Key.Equals("customized"))
                {
                    if (entry.Value.ToString().Equals("yes"))
                        adventureData.setGUI(adventureData.getGUIType(), true);
                    else
                        adventureData.setGUI(adventureData.getGUIType(), false);
                }
                if (entry.Key.Equals("inventoryPosition"))
                {
                    if (entry.Value.ToString().Equals("none"))
                        adventureData.setInventoryPosition(DescriptorData.INVENTORY_NONE);
                    else if (entry.Value.ToString().Equals("top_bottom"))
                        adventureData.setInventoryPosition(DescriptorData.INVENTORY_TOP_BOTTOM);
                    else if (entry.Value.ToString().Equals("top"))
                        adventureData.setInventoryPosition(DescriptorData.INVENTORY_TOP);
                    else if (entry.Value.ToString().Equals("bottom"))
                        adventureData.setInventoryPosition(DescriptorData.INVENTORY_BOTTOM);
                    else if (entry.Value.ToString().Equals("fixed_top"))
                        adventureData.setInventoryPosition(DescriptorData.INVENTORY_FIXED_TOP);
                    else if (entry.Value.ToString().Equals("fixed_bottom"))
                        adventureData.setInventoryPosition(DescriptorData.INVENTORY_FIXED_BOTTOM);
                }
            }
        }

        //Cursor
        if (qName.Equals("cursor"))
        {
            string type = ""; string uri = "";
            foreach (KeyValuePair<string, string> entry in attrs)
            {
                if (entry.Key.Equals("type"))
                {
                    type = entry.Value.ToString();
                }
                else if (entry.Key.Equals("uri"))
                {
                    uri = entry.Value.ToString();
                }
            }
            adventureData.addCursor(type, uri);
        }

        //Button
        if (qName.Equals("button"))
        {
            string type = ""; string uri = ""; string action = "";
            foreach (KeyValuePair<string, string> entry in attrs)
            {
                if (entry.Key.Equals("type"))
                {
                    type = entry.Value.ToString();
                }
                else if (entry.Key.Equals("uri"))
                {
                    uri = entry.Value.ToString();
                }
                else if (entry.Key.Equals("action"))
                {
                    action = entry.Value.ToString();
                }
            }
            adventureData.addButton(action, type, uri);
        }

        if (qName.Equals("arrow"))
        {
            string type = ""; string uri = "";
            foreach (KeyValuePair<string, string> entry in attrs)
            {
                if (entry.Key.Equals("type"))
                {
                    type = entry.Value.ToString();
                }
                else if (entry.Key.Equals("uri"))
                {
                    uri = entry.Value.ToString();
                }
            }
            adventureData.addArrow(type, uri);
        }

        // If reading the mode tag:
        if (qName.Equals("mode"))
        {
            foreach (KeyValuePair<string, string> entry in attrs)
                if (entry.Key.Equals("playerTransparent"))
                    if (entry.Value.ToString().Equals("yes"))
                        adventureData.setPlayerMode(DescriptorData.MODE_PLAYER_1STPERSON);
                    else if (entry.Value.ToString().Equals("no"))
                        adventureData.setPlayerMode(DescriptorData.MODE_PLAYER_3RDPERSON);
        }

        if (qName.Equals("graphics"))
        {
            foreach (KeyValuePair<string, string> entry in attrs)
            {
                if (entry.Key.Equals("mode"))
                {
                    if (entry.Value.ToString().Equals("windowed"))
                    {
                        adventureData.setGraphicConfig(DescriptorData.GRAPHICS_WINDOWED);
                    }
                    else if (entry.Value.ToString().Equals("fullscreen"))
                    {
                        adventureData.setGraphicConfig(DescriptorData.GRAPHICS_FULLSCREEN);
                    }
                    else if (entry.Value.ToString().Equals("blackbkg"))
                    {
                        adventureData.setGraphicConfig(DescriptorData.GRAPHICS_BLACKBKG);
                    }
                }
            }
        }

        // If reading the contents tag, switch to the chapters mode
        else if (qName.Equals("contents"))
        {
            reading = READING_CHAPTER;
        }

        // If reading the contents of a chapter, create a new one to store the data
        else if (qName.Equals("chapter"))
        {
            // Create the chapter
            currentChapter = new Chapter();

            // Search and store the path of the file
            string chapterPath = null;
            foreach (KeyValuePair<string, string> entry in attrs)
                if (entry.Key.Equals("path"))
                    chapterPath = entry.Value.ToString();

            if (chapterPath != null)
            {
                currentChapter.setChapterPath(chapterPath);
            }
            else
                currentChapter.setChapterPath("");

            // Open the file and load the data
            try
            {
                // Set the chapter handler
                // ChapterHandler chapterParser = new ChapterHandler(isCreator, currentChapter);
                ChapterHandler_ chapterParser = new ChapterHandler_(currentChapter);
                Debug.Log(currentChapter.getBooks().Count);
                //// Create a new factory
                //SAXParserFactory factory = SAXParserFactory.newInstance();
                ////factory.setValidating( validate );
                //factory.setValidating(false);
                //SAXParser saxParser = factory.newSAXParser();

                //// Set the input stream with the file
                //InputStream chapterIS = isCreator.buildInputStream(chapterPath);

                //// Parse the data and close the data
                //saxParser.parse(chapterIS, chapterParser);
                //chapterIS.close();
                string chapterIS = isCreator.buildInputStream(chapterPath);
                chapterParser.Parse(chapterIS);

            }
            catch (Exception e) { Debug.LogError(e); }
            //catch (ParserConfigurationException e)
            //{
            //    incidences.add(Incidence.createChapterIncidence(Language.GetText("Error.LoadData.SAX"), chapterPath, e));
            //}
            //catch (SAXException e)
            //{
            //    incidences.add(Incidence.createChapterIncidence(Language.GetText("Error.LoadData.SAX"), chapterPath, e));
            //}
            //catch (IOException e)
            //{
            //    incidences.add(Incidence.createChapterIncidence(Language.GetText("Error.LoadData.IO"), chapterPath, e));
            //}

        }
        // If reading the adaptation configuration, store it
        // With last profile modifications, only old games includes that information in its descriptor file.
        // For that reason, the next "path" info is the name of the profile, and it is necessary to eliminate the path's characteristic
        // such as / and .xml
        else if (qName.Equals("adaptation-configuration"))
        {
            foreach (KeyValuePair<string, string> entry in attrs)
                if (entry.Key.Equals("path"))
                {
                    string adaptationName = entry.Value.ToString();
                    // delete the path's characteristics
                    adaptationName = adaptationName.Substring(adaptationName.IndexOf("/") + 1);
                    adaptationName = adaptationName.Substring(0, adaptationName.IndexOf("."));
                    currentChapter.setAdaptationName(adaptationName);
                    // Search in incidences. If an adaptation incidence was related to this profile, the error is more relevant
                    for (int j = 0; j < incidences.Count; j++)
                    {
                        Incidence current = incidences[j];
                        if (current.getAffectedArea() == Incidence.ADAPTATION_INCIDENCE && current.getAffectedResource().Equals(adaptationName))
                        {
                            string message = current.getMessage();
                            incidences.RemoveAt(j);
                            incidences.Insert(j, Incidence.createAdaptationIncidence(true, message + "Error.LoadAdaptation.Referenced", adaptationName, null));
                        }
                    }
                }
        }
        // If reading the assessment configuration, store it
        // With last profile modifications, only old games includes that information in its descriptor file.
        // For that reason, the next "path" info is the name of the profile, and it is necessary to eliminate the path's characteristic
        // such as / and .xml
        else if (qName.Equals("assessment-configuration"))
        {
            foreach (KeyValuePair<string, string> entry in attrs)
                if (entry.Key.Equals("path"))
                {
                    string assessmentName = entry.Value.ToString();
                    // delete the path's characteristics
                    assessmentName = assessmentName.Substring(assessmentName.IndexOf("/") + 1);
                    assessmentName = assessmentName.Substring(0, assessmentName.IndexOf("."));
                    currentChapter.setAssessmentName(assessmentName);
                    // Search in incidences. If an adaptation incidence was related to this profile, the error is more relevant
                    for (int j = 0; j < incidences.Count; j++)
                    {
                        Incidence current = incidences[j];
                        if (current.getAffectedArea() == Incidence.ASSESSMENT_INCIDENCE && current.getAffectedResource().Equals(assessmentName))
                        {
                            string message = current.getMessage();
                            incidences.RemoveAt(j);
                            incidences.Insert(j, Incidence.createAssessmentIncidence(true, message + "Error.LoadAssessment.Referenced", assessmentName, null));
                        }
                    }

                }
        }
    }