<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Pixabay Image Search</title> <link rel="stylesheet" type="text/css" href="css/basic.css"/> <script type="text/javascript" src="scripts/jquery-1.6.2.min.js"></script> <script type="text/javascript" src="locales/locales.js"></script> </head> <body> <!--<p id="lang"></p>--> </body> <script type="text/javascript"> /* This script makes use of the Pixabay image search API, documented here: https://pixabay.com/api/docs/ */ var API_KEY = '2261217-168750d9eaaa0051ca20fa425'; // Number of results per page var limit = 10; // Maximum number of pages to display var maxPages = 10; // Minimum size of pictures to search for var minHeight = 150; var minWidth = 150; // Image type to retrieve. Can be "photo", "illustration", "vector" or "all". var imageType = "all"; // Default language to search in, if the application can't return a suitable one var searchLanguage = "en"; // Language for the widget (languages can be added in locales/locales.js) var locale = locales["en"]; // Fetch 960px images instead of the default 640px. However the API doesn't // provide size information in this case, so it is disabled by default. var fetchMediumResImages = false; // --------------------- // Globals // --------------------- var currentIndex = 0; var currentTerm = ""; var filtersDisplayed = false; // Pixabay's supported search languages var availableLanguages = ['cs', 'da', 'de', 'en', 'es', 'fr', 'id', 'it', 'hu', 'nl', 'no', 'pl', 'pt', 'ro', 'sk', 'fi', 'sv', 'tr', 'vi', 'th', 'bg', 'ru', 'el', 'ja', 'ko', 'zh']; // --------------------- $(document).ready(loadPage) /* Initialize the page layout */ function loadPage() { // Get OpenBoard's current language var appLanguage = window.sankore ? sankore.locale().substr(0,2) : searchLanguage; // Set it as search language, if possible if (availableLanguages.indexOf(appLanguage) > -1) searchLanguage = appLanguage; // And as the widget's language if (locales[searchLanguage] != undefined) locale = locales[searchLanguage]; var mode = false; //search or view mode var hide = false; //hide or no main panel // basic containers and elements var search = $("<div id='search' class='search'>").appendTo("body"); var subSearchInput = $("<div id='subSearchInput' class='subSearch'>").appendTo(search); var subSearchFilter = $("<div id='subSearchFilter' class='subSearch'>").appendTo(search); var searchInput = $("<input id='searchInput' class='searchInput' type='text'/>").appendTo(subSearchInput); var searchButton = $("<div id='searchButton' class='searchButton'>").appendTo(subSearchInput); var toggleFilters = $("<div id='toggleFilters' class='toggleFilters'>").appendTo(subSearchInput); var selectFilter = $("<select id='typeFilter' class='filterSelect'>") .append($("<option value='all'>"+locale.def_opts_val_image+"</option>")) .append($("<option value='photo'>"+locale.image_type_photo+"</option>")) .append($("<option value='illustration'>"+locale.image_type_illustration+"</option>")) .append($("<option value='vector'>"+locale.image_type_vector+"</option>")) $("<div class='filterContainer'>").append("<span>"+locale.image_type_title+":</span><br/>").append(selectFilter).appendTo(subSearchFilter); var searchResult = $("<div id='searchResult'>").appendTo("body"); var disc_nav_cont = $("<div id='disc_nav_cont' class='disc_nav_cont'>").appendTo("body"); var disclaimer = $("<div id='disclaimer' class='disclaimer'>"+locale.disclaimer_title+"<div>").appendTo(disc_nav_cont); // Functions searchButton.click(function(){ if(!hide){ runSearch(searchInput.val(), 0); } }); searchInput.keydown(function(event){ if(!hide){ if((event.keyCode == 0xA)||(event.keyCode == 0xD)){ runSearch(searchInput.val(), 0); } } }); ($(".imgContainer").live("click",function(){ sankore.sendFileMetadata(createMetaData($(this))); })); toggleFilters.click(function(){ if(filtersDisplayed){ subSearchFilter.hide(); toggleFilters.css("background-image","url(images/down.png)"); filtersDisplayed = false; } else { subSearchFilter.css("display","inline-block"); toggleFilters.css("background-image","url(images/up.png)"); filtersDisplayed = true; } }); } function updateFilters() { var value = $("#typeFilter option:selected").val(); imageType = value; } function runSearch(term, index) { updateFilters(); currentTerm = term; currentIndex = index; var page = index+1; // Page numbers start at 1 on Pixabay var url = "https://pixabay.com/api/?key="+API_KEY +"&q="+escape(term) +"&per_page="+limit +"&page="+page +"&min_width="+minWidth +"&minHeight="+minHeight +"&image_type="+imageType +"&lang="+searchLanguage +"&safesearch=true"; //console.log(url); //document.getElementById("lang").innerHTML = "Language: " + searchLanguage; $.ajax({ url: url, success: searchComplete, error: searchFail, dataType: "json" }); } function searchComplete(json) { // Grab our content div, clear it. var totalResults = json.totalHits; var contentDiv = $('#searchResult').empty(); // Loop through our results, printing them to the page. var results = json.hits; if (results.length == 0) $("<p>"+locale.no_result+"</p>").appendTo(contentDiv); for (var i = 0; i < results.length; i++) { var result = results[i]; /* Images are displayed in an `imgContainer` element. It contains the image itself (`newImg`) but also some hidden fields containing metadata that is sent to OpenBoard if the user clicks the image */ // Image element var imgContainer = $("<div class='imgContainer' draggable='true'>"); var newImg = document.createElement('img'); newImg.src = result.previewURL; var imgWidth = (result.previewWidth > minWidth)?result.previewWidth:minWidth; var imgHeight = (result.previewHeight > minHeight)?result.previewHeight:minHeight; imgContainer.width(imgWidth).height(imgHeight); imgContainer.append($(newImg)); // Metadata to send to OpenBoard var iUrl = $("<input type='hidden'/>"); var iContent = $("<input type='hidden'/>"); var iHeight = $("<input type='hidden'/>"); var iWidth = $("<input type='hidden'/>"); var iThumbnailUrl = $("<input type='hidden'/>"); var iTitle = $("<input type='hidden'/>"); var imageURL = result.webformatURL; if (fetchMediumResImages) imageURL = getMediumResURL(result); iUrl.attr("value", imageURL); iContent.attr("value", result.type); iHeight.attr("value", result.webformatHeight); iWidth.attr("value", result.webformatWidth); iThumbnailUrl.attr("value", result.previewURL); iTitle.attr("value", getImageTitle(result)); imgContainer.append(iUrl); imgContainer.append(iContent); imgContainer.append(iHeight); imgContainer.append(iWidth); imgContainer.append(iThumbnailUrl); imgContainer.append(iTitle); // Add the image to the page imgContainer.appendTo(contentDiv); } // Now add links to additional pages of search results. addPaginationLinks(totalResults); } function addPaginationLinks(totalResults) { var curPage = currentIndex; var pagesDiv = $("<div id='resultFooter' class='resultFooter'>"); var highestPageNumber = maxPages; if (totalResults/limit < maxPages) highestPageNumber = totalResults/limit; for (var i = 0; i < highestPageNumber; i++) { var link = $("<a class='pager_button'></a>").attr('href', 'javascript:gotoPage('+i+');').html(i+1).appendTo(pagesDiv); if (curPage == i) link.addClass('active'); } $("#disc_nav_cont #resultFooter").remove(); pagesDiv.insertBefore($('#disclaimer')); $(".imgContainer").each(function(){ this.addEventListener("dragstart", imageDragging, false); }) $(".imgContainer").each(function(){ this.addEventListener("dragenter", imageDragenter, false); }) $(".imgContainer").each(function(){ this.addEventListener("dragleave", imageDragleave, false); }) $(".imgContainer").each(function(){ this.addEventListener("dragover", imageDragover, false); }) } function searchFail(jqXHR, textStatus, errorThrown) { alert('Couldn\'t connect to Pixabay: ' + textStatus + ' ' + errorThrown); } function imageDragging(e){ e.dataTransfer.setData("text/plain",$(this).find("input:hidden").eq(0).val()); } function imageDragleave(e){ return false; } function imageDragover(e){ return false; } function imageDragenter(e){ return false; } function gotoPage(i) { runSearch(currentTerm, i); } function createMetaData(parent){ var meta = ""; //alert($(this).find("input:hidden").eq(0).val()); meta = "<metadata><data><key>Type</key><value>Image</value></data><data><key>Url</key><value>" + parent.find("input:hidden").eq(0).val() + "</value></data><data><key>Content</key><value>" + parent.find("input:hidden").eq(1).val() + "</value></data><data><key>Height</key><value>" + parent.find("input:hidden").eq(2).val() + "</value></data><data><key>Width</key><value>" + parent.find("input:hidden").eq(3).val() + "</value></data><data><key>thumbnailUrl</key><value>" + parent.find("input:hidden").eq(4).val() + "</value></data><data><key>Title</key><value>" + parent.find("input:hidden").eq(5).val() + "</value></data></metadata>"; return meta; } function getImageTitle(image) { // Pixabay images don't have a title, but we can fetch the first tag and use that as a title. var firstTag = image.tags.split(",")[0] //console.log(firstTag); return firstTag; } function getMediumResURL(image) { // Pixabay automatically returns a 640px "webformat" picture; we can't request a larger one // in the search request, but we can manually fetch one (up to 960px) var url = image.webformatURL; medResURL = url.replace("_640.", "_960."); return medResURL; } </script> </html>