TiledTileset LoadTilesetData( XElement node, TiledTileset tileset )
        {
            if( node.Name != "tileset" )
            {
                Log.Editor.WriteError("Cannot load tileset data! (Element should be <tileset>, not <{0}>)", node.Name);
                return null;
            }

            if( tileset == null )
            {
                Log.Editor.WriteError("Cannot load tileset data! (Tileset is NULL)");
                return null;
            }

            // Read attributes
            foreach( var attribute in node.Attributes() )
            {
                switch( attribute.Name.LocalName )
                {
                    case "firstgid":
                        tileset.FirstGID = int.Parse(attribute.Value, System.Globalization.NumberStyles.Integer);
                        break;

                    case "name":
                        tileset.Name = attribute.Value;
                        break;

                    case "tilewidth":
                        tileset.TileW = int.Parse(attribute.Value, System.Globalization.NumberStyles.Integer);
                        break;

                    case "tileheight":
                        tileset.TileH = int.Parse(attribute.Value, System.Globalization.NumberStyles.Integer);
                        break;

                    case "tilecount":
                        tileset.TileCount = int.Parse(attribute.Value, System.Globalization.NumberStyles.Integer);
                        break;

                    // Tilemap is using an external tileset file; go recursive!
                    case "source":
                        using( TextReader txt = new StreamReader(FileOp.Open(@"Source\Media\"+attribute.Value, FileAccessMode.Read) ) )
                        {
                            var xml = new XmlData();
                            var data = txt.ReadToEnd();
                            xml.SetData(data, data.Length, Encoding.Unicode);
                            xml.Validate(); // Not sure if this is necessary

                            // Data is valid
                            if( xml.IsValid )
                                return LoadTilesetData(xml.XmlDocument.Root, tileset);

                            Log.Editor.WriteError("Unable to load external tileset!");
                            return null;
                        }

                    default:
                        Log.Editor.WriteWarning("Attribute {0} not supported in tilesets.", attribute.Name);
                        break;
                }
            }

            foreach( var xelem in node.Elements() )
            {
                var element = (XElement)xelem;

                switch( element.Name.LocalName )
                {
                    case "properties":
                        tileset.LoadProperties( element );
                        break;

                    case "tileoffset":
                        tileset.LoadOffset( element );
                        break;

                    case "image":
                        tileset.LoadImage( element );
                        break;

                    case "terraintypes":
                        tileset.LoadTerrainTypes( element );
                        break;

                    case "tile":
                        tileset.LoadTerrainTile( element );
                        break;

                    default:
                        Log.Editor.WriteWarning("Element {0} not supported in tilesets.", element.Name);
                        break;
                }
            }

            return tileset;
        }
        TiledTileset LoadTileset( XElement node )
        {
            if( node.HasAttributes )
            {
                Log.Editor.Write("Loading tileset..."); //node.Attribute("name").Value);

                var tileset = new TiledTileset();
                tileset.Parent = this;

                return LoadTilesetData( node, tileset );
            }

            return null;
        }