ReIMG Image Resizer mit Highslide (Fragen/Einstellungen/etc.

Hier kommen die Support Anfragen für phpBB 3.0.x MODs hinein.
Benutzeravatar
techno-com
Beiträge: 55
Registriert: 16. Aug 2010 12:28
Familienstand: Verheiratet
Wohnort: 74076 Heilbronn/ Germany
Kontaktdaten:

ReIMG Image Resizer mit Highslide (Fragen/Einstellungen/etc.

Beitragvon techno-com » 9. Feb 2012 15:00

Deine phpBB Version: 3.0.10
Typ Deines phpBB Forums: Standard phpBB (auch Vanilla (phpbb2) oder Olympus (phpBB3) genannt)
MODs installiert: Ja
Dein Wissensstand: Grundwissen
Link zu Deinem Forum: http://www.techno-com.de/Forum

PHP Version: 3.0.10
MySQL Version: MySQL 5.1.43-nmm4-log

Was hast Du gemacht, bevor das Problem aufgetreten ist?
Boards durchstöbert, viele gelesen

Was hast Du bereits versucht um das Problem zu lösen?
ALLES ..

Fehlerbeschreibung und Nachricht
Ein Hallo....

ich habe ein paar Fragen betreffend "Bildanhängen" im Forum, deren Größenanpassung (verkleinern/vergrössern ?) und deren Darstellung im Forum. Basierend auf dem "ReImg Image Resizer" wurde dazu noch "Highslide" installiert und das klappt alles wunderbar ... bis auf ein paar Sachen die ggf. "besser" gehen wenn ich andere Foren anschauen die ich auf vielen Rechergen gesehen habe.

1.1. Einige Bilder funktionieren mit dem Highslide einwandfrei (LINK => erstes Bild dort)
Das hat den Zoom-Button wenn es aufgemacht wird rechts unten und ich kann das Bild weiter vergrössern... Einige Bilder (z.B. das darauf folgende Bild in dem Beitrag) haben wenn sie geöffnet wurden rechts unten diesen Zoom-Button nicht...
Woran liegt das ? Was kann ich einstellen umd das für alle Bilder zu bekommen ?
1.2. Einige Bilder werden nicht über Highslide geöffnet (Beispiel)... ich glaube gelesen zu haben das dies daran liegt das dieses BilderANHÄNGE sind die schon vor Einbau dieses MODs im Forum waren und das alte Bilder nur über Highslide gehen würden wenn sie keine "Anhänge" wären, sondern "im Beitrag angezeigt" würden.
Gibt es da einen Fix das auch alte Bilder so gehandhabt werden könnten ?
Könnte ich die Bildanhänge im Beitrag jetzt nachträglich über EDIT anzeigen lassen und diese würden über Highslide gehen ?
(wäre natürlich fast unmöglich das bie allen alten Beiträgen nachträglich zu machen)
1.3. Einige neu hochgeladene Bilder können auch nicht gezoomed werden (LINK => 3rd and 4th pictures there)... Dort ist ein Test-Upload-Bereich wo jeder posten kann, ich habe unter die Bilder auch die Abmessungen des Bilders geschrieben da ich denke das hat mir irgendeiner Einstellung im Forum zu tun.....
Aber welche Einstellung ist dafür verantwortlich (habe Einstellungen für "Bilderanhänge" im ACP und auch für "ABBC3" (dort gibt es ja auch den Resizer der aber nicht "in Funktion" sein sollte da ja der REimg akt. arbeitet und das war schon Problem in eniem anderen Beitrag von mir....

Sceenshot von den Einstellungen für den "REimg Image Resizer"
Bild
Screenshot von den Einstellungen für "Dateianhänge"
Bild
Screenshot von den Einstellungen für "ABBC3"
Bild


2. Grundwunsch ist das alle Bilder klein dargestellt werden (sagen wir mal z.B. max. 400 Pixel) und bei klick darauf dann über Highslide groß werden (sagen wir mal z.B. 768 Pixel ca.)..... und dann sollten man über die so eine Funktion weitere Bilder wählen können... also vorwärts/rückwärts gehen können + Bild vergrößern/zommen und das "x" für Close natürlich ...... das habe ich auch schon irgendwo relativ "simpel" gesehen, also nur mit dem vorwärts-/rückwärts Button und nicht so super ausgereicht wie in dem hier verlinkten Beispiel (das sieht aber echt super aus !).



Brainstorming ENDE ! Ich habe viel gelesen und auch gefunden.... war aber alles in fachmännischstem Englisch, und irgendwann war dann der Punkt wo man davon nichts mehr verstanden hat ... 80% der gefundenen Links führten auch zu Beispielen die mitterweile tot sind.

Im Diskussionsforum zum ReImg Resizer habe ich das auch schon in meinem besten Englisch von mir gegeben, dort scheint aber alles was nicht "Standard" ist (hier z.B. das "Highslide" bzw. das "vorwärts-/rückwärts-Button" nicht so gerne bearbeitet da es andere MOD-Erweiterungen sind und die von "anderen" kommen- hat auf jedne Fall den Anschein da andere Fragen dort beantwortet werden aktuell und meine brach liegt).


P.S. diese Seite mit Erklärungen für die Grösseneinstellungen habe ich auch gefunde... so richtig "erklärt" wird dort aber auch nichts ! Nur geschrieben wo man "etwas" einstellen kann, aber nicht "was die Einstellung dort dann auch bewirkt" !
https://www.satshop-heilbronn.de
https://www.satanlagenforum.de
Version 3.0.13-PL1
Board3 Portal 2.0.2
Tapatalk
phpBB SEO Class 0.7.0-/Mode:Advanced
Advanced BBcodes Box 3.0.11 (Highslide)
Wer war da 1.2.1
Thanks for Post 1.3.5
phpBB Galerie 1.1.6

Benutzeravatar
Mahony
Site Admin
Site Admin
Beiträge: 749
Registriert: 3. Dez 2006 22:09
Hat sich bedankt: 1 Mal
Danksagung erhalten: 4 Mal

Re: ReIMG Image Resizer mit Highslide (Fragen/Einstellungen/

Beitragvon Mahony » 9. Feb 2012 15:09

Hallo
Ich antworte dir mal auf deinen Beitrag hier http://www.phpbb.com/customise/db/mod/r ... 57#p242757

Die Bilder 3 und 4 öffnen nicht im Zoom-Fenster, da sie kleiner sind. Wenn auch diese Bilder im Zoom angezeigt werden sollen, musst du in den Einstellungen die Größenbeschränkung (im Moment 640x480 ) herunter setzen.

Zu deiner Frage
2. i found some forum with an "scroll-Button" .. you open one picture and there is an scroll button for going one picture forward / backward... this one is super good... what extra MOD is good for that ? The classic one with just the button forward/backward/zoom/close would be good for my wished too !


Ich denke mal, es handelt sich da um die Diashow des phpBB Gallery MODs (Benötigt ein Plugin, siehe contrib/plugins/) --> http://www.flying-bits.org/viewtopic.php?p=7459#p7459

Um alle Beiträge zu bearbeiten, empfiehlt sich das Support Toolkit, damit kannst du die BBCodes neu verarbeiten (parsen).


Grüße: Mahony
Diejenigen, die lautstark darüber diskutieren, warum es nicht geht, mögen bitte jene nicht stören, die es gerade tun.
Klug ist, wer nur die Hälfte von dem glaubt, was er hört. Weise ist, wer erkennt, welche Hälfte richtig ist.

Bild

Benutzeravatar
Mahony
Site Admin
Site Admin
Beiträge: 749
Registriert: 3. Dez 2006 22:09
Hat sich bedankt: 1 Mal
Danksagung erhalten: 4 Mal

Re: ReIMG Image Resizer mit Highslide (Fragen/Einstellungen/

Beitragvon Mahony » 9. Feb 2012 15:37

Hallo
Was mir noch eingefallen ist: Wenn du Bilder während des Hochladens automatisch Serverseitig verkleinern lassen möchtest (um Speicherplatz zu sparen), bietet sich das folgende Snippet an Serverseitiges image resize beim Upload

Grüße: Mahony
Diejenigen, die lautstark darüber diskutieren, warum es nicht geht, mögen bitte jene nicht stören, die es gerade tun.
Klug ist, wer nur die Hälfte von dem glaubt, was er hört. Weise ist, wer erkennt, welche Hälfte richtig ist.

Bild

Benutzeravatar
techno-com
Beiträge: 55
Registriert: 16. Aug 2010 12:28
Familienstand: Verheiratet
Wohnort: 74076 Heilbronn/ Germany
Kontaktdaten:

Re: ReIMG Image Resizer mit Highslide (Fragen/Einstellungen/

Beitragvon techno-com » 9. Feb 2012 16:17

Thx..

Punkt 1 (warum werden manche Bilder nicht vergrößert wenn man darauf klickt + warum haben manche Bilder kein Lupen-Zeichen unten rechts) habe ich damit voll verstanden ! Habe im ReIMG jetzt 200x200 eingestellt für die Vorschau und dann werden alle Bilder groß wenn ich drauf klicke (das sollte 640x480 sein ?) und wenn ich dann auf die Lupe klicke dann gehen sie voll auf, also auf die orig. Größe die sie haben (Test dazu ! Hier das letzte Bild mit dem Auto... das wird schon richtig riesig wenn ich es ganz groß mache !)

Was ich aber nicht ganz geblickt habe ist das mit dem Gallerie Mod... das hatte ich ja drauf, vorher schon....

Das man für "Highslide" da was extra installieren muss wegen Rechten usw. habe ich verstanden.... aber, dieses Gallerie ist doch etwas ganz anderes... Was hat das dann mit den Bildern die ich im Beitrag hochlade zu tun und wenn das über so ein MOD geht brauche ich dann eigentlich noch das "ReIMG Image Resizer" MOD ?
Da steh ich jetzt gerade voll auf dem Schlauch !


Der Part mit den "alten" Bildern ist hier in dem Beitrag auch neu , also "neu" zu dem Beitrag auf den du mir per PM schon geantwortet hast bevor ich diesen Beitrag hier erstellt hatte, aus dem anderen Forum das ich und du auch ja verlinkt haben ! Kannst du mir dazu noch etwas sagen ? Einfach eine Sache der "Schönheit" im Forum


P.S. das mit dem RIESEN Testbild oben in meinem Beitrag hat sich dann wohl auch erledigt wenn ich das MOD installiere das du nachgereicht hast !
Heute aber nicht mehr... mein Kleiner (2.75 Jahre) wünscht gerade den Papa zu Hause um in den Schnee zu gehen und den Wunsch muss ich ihm SOFORT erfüllen.... eh nix los bei dem Wetter in meiner Branche !!! :traurig
https://www.satshop-heilbronn.de
https://www.satanlagenforum.de
Version 3.0.13-PL1
Board3 Portal 2.0.2
Tapatalk
phpBB SEO Class 0.7.0-/Mode:Advanced
Advanced BBcodes Box 3.0.11 (Highslide)
Wer war da 1.2.1
Thanks for Post 1.3.5
phpBB Galerie 1.1.6

Benutzeravatar
techno-com
Beiträge: 55
Registriert: 16. Aug 2010 12:28
Familienstand: Verheiratet
Wohnort: 74076 Heilbronn/ Germany
Kontaktdaten:

Re: ReIMG Image Resizer mit Highslide (Fragen/Einstellungen/

Beitragvon techno-com » 9. Feb 2012 16:27

Nach einem Klick drauf habe ich gesehen das es nur ein Mini Snippet ist und habe das doch gleich mal gemacht....

Nehm es aber gleich wieder mal raus dann.. es kommt damit bei meinem ersten Test gleich:

Fatal error: Class declarations may not be nested in /www/htdocs/w00e1c1f/Forum/includes/functions_upload.php on line 462


Hier die geänderte Datei (functions_upload.php):

die Reihe 462 ist die 2. hier:

class fileerror extends filespec
{
function fileerror($error_msg)
{
$this->error[] = $error_msg;
}
}


Code: Alles auswählen

<?php
/**
*
* @package phpBB3
* @version $Id$
* @copyright (c) 2005 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/

/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
   exit;
}

/**
* Responsible for holding all file relevant information, as well as doing file-specific operations.
* The {@link fileupload fileupload class} can be used to upload several files, each of them being this object to operate further on.
* @package phpBB3
*/
class filespec
{
   var $filename = '';
   var $realname = '';
   var $uploadname = '';
   var $mimetype = '';
   var $extension = '';
   var $filesize = 0;
   var $width = 0;
   var $height = 0;
   var $image_info = array();

   var $destination_file = '';
   var $destination_path = '';

   var $file_moved = false;
   var $init_error = false;
   var $local = false;

   var $error = array();

   var $upload = '';

   /**
   * File Class
   * @access private
   */
   function filespec($upload_ary, $upload_namespace)
   {
      if (!isset($upload_ary))
      {
         $this->init_error = true;
         return;
      }

      $this->filename = $upload_ary['tmp_name'];
      $this->filesize = $upload_ary['size'];
      $name = (STRIP) ? stripslashes($upload_ary['name']) : $upload_ary['name'];
      $name = trim(utf8_htmlspecialchars(utf8_basename($name)));
      $this->realname = $this->uploadname = $name;
      $this->mimetype = $upload_ary['type'];

      // Opera adds the name to the mime type
      $this->mimetype   = (strpos($this->mimetype, '; name') !== false) ? str_replace(strstr($this->mimetype, '; name'), '', $this->mimetype) : $this->mimetype;

      if (!$this->mimetype)
      {
         $this->mimetype = 'application/octetstream';
      }

      $this->extension = strtolower($this->get_extension($this->realname));

      // Try to get real filesize from temporary folder (not always working) ;)
      $this->filesize = (@filesize($this->filename)) ? @filesize($this->filename) : $this->filesize;

      $this->width = $this->height = 0;
      $this->file_moved = false;

      $this->local = (isset($upload_ary['local_mode'])) ? true : false;
      $this->upload = $upload_namespace;
   }

   /**
   * Cleans destination filename
   *
   * @param real|unique|unique_ext $mode real creates a realname, filtering some characters, lowering every character. Unique creates an unique filename
   * @param string $prefix Prefix applied to filename
   * @access public
   */
   function clean_filename($mode = 'unique', $prefix = '', $user_id = '')
   {
      if ($this->init_error)
      {
         return;
      }

      switch ($mode)
      {
         case 'real':
            // Remove every extension from filename (to not let the mime bug being exposed)
            if (strpos($this->realname, '.') !== false)
            {
               $this->realname = substr($this->realname, 0, strpos($this->realname, '.'));
            }

            // Replace any chars which may cause us problems with _
            $bad_chars = array("'", "\\", ' ', '/', ':', '*', '?', '"', '<', '>', '|');

            $this->realname = rawurlencode(str_replace($bad_chars, '_', strtolower($this->realname)));
            $this->realname = preg_replace("/%(\w{2})/", '_', $this->realname);

            $this->realname = $prefix . $this->realname . '.' . $this->extension;
         break;

         case 'unique':
            $this->realname = $prefix . md5(unique_id());
         break;

         case 'avatar':
            $this->extension = strtolower($this->extension);
            $this->realname = $prefix . $user_id . '.' . $this->extension;

         break;

         case 'unique_ext':
         default:
            $this->realname = $prefix . md5(unique_id()) . '.' . $this->extension;
         break;
      }
   }

   /**
   * Get property from file object
   */
   function get($property)
   {
      if ($this->init_error || !isset($this->$property))
      {
         return false;
      }

      return $this->$property;
   }

   /**
   * Check if file is an image (mimetype)
   *
   * @return true if it is an image, false if not
   */
   function is_image()
   {
      return (strpos($this->mimetype, 'image/') !== false) ? true : false;
   }

   /**
   * Check if the file got correctly uploaded
   *
   * @return true if it is a valid upload, false if not
   */
   function is_uploaded()
   {
      if (!$this->local && !is_uploaded_file($this->filename))
      {
         return false;
      }

      if ($this->local && !file_exists($this->filename))
      {
         return false;
      }

      return true;
   }

   /**
   * Remove file
   */
   function remove()
   {
      if ($this->file_moved)
      {
         @unlink($this->destination_file);
      }
   }

   /**
   * Get file extension
   */
   function get_extension($filename)
   {
      if (strpos($filename, '.') === false)
      {
         return '';
      }

      $filename = explode('.', $filename);
      return array_pop($filename);
   }

   /**
   * Get mimetype. Utilize mime_content_type if the function exist.
   * Not used at the moment...
   */
   function get_mimetype($filename)
   {
      $mimetype = '';

      if (function_exists('mime_content_type'))
      {
         $mimetype = mime_content_type($filename);
      }

      // Some browsers choke on a mimetype of application/octet-stream
      if (!$mimetype || $mimetype == 'application/octet-stream')
      {
         $mimetype = 'application/octetstream';
      }

      return $mimetype;
   }

   /**
   * Get filesize
   */
   function get_filesize($filename)
   {
      return @filesize($filename);
   }


   /**
   * Check the first 256 bytes for forbidden content
   */
   function check_content($disallowed_content)
   {
      if (empty($disallowed_content))
      {
         return true;
      }

      $fp = @fopen($this->filename, 'rb');

      if ($fp !== false)
      {
         $ie_mime_relevant = fread($fp, 256);
         fclose($fp);
         foreach ($disallowed_content as $forbidden)
         {
            if (stripos($ie_mime_relevant, '<' . $forbidden) !== false)
            {
               return false;
            }
         }
      }
      return true;
   }

   /**
   * Move file to destination folder
   * The phpbb_root_path variable will be applied to the destination path
   *
   * @param string $destination_path Destination path, for example $config['avatar_path']
   * @param bool $overwrite If set to true, an already existing file will be overwritten
   * @param string $chmod Permission mask for chmodding the file after a successful move. The mode entered here reflects the mode defined by {@link phpbb_chmod()}
   *
   * @access public
   */
   /**
    * Resize images with the true diemensions (800*600)
    */
    function resize_images()
    {
       if ( $this->is_image() ) {
       $limite_largeur = "800px";
       $limite_hauteur = "600px";
       $size = getimagesize($this->destination_file);
       $largeur = $size[0];
       $hauteur = $size[1];
       if($hauteur > $limite_hauteur OR $largeur > $limite_largeur)
       {
   function move_file($destination, $overwrite = false, $skip_image_check = false, $chmod = false)
   {
      global $user, $phpbb_root_path;

      if (sizeof($this->error))
      {
         return false;
      }

      $chmod = ($chmod === false) ? CHMOD_READ | CHMOD_WRITE : $chmod;

      // We need to trust the admin in specifying valid upload directories and an attacker not being able to overwrite it...
      $this->destination_path = $phpbb_root_path . $destination;

      // Check if the destination path exist...
      if (!file_exists($this->destination_path))
      {
         @unlink($this->filename);
         return false;
      }

      $upload_mode = (@ini_get('open_basedir') || @ini_get('safe_mode') || strtolower(@ini_get('safe_mode')) == 'on') ? 'move' : 'copy';
      $upload_mode = ($this->local) ? 'local' : $upload_mode;
      $this->destination_file = $this->destination_path . '/' . utf8_basename($this->realname);

      // Check if the file already exist, else there is something wrong...
      if (file_exists($this->destination_file) && !$overwrite)
      {
         @unlink($this->filename);
      }
      else
      {
         if (file_exists($this->destination_file))
         {
            @unlink($this->destination_file);
         }

         switch ($upload_mode)
         {
            case 'copy':

               if (!@copy($this->filename, $this->destination_file))
               {
                  if (!@move_uploaded_file($this->filename, $this->destination_file))
                  {
                     $this->error[] = sprintf($user->lang[$this->upload->error_prefix . 'GENERAL_UPLOAD_ERROR'], $this->destination_file);
                  }
               }

            break;

            case 'move':

               if (!@move_uploaded_file($this->filename, $this->destination_file))
               {
                  if (!@copy($this->filename, $this->destination_file))
                  {
                     $this->error[] = sprintf($user->lang[$this->upload->error_prefix . 'GENERAL_UPLOAD_ERROR'], $this->destination_file);
                  }
               }

            break;

            case 'local':

               if (!@copy($this->filename, $this->destination_file))
               {
                  $this->error[] = sprintf($user->lang[$this->upload->error_prefix . 'GENERAL_UPLOAD_ERROR'], $this->destination_file);
               }

            break;
         }

         // Remove temporary filename
         @unlink($this->filename);

         if ( $this->is_image() )
            {
                $this->resize_images();
            }
         if (sizeof($this->error))
         {
            return false;
         }

         phpbb_chmod($this->destination_file, $chmod);
      }

      // Try to get real filesize from destination folder
      $this->filesize = (@filesize($this->destination_file)) ? @filesize($this->destination_file) : $this->filesize;

      if ($this->is_image() && !$skip_image_check)
      {
         $this->width = $this->height = 0;

         if (($this->image_info = @getimagesize($this->destination_file)) !== false)
         {
            $this->width = $this->image_info[0];
            $this->height = $this->image_info[1];

            if (!empty($this->image_info['mime']))
            {
               $this->mimetype = $this->image_info['mime'];
            }

            // Check image type
            $types = $this->upload->image_types();

            if (!isset($types[$this->image_info[2]]) || !in_array($this->extension, $types[$this->image_info[2]]))
            {
               if (!isset($types[$this->image_info[2]]))
               {
                  $this->error[] = sprintf($user->lang['IMAGE_FILETYPE_INVALID'], $this->image_info[2], $this->mimetype);
               }
               else
               {
                  $this->error[] = sprintf($user->lang['IMAGE_FILETYPE_MISMATCH'], $types[$this->image_info[2]][0], $this->extension);
               }
            }

            // Make sure the dimensions match a valid image
            if (empty($this->width) || empty($this->height))
            {
               $this->error[] = $user->lang['ATTACHED_IMAGE_NOT_IMAGE'];
            }
         }
         else
         {
            $this->error[] = $user->lang['UNABLE_GET_IMAGE_SIZE'];
         }
      }

      $this->file_moved = true;
      $this->additional_checks();
      unset($this->upload);

      return true;
   }

   /**
   * Performing additional checks
   */
   function additional_checks()
   {
      global $user;

      if (!$this->file_moved)
      {
         return false;
      }

      // Filesize is too big or it's 0 if it was larger than the maxsize in the upload form
      if ($this->upload->max_filesize && ($this->get('filesize') > $this->upload->max_filesize || $this->filesize == 0))
      {
         $max_filesize = get_formatted_filesize($this->upload->max_filesize, false);

         $this->error[] = sprintf($user->lang[$this->upload->error_prefix . 'WRONG_FILESIZE'], $max_filesize['value'], $max_filesize['unit']);

         return false;
      }

      if (!$this->upload->valid_dimensions($this))
      {
         $this->error[] = sprintf($user->lang[$this->upload->error_prefix . 'WRONG_SIZE'], $this->upload->min_width, $this->upload->min_height, $this->upload->max_width, $this->upload->max_height, $this->width, $this->height);

         return false;
      }

      return true;
   }
}

/**
* Class for assigning error messages before a real filespec class can be assigned
*
* @package phpBB3
*/
class fileerror extends filespec
{
   function fileerror($error_msg)
   {
      $this->error[] = $error_msg;
   }
}

/**
* File upload class
* Init class (all parameters optional and able to be set/overwritten separately) - scope is global and valid for all uploads
*
* @package phpBB3
*/
class fileupload
{
   var $allowed_extensions = array();
   var $disallowed_content = array('body', 'head', 'html', 'img', 'plaintext', 'a href', 'pre', 'script', 'table', 'title');
   var $max_filesize = 0;
   var $min_width = 0;
   var $min_height = 0;
   var $max_width = 0;
   var $max_height = 0;
   var $error_prefix = '';

   /**
   * Init file upload class.
   *
   * @param string $error_prefix Used error messages will get prefixed by this string
   * @param array $allowed_extensions Array of allowed extensions, for example array('jpg', 'jpeg', 'gif', 'png')
   * @param int $max_filesize Maximum filesize
   * @param int $min_width Minimum image width (only checked for images)
   * @param int $min_height Minimum image height (only checked for images)
   * @param int $max_width Maximum image width (only checked for images)
   * @param int $max_height Maximum image height (only checked for images)
   *
   */
   function fileupload($error_prefix = '', $allowed_extensions = false, $max_filesize = false, $min_width = false, $min_height = false, $max_width = false, $max_height = false, $disallowed_content = false)
   {
      $this->set_allowed_extensions($allowed_extensions);
      $this->set_max_filesize($max_filesize);
      $this->set_allowed_dimensions($min_width, $min_height, $max_width, $max_height);
      $this->set_error_prefix($error_prefix);
      $this->set_disallowed_content($disallowed_content);
   }

   /**
   * Reset vars
   */
   function reset_vars()
   {
      $this->max_filesize = 0;
      $this->min_width = $this->min_height = $this->max_width = $this->max_height = 0;
      $this->error_prefix = '';
      $this->allowed_extensions = array();
      $this->disallowed_content = array();
   }

   /**
   * Set allowed extensions
   */
   function set_allowed_extensions($allowed_extensions)
   {
      if ($allowed_extensions !== false && is_array($allowed_extensions))
      {
         $this->allowed_extensions = $allowed_extensions;
      }
   }

   /**
   * Set allowed dimensions
   */
   function set_allowed_dimensions($min_width, $min_height, $max_width, $max_height)
   {
      $this->min_width = (int) $min_width;
      $this->min_height = (int) $min_height;
      $this->max_width = (int) $max_width;
      $this->max_height = (int) $max_height;
   }

   /**
   * Set maximum allowed filesize
   */
   function set_max_filesize($max_filesize)
   {
      if ($max_filesize !== false && (int) $max_filesize)
      {
         $this->max_filesize = (int) $max_filesize;
      }
   }

   /**
   * Set disallowed strings
   */
   function set_disallowed_content($disallowed_content)
   {
      if ($disallowed_content !== false && is_array($disallowed_content))
      {
         $this->disallowed_content = array_diff($disallowed_content, array(''));
      }
   }

   /**
   * Set error prefix
   */
   function set_error_prefix($error_prefix)
   {
      $this->error_prefix = $error_prefix;
   }

   /**
   * Form upload method
   * Upload file from users harddisk
   *
   * @param string $form_name Form name assigned to the file input field (if it is an array, the key has to be specified)
   * @return object $file Object "filespec" is returned, all further operations can be done with this object
   * @access public
   */
   function form_upload($form_name)
   {
      global $user;

      unset($_FILES[$form_name]['local_mode']);
      $file = new filespec($_FILES[$form_name], $this);

      if ($file->init_error)
      {
         $file->error[] = '';
         return $file;
      }

      // Error array filled?
      if (isset($_FILES[$form_name]['error']))
      {
         $error = $this->assign_internal_error($_FILES[$form_name]['error']);

         if ($error !== false)
         {
            $file->error[] = $error;
            return $file;
         }
      }

      // Check if empty file got uploaded (not catched by is_uploaded_file)
      if (isset($_FILES[$form_name]['size']) && $_FILES[$form_name]['size'] == 0)
      {
         $file->error[] = $user->lang[$this->error_prefix . 'EMPTY_FILEUPLOAD'];
         return $file;
      }

      // PHP Upload filesize exceeded
      if ($file->get('filename') == 'none')
      {
         $max_filesize = @ini_get('upload_max_filesize');
         $unit = 'MB';

         if (!empty($max_filesize))
         {
            $unit = strtolower(substr($max_filesize, -1, 1));
            $max_filesize = (int) $max_filesize;

            $unit = ($unit == 'k') ? 'KB' : (($unit == 'g') ? 'GB' : 'MB');
         }

         $file->error[] = (empty($max_filesize)) ? $user->lang[$this->error_prefix . 'PHP_SIZE_NA'] : sprintf($user->lang[$this->error_prefix . 'PHP_SIZE_OVERRUN'], $max_filesize, $user->lang[$unit]);
         return $file;
      }

      // Not correctly uploaded
      if (!$file->is_uploaded())
      {
         $file->error[] = $user->lang[$this->error_prefix . 'NOT_UPLOADED'];
         return $file;
      }

      $this->common_checks($file);

      return $file;
   }

   /**
   * Move file from another location to phpBB
   */
   function local_upload($source_file, $filedata = false)
   {
      global $user;

      $form_name = 'local';

      $_FILES[$form_name]['local_mode'] = true;
      $_FILES[$form_name]['tmp_name'] = $source_file;

      if ($filedata === false)
      {
         $_FILES[$form_name]['name'] = utf8_basename($source_file);
         $_FILES[$form_name]['size'] = 0;
         $mimetype = '';

         if (function_exists('mime_content_type'))
         {
            $mimetype = mime_content_type($source_file);
         }

         // Some browsers choke on a mimetype of application/octet-stream
         if (!$mimetype || $mimetype == 'application/octet-stream')
         {
            $mimetype = 'application/octetstream';
         }

         $_FILES[$form_name]['type'] = $mimetype;
      }
      else
      {
         $_FILES[$form_name]['name'] = $filedata['realname'];
         $_FILES[$form_name]['size'] = $filedata['size'];
         $_FILES[$form_name]['type'] = $filedata['type'];
      }

      $file = new filespec($_FILES[$form_name], $this);

      if ($file->init_error)
      {
         $file->error[] = '';
         return $file;
      }

      if (isset($_FILES[$form_name]['error']))
      {
         $error = $this->assign_internal_error($_FILES[$form_name]['error']);

         if ($error !== false)
         {
            $file->error[] = $error;
            return $file;
         }
      }

      // PHP Upload filesize exceeded
      if ($file->get('filename') == 'none')
      {
         $max_filesize = @ini_get('upload_max_filesize');
         $unit = 'MB';

         if (!empty($max_filesize))
         {
            $unit = strtolower(substr($max_filesize, -1, 1));
            $max_filesize = (int) $max_filesize;

            $unit = ($unit == 'k') ? 'KB' : (($unit == 'g') ? 'GB' : 'MB');
         }

         $file->error[] = (empty($max_filesize)) ? $user->lang[$this->error_prefix . 'PHP_SIZE_NA'] : sprintf($user->lang[$this->error_prefix . 'PHP_SIZE_OVERRUN'], $max_filesize, $user->lang[$unit]);
         return $file;
      }

      // Not correctly uploaded
      if (!$file->is_uploaded())
      {
         $file->error[] = $user->lang[$this->error_prefix . 'NOT_UPLOADED'];
         return $file;
      }

      $this->common_checks($file);

      return $file;
   }

   /**
   * Remote upload method
   * Uploads file from given url
   *
   * @param string $upload_url URL pointing to file to upload, for example http://www.foobar.com/example.gif
   * @return object $file Object "filespec" is returned, all further operations can be done with this object
   * @access public
   */
   function remote_upload($upload_url)
   {
      global $user, $phpbb_root_path;

      $upload_ary = array();
      $upload_ary['local_mode'] = true;

      if (!preg_match('#^(https?://).*?\.(' . implode('|', $this->allowed_extensions) . ')$#i', $upload_url, $match))
      {
         $file = new fileerror($user->lang[$this->error_prefix . 'URL_INVALID']);
         return $file;
      }

      if (empty($match[2]))
      {
         $file = new fileerror($user->lang[$this->error_prefix . 'URL_INVALID']);
         return $file;
      }

      $url = parse_url($upload_url);

      $host = $url['host'];
      $path = $url['path'];
      $port = (!empty($url['port'])) ? (int) $url['port'] : 80;

      $upload_ary['type'] = 'application/octet-stream';

      $url['path'] = explode('.', $url['path']);
      $ext = array_pop($url['path']);

      $url['path'] = implode('', $url['path']);
      $upload_ary['name'] = utf8_basename($url['path']) . (($ext) ? '.' . $ext : '');
      $filename = $url['path'];
      $filesize = 0;

      $errno = 0;
      $errstr = '';

      if (!($fsock = @fsockopen($host, $port, $errno, $errstr)))
      {
         $file = new fileerror($user->lang[$this->error_prefix . 'NOT_UPLOADED']);
         return $file;
      }

      // Make sure $path not beginning with /
      if (strpos($path, '/') === 0)
      {
         $path = substr($path, 1);
      }

      fputs($fsock, 'GET /' . $path . " HTTP/1.1\r\n");
      fputs($fsock, "HOST: " . $host . "\r\n");
      fputs($fsock, "Connection: close\r\n\r\n");

      $get_info = false;
      $data = '';
      while (!@feof($fsock))
      {
         if ($get_info)
         {
            $block = @fread($fsock, 1024);
            $filesize += strlen($block);

            if ($this->max_filesize && $filesize > $this->max_filesize)
            {
               $max_filesize = get_formatted_filesize($this->max_filesize, false);

               $file = new fileerror(sprintf($user->lang[$this->error_prefix . 'WRONG_FILESIZE'], $max_filesize['value'], $max_filesize['unit']));
               return $file;
            }

            $data .= $block;
         }
         else
         {
            $line = @fgets($fsock, 1024);

            if ($line == "\r\n")
            {
               $get_info = true;
            }
            else
            {
               if (stripos($line, 'content-type: ') !== false)
               {
                  $upload_ary['type'] = rtrim(str_replace('content-type: ', '', strtolower($line)));
               }
               else if ($this->max_filesize && stripos($line, 'content-length: ') !== false)
               {
                  $length = (int) str_replace('content-length: ', '', strtolower($line));

                  if ($length && $length > $this->max_filesize)
                  {
                     $max_filesize = get_formatted_filesize($this->max_filesize, false);

                     $file = new fileerror(sprintf($user->lang[$this->error_prefix . 'WRONG_FILESIZE'], $max_filesize['value'], $max_filesize['unit']));
                     return $file;
                  }
               }
               else if (stripos($line, '404 not found') !== false)
               {
                  $file = new fileerror($user->lang[$this->error_prefix . 'URL_NOT_FOUND']);
                  return $file;
               }
            }
         }
      }
      @fclose($fsock);

      if (empty($data))
      {
         $file = new fileerror($user->lang[$this->error_prefix . 'EMPTY_REMOTE_DATA']);
         return $file;
      }

      $tmp_path = (!@ini_get('safe_mode') || strtolower(@ini_get('safe_mode')) == 'off') ? false : $phpbb_root_path . 'cache';
      $filename = tempnam($tmp_path, unique_id() . '-');

      if (!($fp = @fopen($filename, 'wb')))
      {
         $file = new fileerror($user->lang[$this->error_prefix . 'NOT_UPLOADED']);
         return $file;
      }

      $upload_ary['size'] = fwrite($fp, $data);
      fclose($fp);
      unset($data);

      $upload_ary['tmp_name'] = $filename;

      $file = new filespec($upload_ary, $this);
      $this->common_checks($file);

      return $file;
   }

   /**
   * Assign internal error
   * @access private
   */
   function assign_internal_error($errorcode)
   {
      global $user;

      switch ($errorcode)
      {
         case 1:
            $max_filesize = @ini_get('upload_max_filesize');
            $unit = 'MB';

            if (!empty($max_filesize))
            {
               $unit = strtolower(substr($max_filesize, -1, 1));
               $max_filesize = (int) $max_filesize;

               $unit = ($unit == 'k') ? 'KB' : (($unit == 'g') ? 'GB' : 'MB');
            }

            $error = (empty($max_filesize)) ? $user->lang[$this->error_prefix . 'PHP_SIZE_NA'] : sprintf($user->lang[$this->error_prefix . 'PHP_SIZE_OVERRUN'], $max_filesize, $user->lang[$unit]);
         break;

         case 2:
            $max_filesize = get_formatted_filesize($this->max_filesize, false);

            $error = sprintf($user->lang[$this->error_prefix . 'WRONG_FILESIZE'], $max_filesize['value'], $max_filesize['unit']);
         break;

         case 3:
            $error = $user->lang[$this->error_prefix . 'PARTIAL_UPLOAD'];
         break;

         case 4:
            $error = $user->lang[$this->error_prefix . 'NOT_UPLOADED'];
         break;

         case 6:
            $error = 'Temporary folder could not be found. Please check your PHP installation.';
         break;

         default:
            $error = false;
         break;
      }

      return $error;
   }

   /**
   * Perform common checks
   */
   function common_checks(&$file)
   {
      global $user;

      // Filesize is too big or it's 0 if it was larger than the maxsize in the upload form
      if ($this->max_filesize && ($file->get('filesize') > $this->max_filesize || $file->get('filesize') == 0))
      {
         $max_filesize = get_formatted_filesize($this->max_filesize, false);

         $file->error[] = sprintf($user->lang[$this->error_prefix . 'WRONG_FILESIZE'], $max_filesize['value'], $max_filesize['unit']);
      }

      // check Filename
      if (preg_match("#[\\/:*?\"<>|]#i", $file->get('realname')))
      {
         $file->error[] = sprintf($user->lang[$this->error_prefix . 'INVALID_FILENAME'], $file->get('realname'));
      }

      // Invalid Extension
      if (!$this->valid_extension($file))
      {
         $file->error[] = sprintf($user->lang[$this->error_prefix . 'DISALLOWED_EXTENSION'], $file->get('extension'));
      }

      // MIME Sniffing
      if (!$this->valid_content($file))
      {
         $file->error[] = sprintf($user->lang[$this->error_prefix . 'DISALLOWED_CONTENT']);
      }
   }

   /**
   * Check for allowed extension
   */
   function valid_extension(&$file)
   {
      return (in_array($file->get('extension'), $this->allowed_extensions)) ? true : false;
   }

   /**
   * Check for allowed dimension
   */
   function valid_dimensions(&$file)
   {
      if (!$this->max_width && !$this->max_height && !$this->min_width && !$this->min_height)
      {
         return true;
      }

      if (($file->get('width') > $this->max_width && $this->max_width) ||
         ($file->get('height') > $this->max_height && $this->max_height) ||
         ($file->get('width') < $this->min_width && $this->min_width) ||
         ($file->get('height') < $this->min_height && $this->min_height))
      {
         return false;
      }

      return true;
   }

   /**
   * Check if form upload is valid
   */
   function is_valid($form_name)
   {
      return (isset($_FILES[$form_name]) && $_FILES[$form_name]['name'] != 'none') ? true : false;
   }


   /**
   * Check for allowed extension
   */
   function valid_content(&$file)
   {
      return ($file->check_content($this->disallowed_content));
   }

   /**
   * Return image type/extension mapping
   */
   function image_types()
   {
      return array(
         1 => array('gif'),
         2 => array('jpg', 'jpeg'),
         3 => array('png'),
         4 => array('swf'),
         5 => array('psd'),
         6 => array('bmp'),
         7 => array('tif', 'tiff'),
         8 => array('tif', 'tiff'),
         9 => array('jpg', 'jpeg'),
         10 => array('jpg', 'jpeg'),
         11 => array('jpg', 'jpeg'),
         12 => array('jpg', 'jpeg'),
         13 => array('swc'),
         14 => array('iff'),
         15 => array('wbmp'),
         16 => array('xbm'),
      );
   }
}

?>



Frage noch dazu: wird das eigentlich dann auch proportional auf die max. 800x600 geändert und fix einfach diese Pixel herangezogen , also darauf gehändert ?
https://www.satshop-heilbronn.de
https://www.satanlagenforum.de
Version 3.0.13-PL1
Board3 Portal 2.0.2
Tapatalk
phpBB SEO Class 0.7.0-/Mode:Advanced
Advanced BBcodes Box 3.0.11 (Highslide)
Wer war da 1.2.1
Thanks for Post 1.3.5
phpBB Galerie 1.1.6

Benutzeravatar
Mahony
Site Admin
Site Admin
Beiträge: 749
Registriert: 3. Dez 2006 22:09
Hat sich bedankt: 1 Mal
Danksagung erhalten: 4 Mal

Re: ReIMG Image Resizer mit Highslide (Fragen/Einstellungen/

Beitragvon Mahony » 9. Feb 2012 17:10

Hallo
techno-com hat geschrieben:Das man für "Highslide" da was extra installieren muss wegen Rechten usw. habe ich verstanden.... aber, dieses Gallerie ist doch etwas ganz anderes... Was hat das dann mit den Bildern die ich im Beitrag hochlade zu tun und wenn das über so ein MOD geht brauche ich dann eigentlich noch das "ReIMG Image Resizer" MOD ?
Da steh ich jetzt gerade voll auf dem Schlauch !

Hm...du hattest das Beispiel im verlinkten Forum genannt und dort wird wohl das Plugin vom Galery MOD verwendet. Ob das Plugin vom Galery MOD sich auch auf normal hochgeladene Bilder auswirkt, kann ich nicht sagen (da ich das nie getestet habe und auch keinen Galery MOD verwende).

techno-com hat geschrieben:Der Part mit den "alten" Bildern ist hier in dem Beitrag auch neu , also "neu" zu dem Beitrag auf den du mir per PM schon geantwortet hast bevor ich diesen Beitrag hier erstellt hatte, aus dem anderen Forum das ich und du auch ja verlinkt haben ! Kannst du mir dazu noch etwas sagen ? Einfach eine Sache der "Schönheit" im Forum

Ich habe dir mal das stk hochgeladen (in der älteren Version 1.0.4 (die ich entsprechend angepasst habe) da die neue Version nicht mit dem SEO MOD zusammen arbeitet). Du kannst damit die alten Beiträge neu parsen lassen (mit der bereits genannten Option). Hier dein stk-Zugang
techno-com hat geschrieben:P.S. das mit dem RIESEN Testbild oben in meinem Beitrag hat sich dann wohl auch erledigt wenn ich das MOD installiere das du nachgereicht hast !

Ja
techno-com hat geschrieben:Fatal error: Class declarations may not be nested in /www/htdocs/w00e1c1f/Forum/includes/functions_upload.php on line 462

Ich schau mir das dann mal an.


Edit: Du hattest den ersten Code an der falschen Stelle eingefügt. Ich habe dir das mal entsprechend angepasst. siehe Testbeitrag http://www.techno-com.de/Forum/post14174.html#p14174

Fazit: Das Snippet funktioniert nun.

Grüße: Mahony
Diejenigen, die lautstark darüber diskutieren, warum es nicht geht, mögen bitte jene nicht stören, die es gerade tun.
Klug ist, wer nur die Hälfte von dem glaubt, was er hört. Weise ist, wer erkennt, welche Hälfte richtig ist.

Bild

Benutzeravatar
techno-com
Beiträge: 55
Registriert: 16. Aug 2010 12:28
Familienstand: Verheiratet
Wohnort: 74076 Heilbronn/ Germany
Kontaktdaten:

Re: ReIMG Image Resizer mit Highslide (Fragen/Einstellungen/

Beitragvon techno-com » 10. Feb 2012 16:35

Mahony hat geschrieben:Hm...du hattest das Beispiel im verlinkten Forum genannt und dort wird wohl das Plugin vom Galery MOD verwendet. Ob das Plugin vom Galery MOD sich auch auf normal hochgeladene Bilder auswirkt, kann ich nicht sagen (da ich das nie getestet habe und auch keinen Galery MOD verwende).

Gallerie-MOD läuft ja/ist ja aktiviert. Habe sogar noch "b3p_gallery_block_2_1_1" drauf gemacht und auch "Highslide" für die Gallierie installiert ! Kann also keinen Einfluss auf diese "vorwärts/rückwärts" Buttons haben !
Das komische ist ja auch das wenn man auf ein aufgepoptes Bild mit dem Cursor drauf geht sogar ein Title kommt mit ".......verwende die Pfeiltasten für Vorherige und Nächste" kommt .... das hat doch zu bedeuten das diese Pfeiltasten normal da sein "sollten" / "müssten" , oder ?
Diese Funktion finde ich super, vor allem wenn es ein Beitrag mit so vielen Bildern ist (man muss immer das eine schliesen umd das nächste aufmachen zu können).

Wenn das mit dem "Title" nicht da bei mir stehen würde könnte man ja schon denken das es einfach am "Highslide" hängt und dieses diese Buttons nicht unterstützt (also das ein anderes MOD dafür benötgit würde bzw. andere Einstellung für die Art der Anzeige)... aber da steht es eben mal !

Mahony hat geschrieben:Ich habe dir mal das stk hochgeladen (in der älteren Version 1.0.4 (die ich entsprechend angepasst habe) da die neue Version nicht mit dem SEO MOD zusammen arbeitet). Du kannst damit die alten Beiträge neu parsen lassen (mit der bereits genannten Option). Hier dein stk-Zugang

Hups... was ist den das ? Und hoffentlich kam meine Eingabemaske mit den Zugangsdaten nur automatisch da diese per Cookie etc. bei mir gespeichert waren auf dem PC :razz !
Ich finde dort aber nichts mit "parse" !!!
Und was meinst du genau wie sich das dann auf die alten Bilder auswirken sollte ?
Gut war aber das man dort die angemeldeten User mal "aufräumen" kann und die Russia-Mailadressen-Spamer mal einfach mit Haken setzen rauslöschen kann ! Aber das Problem konnte ich mal eigenständig schon vor ein paar Wochen lösen, also das so viel Spamer sich angemeldet hatten ! Seitdem ist damit "RUHE" !

Mahony hat geschrieben:Ja

Habe die max. Bildgröße des Popup-Bildes hochgesetzt auf 1000x1000 ! Vorher wurde es nicht groß genug skaliert bzw. machte das resize durch die proportionale Anpassung (meine Frage dazu im Beitrag hat sich damit erledigt, das habe ich jetzt gesehen das es proportional resized wird - alles andere wäre ja auch idiotisch !) das Bild dann wieder kleiner.... so gefällt mir das jetzt echt super !

Mahony hat geschrieben:Edit: Du hattest den ersten Code an der falschen Stelle eingefügt. Ich habe dir das mal entsprechend angepasst. siehe Testbeitrag http://www.techno-com.de/Forum/post14174.html#p14174
Fazit: Das Snippet funktioniert nun.

:traurig
Man sollte solche Sachen, wenn auch echt nur 2 Edit´s, nicht dann machen wenn man keine Zeit hat ! Thx dafür, sau geile Sache .... habe div. Tests gemacht und das ist einfach genial wie aus einem 2MB-Bild automatisch 40kB gemacht werden ! SAU GEIL ! Warum hat das nicht jeder ? Warum seh ich das erst jetzt ? Warum ist das kein "Standard" von einem Forum (wie so viele andere Sachen von denen JEDER doch nur profitieren würde) ?

P.S. heute Morgen zu Hause am Lappi ging das mit dem URL-Popup nicht mehr (also "Text markieren" => URL anklicken => Popup für Url-Adress-Eingabe kommt)... habe das eben nochmal hier getestet und hier geht es ! Auch zu Hause hatte ich z.B. F5 refresh gemacht usw.... komisch, aber egal !
https://www.satshop-heilbronn.de
https://www.satanlagenforum.de
Version 3.0.13-PL1
Board3 Portal 2.0.2
Tapatalk
phpBB SEO Class 0.7.0-/Mode:Advanced
Advanced BBcodes Box 3.0.11 (Highslide)
Wer war da 1.2.1
Thanks for Post 1.3.5
phpBB Galerie 1.1.6

Benutzeravatar
techno-com
Beiträge: 55
Registriert: 16. Aug 2010 12:28
Familienstand: Verheiratet
Wohnort: 74076 Heilbronn/ Germany
Kontaktdaten:

Re: ReIMG Image Resizer mit Highslide (Fragen/Einstellungen/

Beitragvon techno-com » 10. Feb 2012 17:08

Sooooo... "Sherlock"-Tristan war mal kurz unterwegs und hat auf der Highslide-Seite gesehen das es da verrschiedene Scripte gibt die unterschiedlich aussehen (daher gibt es im Ordner "reimg/highslide" auch verschiedene js-Scripte.

ABER.... wenn ich das normale Standard highslide.js dann mal öffne fällt mir dort sofort ins Auge das alles in englisch geschrieben ist:

// Language strings
lang : {
cssDirection: 'ltr',
loadingText : 'Loading...',
loadingTitle : 'Click to cancel',
focusTitle : 'Click to bring to front',
fullExpandTitle : 'Expand to actual size (f)',
creditsText : 'Powered by <i>Highslide JS</i>',
creditsTitle : 'Go to the Highslide JS homepage',
restoreTitle : 'Click to close image, click and drag to move. Use arrow keys for next and previous.'


Das was da akt. bei mir also angezeigt wird von wegen ".......verwende die Pfeiltasten für Vorherige und Nächste" kann also gar nicht von diesem Highslide-Scipt kommen !!!! Ich habe das noch 2x sonst drin, einmal für die Galerie und einmal für ABBCode ("gallery=>plugins=>highslide" und "styles=>abbcode=>highslide"), dort ist aber auch alles in englisch gehalten wonach diese auch nicht das sein können was die "Ursache" aktuell ist !


Liege ich da irgendwo falsch ?
Aber was ist dann akt. das Tool was die Popups für die Bilder macht ? Und wo kann ich das jetzt konfigurieren ?


Ganzes Scipt:

Code: Alles auswählen

/**
 * Name:    Highslide JS
 * Version: 4.1.13 (2011-10-06)
 * Config:  default
 * Author:  Torstein Hønsi
 * Support: www.highslide.com/support
 * License: www.highslide.com/#license
 */
if (!hs) { var hs = {
// Language strings
lang : {
   cssDirection: 'ltr',
   loadingText : 'Loading...',
   loadingTitle : 'Click to cancel',
   focusTitle : 'Click to bring to front',
   fullExpandTitle : 'Expand to actual size (f)',
   creditsText : 'Powered by <i>Highslide JS</i>',
   creditsTitle : 'Go to the Highslide JS homepage',
   restoreTitle : 'Click to close image, click and drag to move. Use arrow keys for next and previous.'
},
// See http://highslide.com/ref for examples of settings 
graphicsDir : 'highslide/graphics/',
expandCursor : 'zoomin.cur', // null disables
restoreCursor : 'zoomout.cur', // null disables
expandDuration : 250, // milliseconds
restoreDuration : 250,
marginLeft : 15,
marginRight : 15,
marginTop : 15,
marginBottom : 15,
zIndexCounter : 1001, // adjust to other absolutely positioned elements
loadingOpacity : 0.75,
allowMultipleInstances: true,
numberOfImagesToPreload : 5,
outlineWhileAnimating : 2, // 0 = never, 1 = always, 2 = HTML only
outlineStartOffset : 3, // ends at 10
padToMinWidth : false, // pad the popup width to make room for wide caption
fullExpandPosition : 'bottom right',
fullExpandOpacity : 1,
showCredits : true, // you can set this to false if you want
creditsHref : 'http://highslide.com/',
creditsTarget : '_self',
enableKeyListener : true,
openerTagNames : ['a'], // Add more to allow slideshow indexing

dragByHeading: true,
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
// END OF YOUR SETTINGS


// declare internal properties
preloadTheseImages : [],
continuePreloading: true,
expanders : [],
overrides : [
   'allowSizeReduction',
   'useBox',
   'outlineType',
   'outlineWhileAnimating',
   'captionId',
   'captionText',
   'captionEval',
   'captionOverlay',
   'headingId',
   'headingText',
   'headingEval',
   'headingOverlay',
   'creditsPosition',
   'dragByHeading',
   
   'width',
   'height',
   
   'wrapperClassName',
   'minWidth',
   'minHeight',
   'maxWidth',
   'maxHeight',
   'pageOrigin',
   'slideshowGroup',
   'easing',
   'easingClose',
   'fadeInOut',
   'src'
],
overlays : [],
idCounter : 0,
oPos : {
   x: ['leftpanel', 'left', 'center', 'right', 'rightpanel'],
   y: ['above', 'top', 'middle', 'bottom', 'below']
},
mouse: {},
headingOverlay: {},
captionOverlay: {},
timers : [],

pendingOutlines : {},
clones : {},
onReady: [],
uaVersion: /Trident\/4\.0/.test(navigator.userAgent) ? 8 :
   parseFloat((navigator.userAgent.toLowerCase().match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1]),
ie : (document.all && !window.opera),
//ie : navigator && /MSIE [678]/.test(navigator.userAgent), // ie9 compliant?
safari : /Safari/.test(navigator.userAgent),
geckoMac : /Macintosh.+rv:1\.[0-8].+Gecko/.test(navigator.userAgent),

$ : function (id) {
   if (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.extend(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;
},

extend : function (el, attribs) {
   for (var x in attribs) el[x] = attribs[x];
   return el;
},

setStyles : function (el, styles) {
   for (var x in styles) {
      if (hs.ieLt9 && x == 'opacity') {
         if (styles[x] > 0.99) el.style.removeAttribute('filter');
         else el.style.filter = 'alpha(opacity='+ (styles[x] * 100) +')';
      }
      else el.style[x] = styles[x];      
   }
},
animate: function(el, prop, opt) {
   var start,
      end,
      unit;
   if (typeof opt != 'object' || opt === null) {
      var args = arguments;
      opt = {
         duration: args[2],
         easing: args[3],
         complete: args[4]
      };
   }
   if (typeof opt.duration != 'number') opt.duration = 250;
   opt.easing = Math[opt.easing] || Math.easeInQuad;
   opt.curAnim = hs.extend({}, prop);
   for (var name in prop) {
      var e = new hs.fx(el, opt , name );
      
      start = parseFloat(hs.css(el, name)) || 0;
      end = parseFloat(prop[name]);
      unit = name != 'opacity' ? 'px' : '';
      
      e.custom( start, end, unit );
   }   
},
css: function(el, prop) {
   if (el.style[prop]) {
      return el.style[prop];
   } else if (document.defaultView) {
      return document.defaultView.getComputedStyle(el, null).getPropertyValue(prop);

   } else {
      if (prop == 'opacity') prop = 'filter';
      var val = el.currentStyle[prop.replace(/\-(\w)/g, function (a, b){ return b.toUpperCase(); })];
      if (prop == 'filter')
         val = val.replace(/alpha\(opacity=([0-9]+)\)/,
            function (a, b) { return b / 100 });
      return val === '' ? 1 : val;
   }
},

getPageSize : function () {
   var d = document, w = window, iebody = d.compatMode && d.compatMode != 'BackCompat'
      ? d.documentElement : d.body,
      ieLt9 = hs.ie && (hs.uaVersion < 9 || typeof pageXOffset == 'undefined');
   
   var width = ieLt9 ? iebody.clientWidth :
         (d.documentElement.clientWidth || self.innerWidth),
      height = ieLt9 ? iebody.clientHeight : self.innerHeight;
   hs.page = {
      width: width,
      height: height,      
      scrollLeft: ieLt9 ? iebody.scrollLeft : pageXOffset,
      scrollTop: ieLt9 ? iebody.scrollTop : pageYOffset
   };
   return hs.page;
},

getPosition : 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, type) {
   if (!a) a = hs.createElement('a', null, { display: 'none' }, hs.container);
   if (typeof a.getParams == 'function') return params;   
   try {   
      new hs.Expander(a, params, custom);
      return false;
   } catch (e) { return true; }
},


focusTopmost : function() {
   var topZ = 0,
      topmostKey = -1,
      expanders = hs.expanders,
      exp,
      zIndex;
   for (var i = 0; i < expanders.length; i++) {
      exp = expanders[i];
      if (exp) {
         zIndex = exp.wrapper.style.zIndex;
         if (zIndex && zIndex > topZ) {
            topZ = zIndex;            
            topmostKey = i;
         }
      }
   }
   if (topmostKey == -1) hs.focusKey = -1;
   else expanders[topmostKey].focus();
},

getParam : function (a, param) {
   a.getParams = a.onclick;
   var p = a.getParams ? a.getParams() : null;
   a.getParams = null;
   
   return (p && typeof p[param] != 'undefined') ? p[param] :
      (typeof hs[param] != 'undefined' ? hs[param] : null);
},

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);
   }
},

discardElement : function(d) {
   if (d) hs.garbageBin.appendChild(d);
   hs.garbageBin.innerHTML = '';
},
transit : function (adj, exp) {
   var last = exp || hs.getExpander();
   exp = last;
   if (hs.upcoming) return false;
   else hs.last = last;
   hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler);
   try {
      hs.upcoming = adj;
      adj.onclick();       
   } catch (e){
      hs.last = hs.upcoming = null;
   }
   try {
      exp.close();
   } catch (e) {}
   return false;
},

previousOrNext : function (el, op) {
   var exp = hs.getExpander(el);
   if (exp) return hs.transit(exp.getAdjacentAnchor(op), exp);
   else 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 (typeof e.target.form != 'undefined') return true; // form element has focus
   var exp = hs.getExpander();
   
   var op = null;
   switch (e.keyCode) {
      case 70: // f
         if (exp) exp.doFullExpand();
         return true;
      case 32: // Space
      case 34: // Page Down
      case 39: // Arrow right
      case 40: // Arrow down
         op = 1;
         break;
      case 8:  // Backspace
      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, window.opera ? 'keypress' : 'keydown', hs.keyHandler);
      if (!hs.enableKeyListener) return true;
      
      if (e.preventDefault) e.preventDefault();
       else e.returnValue = false;
       if (exp) {
         if (op == 0) {
            exp.close();
         } else {
            hs.previousOrNext(exp.key, op);
         }
         return false;
      }
   }
   return true;
},


registerOverlay : function (overlay) {
   hs.push(hs.overlays, hs.extend(overlay, { hsId: 'hsId'+ hs.idCounter++ } ));
},


getWrapperKey : function (element, expOnly) {
   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
   if (!expOnly) {
      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;
      }
   }
   return null;
},

getExpander : function (el, expOnly) {
   if (typeof el == 'undefined') return hs.expanders[hs.focusKey] || null;
   if (typeof el == 'number') return hs.expanders[el] || null;
   if (typeof el == 'string') el = hs.$(el);
   return hs.expanders[hs.getWrapperKey(el, expOnly)] || null;
},

isHsAnchor : function (a) {
   return (a.onclick && a.onclick.toString().replace(/\s/g, ' ').match(/hs.(htmlE|e)xpand/));
},

reOrder : function () {
   for (var i = 0; i < hs.expanders.length; i++)
      if (hs.expanders[i] && hs.expanders[i].isExpanded) hs.focusTopmost();
},

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 true;
      
   if (exp && e.type == 'mousedown') {
      if (e.target.form) return true;
      var match = el.className.match(/highslide-(image|move|resize)/);
      if (match) {
         hs.dragArgs = {
            exp: exp ,
            type: match[1],
            left: exp.x.pos,
            width: exp.x.size,
            top: exp.y.pos,
            height: exp.y.size,
            clickX: e.clientX,
            clickY: e.clientY
         };
         
         
         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 (e.type == 'mouseup') {
      
      hs.removeEventListener(document, 'mousemove', hs.dragHandler);
      
      if (hs.dragArgs) {
         if (hs.styleRestoreCursor && hs.dragArgs.type == 'image')
            hs.dragArgs.exp.content.style.cursor = hs.styleRestoreCursor;
         var hasDragged = hs.dragArgs.hasDragged;
         
         if (!hasDragged &&!hs.hasFocused && !/(move|resize)/.test(hs.dragArgs.type)) {
            exp.close();
         }
         else if (hasDragged || (!hasDragged && hs.hasHtmlExpanders)) {
            hs.dragArgs.exp.doShowHide('hidden');
         }
         hs.hasFocused = false;
         hs.dragArgs = null;
      
      } else if (/highslide-image-blur/.test(el.className)) {
         el.style.cursor = hs.styleRestoreCursor;      
      }
   }
   return false;
},

dragHandler : function(e)
{
   if (!hs.dragArgs) return true;
   if (!e) e = window.event;
   var a = hs.dragArgs, exp = a.exp;
   
   a.dX = e.clientX - a.clickX;
   a.dY = e.clientY - a.clickY;   
   
   var distance = Math.sqrt(Math.pow(a.dX, 2) + Math.pow(a.dY, 2));
   if (!a.hasDragged) a.hasDragged = (a.type != 'image' && distance > 0)
      || (distance > (hs.dragSensitivity || 5));
   
   if (a.hasDragged && e.clientX > 5 && e.clientY > 5) {
      
      if (a.type == 'resize') exp.resize(a);
      else {
         exp.moveTo(a.left + a.dX, a.top + a.dY);
         if (a.type == 'image') exp.content.style.cursor = 'move';
      }
   }
   return false;
},

wrapperMouseHandler : function (e) {
   try {
      if (!e) e = window.event;
      var over = /mouseover/i.test(e.type);
      if (!e.target) e.target = e.srcElement; // ie
      if (!e.relatedTarget) e.relatedTarget =
         over ? e.fromElement : e.toElement; // ie
      var exp = hs.getExpander(e.target);
      if (!exp.isExpanded) return;
      if (!exp || !e.relatedTarget || hs.getExpander(e.relatedTarget, true) == exp
         || hs.dragArgs) return;
      for (var i = 0; i < exp.overlays.length; i++) (function() {
         var o = hs.$('hsId'+ exp.overlays[i]);
         if (o && o.hideOnMouseOut) {
            if (over) hs.setStyles(o, { visibility: 'visible', display: '' });
            hs.animate(o, { opacity: over ? o.opacity : 0 }, o.dur);
         }
      })();   
   } catch (e) {}
},
addEventListener : function (el, event, func) {
   if (el == document && event == 'ready') {
      hs.push(hs.onReady, 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() {
         img = null;
         hs.preloadFullImage(i + 1);
      };
      img.src = hs.preloadTheseImages[i];
   }
},
preloadImages : function (number) {
   if (number && typeof number != 'object') hs.numberOfImagesToPreload = number;
   
   var arr = hs.getAnchors();
   for (var i = 0; i < arr.images.length && i < hs.numberOfImagesToPreload; i++) {
      hs.push(hs.preloadTheseImages, hs.getSrc(arr.images[i]));
   }
   
   // preload outlines
   if (hs.outlineType)   new hs.Outline(hs.outlineType, function () { hs.preloadFullImage(0)} );
   else
   
   hs.preloadFullImage(0);
   
   // preload cursor
   if (hs.restoreCursor) var cur = hs.createElement('img', { src: hs.graphicsDir + hs.restoreCursor });
},


init : function () {
   if (!hs.container) {
   
      hs.ieLt7 = hs.ie && hs.uaVersion < 7;
      hs.ieLt9 = hs.ie && hs.uaVersion < 9;
      
      hs.getPageSize();
      for (var x in hs.langDefaults) {
         if (typeof hs[x] != 'undefined') hs.lang[x] = hs[x];
         else if (typeof hs.lang[x] == 'undefined' && typeof hs.langDefaults[x] != 'undefined')
            hs.lang[x] = hs.langDefaults[x];
      }
      
      hs.container = hs.createElement('div', {
            className: 'highslide-container'
         }, {
            position: 'absolute',
            left: 0,
            top: 0,
            width: '100%',
            zIndex: hs.zIndexCounter,
            direction: 'ltr'
         },
         document.body,
         true
      );
      hs.loading = hs.createElement('a', {
            className: 'highslide-loading',
            title: hs.lang.loadingTitle,
            innerHTML: hs.lang.loadingText,
            href: 'javascript:;'
         }, {
            position: 'absolute',
            top: '-9999px',
            opacity: hs.loadingOpacity,
            zIndex: 1
         }, hs.container
      );
      hs.garbageBin = hs.createElement('div', null, { display: 'none' }, hs.container);
      
      // 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.hideSelects = hs.ieLt7;
      hs.hideIframes = ((window.opera && hs.uaVersion < 9) || navigator.vendor == 'KDE'
         || (hs.ieLt7 && hs.uaVersion < 5.5));
   }
},
ready : function() {
   if (hs.isReady) return;
   hs.isReady = true;
   for (var i = 0; i < hs.onReady.length; i++) hs.onReady[i]();
},

updateAnchors : function() {
   var el, els, all = [], images = [],groups = {}, re;
      
   for (var i = 0; i < hs.openerTagNames.length; i++) {
      els = document.getElementsByTagName(hs.openerTagNames[i]);
      for (var j = 0; j < els.length; j++) {
         el = els[j];
         re = hs.isHsAnchor(el);
         if (re) {
            hs.push(all, el);
            if (re[0] == 'hs.expand') hs.push(images, el);
            var g = hs.getParam(el, 'slideshowGroup') || 'none';
            if (!groups[g]) groups[g] = [];
            hs.push(groups[g], el);
         }
      }
   }
   hs.anchors = { all: all, groups: groups, images: images };
   return hs.anchors;
   
},

getAnchors : function() {
   return hs.anchors || hs.updateAnchors();
},


close : function(el) {
   var exp = hs.getExpander(el);
   if (exp) exp.close();
   return false;
}
}; // end hs object
hs.fx = function( elem, options, prop ){
   this.options = options;
   this.elem = elem;
   this.prop = prop;

   if (!options.orig) options.orig = {};
};
hs.fx.prototype = {
   update: function(){
      (hs.fx.step[this.prop] || hs.fx.step._default)(this);
      
      if (this.options.step)
         this.options.step.call(this.elem, this.now, this);

   },
   custom: function(from, to, unit){
      this.startTime = (new Date()).getTime();
      this.start = from;
      this.end = to;
      this.unit = unit;// || this.unit || "px";
      this.now = this.start;
      this.pos = this.state = 0;

      var self = this;
      function t(gotoEnd){
         return self.step(gotoEnd);
      }

      t.elem = this.elem;

      if ( t() && hs.timers.push(t) == 1 ) {
         hs.timerId = setInterval(function(){
            var timers = hs.timers;

            for ( var i = 0; i < timers.length; i++ )
               if ( !timers[i]() )
                  timers.splice(i--, 1);

            if ( !timers.length ) {
               clearInterval(hs.timerId);
            }
         }, 13);
      }
   },
   step: function(gotoEnd){
      var t = (new Date()).getTime();
      if ( gotoEnd || t >= this.options.duration + this.startTime ) {
         this.now = this.end;
         this.pos = this.state = 1;
         this.update();

         this.options.curAnim[ this.prop ] = true;

         var done = true;
         for ( var i in this.options.curAnim )
            if ( this.options.curAnim[i] !== true )
               done = false;

         if ( done ) {
            if (this.options.complete) this.options.complete.call(this.elem);
         }
         return false;
      } else {
         var n = t - this.startTime;
         this.state = n / this.options.duration;
         this.pos = this.options.easing(n, 0, 1, this.options.duration);
         this.now = this.start + ((this.end - this.start) * this.pos);
         this.update();
      }
      return true;
   }

};

hs.extend( hs.fx, {
   step: {

      opacity: function(fx){
         hs.setStyles(fx.elem, { opacity: fx.now });
      },

      _default: function(fx){
         try {
            if ( fx.elem.style && fx.elem.style[ fx.prop ] != null )
               fx.elem.style[ fx.prop ] = fx.now + fx.unit;
            else
               fx.elem[ fx.prop ] = fx.now;
         } catch (e) {}
      }
   }
});

hs.Outline =  function (outlineType, onLoad) {
   this.onLoad = onLoad;
   this.outlineType = outlineType;
   var v = hs.uaVersion, tr;
   
   this.hasAlphaImageLoader = hs.ie && hs.uaVersion < 7;
   if (!outlineType) {
      if (onLoad) onLoad();
      return;
   }
   
   hs.init();
   this.table = hs.createElement(
      'table', {
         cellSpacing: 0
      }, {
         visibility: 'hidden',
         position: 'absolute',
         borderCollapse: 'collapse',
         width: 0
      },
      hs.container,
      true
   );
   var 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' }, 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 +' highslide-outline';
   
   this.preloadGraphic();
};

hs.Outline.prototype = {
preloadGraphic : function () {
   var src = hs.graphicsDir + (hs.outlinesDir || "outlines/")+ this.outlineType +".png";
            
   var appendTo = hs.safari && hs.uaVersion < 525 ? hs.container : null;
   this.graphic = hs.createElement('img', null, { position: 'absolute',
      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);
      }
   }
   this.graphic = null;
   if (hs.pendingOutlines[this.outlineType]) hs.pendingOutlines[this.outlineType].destroy();
   hs.pendingOutlines[this.outlineType] = this;
   if (this.onLoad) this.onLoad();
},
   
setPosition : function (pos, offset, vis, dur, easing) {
   var exp = this.exp,
      stl = exp.wrapper.style,
      offset = offset || 0,
      pos = pos || {
         x: exp.x.pos + offset,
         y: exp.y.pos + offset,
         w: exp.x.get('wsize') - 2 * offset,
         h: exp.y.get('wsize') - 2 * offset
      };
   if (vis) this.table.style.visibility = (pos.h >= 4 * this.offset)
      ? 'visible' : 'hidden';
   hs.setStyles(this.table, {
      left: (pos.x - this.offset) +'px',
      top: (pos.y - this.offset) +'px',
      width: (pos.w + 2 * this.offset) +'px'
   });
   
   pos.w -= 2 * this.offset;
   pos.h -= 2 * this.offset;
   hs.setStyles (this.td[4], {
      width: pos.w >= 0 ? pos.w +'px' : 0,
      height: pos.h >= 0 ? pos.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.discardElement(this.table);
}
};

hs.Dimension = function(exp, dim) {
   this.exp = exp;
   this.dim = dim;
   this.ucwh = dim == 'x' ? 'Width' : 'Height';
   this.wh = this.ucwh.toLowerCase();
   this.uclt = dim == 'x' ? 'Left' : 'Top';
   this.lt = this.uclt.toLowerCase();
   this.ucrb = dim == 'x' ? 'Right' : 'Bottom';
   this.rb = this.ucrb.toLowerCase();
   this.p1 = this.p2 = 0;
};
hs.Dimension.prototype = {
get : function(key) {
   switch (key) {
      case 'loadingPos':
         return this.tpos + this.tb + (this.t - hs.loading['offset'+ this.ucwh]) / 2;
      case 'wsize':
         return this.size + 2 * this.cb + this.p1 + this.p2;
      case 'fitsize':
         return this.clientSize - this.marginMin - this.marginMax;
      case 'maxsize':
         return this.get('fitsize') - 2 * this.cb - this.p1 - this.p2 ;
      case 'opos':
         return this.pos - (this.exp.outline ? this.exp.outline.offset : 0);
      case 'osize':
         return this.get('wsize') + (this.exp.outline ? 2*this.exp.outline.offset : 0);
      case 'imgPad':
         return this.imgSize ? Math.round((this.size - this.imgSize) / 2) : 0;
      
   }
},
calcBorders: function() {
   // correct for borders
   this.cb = (this.exp.content['offset'+ this.ucwh] - this.t) / 2;
   
   this.marginMax = hs['margin'+ this.ucrb];
},
calcThumb: function() {
   this.t = this.exp.el[this.wh] ? parseInt(this.exp.el[this.wh]) :
      this.exp.el['offset'+ this.ucwh];
   this.tpos = this.exp.tpos[this.dim];
   this.tb = (this.exp.el['offset'+ this.ucwh] - this.t) / 2;
   if (this.tpos == 0 || this.tpos == -1) {
      this.tpos = (hs.page[this.wh] / 2) + hs.page['scroll'+ this.uclt];      
   };
},
calcExpanded: function() {
   var exp = this.exp;
   this.justify = 'auto';
   
   
   // size and position
   this.pos = this.tpos - this.cb + this.tb;
   
   if (this.maxHeight && this.dim == 'x')
      exp.maxWidth = Math.min(exp.maxWidth || this.full, exp.maxHeight * this.full / exp.y.full);
      
   this.size = Math.min(this.full, exp['max'+ this.ucwh] || this.full);
   this.minSize = exp.allowSizeReduction ?
      Math.min(exp['min'+ this.ucwh], this.full) :this.full;
   if (exp.isImage && exp.useBox)   {
      this.size = exp[this.wh];
      this.imgSize = this.full;
   }
   if (this.dim == 'x' && hs.padToMinWidth) this.minSize = exp.minWidth;
   this.marginMin = hs['margin'+ this.uclt];
   this.scroll = hs.page['scroll'+ this.uclt];
   this.clientSize = hs.page[this.wh];
},
setSize: function(i) {
   var exp = this.exp;
   if (exp.isImage && (exp.useBox || hs.padToMinWidth)) {
      this.imgSize = i;
      this.size = Math.max(this.size, this.imgSize);
      exp.content.style[this.lt] = this.get('imgPad')+'px';
   } else
   this.size = i;
   
   exp.content.style[this.wh] = i +'px';
   exp.wrapper.style[this.wh] = this.get('wsize') +'px';
   if (exp.outline) exp.outline.setPosition();
   if (this.dim == 'x' && exp.overlayBox) exp.sizeOverlayBox(true);
},
setPos: function(i) {
   this.pos = i;
   this.exp.wrapper.style[this.lt] = i +'px';   
   
   if (this.exp.outline) this.exp.outline.setPosition();
   
}
};

hs.Expander = function(a, params, custom, contentType) {
   if (document.readyState && hs.ie && !hs.isReady) {
      hs.addEventListener(document, 'ready', function() {
         new hs.Expander(a, params, custom, contentType);
      });
      return;
   }
   this.a = a;
   this.custom = custom;
   this.contentType = contentType || 'image';
   this.isImage = !this.isHtml;
   
   hs.continuePreloading = false;
   this.overlays = [];
   hs.init();
   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];
   }
   if (!this.src) this.src = a.href;
   
   // get thumb
   var el = (params && params.thumbnailId) ? hs.$(params.thumbnailId) : a;
   el = this.thumb = el.getElementsByTagName('img')[0] || el;
   this.thumbsUserSetId = el.id || a.id;
   
   // 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
   if (!hs.allowSimultaneousLoading) 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[key] = this;
   if (!hs.allowMultipleInstances && !hs.upcoming) {
      if (hs.expanders[key-1]) hs.expanders[key-1].close();
      if (typeof hs.focusKey != 'undefined' && hs.expanders[hs.focusKey])
         hs.expanders[hs.focusKey].close();
   }
   
   // initiate metrics
   this.el = el;
   this.tpos = this.pageOrigin || hs.getPosition(el);
   hs.getPageSize();
   var x = this.x = new hs.Dimension(this, 'x');
   x.calcThumb();
   var y = this.y = new hs.Dimension(this, 'y');
   y.calcThumb();
   this.wrapper = hs.createElement(
      'div', {
         id: 'highslide-wrapper-'+ this.key,
         className: 'highslide-wrapper '+ this.wrapperClassName
      }, {
         visibility: 'hidden',
         position: 'absolute',
         zIndex: hs.zIndexCounter += 2
      }, null, true );
   
   this.wrapper.onmouseover = this.wrapper.onmouseout = hs.wrapperMouseHandler;
   if (this.contentType == 'image' && this.outlineWhileAnimating == 2)
      this.outlineWhileAnimating = 0;
   
   // get the outline
   if (!this.outlineType) {
      this[this.contentType +'Create']();
   
   } else if (hs.pendingOutlines[this.outlineType]) {
      this.connectOutline();
      this[this.contentType +'Create']();
   
   } else {
      this.showLoading();
      var exp = this;
      new hs.Outline(this.outlineType,
         function () {
            exp.connectOutline();
            exp[exp.contentType +'Create']();
         }
      );
   }
   return true;
};

hs.Expander.prototype = {
error : function(e) {
   if (hs.debug) alert ('Line '+ e.lineNumber +': '+ e.message);
   else window.location.href = this.src;
},

connectOutline : function() {
   var outline = this.outline = hs.pendingOutlines[this.outlineType];
   outline.exp = this;
   outline.table.style.zIndex = this.wrapper.style.zIndex - 1;
   hs.pendingOutlines[this.outlineType] = null;
},

showLoading : function() {
   if (this.onLoadStarted || this.loading) return;
   
   this.loading = hs.loading;
   var exp = this;
   this.loading.onclick = function() {
      exp.cancelLoading();
   };
   var exp = this,
      l = this.x.get('loadingPos') +'px',
      t = this.y.get('loadingPos') +'px';
   setTimeout(function () {
      if (exp.loading) hs.setStyles(exp.loading, { left: l, top: t, zIndex: hs.zIndexCounter++ })}
   , 100);
},

imageCreate : function() {
   var exp = this;
   
   var img = document.createElement('img');
    this.content = img;
    img.onload = function () {
       if (hs.expanders[exp.key]) exp.contentLoaded();
   };
    if (hs.blockRightClick) img.oncontextmenu = function() { return false; };
    img.className = 'highslide-image';
    hs.setStyles(img, {
       visibility: 'hidden',
       display: 'block',
       position: 'absolute',
      maxWidth: '9999px',
      zIndex: 3
   });
    img.title = hs.lang.restoreTitle;
   if (hs.safari && hs.uaVersion < 525) hs.container.appendChild(img);
    if (hs.ie && hs.flushImgSize) img.src = null;
   img.src = this.src;
   
   this.showLoading();
},

contentLoaded : function() {
   try {   
      if (!this.content) return;
      this.content.onload = null;
      if (this.onLoadStarted) return;
      else this.onLoadStarted = true;
      
      var x = this.x, y = this.y;
      
      if (this.loading) {
         hs.setStyles(this.loading, { top: '-9999px' });
         this.loading = null;
      }   
         x.full = this.content.width;
         y.full = this.content.height;
         
         hs.setStyles(this.content, {
            width: x.t +'px',
            height: y.t +'px'
         });
         this.wrapper.appendChild(this.content);
         hs.container.appendChild(this.wrapper);
      
      x.calcBorders();
      y.calcBorders();
      
      hs.setStyles (this.wrapper, {
         left: (x.tpos + x.tb - x.cb) +'px',
         top: (y.tpos + x.tb - y.cb) +'px'
      });
      this.getOverlays();
      
      var ratio = x.full / y.full;
      x.calcExpanded();
      this.justify(x);
      
      y.calcExpanded();
      this.justify(y);
      if (this.overlayBox) this.sizeOverlayBox(0, 1);

      
      if (this.allowSizeReduction) {
            this.correctRatio(ratio);
         if (this.isImage && this.x.full > (this.x.imgSize || this.x.size)) {
            this.createFullExpand();
            if (this.overlays.length == 1) this.sizeOverlayBox();
         }
      }
      this.show();
      
   } catch (e) {
      this.error(e);
   }
},

justify : function (p, moveOnly) {
   var tgtArr, tgt = p.target, dim = p == this.x ? 'x' : 'y';
   
      var hasMovedMin = false;
      
      var allowReduce = p.exp.allowSizeReduction;
         p.pos = Math.round(p.pos - ((p.get('wsize') - p.t) / 2));
      if (p.pos < p.scroll + p.marginMin) {
         p.pos = p.scroll + p.marginMin;
         hasMovedMin = true;      
      }
      if (!moveOnly && p.size < p.minSize) {
         p.size = p.minSize;
         allowReduce = false;
      }
      if (p.pos + p.get('wsize') > p.scroll + p.clientSize - p.marginMax) {
         if (!moveOnly && hasMovedMin && allowReduce) {
            p.size = Math.min(p.size, p.get(dim == 'y' ? 'fitsize' : 'maxsize'));
         } else if (p.get('wsize') < p.get('fitsize')) {
            p.pos = p.scroll + p.clientSize - p.marginMax - p.get('wsize');
         } else { // image larger than viewport
            p.pos = p.scroll + p.marginMin;
            if (!moveOnly && allowReduce) p.size = p.get(dim == 'y' ? 'fitsize' : 'maxsize');
         }         
      }
      
      if (!moveOnly && p.size < p.minSize) {
         p.size = p.minSize;
         allowReduce = false;
      }
      
   
      
   if (p.pos < p.marginMin) {
      var tmpMin = p.pos;
      p.pos = p.marginMin;
      
      if (allowReduce && !moveOnly) p.size = p.size - (p.pos - tmpMin);
      
   }
},

correctRatio : function(ratio) {
   var x = this.x,
      y = this.y,
      changed = false,
      xSize = Math.min(x.full, x.size),
      ySize = Math.min(y.full, y.size),
      useBox = (this.useBox || hs.padToMinWidth);
   
   if (xSize / ySize > ratio) { // width greater
      xSize = ySize * ratio;
      if (xSize < x.minSize) { // below minWidth
         xSize = x.minSize;
         ySize = xSize / ratio;
      }
      changed = true;
   
   } else if (xSize / ySize < ratio) { // height greater
      ySize = xSize / ratio;
      changed = true;
   }
   
   if (hs.padToMinWidth && x.full < x.minSize) {
      x.imgSize = x.full;
      y.size = y.imgSize = y.full;
   } else if (this.useBox) {
      x.imgSize = xSize;
      y.imgSize = ySize;
   } else {
      x.size = xSize;
      y.size = ySize;
   }
   changed = this.fitOverlayBox(this.useBox ? null : ratio, changed);
   if (useBox && y.size < y.imgSize) {
      y.imgSize = y.size;
      x.imgSize = y.size * ratio;
   }
   if (changed || useBox) {
      x.pos = x.tpos - x.cb + x.tb;
      x.minSize = x.size;
      this.justify(x, true);
   
      y.pos = y.tpos - y.cb + y.tb;
      y.minSize = y.size;
      this.justify(y, true);
      if (this.overlayBox) this.sizeOverlayBox();
   }
   
   
},
fitOverlayBox : function(ratio, changed) {
   var x = this.x, y = this.y;
   if (this.overlayBox) {
      while (y.size > this.minHeight && x.size > this.minWidth
            &&  y.get('wsize') > y.get('fitsize')) {
         y.size -= 10;
         if (ratio) x.size = y.size * ratio;
         this.sizeOverlayBox(0, 1);
         changed = true;
      }
   }
   return changed;
},

show : function () {
   var x = this.x, y = this.y;
   this.doShowHide('hidden');
   
   // Apply size change
   this.changeSize(
      1, {
         wrapper: {
            width : x.get('wsize'),
            height : y.get('wsize'),
            left: x.pos,
            top: y.pos
         },
         content: {
            left: x.p1 + x.get('imgPad'),
            top: y.p1 + y.get('imgPad'),
            width:x.imgSize ||x.size,
            height:y.imgSize ||y.size
         }
      },
      hs.expandDuration
   );
},

changeSize : function(up, to, dur) {
   
   if (this.outline && !this.outlineWhileAnimating) {
      if (up) this.outline.setPosition();
      else this.outline.destroy();
   }
   
   
   if (!up) this.destroyOverlays();
   
   var exp = this,
      x = exp.x,
      y = exp.y,
      easing = this.easing;
   if (!up) easing = this.easingClose || easing;
   var after = up ?
      function() {
            
         if (exp.outline) exp.outline.table.style.visibility = "visible";
         setTimeout(function() {
            exp.afterExpand();
         }, 50);
      } :
      function() {
         exp.afterClose();
      };
   if (up) hs.setStyles( this.wrapper, {
      width: x.t +'px',
      height: y.t +'px'
   });
   if (this.fadeInOut) {
      hs.setStyles(this.wrapper, { opacity: up ? 0 : 1 });
      hs.extend(to.wrapper, { opacity: up });
   }
   hs.animate( this.wrapper, to.wrapper, {
      duration: dur,
      easing: easing,
      step: function(val, args) {
         if (exp.outline && exp.outlineWhileAnimating && args.prop == 'top') {
            var fac = up ? args.pos : 1 - args.pos;
            var pos = {
               w: x.t + (x.get('wsize') - x.t) * fac,
               h: y.t + (y.get('wsize') - y.t) * fac,
               x: x.tpos + (x.pos - x.tpos) * fac,
               y: y.tpos + (y.pos - y.tpos) * fac
            };
            exp.outline.setPosition(pos, 0, 1);            
         }
      }
   });
   hs.animate( this.content, to.content, dur, easing, after);
   if (up) {
      this.wrapper.style.visibility = 'visible';
      this.content.style.visibility = 'visible';
      this.a.className += ' highslide-active-anchor';
   }
},




afterExpand : function() {
   this.isExpanded = true;   
   this.focus();
   if (hs.upcoming && hs.upcoming == this.a) hs.upcoming = null;
   this.prepareNextOutline();
   var p = hs.page, mX = hs.mouse.x + p.scrollLeft, mY = hs.mouse.y + p.scrollTop;
   this.mouseIsOver = this.x.pos < mX && mX < this.x.pos + this.x.get('wsize')
      && this.y.pos < mY && mY < this.y.pos + this.y.get('wsize');   
   if (this.overlayBox) this.showOverlays();
   
},


prepareNextOutline : function() {
   var key = this.key;
   var outlineType = this.outlineType;
   new hs.Outline(outlineType,
      function () { try { hs.expanders[key].preloadNext(); } catch (e) {} });
},


preloadNext : function() {
   var next = this.getAdjacentAnchor(1);
   if (next && next.onclick.toString().match(/hs\.expand/))
      var img = hs.createElement('img', { src: hs.getSrc(next) });
},


getAdjacentAnchor : function(op) {
   var current = this.getAnchorIndex(), as = hs.anchors.groups[this.slideshowGroup || 'none'];
   return (as && as[current + op]) || null;
},

getAnchorIndex : function() {
   var arr = hs.getAnchors().groups[this.slideshowGroup || 'none'];
   if (arr) for (var i = 0; i < arr.length; i++) {
      if (arr[i] == this.a) return i;
   }
   return null;
},


cancelLoading : function() {
   hs.discardElement (this.wrapper);
   hs.expanders[this.key] = null;
   if (this.loading) hs.loading.style.left = '-9999px';
},

writeCredits : function () {
   this.credits = hs.createElement('a', {
      href: hs.creditsHref,
      target: hs.creditsTarget,
      className: 'highslide-credits',
      innerHTML: hs.lang.creditsText,
      title: hs.lang.creditsTitle
   });
   this.createOverlay({
      overlayId: this.credits,
      position: this.creditsPosition || 'top left'
   });
},

getInline : function(types, addOverlay) {
   for (var i = 0; i < types.length; i++) {
      var type = types[i], s = null;
      if (!this[type +'Id'] && this.thumbsUserSetId) 
         this[type +'Id'] = type +'-for-'+ this.thumbsUserSetId;
      if (this[type +'Id']) this[type] = hs.getNode(this[type +'Id']);
      if (!this[type] && !this[type +'Text'] && this[type +'Eval']) try {
         s = eval(this[type +'Eval']);
      } catch (e) {}
      if (!this[type] && this[type +'Text']) {
         s = this[type +'Text'];
      }
      if (!this[type] && !s) {
         this[type] = hs.getNode(this.a['_'+ type + 'Id']);
         if (!this[type]) {
            var next = this.a.nextSibling;
            while (next && !hs.isHsAnchor(next)) {
               if ((new RegExp('highslide-'+ type)).test(next.className || null)) {
                  if (!next.id) this.a['_'+ type + 'Id'] = next.id = 'hsId'+ hs.idCounter++;
                  this[type] = hs.getNode(next.id);
                  break;
               }
               next = next.nextSibling;
            }
         }
      }
      
      if (!this[type] && s) this[type] = hs.createElement('div',
            { className: 'highslide-'+ type, innerHTML: s } );
      
      if (addOverlay && this[type]) {
         var o = { position: (type == 'heading') ? 'above' : 'below' };
         for (var x in this[type+'Overlay']) o[x] = this[type+'Overlay'][x];
         o.overlayId = this[type];
         this.createOverlay(o);
      }
   }
},


// on end move and resize
doShowHide : function(visibility) {
   if (hs.hideSelects) this.showHideElements('SELECT', visibility);
   if (hs.hideIframes) this.showHideElements('IFRAME', visibility);
   if (hs.geckoMac) this.showHideElements('*', visibility);
},
showHideElements : function (tagName, visibility) {
   var els = document.getElementsByTagName(tagName);
   var prop = tagName == '*' ? 'overflow' : 'visibility';
   for (var i = 0; i < els.length; i++) {
      if (prop == 'visibility' || (document.defaultView.getComputedStyle(
            els[i], "").getPropertyValue('overflow') == 'auto'
            || els[i].getAttribute('hidden-by') != null)) {
         var hiddenBy = els[i].getAttribute('hidden-by');
         if (visibility == 'visible' && hiddenBy) {
            hiddenBy = hiddenBy.replace('['+ this.key +']', '');
            els[i].setAttribute('hidden-by', hiddenBy);
            if (!hiddenBy) els[i].style[prop] = els[i].origProp;
         } else if (visibility == 'hidden') { // hide if behind
            var elPos = hs.getPosition(els[i]);
            elPos.w = els[i].offsetWidth;
            elPos.h = els[i].offsetHeight;
         
            
               var clearsX = (elPos.x + elPos.w < this.x.get('opos')
                  || elPos.x > this.x.get('opos') + this.x.get('osize'));
               var clearsY = (elPos.y + elPos.h < this.y.get('opos')
                  || elPos.y > this.y.get('opos') + this.y.get('osize'));
            var wrapperKey = hs.getWrapperKey(els[i]);
            if (!clearsX && !clearsY && wrapperKey != this.key) { // element falls behind image
               if (!hiddenBy) {
                  els[i].setAttribute('hidden-by', '['+ this.key +']');
                  els[i].origProp = els[i].style[prop];
                  els[i].style[prop] = 'hidden';
                  
               } else if (hiddenBy.indexOf('['+ this.key +']') == -1) {
                  els[i].setAttribute('hidden-by', hiddenBy + '['+ this.key +']');
               }
            } else if ((hiddenBy == '['+ this.key +']' || hs.focusKey == wrapperKey)
                  && wrapperKey != this.key) { // on move
               els[i].setAttribute('hidden-by', '');
               els[i].style[prop] = els[i].origProp || '';
            } else if (hiddenBy && hiddenBy.indexOf('['+ this.key +']') > -1) {
               els[i].setAttribute('hidden-by', hiddenBy.replace('['+ this.key +']', ''));
            }
                  
         }
      }
   }
},

focus : function() {
   this.wrapper.style.zIndex = hs.zIndexCounter += 2;
   // blur others
   for (var i = 0; i < hs.expanders.length; i++) {
      if (hs.expanders[i] && i == hs.focusKey) {
         var blurExp = hs.expanders[i];
         blurExp.content.className += ' highslide-'+ blurExp.contentType +'-blur';
            blurExp.content.style.cursor = hs.ieLt7 ? 'hand' : 'pointer';
            blurExp.content.title = hs.lang.focusTitle;
      }
   }
   
   // focus this
   if (this.outline) this.outline.table.style.zIndex
      = this.wrapper.style.zIndex - 1;
   this.content.className = 'highslide-'+ this.contentType;
      this.content.title = hs.lang.restoreTitle;
      
      if (hs.restoreCursor) {
         hs.styleRestoreCursor = window.opera ? 'pointer' : 'url('+ hs.graphicsDir + hs.restoreCursor +'), pointer';
         if (hs.ieLt7 && hs.uaVersion < 6) hs.styleRestoreCursor = 'hand';
         this.content.style.cursor = hs.styleRestoreCursor;
      }
      
   hs.focusKey = this.key;   
   hs.addEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler);   
},
moveTo: function(x, y) {
   this.x.setPos(x);
   this.y.setPos(y);
},
resize : function (e) {
   var w, h, r = e.width / e.height;
   w = Math.max(e.width + e.dX, Math.min(this.minWidth, this.x.full));
   if (this.isImage && Math.abs(w - this.x.full) < 12) w = this.x.full;
   h = w / r;
   if (h < Math.min(this.minHeight, this.y.full)) {
      h = Math.min(this.minHeight, this.y.full);
      if (this.isImage) w = h * r;
   }
   this.resizeTo(w, h);
},
resizeTo: function(w, h) {
   this.y.setSize(h);
   this.x.setSize(w);
   this.wrapper.style.height = this.y.get('wsize') +'px';
},

close : function() {
   if (this.isClosing || !this.isExpanded) return;
   this.isClosing = true;
   
   hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler);
   
   try {
      this.content.style.cursor = 'default';
      this.changeSize(
         0, {
            wrapper: {
               width : this.x.t,
               height : this.y.t,
               left: this.x.tpos - this.x.cb + this.x.tb,
               top: this.y.tpos - this.y.cb + this.y.tb
            },
            content: {
               left: 0,
               top: 0,
               width: this.x.t,
               height: this.y.t
            }
         }, hs.restoreDuration
      );
   } catch (e) { this.afterClose(); }
},

createOverlay : function (o) {
   var el = o.overlayId;
   if (typeof el == 'string') el = hs.getNode(el);
   if (o.html) el = hs.createElement('div', { innerHTML: o.html });
   if (!el || typeof el == 'string') return;
   el.style.display = 'block';
   this.genOverlayBox();
   var width = o.width && /^[0-9]+(px|%)$/.test(o.width) ? o.width : 'auto';
   if (/^(left|right)panel$/.test(o.position) && !/^[0-9]+px$/.test(o.width)) width = '200px';
   var overlay = hs.createElement(
      'div', {
         id: 'hsId'+ hs.idCounter++,
         hsId: o.hsId
      }, {
         position: 'absolute',
         visibility: 'hidden',
         width: width,
         direction: hs.lang.cssDirection || '',
         opacity: 0
      },this.overlayBox,
      true
   );
   
   overlay.appendChild(el);
   hs.extend(overlay, {
      opacity: 1,
      offsetX: 0,
      offsetY: 0,
      dur: (o.fade === 0 || o.fade === false || (o.fade == 2 && hs.ie)) ? 0 : 250
   });
   hs.extend(overlay, o);
   
      
   if (this.gotOverlays) {
      this.positionOverlay(overlay);
      if (!overlay.hideOnMouseOut || this.mouseIsOver)
         hs.animate(overlay, { opacity: overlay.opacity }, overlay.dur);
   }
   hs.push(this.overlays, hs.idCounter - 1);
},
positionOverlay : function(overlay) {
   var p = overlay.position || 'middle center',
      offX = overlay.offsetX,
      offY = overlay.offsetY;
   if (overlay.parentNode != this.overlayBox) this.overlayBox.appendChild(overlay);
   if (/left$/.test(p)) overlay.style.left = offX +'px';
   
   if (/center$/.test(p))   hs.setStyles (overlay, {
      left: '50%',
      marginLeft: (offX - Math.round(overlay.offsetWidth / 2)) +'px'
   });   
   
   if (/right$/.test(p)) overlay.style.right = - offX +'px';
      
   if (/^leftpanel$/.test(p)) {
      hs.setStyles(overlay, {
         right: '100%',
         marginRight: this.x.cb +'px',
         top: - this.y.cb +'px',
         bottom: - this.y.cb +'px',
         overflow: 'auto'
      });      
      this.x.p1 = overlay.offsetWidth;
   
   } else if (/^rightpanel$/.test(p)) {
      hs.setStyles(overlay, {
         left: '100%',
         marginLeft: this.x.cb +'px',
         top: - this.y.cb +'px',
         bottom: - this.y.cb +'px',
         overflow: 'auto'
      });
      this.x.p2 = overlay.offsetWidth;
   }

   if (/^top/.test(p)) overlay.style.top = offY +'px';
   if (/^middle/.test(p))   hs.setStyles (overlay, {
      top: '50%',
      marginTop: (offY - Math.round(overlay.offsetHeight / 2)) +'px'
   });   
   if (/^bottom/.test(p)) overlay.style.bottom = - offY +'px';
   if (/^above$/.test(p)) {
      hs.setStyles(overlay, {
         left: (- this.x.p1 - this.x.cb) +'px',
         right: (- this.x.p2 - this.x.cb) +'px',
         bottom: '100%',
         marginBottom: this.y.cb +'px',
         width: 'auto'
      });
      this.y.p1 = overlay.offsetHeight;
   
   } else if (/^below$/.test(p)) {
      hs.setStyles(overlay, {
         position: 'relative',
         left: (- this.x.p1 - this.x.cb) +'px',
         right: (- this.x.p2 - this.x.cb) +'px',
         top: '100%',
         marginTop: this.y.cb +'px',
         width: 'auto'
      });
      this.y.p2 = overlay.offsetHeight;
      overlay.style.position = 'absolute';
   }
},

getOverlays : function() {   
   this.getInline(['heading', 'caption'], true);
   if (this.heading && this.dragByHeading) this.heading.className += ' highslide-move';
   if (hs.showCredits) this.writeCredits();
   for (var i = 0; i < hs.overlays.length; i++) {
      var o = hs.overlays[i], tId = o.thumbnailId, sg = o.slideshowGroup;
      if ((!tId && !sg) || (tId && tId == this.thumbsUserSetId)
            || (sg && sg === this.slideshowGroup)) {
         this.createOverlay(o);
      }
   }
   var os = [];
   for (var i = 0; i < this.overlays.length; i++) {
      var o = hs.$('hsId'+ this.overlays[i]);
      if (/panel$/.test(o.position)) this.positionOverlay(o);
      else hs.push(os, o);
   }
   for (var i = 0; i < os.length; i++) this.positionOverlay(os[i]);
   this.gotOverlays = true;
},
genOverlayBox : function() {
   if (!this.overlayBox) this.overlayBox = hs.createElement (
      'div', {
         className: this.wrapperClassName
      }, {
         position : 'absolute',
         width: (this.x.size || (this.useBox ? this.width : null)
            || this.x.full) +'px',
         height: (this.y.size || this.y.full) +'px',
         visibility : 'hidden',
         overflow : 'hidden',
         zIndex : hs.ie ? 4 : 'auto'
      },
      hs.container,
      true
   );
},
sizeOverlayBox : function(doWrapper, doPanels) {
   var overlayBox = this.overlayBox,
      x = this.x,
      y = this.y;
   hs.setStyles( overlayBox, {
      width: x.size +'px',
      height: y.size +'px'
   });
   if (doWrapper || doPanels) {
      for (var i = 0; i < this.overlays.length; i++) {
         var o = hs.$('hsId'+ this.overlays[i]);
         var ie6 = (hs.ieLt7 || document.compatMode == 'BackCompat');
         if (o && /^(above|below)$/.test(o.position)) {
            if (ie6) {
               o.style.width = (overlayBox.offsetWidth + 2 * x.cb
                  + x.p1 + x.p2) +'px';
            }
            y[o.position == 'above' ? 'p1' : 'p2'] = o.offsetHeight;
         }
         if (o && ie6 && /^(left|right)panel$/.test(o.position)) {
            o.style.height = (overlayBox.offsetHeight + 2* y.cb) +'px';
         }
      }
   }
   if (doWrapper) {
      hs.setStyles(this.content, {
         top: y.p1 +'px'
      });
      hs.setStyles(overlayBox, {
         top: (y.p1 + y.cb) +'px'
      });
   }
},

showOverlays : function() {
   var b = this.overlayBox;
   b.className = '';
   hs.setStyles(b, {
      top: (this.y.p1 + this.y.cb) +'px',
      left: (this.x.p1 + this.x.cb) +'px',
      overflow : 'visible'
   });
   if (hs.safari) b.style.visibility = 'visible';
   this.wrapper.appendChild (b);
   for (var i = 0; i < this.overlays.length; i++) {
      var o = hs.$('hsId'+ this.overlays[i]);
      o.style.zIndex = o.zIndex || 4;
      if (!o.hideOnMouseOut || this.mouseIsOver) {
         o.style.visibility = 'visible';
         hs.setStyles(o, { visibility: 'visible', display: '' });
         hs.animate(o, { opacity: o.opacity }, o.dur);
      }
   }
},

destroyOverlays : function() {
   if (!this.overlays.length) return;
   hs.discardElement(this.overlayBox);
},



createFullExpand : function () {
   this.fullExpandLabel = hs.createElement(
      'a', {
         href: 'javascript:hs.expanders['+ this.key +'].doFullExpand();',
         title: hs.lang.fullExpandTitle,
         className: 'highslide-full-expand'
      }
   );
   
   this.createOverlay({
      overlayId: this.fullExpandLabel,
      position: hs.fullExpandPosition,
      hideOnMouseOut: true,
      opacity: hs.fullExpandOpacity
   });
},

doFullExpand : function () {
   try {
      if (this.fullExpandLabel) hs.discardElement(this.fullExpandLabel);
      
      this.focus();
      var xSize = this.x.size,
           ySize = this.y.size;
        this.resizeTo(this.x.full, this.y.full);
       
        var xpos = this.x.pos - (this.x.size - xSize) / 2;
        if (xpos < hs.marginLeft) xpos = hs.marginLeft;
       
        var ypos = this.y.pos - (this.y.size - ySize) / 2;
        if (ypos < hs.marginTop) ypos = hs.marginTop;
       
        this.moveTo(xpos, ypos);
      this.doShowHide('hidden');
   
   } catch (e) {
      this.error(e);
   }
},


afterClose : function () {
   this.a.className = this.a.className.replace('highslide-active-anchor', '');
   
   this.doShowHide('visible');
      if (this.outline && this.outlineWhileAnimating) this.outline.destroy();
   
      hs.discardElement(this.wrapper);
   
   hs.expanders[this.key] = null;      
   hs.reOrder();
}

};
hs.langDefaults = hs.lang;
// history
var HsExpander = hs.Expander;
if (hs.ie && window == window.top) {
   (function () {
      try {
         document.documentElement.doScroll('left');
      } catch (e) {
         setTimeout(arguments.callee, 50);
         return;
      }
      hs.ready();
   })();
}
hs.addEventListener(document, 'DOMContentLoaded', hs.ready);
hs.addEventListener(window, 'load', hs.ready);

// set handlers
hs.addEventListener(document, 'ready', function() {
   if (hs.expandCursor) {
      var style = hs.createElement('style', { type: 'text/css' }, null,
         document.getElementsByTagName('HEAD')[0]),
         backCompat = document.compatMode == 'BackCompat';
         
      
      function addRule(sel, dec) {
         if (hs.ie && (hs.uaVersion < 9 || backCompat)) {
            var last = document.styleSheets[document.styleSheets.length - 1];
            if (typeof(last.addRule) == "object") last.addRule(sel, dec);
         } else {
            style.appendChild(document.createTextNode(sel + " {" + dec + "}"));
         }
      }
      function fix(prop) {
         return 'expression( ( ( ignoreMe = document.documentElement.'+ prop +
            ' ? document.documentElement.'+ prop +' : document.body.'+ prop +' ) ) + \'px\' );';
      }
      if (hs.expandCursor) addRule ('.highslide img',
         'cursor: url('+ hs.graphicsDir + hs.expandCursor +'), pointer !important;');
   }
});
hs.addEventListener(window, 'resize', function() {
   hs.getPageSize();
});
hs.addEventListener(document, 'mousemove', function(e) {
   hs.mouse = { x: e.clientX, y: e.clientY   };
});
hs.addEventListener(document, 'mousedown', hs.mouseClickHandler);
hs.addEventListener(document, 'mouseup', hs.mouseClickHandler);

hs.addEventListener(document, 'ready', hs.getAnchors);
hs.addEventListener(window, 'load', hs.preloadImages);
}
https://www.satshop-heilbronn.de
https://www.satanlagenforum.de
Version 3.0.13-PL1
Board3 Portal 2.0.2
Tapatalk
phpBB SEO Class 0.7.0-/Mode:Advanced
Advanced BBcodes Box 3.0.11 (Highslide)
Wer war da 1.2.1
Thanks for Post 1.3.5
phpBB Galerie 1.1.6

Benutzeravatar
techno-com
Beiträge: 55
Registriert: 16. Aug 2010 12:28
Familienstand: Verheiratet
Wohnort: 74076 Heilbronn/ Germany
Kontaktdaten:

Re: ReIMG Image Resizer mit Highslide (Fragen/Einstellungen/

Beitragvon techno-com » 11. Feb 2012 08:55

Noch ein Zwischenbericht ......

Sitze gerade zu Hause vor dem Laptop und hier geht jetzt das "URL-Prompt" auch wieder ! Warum auch immer das gestern Morgen von hier aus nicht ging ?!
https://www.satshop-heilbronn.de
https://www.satanlagenforum.de
Version 3.0.13-PL1
Board3 Portal 2.0.2
Tapatalk
phpBB SEO Class 0.7.0-/Mode:Advanced
Advanced BBcodes Box 3.0.11 (Highslide)
Wer war da 1.2.1
Thanks for Post 1.3.5
phpBB Galerie 1.1.6

Benutzeravatar
Mahony
Site Admin
Site Admin
Beiträge: 749
Registriert: 3. Dez 2006 22:09
Hat sich bedankt: 1 Mal
Danksagung erhalten: 4 Mal

Re: ReIMG Image Resizer mit Highslide (Fragen/Einstellungen/

Beitragvon Mahony » 11. Feb 2012 19:10

Hallo
techno-com hat geschrieben:Das was da akt. bei mir also angezeigt wird von wegen ".......verwende die Pfeiltasten für Vorherige und Nächste" kann also gar nicht von diesem Highslide-Scipt kommen !!!! Ich habe das noch 2x sonst drin, einmal für die Galerie und einmal für ABBCode ("gallery=>plugins=>highslide" und "styles=>abbcode=>highslide"), dort ist aber auch alles in englisch gehalten wonach diese auch nicht das sein können was die "Ursache" aktuell ist !

In der styles/prosilver/template/mods/reimg_content.html findest du zum Beispiel folgendes

Code: Alles auswählen

<!-- IF S_REIMG_ZOOM_METHOD eq '_highslide' -->
   if (window.hs)
   {
      hs.graphicsDir = "{ROOT_PATH}reimg/highslide/graphics/";
      // Language settings for Highslide JS
      hs.lang.cssDirection = "{S_CONTENT_DIRECTION}";
      hs.lang.loadingText = "{LA_LOADING_TEXT}";
      hs.lang.loadingTitle = "{LA_LOADING_TITLE}";
      hs.lang.focusTitle = "{LA_FOCUS_TITLE}";
      hs.lang.fullExpandTitle = "{LA_FULL_EXPAND_TITLE}";
      hs.lang.creditsText = "{LA_CREDITS_TEXT}";
      hs.lang.creditsTitle = "{LA_CREDITS_TITLE}";
      hs.lang.previousText = "{LA_PREVIOUS_TEXT}";
      hs.lang.nextText = "{LA_NEXT_TEXT}";
      hs.lang.moveText = "{LA_MOVE_TEXT}";
      hs.lang.closeText = "{LA_CLOSE_TEXT}";
      hs.lang.closeTitle = "{LA_CLOSE_TITLE}";
      hs.lang.resizeTitle = "{LA_RESIZE_TITLE}";
      hs.lang.playText = "{LA_PLAY_TEXT}";
      hs.lang.playTitle = "{LA_PLAY_TITLE}";
      hs.lang.pauseText = "{LA_PAUSE_TEXT}";
      hs.lang.pauseTitle = "{LA_PAUSE_TITLE}";
      hs.lang.previousTitle = "{LA_PREVIOUS_TITLE}";
      hs.lang.nextTitle = "{LA_NEXT_TITLE}";
      hs.lang.moveTitle = "{LA_MOVE_TITLE}";
      hs.lang.number = "{LA_IMAGE_NUMBER}";
      hs.lang.restoreTitle = "{LA_RESTORE_TITLE}";
   }

damit werden die Sprachvariablen aus den language/xx/xxx.php verwendet.

techno-com hat geschrieben:Ich finde dort aber nichts mit "parse" !!!
Und was meinst du genau wie sich das dann auf die alten Bilder auswirken sollte ?

Dann lies noch einmal was ich geschrieben habe.
Mahony hat geschrieben:Um alle Beiträge zu bearbeiten, empfiehlt sich das Support Toolkit, damit kannst du die BBCodes neu verarbeiten (parsen).
techno-com hat geschrieben:Und was meinst du genau wie sich das dann auf die alten Bilder auswirken sollte ?


Bilder die per BBCode eingebunden wurden und nicht richtig angezeigt werden, werden nach dem neu verarbeiten der BBCodes richtig angezeigt. In der Praxis passiert dabei folgendes (grob gesagt) --> Die Beiträge werden quasi geöffnet und neu gespeichert (neu verarbeitet/geparst).



Grüße: Mahony
Diejenigen, die lautstark darüber diskutieren, warum es nicht geht, mögen bitte jene nicht stören, die es gerade tun.
Klug ist, wer nur die Hälfte von dem glaubt, was er hört. Weise ist, wer erkennt, welche Hälfte richtig ist.

Bild


Zurück zu „Support für phpBB 3.0.x MODs“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste