/// <summary>
        /// Sets file item by index within specified library.
        /// </summary>
        /// <param name="Type">Library type.</param>
        /// <param name="Index">Index of file.</param>
        /// <param name="Item">ImageFileItem to store.</param>
        private void SetFileItem(LibraryTypes Type, int Index, ImageFileItem Item)
        {
            // Index must be within range
            if (Index < 0 || Index >= GetFileCount(Type))
            {
                return;
            }

            // Get path by index
            switch (Type)
            {
            case LibraryTypes.Texture:
                TextureFileItems[Index] = Item;
                break;

            case LibraryTypes.Img:
                ImgFileItems[Index] = Item;
                break;

            case LibraryTypes.Cif:
                CifFileItems[Index] = Item;
                break;

            case LibraryTypes.Rci:
                RciFileItems[Index] = Item;
                break;

            case LibraryTypes.Sky:
                SkyFileItems[Index] = Item;
                break;
            }
        }
        /// <summary>
        /// Discard a file object so it will be garbage collected.
        /// </summary>
        /// <param name="Type">Library type.</param>
        /// <param name="Index">Index of file to discard.</param>
        private void DiscardFile(LibraryTypes Type, int Index)
        {
            // Discard by type
            ImageFileItem Item = GetFileItem(Type, Index);

            Item.ImageFile = null;
            SetFileItem(Type, Index, Item);
        }
        /// <summary>
        /// Loads file by index within specified library.
        /// </summary>
        /// <param name="Type">Library type.</param>
        /// <param name="Index">Index of file.</param>
        /// <returns>True if successful, otherwise false.</returns>
        private bool LoadFile(LibraryTypes Type, int Index)
        {
            // Arena2 must be valid, which implies files are indexed
            if (0 == GetFileCount(Type))
            {
                return(false);
            }

            // Get file item and exit if already loaded (ImageFile is non-null)
            ImageFileItem Item = GetFileItem(Type, Index);

            if (null != Item.ImageFile)
            {
                MyFileIndex = Index;
                return(true);
            }

            // Discard last file
            DiscardLastFile();

            // Compose full path to file
            string FilePath = Path.Combine(MyArena2Path, GetFileName(Type, Index));

            // Create file object
            Item.ImageFile = CreateFile(Type);
            if (null == Item.ImageFile)
            {
                return(false);
            }

            // Load file
            if (!Item.ImageFile.Load(FilePath, Usage, true))
            {
                return(false);
            }

            // Load pallette
            string PaletteName = Item.ImageFile.PaletteName;

            if (!string.IsNullOrEmpty(PaletteName))
            {
                string PalettePath = Path.Combine(MyArena2Path, PaletteName);
                Item.ImageFile.LoadPalette(PalettePath);
            }

            // Set file item
            SetFileItem(Type, Index, Item);

            // Store new file index
            MyFileIndex = Index;

            // Store new library and index for auto-discard later
            LastOpenLibraryType = LibraryType;
            LastOpenFileIndex   = Index;

            return(true);
        }
        /// <summary>
        /// Gets image file object of index from specified library.
        /// </summary>
        /// <param name="Type">Library type.</param>
        /// <param name="Index">Index of file.</param>
        /// <returns>DFImageFile object.</returns>
        private DFImageFile GetImageFile(LibraryTypes Type, int Index)
        {
            // File must be loaded
            if (!LoadFile(Type, Index))
            {
                return(null);
            }

            // Get the item
            ImageFileItem Item = GetFileItem(Type, Index);

            return(Item.ImageFile);
        }
        private void AddFiles(String dirPath)
        {
            //GET FILES
            string[] files = System.IO.Directory.GetFiles(dirPath);
            foreach (string file in files)
            {
                System.IO.FileInfo fileInfo = new System.IO.FileInfo(System.IO.Path.Combine(dirPath, file));
                if (fileInfo.Exists)
                {
                    String fileName = fileInfo.Name;

                    // ADD THE RELATIVE PATH INFORMATION
                    if (dirPath != imagesFolderPath)
                    {
                        fileName = System.IO.Path.Combine(dirPath.Substring(imagesFolderPath.Length + 1), fileName);
                        fileName = fileName.Replace("\\", "/");
                    }

                    // CHECK IF IT IS ASSOCIATED WITH SOME PRODUCT OR OTHER CATALOG ITEM
                    if (IsAssociatedImage(System.IO.Path.Combine("~/Assets/ProductImages/", fileName)))
                    {
                        continue;
                    }

                    ImageFileItem dgFileItem = new ImageFileItem(fileName, fileInfo.Extension, fileInfo.Length);

                    // DIMENTIONS
                    System.Drawing.Image thisImage = null;
                    try
                    {
                        thisImage             = System.Drawing.Image.FromFile(fileInfo.FullName);
                        dgFileItem.Dimensions = string.Format("({0}w X {1}h)", thisImage.Width, thisImage.Height);
                    }
                    catch
                    {
                        dgFileItem.Dimensions = String.Empty;
                    }
                    finally
                    {
                        if (thisImage != null)
                        {
                            thisImage.Dispose();
                            thisImage = null;
                        }
                    }

                    imageFiles.Add(dgFileItem);
                }
            }
        }
        /// <summary>
        /// Index all files of specified library type.
        /// </summary>
        /// <param name="FilePaths">Array of absolute paths to files.</param>
        /// <param name="Type">Library type.</param>
        /// <returns></returns>
        private bool IndexLibrary(ref string[] FilePaths, LibraryTypes Type)
        {
            // Create file name arrays
            switch (Type)
            {
            case LibraryTypes.Texture:
                TextureFileNames = new string[(FilePaths.Length - Arena2.TextureFile.UnsupportedFilenames.Length)];
                break;

            case LibraryTypes.Img:
                ImgFileNames = new string[(FilePaths.Length - Arena2.TextureFile.UnsupportedFilenames.Length)];
                break;

            case LibraryTypes.Cif:
                CifFileNames = new string[FilePaths.Length];
                break;

            case LibraryTypes.Rci:
                RciFileNames = new string[FilePaths.Length];
                break;

            case LibraryTypes.Sky:
                SkyFileNames = new string[FilePaths.Length];
                break;
            }

            // Index and hash files
            int         Index       = 0;
            TextureFile TextureFile = new TextureFile();
            ImgFile     ImgFile     = new ImgFile();

            foreach (string FilePath in FilePaths)
            {
                // Get filename only
                string FileName = Path.GetFileName(FilePath);

                // Handle unsupported TEXTURE files
                if (LibraryTypes.Texture == Type)
                {
                    if (!TextureFile.IsFilenameSupported(FileName))
                    {
                        continue;
                    }
                }

                // Handle unsupported IMG files
                if (LibraryTypes.Img == Type)
                {
                    if (!ImgFile.IsFilenameSupported(FileName))
                    {
                        continue;
                    }
                }

                // Store file name in array
                switch (Type)
                {
                case LibraryTypes.Texture:
                    TextureFileNames[Index] = FileName;
                    break;

                case LibraryTypes.Img:
                    ImgFileNames[Index] = FileName;
                    break;

                case LibraryTypes.Cif:
                    CifFileNames[Index] = FileName;
                    break;

                case LibraryTypes.Rci:
                    RciFileNames[Index] = FileName;
                    break;

                case LibraryTypes.Sky:
                    SkyFileNames[Index] = FileName;
                    break;
                }

                // Create file item
                ImageFileItem Item = new ImageFileItem();
                Item.FileName    = FileName;
                Item.LibraryType = Type;
                Item.ImageFile   = null;

                // Add file item based on type
                switch (Type)
                {
                case LibraryTypes.Texture:
                    TextureFileItems.Add(Item);
                    break;

                case LibraryTypes.Img:
                    ImgFileItems.Add(Item);
                    break;

                case LibraryTypes.Cif:
                    CifFileItems.Add(Item);
                    break;

                case LibraryTypes.Rci:
                    RciFileItems.Add(Item);
                    break;

                case LibraryTypes.Sky:
                    SkyFileItems.Add(Item);
                    break;
                }

                // Hash file index based on type
                switch (Type)
                {
                case LibraryTypes.Texture:
                    TextureHashtable.Add(FileName, Index);
                    break;

                case LibraryTypes.Img:
                    ImgHashtable.Add(FileName, Index);
                    break;

                case LibraryTypes.Cif:
                    CifHashtable.Add(FileName, Index);
                    break;

                case LibraryTypes.Rci:
                    RciHashtable.Add(FileName, Index);
                    break;

                case LibraryTypes.Sky:
                    SkyHashtable.Add(FileName, Index);
                    break;
                }

                // Increment index
                Index++;
            }

            return(true);
        }