From 6c3cd2b4f2552958986b3b9d6a10de33c2ad8bc8 Mon Sep 17 00:00:00 2001 From: orbiter Date: Mon, 18 Feb 2008 16:38:06 +0000 Subject: [PATCH] - added new way to watch images from the image search: they appear as separate, floating window above the search results, not in a new window - added highslide javascript library for feature mentioned above - removed dir servlet. This thing was not used as it was supposed to be (as an example applet) and was a major problem for intranet-indexing when files are hosted on the same peer. - added yacy-httpd-internal directory listing. Because YaCy is a search engine, directory listings are similar to search result listings. Intranet indexing from the same peer will get nice index pages for document collections. - removed unused test applet git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@4494 6c8d7289-2bf4-0310-a012-ef5d649a1542 --- .classpath | 2 - htroot/TestApplet.html | 36 - htroot/TestApplet.java | 99 - htroot/env/highslide.css | 77 + htroot/htdocsdefault/dir.html | 263 -- htroot/htdocsdefault/dir.java | 353 --- htroot/htdocsdefault/dir.rss | 20 - htroot/htdocsdefault/dir.xml | 19 - htroot/js/highslide.js | 2281 +++++++++++++++++ htroot/yacy/user/ysearch.html | 5 +- htroot/yacy/user/ysearchitem.html | 5 +- htroot/yacysearch.html | 17 +- htroot/yacysearchitem.html | 5 +- .../htmlFilter/htmlFilterContentScraper.java | 14 + source/de/anomic/http/httpdFileHandler.java | 87 +- source/yacy.java | 6 +- 16 files changed, 2463 insertions(+), 826 deletions(-) delete mode 100644 htroot/TestApplet.html delete mode 100644 htroot/TestApplet.java create mode 100644 htroot/env/highslide.css delete mode 100644 htroot/htdocsdefault/dir.html delete mode 100644 htroot/htdocsdefault/dir.java delete mode 100644 htroot/htdocsdefault/dir.rss delete mode 100644 htroot/htdocsdefault/dir.xml create mode 100755 htroot/js/highslide.js diff --git a/.classpath b/.classpath index 790c1dfc9..e9f4050d3 100644 --- a/.classpath +++ b/.classpath @@ -1,10 +1,8 @@ - - diff --git a/htroot/TestApplet.html b/htroot/TestApplet.html deleted file mode 100644 index a1f1ca2c5..000000000 --- a/htroot/TestApplet.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - YaCy '#[clientname]#': test Applet - #%env/templates/metas.template%# - - - #%env/templates/header.template%# -

Test Applet

- #(mode)# -
- - - - - - - - - - -
relative Path/yacysearch.html
Parameters - search=yacy
- -
- :: - returned Templates:
-
- returned Template Structure:
-
- returned Text:
-
- #(/mode)# - #%env/templates/footer.template%# - - diff --git a/htroot/TestApplet.java b/htroot/TestApplet.java deleted file mode 100644 index 1956462fa..000000000 --- a/htroot/TestApplet.java +++ /dev/null @@ -1,99 +0,0 @@ -// TestApplet.java -// ----------------------- -// (C) 2006 by Alexander Schier -// part of YACY -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -import java.io.File; -import java.lang.reflect.InvocationTargetException; -import java.util.Iterator; - -import de.anomic.http.httpHeader; -import de.anomic.http.httpdFileHandler; -import de.anomic.server.serverByteBuffer; -import de.anomic.server.serverObjects; -import de.anomic.server.serverSwitch; - -public class TestApplet { - public static serverObjects respond(httpHeader header, serverObjects post, serverSwitch env) { - serverObjects prop = new serverObjects(); - - if(post== null || !post.containsKey("url")){ - prop.put("mode", "0"); - return prop; - } - serverObjects args=new serverObjects(); - - String[] lines=((String)post.get("arguments")).split("\n"); - String[] pair; - for(int i=0;i it = tp.keySet().iterator(); - StringBuffer tmp = new StringBuffer(); - String key = ""; - while(it.hasNext()){ - key = it.next(); - tmp.append(key).append("=").append(tp.get(key)).append("\n"); - } - prop.put("mode_templates", tmp.toString()); - //FileInputStream fis=null; - //try { - //fis=new FileInputStream(templatefile); - - serverByteBuffer o=new serverByteBuffer(); - //byte[] structure=httpTemplate.writeTemplate(fis, o, tp, "-UNRESOLVED_PATTERN-".getBytes("UTF-8")); - //prop.put("mode_structure", structure); - prop.put("mode_text", o.toString()); - return prop; - //} - //catch (FileNotFoundException e) {} - //catch (UnsupportedEncodingException e) {} - //catch (IOException e) {} - - //prop.put("mode_text", "could not finish correctly"); //very informative errormessage - //return prop; - - } - -} diff --git a/htroot/env/highslide.css b/htroot/env/highslide.css new file mode 100644 index 000000000..2df28018b --- /dev/null +++ b/htroot/env/highslide.css @@ -0,0 +1,77 @@ +/* highslide styles for rounded boxes, taken from highslide demo page */ +.highslide { + cursor: url(highslide/graphics/zoomin.cur), pointer; + outline: none; +} +.highslide-active-anchor img { + visibility: hidden; +} +.highslide img { + border: 2px solid gray; +} +.highslide:hover img { + border: 2px solid white; +} + +.highslide-wrapper { + background: white; +} +.highslide-image { + border: 2px solid white; +} +.highslide-image-blur { +} +.highslide-caption { + display: none; + + border: 2px solid white; + border-top: none; + font-family: Verdana, Helvetica; + font-size: 10pt; + padding: 5px; + background-color: white; +} +.highslide-loading { + display: block; + color: black; + font-size: 8pt; + font-family: sans-serif; + font-weight: bold; + text-decoration: none; + padding: 2px; + border: 1px solid black; + background-color: white; + + padding-left: 22px; + background-image: url(highslide/graphics/loader.white.gif); + background-repeat: no-repeat; + background-position: 3px 1px; +} +a.highslide-credits, +a.highslide-credits i { + padding: 2px; + color: silver; + text-decoration: none; + font-size: 10px; +} +a.highslide-credits:hover, +a.highslide-credits:hover i { + color: white; + background-color: gray; +} + +a.highslide-full-expand { + background: url(highslide/graphics/fullexpand.gif) no-repeat; + display: block; + margin: 0 10px 10px 0; + width: 34px; + height: 34px; +} + +/* These must always be last */ +.highslide-display-block { + display: block; +} +.highslide-display-none { + display: none; +} diff --git a/htroot/htdocsdefault/dir.html b/htroot/htdocsdefault/dir.html deleted file mode 100644 index 2f5b1b67f..000000000 --- a/htroot/htdocsdefault/dir.html +++ /dev/null @@ -1,263 +0,0 @@ - - - -YaCy: Public Files - - - - - - - - - - - - - - -
- - - - - - -
- - YaCy-Logo - - - - - - -
-
- - Public File Directory - -
-
-
- - - -
-
- -
-
  
-
-
- - - -
  - - - - - - - - - -
Welcome! You are identified and authorized as "#(ident)#Administrator::Uploader::Downloader::not authorized#(/ident)#". - #(logout)# -
- -  (enter empty account) -
- :: -
- -  (enter empty account) -
- :: -
- -  (enter empty account) -
- :: - #(/logout)# -
- - - - - - - - - - -
- - - - - -
Service
- #(service)# - - - - - - - - - -
New Directory:
- -   - -
-
File Upload:
- Resource =  - -
- Indexing : 
- -
-
- :: - You are granted to view directory listings and do downloads in this directory.
- If you want to upload, please log in as user 'upload' - :: - No service available. - #(/service)# -
-
- - - - - -
Account
- #(account)# - - - - - - - - - -
upload:
- -   - -
-
download:
- -   - -
-
- :: -
- - -
- :: -
- - -
-
- - -
- :: -
- - -
-
- - -
-
- - -
- #(/account)# -
-
- - - - - -
Info
- #(info)# - Admin and download accounts are necessary to grant their services to clients; - no password is required for the download-account unless you set one. - Files uploaded and indexed here have a special index entry 'yacyshare'; - if you want to find files that are indexed in any share zone, add the word 'yacyshare' to the search words. - :: - Uploaders are not granted to delete files or directories. If you want to do this, log-in as admin. - :: - Download is granted even if no download account has been defined.
- If you are an administrator and you wish to block non-authorized downloades, please log in as user 'admin' and set a download password. - :: - You must log-in to upload or download. - #(/info)# -
-
- -
- - -
-

- - - - -#{dirlist}# - -#(dir)# - - - - - -:: - - - - - -#(/dir)# -#(adminAuthorization)# -:: - -#(/adminAuthorization)# - -#{/dirlist}# -
#[path]#
- #[date]##[name]##[size]##[md5s]##(descriptionMode)##[text]#::#[text]##(/descriptionMode)##[date]##[name]# Directory -
- - - -
-
-#(emptydir)#::EMPTY
#(/emptydir)# -#(authenticated)#To inspect this directory you need either an admin, upload or download account. Please log in.::#(/authenticated)# -

-
- -

-Access of this page with the URLs: -http://#[peeraddress]#/share/, or http://share.#[peerdomain]#.yacy -from within the YaCy network. -

- -
 
- - diff --git a/htroot/htdocsdefault/dir.java b/htroot/htdocsdefault/dir.java deleted file mode 100644 index b03c92dae..000000000 --- a/htroot/htdocsdefault/dir.java +++ /dev/null @@ -1,353 +0,0 @@ -// dir.java -// (C) 2004, 2005 by Michael Peter Christen; mc@yacy.net, Frankfurt a. M., Germany -// first published 2004 on http://yacy.net -// -// This is a part of YaCy, a peer-to-peer based web search engine -// -// $LastChangedDate$ -// $LastChangedRevision$ -// $LastChangedBy$ -// -// LICENSE -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.IOException; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Date; -import java.util.Iterator; - -import de.anomic.data.userDB; -import de.anomic.http.httpHeader; -import de.anomic.http.httpc; -import de.anomic.http.httpd; -import de.anomic.index.indexURLEntry; -import de.anomic.kelondro.kelondroBase64Order; -import de.anomic.kelondro.kelondroBitfield; -import de.anomic.plasma.plasmaCondenser; -import de.anomic.plasma.plasmaHTCache; -import de.anomic.plasma.plasmaSwitchboard; -import de.anomic.server.serverCodings; -import de.anomic.server.serverCore; -import de.anomic.server.serverDomains; -import de.anomic.server.serverFileUtils; -import de.anomic.server.serverMemory; -import de.anomic.server.serverObjects; -import de.anomic.server.serverSwitch; -import de.anomic.server.logging.serverLog; -import de.anomic.server.serverFileUtils.dirlistComparator; -import de.anomic.tools.md5DirFileFilter; -import de.anomic.yacy.yacyCore; -import de.anomic.yacy.yacySeed; -import de.anomic.yacy.yacyURL; - -public class dir { - - private static SimpleDateFormat SimpleFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); - public static String dateString(Date date) { - return SimpleFormatter.format(date); - } - - public static serverObjects respond(httpHeader header, serverObjects post, serverSwitch env) { - final plasmaSwitchboard switchboard = (plasmaSwitchboard) env; - final serverObjects prop = new serverObjects(); - -// System.out.println("###Header="+ header); -// System.out.println("###post=" + post); - String action = ((post == null) ? "info" : post.get("action", "info")); - - // variables for this path -// File htroot = new File(switchboard.getRootPath(), switchboard.getConfig("htRootPath", "htroot")); - final File htroot = switchboard.getConfigPath("htDocsPath", "DATA/HTDOCS"); - String path = (String) header.get("PATH", "/"); - int pos = path.lastIndexOf("/"); - if (pos >= 0) { path = path.substring(0, pos + 1); } - final File dir = new File(htroot, path); - - // general settings - prop.putHTML("peername", env.getConfig("peerName", "")); - prop.putHTML("peerdomain", env.getConfig("peerName", "").toLowerCase()); - prop.putHTML("peeraddress", yacyCore.seedDB.mySeed().getPublicAddress()); - prop.put("hostname", serverDomains.myPublicIP()); - try{ - prop.put("hostip", InetAddress.getByName(serverDomains.myPublicIP())); - }catch(UnknownHostException e){ - prop.put("hostip", "Unknown Host Exception"); - } - prop.put("port", serverCore.getPortNr(env.getConfig("port","8080"))); - - // generate upload/download authorizations - final String adminAccountBase64MD5 = switchboard.getConfig(httpd.ADMIN_ACCOUNT_B64MD5, ""); - final String uploadAccountBase64MD5 = switchboard.getConfig("uploadAccountBase64MD5", ""); - final String downloadAccountBase64MD5 = switchboard.getConfig("downloadAccountBase64MD5", ""); - - userDB.Entry entry = switchboard.userDB.proxyAuth((String)header.get("Authorization", "xxxxxx")); - boolean adminAuthorization, downloadAuthorization, uploadAuthorization; - if(entry == null){ - final String authorizationMD5 = de.anomic.server.serverCodings.encodeMD5Hex(((String) header.get("Authorization", "xxxxxx")).trim().substring(6)); -// if (logoutAccountBase64.equals(authorization)) - adminAuthorization = (adminAccountBase64MD5.length() != 0 && adminAccountBase64MD5.equals(authorizationMD5)); - uploadAuthorization = (adminAuthorization ||(uploadAccountBase64MD5.length() != 0 && uploadAccountBase64MD5.equals(authorizationMD5))); - downloadAuthorization = (adminAuthorization || uploadAuthorization || downloadAccountBase64MD5.length() == 0 || downloadAccountBase64MD5.equals(authorizationMD5)); - }else{ //userDB - adminAuthorization=entry.hasRight(userDB.Entry.ADMIN_RIGHT); - uploadAuthorization=entry.hasRight(userDB.Entry.UPLOAD_RIGHT); - downloadAuthorization=entry.hasRight(userDB.Entry.DOWNLOAD_RIGHT); - } - - // do authentitcate processes by triggering the http authenticate method - if (action.equals("authenticateAdmin") && !adminAuthorization) { - prop.put("AUTHENTICATE", "admin log-in"); - return prop; - } - if (action.equals("authenticateUpload") && !uploadAuthorization) { - prop.put("AUTHENTICATE", "upload log-in"); - return prop; - } - if (action.equals("authenticateDownload") && !downloadAuthorization) { - prop.put("AUTHENTICATE", "download log-in"); - return prop; - } - - // work off actions - if (action.equals("logout")) { - if (adminAuthorization) { - prop.put("AUTHENTICATE", "admin log-in"); - return prop; - } else if (uploadAuthorization) { - prop.put("AUTHENTICATE", "upload log-in"); - return prop; - } else if (downloadAuthorization) { - prop.put("AUTHENTICATE", "download log-in"); - return prop; - } else { - action = ""; - } - } else if (action.equals("downloadPassword") && adminAuthorization) { - switchboard.setConfig("downloadAccountBase64MD5", (post.get("password", "").length() == 0) ? "" : serverCodings.encodeMD5Hex(kelondroBase64Order.standardCoder.encodeString("download:" + post.get("password", "")))); - } else if (action.equals("uploadPassword") && adminAuthorization) { - switchboard.setConfig("uploadAccountBase64MD5", (post.get("password", "").length() == 0) ? "" : serverCodings.encodeMD5Hex(kelondroBase64Order.standardCoder.encodeString("upload:" + post.get("password", "")))); - } else if (action.equals("upload") && (uploadAuthorization || adminAuthorization)) { - String filename = new File(post.get("file", "dummy")).getName(); - pos = filename.lastIndexOf("\\"); - if (pos >= 0) { filename = filename.substring(pos + 1); } - final File newfile = new File(dir, filename); - final byte[] binary = (byte[]) post.get("file$file", new byte[0]); - try { - serverFileUtils.write(binary, newfile); - byte[] md5 = serverCodings.encodeMD5Raw(newfile); - String md5s = serverCodings.encodeHex(md5); - - // index file info - if (post.get("indexing", "").equals("on")) { - final String urlstring = yacyhURL(yacyCore.seedDB.mySeed(), filename, md5s); - final String phrase = filename.replace('.', ' ').replace('_', ' ').replace('-', ' '); - indexPhrase(switchboard, urlstring, phrase, "", md5); - } - } catch (IOException e) {} - } else if (action.equals("newdir") && (uploadAuthorization || adminAuthorization)) { - final String newdirname = post.get("directory", "EmptyDir"); - if (newdirname != null && newdirname.length() > 0) { - final File newdir = new File(dir, newdirname); - newdir.mkdir(); - } - } else if (action.equals("delete") && adminAuthorization) { - String filename = post.get("file", "foo"); - final File file = new File(dir, filename); - if (file.exists()) { - // delete file(s) - if (file.isDirectory()) { - final String[] content = file.list(); - for (int i = 0; i < content.length; i++) (new File(file, content[i])).delete(); - file.delete(); - } else if (file.isFile()) { - file.delete(); - } - // delete index - final String urlstring = yacyhURL(yacyCore.seedDB.mySeed(), filename, ""); - final String phrase = filename.replace('.', ' ').replace('_', ' ').replace('-', ' '); - deletePhrase(switchboard, urlstring, phrase, ""); - } - } - - // if authorized, generate directory tree listing - if ((adminAuthorization) || (uploadAuthorization) || (downloadAuthorization)) { - // generate dir listing - md5DirFileFilter fileFilter = new md5DirFileFilter(); - File[] list = dir.listFiles(fileFilter); - if (list == null) list = new File[0]; - - // sorting the dir list - dirlistComparator comparator = new dirlistComparator(); - Arrays.sort(list, comparator); - - // tree += "path = " + path + "

"; - if (list != null) { - int filecount = 0, fileIdx = 0; - prop.putHTML("path", path); - - boolean dark = false; - for (int i = 0; i < list.length; i++) { - - filecount++; - File f = list[i]; - String fileName = f.getName(); - - // changing table row color - prop.put("dirlist_" + fileIdx + "_dark" , dark ? "1" : "0"); - dark = !dark; - - - - // last modification date if the entry - prop.put("dirlist_" + fileIdx + "_dir_date" , dateString(new Date(f.lastModified()))); - prop.put("dirlist_" + fileIdx + "_dir_rfc822date" , httpc.dateString(new Date(f.lastModified()))); - prop.put("dirlist_" + fileIdx + "_dir_timestamp" , Long.toString(f.lastModified())); - // the entry name - prop.putHTML("dirlist_" + fileIdx + "_dir_name" , fileName); - - if (f.isDirectory()) { - // the entry is a directory - prop.put("dirlist_" + fileIdx + "_dir" , "1"); - prop.putHTML("dirlist_" + fileIdx + "_dir_URL","http://" + yacyCore.seedDB.mySeed().getPublicAddress() + path + fileName + "/"); - } else { - // determine if we should display the description string or a preview image - boolean showImage = /* (description.length() == 0) && */ (fileName.endsWith(".jpg") || fileName.endsWith(".gif") || fileName.endsWith(".png") || fileName.endsWith(".ico") || fileName.endsWith(".bmp")); - - // the entry is a file - String md5s = serverCodings.encodeMD5Hex(f); - - prop.put("dirlist_" + fileIdx + "_dir" , "0"); - // the file size - prop.put("dirlist_" + fileIdx + "_dir_size" , serverMemory.bytesToString(f.length())); - prop.put("dirlist_" + fileIdx + "_dir_sizeBytes" , f.length()); - // the unique url - prop.putHTML("dirlist_" + fileIdx + "_dir_yacyhURL",yacyhURL(yacyCore.seedDB.mySeed(), fileName, md5s)); - prop.putHTML("dirlist_" + fileIdx + "_dir_URL","http://" + yacyCore.seedDB.mySeed().getPublicAddress() + path + fileName); - // the md5 sum of the file - prop.put("dirlist_" + fileIdx + "_dir_md5s",md5s); - // description mode: 0...image preview, 1...description text - prop.put("dirlist_" + fileIdx + "_dir_descriptionMode",showImage?0:1); - if (showImage) { - prop.putHTML("dirlist_" + fileIdx + "_dir_descriptionMode_image",fileName); - } - // always set the description tag (needed by rss and xml) - prop.putHTML("dirlist_" + fileIdx + "_dir_descriptionMode_text", ""); - } - - prop.put("dirlist_" + fileIdx + "_adminAuthorization",adminAuthorization ? "1" : "0"); - prop.putHTML("dirlist_" + fileIdx + "_adminAuthorization_name",fileName); - - fileIdx++; - } - - prop.put("dirlist",filecount); - prop.put("emptydir", filecount == 0 ? "1" : "0"); - } - prop.put("authenticated", "1"); - } else { - prop.put("authenticated", "0"); - } - - if (adminAuthorization) { - prop.put("ident", "0"); - prop.put("logout", "0"); - prop.put("account", "0"); - prop.put("service", "0"); - prop.put("info", "0"); - } else if (uploadAuthorization) { - prop.put("ident", "1"); - prop.put("logout", "1"); - prop.put("account", "1"); - prop.put("service", "0"); - prop.put("info", "1"); - } else if (downloadAuthorization) { - prop.put("ident", "2"); - prop.put("logout", "2"); - prop.put("account", "2"); - prop.put("service", "1"); - prop.put("info", "2"); - - } else { - prop.put("ident", "3"); - prop.put("logout", "3"); - prop.put("account", "3"); - prop.put("service", "2"); - prop.put("info", "3"); - } - - // return rewrite properties - return prop; - } - - public static String yacyhURL(yacySeed seed, String filename, String md5) { - return "http://share." + seed.getHexHash() + ".yacyh/" + filename + "?md5=" + md5; - } - - public static void indexPhrase(plasmaSwitchboard switchboard, String urlstring, String phrase, String descr, byte[] md5) { - try { - final yacyURL url = new yacyURL(urlstring, null); - final plasmaCondenser condenser = new plasmaCondenser(new ByteArrayInputStream(("yacyshare. " + phrase + ". " + descr).getBytes()), "UTF-8"); - final indexURLEntry newEntry = new indexURLEntry( - url, - "YaCyShare: " + descr, - yacyCore.seedDB.mySeed().getName(), - "", // tags - "", // ETag - new Date(), // modification - new Date(), // loadtime - new Date(), // freshtime - "AAAAAAAAAAAA", // referrer - md5, // md5 - phrase.length(), // size - condenser.RESULT_NUMB_WORDS, // word count - plasmaHTCache.DT_SHARE, // doctype - new kelondroBitfield(4), - "**", // language - 0,0,0,0,0,0 - ); - switchboard.wordIndex.loadedURL.store(newEntry); - switchboard.wordIndex.loadedURL.stack( - newEntry, - "____________", /*initiator*/ - yacyCore.seedDB.mySeed().hash, /*executor*/ - 5 /*process case*/ - ); - - /*final int words =*/ switchboard.wordIndex.addPageIndex(url, new Date(), phrase.length() + descr.length() + 13, null, condenser, "**", plasmaHTCache.DT_SHARE, 0, 0); - } catch (IOException e) {} - } - - public static void deletePhrase(plasmaSwitchboard switchboard, String urlstring, String phrase, String descr) { - try { - final String urlhash = (new yacyURL(urlstring, null)).hash(); - final Iterator words = plasmaCondenser.getWords(("yacyshare " + phrase + " " + descr).getBytes("UTF-8"), "UTF-8").keySet().iterator(); - String word; - while (words.hasNext()) { - word = words.next(); - switchboard.wordIndex.removeEntry(plasmaCondenser.word2hash(word), urlhash); - } - switchboard.wordIndex.loadedURL.remove(urlhash); - } catch (Exception e) { - serverLog.logSevere("DIR", "INTERNAL ERROR in dir.deletePhrase", e); - } - } - -} diff --git a/htroot/htdocsdefault/dir.rss b/htroot/htdocsdefault/dir.rss deleted file mode 100644 index 93fdb8b6d..000000000 --- a/htroot/htdocsdefault/dir.rss +++ /dev/null @@ -1,20 +0,0 @@ - - - - <![CDATA[YaCy '#[clientname]#': Public Files #[path]#]]> - http://#[peeraddress]##[path]# - - - http://#[peeraddress]#/env/grafics/YaCyLogo_60ppi.png - YaCy - http://#[peeraddress]#/ - - #{dirlist}# - <![CDATA[#(dir)##[name]#::#[name]##(/dir)#]]> - #(dir)##[URL]#::#[URL]##(/dir)# - #(dir)##[rfc822date]#::#[rfc822date]##(/dir)# - #(dir)##[md5s]#::#(/dir)# - - #{/dirlist}# - - \ No newline at end of file diff --git a/htroot/htdocsdefault/dir.xml b/htroot/htdocsdefault/dir.xml deleted file mode 100644 index d22cf64f4..000000000 --- a/htroot/htdocsdefault/dir.xml +++ /dev/null @@ -1,19 +0,0 @@ - - -#{dirlist}# - #(dir)# - - #[name]# - #[date]# - #[size]# - #[md5s]# - #[yacyhURL]# - - :: - - #[name]# - #[date]# - - #(/dir)# -#{/dirlist}# - \ No newline at end of file diff --git a/htroot/js/highslide.js b/htroot/js/highslide.js new file mode 100755 index 000000000..079beeb67 --- /dev/null +++ b/htroot/js/highslide.js @@ -0,0 +1,2281 @@ + /****************************************************************************** +Name: Highslide JS +Version: 3.3.9 (February 15 2008) +Config: default +positioning +events +unobtrusive +transitions +inline +ajax +iframe +flash +Author: Torstein Hønsi +Support: http://vikjavev.no/highslide/forum + +Licence: +Highslide JS is licensed under a Creative Commons Attribution-NonCommercial 2.5 +License (http://creativecommons.org/licenses/by-nc/2.5/). + +You are free: + * to copy, distribute, display, and perform the work + * to make derivative works + +Under the following conditions: + * Attribution. You must attribute the work in the manner specified by the + author or licensor. + * Noncommercial. You may not use this work for commercial purposes. + +* For any reuse or distribution, you must make clear to others the license + terms of this work. +* Any of these conditions can be waived if you get permission from the + copyright holder. + +Your fair use and other rights are in no way affected by the above. +******************************************************************************/ + +var hs = { + +// Apply your own settings here, or override them in the html file. +graphicsDir : '/env/grafics/highslide/', +restoreCursor : 'zoomout.cur', // necessary for preload +expandSteps : 10, // number of steps in zoom. Each step lasts for duration/step milliseconds. +expandDuration : 250, // milliseconds +restoreSteps : 10, +restoreDuration : 250, +marginLeft : 15, +marginRight : 15, +marginTop : 15, +marginBottom : 15, +zIndexCounter : 1001, // adjust to other absolutely positioned elements + +restoreTitle : 'Click to close image, click and drag to move. Use arrow keys for next and previous.', +loadingText : 'Loading...', +loadingTitle : 'Click to cancel', +loadingOpacity : 0.75, +focusTitle : 'Click to bring to front', +allowMultipleInstances: true, +numberOfImagesToPreload : 5, +captionSlideSpeed : 1, // set to 0 to disable slide in effect +padToMinWidth : false, // pad the popup width to make room for wide caption +outlineWhileAnimating : 2, // 0 = never, 1 = always, 2 = HTML only +outlineStartOffset : 3, // ends at 10 +fullExpandTitle : 'Expand to actual size', +fullExpandPosition : 'bottom right', +fullExpandOpacity : 1, +showCredits : false, // you can set this to false if you want +creditsText : 'Powered by Highslide JS', +creditsHref : 'http://vikjavev.no/highslide/', +creditsTitle : 'Go to the Highslide JS homepage', +enableKeyListener : true, +transitions : [], +dimmingOpacity: 0, // Lightbox style dimming background +dimmingDuration: 50, // 0 for instant dimming + + +// HTML extension + +previousText : 'Previous', +nextText : 'Next', +moveText : 'Move', +closeText : 'Close', +closeTitle : 'Click to close', +resizeTitle : 'Resize', +allowWidthReduction : false, +allowHeightReduction : true, +preserveContent : true, // Preserve changes made to the content and position of HTML popups. +objectLoadTime : 'before', // Load iframes 'before' or 'after' expansion. +cacheAjax : true, // Cache ajax popups for instant display. Can be overridden for each popup. + +// These settings can also be overridden inline for each image +anchor : 'auto', // where the image expands from +align : 'auto', // position in the client (overrides anchor) +targetX: null, // the id of a target element +targetY: null, +captionId : null, +spaceForCaption : 30, // leaves space below images with captions +slideshowGroup : null, // defines groups for next/previous links and keystrokes +minWidth: 200, +minHeight: 200, +allowSizeReduction: true, // allow the image to reduce to fit client size. If false, this overrides minWidth and minHeight +outlineType : 'drop-shadow', // set null to disable outlines +wrapperClassName : 'highslide-wrapper', // for enhanced css-control + +// END OF YOUR SETTINGS + + +// declare internal properties +preloadTheseImages : [], +continuePreloading: true, +expanders : [], +overrides : [ + 'allowSizeReduction', + 'anchor', + 'align', + 'targetX', + 'targetY', + 'outlineType', + 'outlineWhileAnimating', + 'spaceForCaption', + 'captionId', + 'captionText', + 'captionEval', + 'transitions', + 'dimmingOpacity', + + 'contentId', + 'width', + 'height', + 'allowWidthReduction', + 'allowHeightReduction', + 'preserveContent', + 'objectType', + 'cacheAjax', + 'objectWidth', + 'objectHeight', + 'objectLoadTime', + 'swfObject', + 'wrapperClassName', + 'minWidth', + 'minHeight', + 'slideshowGroup', + 'easing', + 'easingClose', + 'fadeInOut' +], +overlays : [], +faders : [], + +pendingOutlines : {}, +sleeping : [], +preloadTheseAjax : [], +cacheBindings : [], +cachedGets : {}, +clones : {}, +ie : (document.all && !window.opera), +safari : /Safari/.test(navigator.userAgent), +geckoMac : /Macintosh.+rv:1\.[0-8].+Gecko/.test(navigator.userAgent), + +$ : function (id) { + return document.getElementById(id); +}, + +push : function (arr, val) { + arr[arr.length] = val; +}, + +createElement : function (tag, attribs, styles, parent, nopad) { + var el = document.createElement(tag); + if (attribs) hs.setAttribs(el, attribs); + if (nopad) hs.setStyles(el, {padding: 0, border: 'none', margin: 0}); + if (styles) hs.setStyles(el, styles); + if (parent) parent.appendChild(el); + return el; +}, + +setAttribs : function (el, attribs) { + for (var x in attribs) el[x] = attribs[x]; +}, + +setStyles : function (el, styles) { + for (var x in styles) { + try { + if (hs.ie && x == 'opacity') + el.style.filter = (styles[x] == 1) ? '' : 'alpha(opacity='+ (styles[x] * 100) +')'; + else el.style[x] = styles[x]; + } + catch (e) {} + } +}, + +ieVersion : function () { + arr = navigator.appVersion.split("MSIE"); + return parseFloat(arr[1]); +}, + +getPageSize : function () { + var iebody = document.compatMode && document.compatMode != "BackCompat" + ? document.documentElement : document.body; + + + var b = document.body; + var xScroll = (window.innerWidth && window.scrollMaxX) + ? window.innerWidth + window.scrollMaxX : + (b.scrollWidth > b.offsetWidth ? b.scrollWidth : b.offsetWidth), + yScroll = (window.innerHeight && window.scrollMaxY) + ? window.innerHeight + window.scrollMaxY : + (b.scrollHeight > b.offsetHeight ? b.scrollHeight : b.offsetHeight), + pageWidth = hs.ie ? iebody.scrollWidth : + (document.documentElement.clientWidth || self.innerWidth); + pageHeight = hs.ie ? iebody.clientHeight : + (document.documentElement.clientHeight || self.innerHeight); + + var width = hs.ie ? iebody.clientWidth : + (document.documentElement.clientWidth || self.innerWidth), + height = hs.ie ? iebody.clientHeight : self.innerHeight; + + return { + pageWidth: xScroll < pageWidth ? pageWidth : xScroll, + pageHeight: yScroll < pageHeight ? pageHeight : yScroll, + width: width, + height: height, + scrollLeft: hs.ie ? iebody.scrollLeft : pageXOffset, + scrollTop: hs.ie ? iebody.scrollTop : pageYOffset + } +}, + +position : function(el) { + var p = { x: el.offsetLeft, y: el.offsetTop }; + while (el.offsetParent) { + el = el.offsetParent; + p.x += el.offsetLeft; + p.y += el.offsetTop; + if (el != document.body && el != document.documentElement) { + p.x -= el.scrollLeft; + p.y -= el.scrollTop; + } + } + return p; +}, + +expand : function(a, params, custom) { + if (a.getParams) return params; + + try { + new hs.Expander(a, params, custom); + return false; + } catch (e) { return true; } +}, + +htmlExpand : function(a, params, custom) { + if (a.getParams) return params; + + for (var i = 0; i < hs.sleeping.length; i++) { + if (hs.sleeping[i] && hs.sleeping[i].a == a) { + hs.sleeping[i].awake(); + hs.sleeping[i] = null; + return false; + } + } + try { + hs.hasHtmlexpanders = true; + new hs.Expander(a, params, custom, 'html'); + return false; + } catch (e) { + return true; + } +}, + +getElementByClass : function (el, tagName, className) { + var els = el.getElementsByTagName(tagName); + for (var i = 0; i < els.length; i++) { + if (els[i].className == className) { + return els[i]; + } + } +}, + +getSelfRendered : function() { + var s = + '' + +'
' + +''; + return hs.createElement('div', { className: 'highslide-html-content', innerHTML: s } ); +}, + + +setClickEvents : function () { + var els = document.getElementsByTagName('A'); + for (var i = 0; i < els.length; i++) { + if (/^highslide$/.test(els[i].rel)) { + if (hs.fireEvent(hs, 'onSetClickEvent', { element: els[i] })) { + + els[i].onclick = function() { return hs.expand(this) }; + } + + els[i].removeAttribute('rel'); + } + + var match = /^highslide-(ajax|iframe)$/.exec(els[i].rel); + if (match) { + (function(){ + var t = match[1]; + if (hs.fireEvent(hs, 'onSetClickEvent', { element: els[i], type: t })) { + + els[i].onclick = function() { + return hs.htmlExpand(this, { objectType: t } ); + }; + } + })(); + els[i].removeAttribute('rel'); + } + } + if (!hs.pageLoaded) setTimeout( hs.setClickEvents, 50); +}, + +getCacheBinding : function (a) { + for (var i = 0; i < hs.cacheBindings.length; i++) { + if (hs.cacheBindings[i][0] == a) { + var c = hs.cacheBindings[i][1]; + hs.cacheBindings[i][1] = c.cloneNode(1); + return c; + } + } +}, + +preloadAjax : function (e) { + var aTags = document.getElementsByTagName('A'); + var a, re; + for (var i = 0; i < aTags.length; i++) { + a = aTags[i]; + re = hs.isHsAnchor(a); + if (re && re[0] == 'hs.htmlExpand' && hs.getParam(a, 'objectType') == 'ajax' + && hs.getParam(a, 'cacheAjax')) { + hs.push(hs.preloadTheseAjax, a); + } + } + hs.preloadAjaxElement(0); +}, + +preloadAjaxElement : function (i) { + if (!hs.preloadTheseAjax[i]) return; + var a = hs.preloadTheseAjax[i]; + var cache = hs.getNode(hs.getParam(a, 'contentId')); + if (!cache) cache = hs.getSelfRendered(); + var ajax = new hs.Ajax(a, cache, 1); + ajax.onError = function () { }; + ajax.onLoad = function () { + hs.push(hs.cacheBindings, [a, cache]); + hs.preloadAjaxElement(i + 1); + }; + ajax.run(); +}, + +focusTopmost : function() { + var topZ = 0, topmostKey = -1; + for (var i = 0; i < hs.expanders.length; i++) { + if (hs.expanders[i]) { + if (hs.expanders[i].wrapper.style.zIndex && hs.expanders[i].wrapper.style.zIndex > topZ) { + topZ = hs.expanders[i].wrapper.style.zIndex; + + topmostKey = i; + } + } + } + if (topmostKey == -1) hs.focusKey = -1; + else hs.expanders[topmostKey].focus(); +}, + +getAdjacentAnchor : function(key, op) { + var aAr = document.getElementsByTagName('A'), hsAr = {}, activeI = -1, j = 0; + for (var i = 0; i < aAr.length; i++) { + if (hs.isHsAnchor(aAr[i]) && ((hs.expanders[key].slideshowGroup + == hs.getParam(aAr[i], 'slideshowGroup')))) { + hsAr[j] = aAr[i]; + if (hs.expanders[key] && aAr[i] == hs.expanders[key].a) { + activeI = j; + } + j++; + } + } + return hsAr[activeI + op]; +}, + +getParam : function (a, param) { + a.getParams = a.onclick; + var p = a.getParams(); + a.getParams = null; + + return (p && typeof p[param] != 'undefined') ? p[param] : hs[param]; +}, + +getSrc : function (a) { + var src = hs.getParam(a, 'src'); + if (src) return src; + return a.href; +}, + +getNode : function (id) { + var node = hs.$(id), clone = hs.clones[id], a = {}; + if (!node && !clone) return null; + if (!clone) { + clone = node.cloneNode(true); + clone.id = ''; + hs.clones[id] = clone; + return node; + } else { + return clone.cloneNode(true); + } +}, + +purge : function(d) { + if (!hs.ie) return; + var a = d.attributes, i, l, n; + if (a) { + l = a.length; + for (var i = 0; i < l; i += 1) { + n = a[i].name; + if (typeof d[n] === 'function') { + d[n] = null; + } + } + } + a = d.childNodes; + if (a) { + l = a.length; + for (var i = 0; i < l; i += 1) { + hs.purge(d.childNodes[i]); + } + } +}, +dim : function(exp) { + if (!hs.dimmer) { + hs.dimmer = hs.createElement ('div', + { className: 'highslide-dimming', onclick: function() { hs.close() } }, + { position: 'absolute' }, hs.container, true); + hs.addEventListener(window, 'resize', hs.setDimmerSize); + } + hs.dimmer.style.display = ''; + hs.setDimmerSize(); + hs.dimmer.owner = exp.key; + if (hs.geckoMac && hs.dimmingGeckoFix) + hs.dimmer.style.background = 'url('+ hs.graphicsDir + 'geckodimmer.png)'; + else + hs.fade(hs.dimmer, 0, exp.dimmingOpacity, hs.dimmingDuration); +}, +unDim : function(key) { + if (!hs.dimmer) return; + if (typeof key != 'undefined' && key != hs.dimmer.owner) return; + if (hs.upcoming && hs.getParam(hs.upcoming, 'dimmingOpacity')) return; + if (hs.geckoMac && hs.dimmingGeckoFix) + hs.dimmer.style.background = 'none'; + else hs.fade(hs.dimmer, hs.dimmingOpacity, 0, hs.dimmingDuration); + setTimeout( function() { + hs.dimmer.style.display = 'none'; + }, 250); +}, +setDimmerSize : function() { + if (!hs.dimmer) return; + var page = hs.getPageSize(); + hs.setStyles(hs.dimmer, { width: page.pageWidth +'px', height: page.pageHeight +'px'}); +}, + +previousOrNext : function (el, op) { + var exp = hs.last = hs.getExpander(el); + try { + var adj = hs.upcoming = hs.getAdjacentAnchor(exp.key, op); + adj.onclick(); + } catch (e){} + try { exp.close(); } catch (e) {} + return false; +}, + +previous : function (el) { + return hs.previousOrNext(el, -1); +}, + +next : function (el) { + return hs.previousOrNext(el, 1); +}, + +keyHandler : function(e) { + if (!e) e = window.event; + if (!e.target) e.target = e.srcElement; // ie + if (e.target.form) return; // form element has focus + if (!hs.fireEvent(hs, 'onKeyDown', e)) return; + + var op = null; + switch (e.keyCode) { + case 34: // Page Down + case 39: // Arrow right + case 40: // Arrow down + op = 1; + break; + case 33: // Page Up + case 37: // Arrow left + case 38: // Arrow up + op = -1; + break; + case 27: // Escape + case 13: // Enter + op = 0; + } + if (op !== null) { + hs.removeEventListener(document, 'keydown', hs.keyHandler); + if (!hs.enableKeyListener) return true; + + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + if (op == 0) { + try { hs.getExpander().close(); } catch (e) {} + return false; + } else { + return hs.previousOrNext(hs.focusKey, op); + } + } + return true; +}, + + +registerOverlay : function (overlay) { + hs.push(hs.overlays, overlay); +}, + +getWrapperKey : function (element) { + var el, re = /^highslide-wrapper-([0-9]+)$/; + // 1. look in open expanders + el = element; + while (el.parentNode) { + if (el.id && re.test(el.id)) return el.id.replace(re, "$1"); + el = el.parentNode; + } + // 2. look in thumbnail + el = element; + while (el.parentNode) { + if (el.tagName && hs.isHsAnchor(el)) { + for (var key = 0; key < hs.expanders.length; key++) { + var exp = hs.expanders[key]; + if (exp && exp.a == el) return key; + } + } + el = el.parentNode; + } +}, + +getExpander : function (el) { + try { + if (!el) return hs.expanders[hs.focusKey]; + if (typeof el == 'number') return hs.expanders[el]; + if (typeof el == 'string') el = hs.$(el); + return hs.expanders[hs.getWrapperKey(el)]; + } catch (e) {} +}, + +isHsAnchor : function (a) { + return (a.onclick && a.onclick.toString().replace(/\s/g, ' ').match(/hs.(htmlE|e)xpand/)); +}, + +cleanUp : function () { + for (var i = 0; i < hs.expanders.length; i++) + if (hs.expanders[i] && hs.expanders[i].isExpanded) hs.focusTopmost(); +}, +fireEvent : function (obj, evt, args) { + return obj && obj[evt] ? (obj[evt](obj, args) !== false) : true; +}, + +mouseClickHandler : function(e) +{ + if (!e) e = window.event; + if (e.button > 1) return true; + if (!e.target) e.target = e.srcElement; + + var el = e.target; + while (el.parentNode + && !(/highslide-(image|move|html|resize)/.test(el.className))) + { + el = el.parentNode; + } + var exp = hs.getExpander(el); + if (exp && (exp.isClosing || !exp.isExpanded)) return; + + if (exp && e.type == 'mousedown') { + if (e.target.form) return; + var match = el.className.match(/highslide-(image|move|resize)/); + if (match) { + hs.dragArgs = { exp: exp , type: match[1], left: exp.x.min, width: exp.x.span, top: exp.y.min, + height: exp.y.span, clickX: e.clientX, clickY: e.clientY }; + + if (hs.dragArgs.type == 'image') exp.content.style.cursor = 'move'; + + hs.addEventListener(document, 'mousemove', hs.dragHandler); + if (e.preventDefault) e.preventDefault(); // FF + + if (/highslide-(image|html)-blur/.test(exp.content.className)) { + exp.focus(); + hs.hasFocused = true; + } + return false; + } + else if (/highslide-html/.test(el.className) && hs.focusKey != exp.key) { + exp.focus(); + exp.redoShowHide(); + } + } else if (e.type == 'mouseup') { + + hs.removeEventListener(document, 'mousemove', hs.dragHandler); + + if (hs.dragArgs) { + + if (hs.dragArgs.type == 'image') + hs.dragArgs.exp.content.style.cursor = hs.styleRestoreCursor; + + var hasDragged = (Math.abs(hs.dragArgs.dX) + Math.abs(hs.dragArgs.dY) > 0); + + if (!hasDragged &&!hs.hasFocused && !/(move|resize)/.test(hs.dragArgs.type)) { + if (hs.fireEvent(exp, 'onImageClick')) + exp.close(); + } + else if (hasDragged || (!hasDragged && hs.hasHtmlexpanders)) { + hs.dragArgs.exp.redoShowHide(); + } + + if (hs.dragArgs.exp.releaseMask) + hs.dragArgs.exp.releaseMask.style.display = 'none'; + + if (hasDragged) hs.fireEvent(hs.dragArgs.exp, 'onDrop', hs.dragArgs); + if (hasDragged) hs.setDimmerSize(); + + hs.hasFocused = false; + hs.dragArgs = null; + + } else if (/highslide-image-blur/.test(el.className)) { + el.style.cursor = hs.styleRestoreCursor; + } + } +}, + +dragHandler : function(e) +{ + if (!hs.dragArgs) return; + if (!e) e = window.event; + var exp = hs.dragArgs.exp; + if (exp.iframe) { + if (!exp.releaseMask) exp.releaseMask = hs.createElement('div', null, + { position: 'absolute', width: exp.x.span+'px', height: exp.y.span+'px', + left: 0, top: 0, zIndex: 4, background: (hs.ie ? 'white' : 'none'), + opacity: 0.01 }, + exp.wrapper, true); + if (exp.releaseMask.style.display == 'none') + exp.releaseMask.style.display = ''; + } + + hs.dragArgs.dX = e.clientX - hs.dragArgs.clickX; + hs.dragArgs.dY = e.clientY - hs.dragArgs.clickY; + if (!hs.fireEvent(exp, 'onDrag', hs.dragArgs)) return false; + + if (hs.dragArgs.type == 'resize') exp.resize(hs.dragArgs); + else exp.move(hs.dragArgs); + return false; +}, + +addEventListener : function (el, event, func) { + try { + el.addEventListener(event, func, false); + } catch (e) { + try { + el.detachEvent('on'+ event, func); + el.attachEvent('on'+ event, func); + } catch (e) { + el['on'+ event] = func; + } + } +}, + +removeEventListener : function (el, event, func) { + try { + el.removeEventListener(event, func, false); + } catch (e) { + try { + el.detachEvent('on'+ event, func); + } catch (e) { + el['on'+ event] = null; + } + } +}, + +preloadFullImage : function (i) { + if (hs.continuePreloading && hs.preloadTheseImages[i] && hs.preloadTheseImages[i] != 'undefined') { + var img = document.createElement('img'); + img.onload = function() { hs.preloadFullImage(i + 1); }; + img.src = hs.preloadTheseImages[i]; + } +}, +preloadImages : function (number) { + if (number && typeof number != 'object') hs.numberOfImagesToPreload = number; + var a, re, j = 0; + + var aTags = document.getElementsByTagName('A'); + for (var i = 0; i < aTags.length; i++) { + a = aTags[i]; + re = hs.isHsAnchor(a); + if (re && re[0] == 'hs.expand') { + if (j < hs.numberOfImagesToPreload) { + hs.preloadTheseImages[j] = hs.getSrc(a); + j++; + } + } + } + + // preload outlines + new hs.Outline(hs.outlineType, function () { hs.preloadFullImage(0)} ); + + + // preload cursor + var cur = hs.createElement('img', { src: hs.graphicsDir + hs.restoreCursor }); +}, + + +genContainer : function () { + if (!hs.container) { + hs.container = hs.createElement('div', + null, + { position: 'absolute', left: 0, top: 0, width: '100%', zIndex: hs.zIndexCounter }, + document.body, + true + ); + hs.loading = hs.createElement('a', + { + className: 'highslide-loading', + title: hs.loadingTitle, + innerHTML: hs.loadingText, + href: 'javascript:void(0)' + }, + { + position: 'absolute', + opacity: hs.loadingOpacity, + left: '-9999px', + zIndex: 1 + }, hs.container + ); + hs.clearing = hs.createElement('div', null, + { clear: 'both', paddingTop: '1px' }, null, true); + + // http://www.robertpenner.com/easing/ + Math.linearTween = function (t, b, c, d) { + return c*t/d + b; + }; + Math.easeInQuad = function (t, b, c, d) { + return c*(t/=d)*t + b; + }; + hs.fireEvent(this, 'onActivate'); + } +}, + +fade : function (el, o, oFinal, dur, i, dir) { + if (typeof i == 'undefined') { // new fader + if (dur === 0) { // instant + hs.setStyles( el, { + opacity: oFinal, + visibility: (o < oFinal ? 'visible': 'hidden') + }); + return; + } + i = hs.faders.length; + dir = oFinal > o ? 1 : -1; + var step = (25 / (dur || 250)) * Math.abs(o - oFinal); + } + o = parseFloat(o); + el.style.visibility = (o <= 0) ? 'hidden' : 'visible'; + if (o < 0 || (dir == 1 && o > oFinal)) return; + if (el.fading && el.fading.i != i) { // reverse + clearTimeout(hs.faders[el.fading.i]); + o = el.fading.o; + } + el.fading = {i: i, o: o, step: (step || el.fading.step)}; + el.style.visibility = (o <= 0) ? 'hidden' : 'visible'; + hs.setStyles(el, { opacity: o }); + hs.faders[i] = setTimeout(function() { + hs.fade(el, o + el.fading.step * dir, oFinal, null, i, dir); + }, 25); +}, + +close : function(el) { + try { hs.getExpander(el).close(); } catch (e) {} + return false; +} +}; // end hs object + + +//----------------------------------------------------------------------------- +hs.Outline = function (outlineType, onLoad) { + this.onLoad = onLoad; + this.outlineType = outlineType; + var v = hs.ieVersion(), tr; + + this.hasAlphaImageLoader = hs.ie && v >= 5.5 && v < 7; + if (!outlineType) { + if (onLoad) onLoad(); + return; + } + + hs.genContainer(); + this.table = hs.createElement( + 'table', { cellSpacing: 0 }, + { + visibility: 'hidden', + position: 'absolute', + borderCollapse: 'collapse' + }, + hs.container, + true + ); + this.tbody = hs.createElement('tbody', null, null, this.table, 1); + + this.td = []; + for (var i = 0; i <= 8; i++) { + if (i % 3 == 0) tr = hs.createElement('tr', null, { height: 'auto' }, this.tbody, true); + this.td[i] = hs.createElement('td', null, null, tr, true); + var style = i != 4 ? { lineHeight: 0, fontSize: 0} : { position : 'relative' }; + hs.setStyles(this.td[i], style); + } + this.td[4].className = outlineType; + + this.preloadGraphic(); +}; + +hs.Outline.prototype = { +preloadGraphic : function () { + var src = hs.graphicsDir + (hs.outlinesDir || "outlines/")+ this.outlineType +".png"; + + var appendTo = hs.safari ? hs.container : null; + this.graphic = hs.createElement('img', null, { position: 'absolute', left: '-9999px', + top: '-9999px' }, appendTo, true); // for onload trigger + + var pThis = this; + this.graphic.onload = function() { pThis.onGraphicLoad(); }; + + this.graphic.src = src; +}, + +onGraphicLoad : function () { + var o = this.offset = this.graphic.width / 4, + pos = [[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]], + dim = { height: (2*o) +'px', width: (2*o) +'px' }; + + for (var i = 0; i <= 8; i++) { + if (pos[i]) { + if (this.hasAlphaImageLoader) { + var w = (i == 1 || i == 7) ? '100%' : this.graphic.width +'px'; + var div = hs.createElement('div', null, { width: '100%', height: '100%', position: 'relative', overflow: 'hidden'}, this.td[i], true); + hs.createElement ('div', null, { + filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale, src='"+ this.graphic.src + "')", + position: 'absolute', + width: w, + height: this.graphic.height +'px', + left: (pos[i][0]*o)+'px', + top: (pos[i][1]*o)+'px' + }, + div, + true); + } else { + hs.setStyles(this.td[i], { background: 'url('+ this.graphic.src +') '+ (pos[i][0]*o)+'px '+(pos[i][1]*o)+'px'}); + } + + if (window.opera && (i == 3 || i ==5)) + hs.createElement('div', null, dim, this.td[i], true); + + hs.setStyles (this.td[i], dim); + } + } + + hs.pendingOutlines[this.outlineType] = this; + if (this.onLoad) this.onLoad(); +}, + +setPosition : function (exp, x, y, w, h, vis) { + if (vis) this.table.style.visibility = (h >= 4 * this.offset) + ? 'visible' : 'hidden'; + this.table.style.left = (x - this.offset) +'px'; + this.table.style.top = (y - this.offset) +'px'; + this.table.style.width = (w + 2 * (exp.offsetBorderW + this.offset)) +'px'; + w += 2 * (exp.offsetBorderW - this.offset); + h += + 2 * (exp.offsetBorderH - this.offset); + this.td[4].style.width = w >= 0 ? w +'px' : 0; + this.td[4].style.height = h >= 0 ? h +'px' : 0; + if (this.hasAlphaImageLoader) this.td[3].style.height + = this.td[5].style.height = this.td[4].style.height; +}, + +destroy : function(hide) { + if (hide) this.table.style.visibility = 'hidden'; + else { + hs.purge(this.table); + try { this.table.parentNode.removeChild(this.table); } catch (e) {} + } +} +}; + +//----------------------------------------------------------------------------- +// The expander object +hs.Expander = function(a, params, custom, contentType) { + this.a = a; + this.custom = custom; + this.contentType = contentType || 'image'; + this.isHtml = (contentType == 'html'); + this.isImage = !this.isHtml; + + hs.continuePreloading = false; + hs.genContainer(); + var key = this.key = hs.expanders.length; + + // override inline parameters + for (var i = 0; i < hs.overrides.length; i++) { + var name = hs.overrides[i]; + this[name] = params && typeof params[name] != 'undefined' ? + params[name] : hs[name]; + } + + // get thumb + var el = this.thumb = (params ? hs.$(params.thumbnailId) : null) + || a.getElementsByTagName('IMG')[0] || a; + this.thumbsUserSetId = el.id || a.id; + if (!hs.fireEvent(this, 'onInit')) return; + + // check if already open + for (var i = 0; i < hs.expanders.length; i++) { + if (hs.expanders[i] && hs.expanders[i].a == a) { + hs.expanders[i].focus(); + return false; + } + } + // cancel other + for (var i = 0; i < hs.expanders.length; i++) { + if (hs.expanders[i] && hs.expanders[i].thumb != el && !hs.expanders[i].onLoadStarted) { + hs.expanders[i].cancelLoading(); + } + } + hs.expanders[this.key] = this; + if (!hs.allowMultipleInstances) { + try { hs.expanders[key - 1].close(); } catch (e){} + try { hs.expanders[hs.focusKey].close(); } catch (e){} // preserved + } + this.overlays = []; + + var pos = hs.position(el); + + // store properties of thumbnail + this.thumbWidth = el.width ? el.width : el.offsetWidth; + this.thumbHeight = el.height ? el.height : el.offsetHeight; + this.thumbLeft = pos.x; + this.thumbTop = pos.y; + this.thumbOffsetBorderW = (this.thumb.offsetWidth - this.thumbWidth) / 2; + this.thumbOffsetBorderH = (this.thumb.offsetHeight - this.thumbHeight) / 2; + + // instanciate the wrapper + this.wrapper = hs.createElement( + 'div', + { + id: 'highslide-wrapper-'+ this.key, + className: this.wrapperClassName + }, + { + visibility: 'hidden', + position: 'absolute', + zIndex: hs.zIndexCounter++ + }, null, true ); + + this.wrapper.onmouseover = function (e) { + try { hs.expanders[key].wrapperMouseHandler(e); } catch (e) {} + }; + this.wrapper.onmouseout = function (e) { + try { hs.expanders[key].wrapperMouseHandler(e); } catch (e) {} + }; + if (this.contentType == 'image' && this.outlineWhileAnimating == 2) + this.outlineWhileAnimating = 0; + // get the outline + if (hs.pendingOutlines[this.outlineType]) { + this.connectOutline(); + this[this.contentType +'Create'](); + } else if (!this.outlineType) { + this[this.contentType +'Create'](); + } else { + this.displayLoading(); + var exp = this; + new hs.Outline(this.outlineType, + function () { + exp.connectOutline(); + exp[exp.contentType +'Create'](); + } + ); + } +}; + +hs.Expander.prototype = { + +connectOutline : function(x, y) { + var w = hs.pendingOutlines[this.outlineType]; + this.objOutline = w; + w.table.style.zIndex = this.wrapper.style.zIndex; + hs.pendingOutlines[this.outlineType] = null; +}, + +displayLoading : function() { + if (this.onLoadStarted || this.loading) return; + + this.originalCursor = this.a.style.cursor; + this.a.style.cursor = 'wait'; + + this.loading = hs.loading; + var exp = this; + this.loading.onclick = function() { + exp.cancelLoading(); + }; + + + if (!hs.fireEvent(this, 'onShowLoading')) return; + this.loading.style.top = (this.thumbTop + + (this.thumbHeight - this.loading.offsetHeight) / 2) +'px'; + var exp = this, left = (this.thumbLeft + this.thumbOffsetBorderW + + (this.thumbWidth - this.loading.offsetWidth) / 2) +'px'; + setTimeout(function () { if (exp.loading) exp.loading.style.left = left }, 100); +}, + +imageCreate : function() { + var exp = this; + + var img = document.createElement('img'); + this.content = img; + img.onload = function () { + if (hs.expanders[exp.key]) exp.contentLoaded(); + }; + img.className = 'highslide-image'; + img.style.visibility = 'hidden'; // prevent flickering in IE + img.style.display = 'block'; + img.style.position = 'absolute'; + img.style.maxWidth = 'none'; + img.style.zIndex = 3; + img.title = hs.restoreTitle; + if (hs.safari) hs.container.appendChild(img); + // uncomment this to flush img size: + // if (hs.ie) img.src = null; + img.src = hs.getSrc(this.a); + + this.displayLoading(); +}, + +htmlCreate : function () { + if (!hs.fireEvent(this, 'onBeforeGetContent')) return; + this.tempContainer = hs.createElement('div', { className: this.wrapperClassName }, + { + padding: '0 '+ hs.marginRight +'px 0 '+ hs.marginLeft +'px', + visibility: 'hidden' + }, hs.container + ); + + this.content = hs.getCacheBinding(this.a); + if (!this.content) + this.content = hs.getNode(this.contentId); + if (!this.content) + this.content = hs.getSelfRendered(); + + hs.fireEvent(this, 'onAfterGetContent'); + this.innerContent = this.content; + + if (this.swfObject || this.objectType == 'iframe') this.setObjContainerSize(this.innerContent); + this.tempContainer.appendChild(this.innerContent); // to get full width + hs.setStyles (this.innerContent, { position: 'relative', visibility: 'hidden' }); + this.innerContent.className += ' highslide-display-block'; + if (this.width) this.innerContent.style.width = this.width+'px'; + if (this.height) this.innerContent.style.height = this.height+'px'; + if (this.innerContent.offsetWidth < this.minWidth) + this.innerContent.style.width = this.minWidth +'px'; + + this.content = hs.createElement( + 'div', + { className: 'highslide-html' }, + { + position: 'relative', + zIndex: 3, + overflow: 'hidden', + width: this.thumbWidth +'px', + height: this.thumbHeight +'px' + } + ); + + if (this.objectType == 'ajax' && !hs.getCacheBinding(this.a)) { + var ajax = new hs.Ajax(this.a, this.innerContent); + var exp = this; + ajax.onLoad = function () { if (hs.expanders[exp.key]) exp.contentLoaded(); }; + ajax.onError = function () { location.href = hs.getSrc(this.a); }; + ajax.run(); + } + else + + if (this.objectType == 'iframe' && this.objectLoadTime == 'before') { + this.writeExtendedContent(); + } + else + this.contentLoaded(); +}, + +contentLoaded : function() { + try { + if (!this.content) return; + if (this.onLoadStarted) return; // old Gecko loop + else this.onLoadStarted = true; + + + if (this.loading) { + this.loading.style.left = '-9999px'; + this.loading = null; + this.a.style.cursor = this.originalCursor || ''; + hs.fireEvent(this, 'onHideLoading'); + } + this.marginBottom = hs.marginBottom; + if (this.isImage) { + this.newWidth = this.content.width; + this.newHeight = this.content.height; + this.fullExpandWidth = this.newWidth; + this.fullExpandHeight = this.newHeight; + + this.content.style.width = this.thumbWidth +'px'; + this.content.style.height = this.thumbHeight +'px'; + this.getCaption(); + } else if (this.htmlGetSize) this.htmlGetSize(); + + + this.wrapper.appendChild(this.content); + this.content.style.position = 'relative'; // Saf + if (this.caption) this.wrapper.appendChild(this.caption); + this.wrapper.style.left = this.thumbLeft +'px'; + this.wrapper.style.top = this.thumbTop +'px'; + hs.container.appendChild(this.wrapper); + + // correct for borders + this.offsetBorderW = (this.content.offsetWidth - this.thumbWidth) / 2; + this.offsetBorderH = (this.content.offsetHeight - this.thumbHeight) / 2; + var modMarginRight = hs.marginRight + 2 * this.offsetBorderW; + this.marginBottom += 2 * this.offsetBorderH; + + var ratio = this.newWidth / this.newHeight; + var minWidth = this.allowSizeReduction + ? this.minWidth : this.newWidth; + var minHeight = this.allowSizeReduction + ? this.minHeight : this.newHeight; + + var justify = { x: 'auto', y: 'auto' }; + + if (this.align == 'center') { + justify.x = 'center'; + justify.y = 'center'; + } else { + if (this.anchor.match(/^top/)) justify.y = null; + if (this.anchor.match(/right$/)) justify.x = 'max'; + if (this.anchor.match(/^bottom/)) justify.y = 'max'; + if (this.anchor.match(/left$/)) justify.x = null; + } + + var page = hs.getPageSize(); + // justify + this.x = { + min: parseInt(this.thumbLeft) - this.offsetBorderW + this.thumbOffsetBorderW, + span: this.newWidth, + minSpan: (this.newWidth < minWidth && !hs.padToMinWidth) + ? this.newWidth : minWidth, + justify: justify.x, + target: this.targetX, + marginMin: hs.marginLeft, + marginMax: modMarginRight, + scroll: page.scrollLeft, + clientSpan: page.width, + thumbSpan: this.thumbWidth + }; + var oldRight = this.x.min + parseInt(this.thumbWidth); + this.x = this.justify(this.x); + this.y = { + min: parseInt(this.thumbTop) - this.offsetBorderH + this.thumbOffsetBorderH, + span: this.newHeight, + minSpan: this.newHeight < minHeight ? this.newHeight : minHeight, + justify: justify.y, + target: this.targetY, + marginMin: hs.marginTop, + marginMax: this.marginBottom, + scroll: page.scrollTop, + clientSpan: page.height, + thumbSpan: this.thumbHeight + }; + var oldBottom = this.y.min + parseInt(this.thumbHeight); + this.y = this.justify(this.y); + if (this.isHtml) this.htmlSizeOperations(); + + if (this.isImage) + this.correctRatio(ratio); + + + var x = this.x; + var y = this.y; + + this.show(); + } catch (e) { + window.location.href = hs.getSrc(this.a); + } +}, + + +setObjContainerSize : function(parent, auto) { + var c = hs.getElementByClass(parent, 'DIV', 'highslide-body'); + + if (this.objectType == 'iframe') { + if (this.objectWidth) c.style.width = this.objectWidth +'px'; + if (this.objectHeight) c.style.height = this.objectHeight +'px'; + } + if (this.swfObject) { + c.style.width = this.swfObject.attributes.width +'px'; + c.style.height = this.swfObject.attributes.height +'px'; + } +}, + +writeExtendedContent : function (loadTime) { + if (this.hasExtendedContent) return; + var exp = this; + this.body = hs.getElementByClass(this.innerContent, 'DIV', 'highslide-body'); + if (this.objectType == 'iframe') { + this.displayLoading(); + this.ruler = hs.clearing.cloneNode(1); + this.body.appendChild(this.ruler); + this.newWidth = this.innerContent.offsetWidth; + if (!this.objectWidth) this.objectWidth = this.ruler.offsetWidth; + var hDiff = this.innerContent.offsetHeight - this.body.offsetHeight; + var h = this.objectHeight || (hs.getPageSize()).height - hDiff - hs.marginTop - hs.marginBottom; + var onload = (hs.ie && this.objectLoadTime == 'before') ? + 'onload="if(hs.expanders['+ this.key +'])hs.expanders['+ this.key +'].contentLoaded();"' : ''; + var tag = hs.ie ? '