Screenshots!

This adds the ability to track screenshots within CRITs. Uploading a screenshot requires association with another top-level object (currently). When uploading you can choose to upload a new image, or provide the IDs (in comma-separated list form) of any screenshots that are already uploaded but you wish to associate with that top-level object. If you upload this way, we will append source information and tags to the existing screenshots. If you upload a duplicate screenshot, this will also happen.

Screenshots are under source access controls, so you shouldn't be seeing any Screenshots that you don't have source access to see.

Screenshots can be tagged with interesting keywords. When viewing a Details page for a top-level object, the Screenshots widget will be added. Any screenshots the top-level object has been assigned with be visible. Also, if any of the buckets assigned to that top-level object match the tags of any screenshots, those will also be shown and have a unique border around them to differentiate. When you hover over each thumbnail you can choose to remove it, or add its ID to your cookie. You can add as many screenshot IDs as you wish. This can be used to enter into the Screenshot upload form. Clicking on the thumbnail itself opens up a gallery view of the image that takes up most of the page. From here you can cycle through all of the screenshots. It will show you the description and any tags in the top bar as you browse them.

There is a Screenshots listing page and you can also search for Screenshots. You can mark screenshots as a Favorite here and they will show up in your Favorites dropdown and Favorites listing tab in your Profile.

Screenshots comes API-ready so you can GET or POST screenshots.

This should cover #23.