Solved

Help With fixing this PHP Photo Album Script

Posted on 2008-06-20
57
889 Views
Last Modified: 2011-10-19
Hi All,

OK first things first The original script is the PHP Photo Album script from DynamicDrive found here:

http://www.dynamicdrive.com/dynamicindex4/php-photoalbum.htm

Secondly I have already had this script amended and working perfectly with the help of the following answer from MCUK_STORM here at Experts-Exchange:

http://www.experts-exchange.com/Programming/Languages/Scripting/JavaScript/Q_23429761.html


My problem is that it no longer shows the SWFs since I moved the the getpics.php and swfobject.js into a  scripts folder although .jpgs work fine.

Also I'm not able to find a way to load the first image in the variable automatically into the target div when the page is first opened, currently no image is loaded.

I would really apriciate a some help to track down why this no longer works.

NOTE: nothing in the swfobject.js has been altered or amended. only in the code below and the getpics.php.
<script src="<?php echo $domain; ?>scripts/getpics.php?project=<?php echo $row_project_page['project_short_name']; ?>" type="text/javascript"></script>

    <script src="<?php echo $domain; ?>scripts/swfobject.js" type="text/javascript"></script>
 

    <script type="text/javascript">
 

    /***********************************************

    * PHP Photo Album script-  Dynamic Drive DHTML code library (www.dynamicdrive.com)

    * Visit http://www.dynamicDrive.com for hundreds of DHTML scripts

    * This notice must stay intact for legal use

    ***********************************************/
 

    var dimension="3x2" //Specify dimension of gallery (number of images shown), such as 4x2, 3x1 etc

    var imagepath="<?php echo $domain; ?>projects/<?php echo $row_project_page['project_short_name']; ?>/thumbs/" //Absolute path to image directory. Include trailing slash (/)

    var swfThumbSize={width: '100px', height: '100px'};
 

    var href_target="new" //Enter target attribute of links, if applicable
 

    //Toggle popup link setting: popupsetting[0 or 1, "pop up window attributes" (if 1)]

    var popupsetting=[1, "width=500px, height=400px, scrollbars, resizable"]
 

    //Toggle image description: descriptionprefix[0 or 1, "Text to show" (if 1)]

    var descriptionprefix=[0, "Photo "]
 

    //Sort images by date? ("asc", "desc", or "")

    //"desc" for example causes the newest images to show up first in the gallery

    //"" disables this feature, so images are sorted by file name (default)

    var gsortorder=""
 

    //By default, each image hyperlinks to itself.

    //However, if you wish them to link to larger versions of themselves

    //Specify the directory in which the larger images are located

    //The file names of these large images should mirror those of the original

    //Enter a blank string ("") to disable this option

    var targetlinkdir="<?php echo $domain; ?>projects/<?php echo $row_project_page['project_short_name']; ?>/large/"

    var swfLargeSize={width: '300px', height: '300px'};
 

    /////No need to edit beyond here///////////////////
 

    function sortbydate(a, b){ //Sort images function

      if (gsortorder=="asc") {

        //sort by file date: older to newer

        return new Date(a[1])-new Date(b[1]);
 

      } else if (gsortorder=="desc") {

        //sort by file date: newer to older

        return new Date(b[1])-new Date(a[1]);

      }

    }
 

    if (gsortorder=="asc" || gsortorder=="desc") {

      galleryarray.sort(sortbydate);

    }
 

    var totalslots=dimension.split("x")[0]*dimension.split("x")[1];
 

    function buildimage(elem,i){
 

      var ext = galleryarray[i][0].split('.');

      ext = ext[ext.length-1].toLowerCase();
 

      var tempcontainer;
 

      if (galleryarray[i][2]!="") {

        var imagecompletepath=(targetlinkdir!="")? targetlinkdir+galleryarray[i][2] : imagepath+galleryarray[i][2];

      } else {

        var imagecompletepath=(targetlinkdir!="")? targetlinkdir+galleryarray[i][0] : imagepath+galleryarray[i][0];

      }
 

      switch (ext) {

        case 'swf':
 

          tempcontainer='<a href="' + imagecompletepath + '" target="' + href_target + '" onClick="return popuplinkfunc(this)">'

          tempcontainer+='<div id="flashItem' + i + '">Flash Item ' + galleryarray[i][0] + ' [' + galleryarray[i][1] + ']</div>';

          tempcontainer+= galleryarray[i][0] + ' [' + galleryarray[i][1] + ']';

          tempcontainer+='</a><br />';

          tempcontainer+=(descriptionprefix[0]==1)? descriptionprefix[1]+(i+1) : "";

          elem.innerHTML=tempcontainer;
 

          var thumbSO = new SWFObject( imagepath+galleryarray[i][0] , "Thumb", swfThumbSize['width'],swfThumbSize['height'],1,"#fff" );

          thumbSO.write('flashItem' + i);

        break;
 

        default:

          tempcontainer='<a href="'+imagecompletepath+'" target="'+href_target+'" onClick="return popuplinkfunc(this)">';

          tempcontainer+='<img src="'+imagepath+galleryarray[i][0]+'" title="'+galleryarray[i][0]+' ['+galleryarray[i][1]+']" />';

          tempcontainer+='</a><br />';

          tempcontainer+=(descriptionprefix[0]==1)? descriptionprefix[1]+(i+1) : "";
 

          elem.innerHTML=tempcontainer;

      }
 

      return true;

    }
 

    function jumptopage(p){

      var startpoint=(p-1)*totalslots;

      var y=1;

      for (i=0; i<totalslots; i++){

        if (typeof galleryarray[startpoint+i]!="undefined") {

          buildimage( document.getElementById("slide"+i), startpoint+i);

        } else {

          document.getElementById("slide"+i).innerHTML=''

        }

      }
 

      while(document.getElementById("navlink"+y)!=null){

        document.getElementById("navlink"+y).className="";

        y++;

      }
 

      document.getElementById("navlink"+p).className="current";

    }
 
 

    //this is the function which gets the image to open in targetdiv

    function popuplinkfunc(imgsrc){

      if (popupsetting[0]==1){

        var ext = imgsrc.href.split('.');

        ext=ext[ext.length-1].toLowerCase();
 

        switch (ext) {

          case 'swf':

            document.getElementById("targetdiv").innerHTML="<div id=\"largeSwf\"></div>";

            var largeSO = new SWFObject( imgsrc.href , "Large", swfLargeSize['width'],swfLargeSize['height'],1,"#fff" );

            largeSO.write('largeSwf');

          break;
 

          default:

          document.getElementById("targetdiv").innerHTML='<img src="'+imgsrc.href+'" />';

        }

        return false;

      }
 

      else

        return true;

    }
 

    </script>

    

    

</head>
 
 

<body>

<div class="project_id">

  <h1>0<?php echo $row_project_page['project_position']; ?>/</h1>

</div>

<div class="project_name">

  <h2><?php echo $row_project_page['project_name']; ?></h2>

</div>

<div class="project_type">

  <h3><?php echo $row_project_page['project_type']; ?></h3>

</div>

<div id="targetdiv"><script type="text/javascript">

document.write('<img src="'+imagepath+galleryarray[0]+'">');

</script></div>
 
 
 
 
 

<!-- galley and JS script here -->
 
 

    <script type="text/javascript">

      var curimage=0;

      for (y=0; y<dimension.split("x")[1]; y++){

        for (x=0; x<dimension.split("x")[0]; x++){

          if (curimage<galleryarray.length) {

            document.write('<div id="slide'+curimage+'" class="slideshow"></div>');

            buildimage(document.getElementById('slide'+curimage),curimage);

          } else {

            document.write('<div id="slide'+curimage+'" class="slideshow"></div>');

          }

          curimage++;

        }
 

        document.write('<br style="clear: left" />');

      }

    </script>
 
 

    <!--Below HTML code refers to the navigational links for the gallery-->

    <div id="navlinks">

<script type="text/javascript">

var itemsperpage=totalslots

for (i=1; i<Math.ceil(galleryarray.length/totalslots)+1; i++){

var start=(i==1)? i : itemsperpage*(i-1)+1

var end=(i==1)? itemsperpage : Math.min(galleryarray.length, start+itemsperpage-1)

document.write('<a id="navlink'+i+'" href="javascript:jumptopage('+i+')\">'+start+' to '+end+'</a> ')

}

document.getElementById("navlink1").className="current"

</script>

</div>

Open in new window

scripts.zip
0
Comment
Question by:sany101
  • 33
  • 24
57 Comments
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21844914
sany101: I'm not going to open your zip files.  You can post in clear text if you want us to read something.

Almost certainly your troubles arise from an incorrect path in the generated HTML.  If you post a link to the web site we may be able to tie a missing file back to the PHP that generated the link.  That should help you isolate and fix the problem.

~Ray
0
 

Author Comment

by:sany101
ID: 21844987
Thanks Ray,

Yes it seems that the getpics script is putting .jpg at the end of the hyperlink on the Thumb image instead of a .swf extension.

I know that this was a problem which came up in the last question I posted and I think McUK_Storm put it down to the my shared server having PHP5.



Here is the getpics.PHP I also can post the swfobject.js if it will help however its very long and nothing has been altered my end:

<?
$_GET;

Header("content-type: application/x-javascript");
 
if (!function_exists("scandir")) {
  function scandir($dir,$listDirectories=false, $skipDots=true) {
      $dirArray = array();
      if ($handle = opendir($dir)) {
          while (false !== ($file = readdir($handle))) {
              if (($file != "." && $file != "..") || $skipDots == true) {
                  if($listDirectories == false) { if(is_dir($file)) { continue; } }
                  array_push($dirArray,basename($file));
              }
          }
          closedir($handle);
      }
      return $dirArray;
  }
}
 
function returnimages($smallFolder="thumbs",$largeFolder="large") {
 
  $largeListing = array_diff(scandir($largeFolder),array(".",".."));
 
  $pattern="\.(jpg|jpeg|png|gif|bmp)$";
  $files = array();
  $curimage=0;
  if($handle = opendir($smallFolder)) {
    while(false !== ($file = readdir($handle))){
      if(eregi($pattern, $file)){
        $filedate=date ("M d, Y H:i:s", filemtime("$smallFolder/$file"));
 
        $matches=array();
        preg_match('/(.+)(?:\/|\\\)(([^\/\\\]+)\.([a-z0-9]+))$/i',"$smallFolder/$file",$matches);
        list(,$dirname,$filename,$filenameNoExt,$ext)=$matches;
 
        $largeFlashFile = in_array( ($filenameNoExt.".swf"), $largeListing );
        echo 'galleryarray[' . $curimage .']=["' . $file . '", "'.$filedate.'","' . ($largeFlashFile?($filenameNoExt.".swf"):"") . '"];' . "\n";
        $curimage++;
      }
    }
 
    closedir($handle);
  }
  return($files);
}
 
echo "var galleryarray=new Array();" . "\n";



$imagesdirpath=$_SERVER['DOCUMENT_ROOT'] . "/projects/$project/thumbs/"; //server path to images directory
returnimages($imagesdirpath);

echo $project ;



?>

0
 

Author Comment

by:sany101
ID: 21845252
Forgot to add a link as you requested:


sany.co.uk/page.php


And here is the JS In case its any use:




/* Prototype JavaScript framework, version 1.5.0

 * (c) 2005-2007 Sam Stephenson

 *

 * Prototype is freely distributable under the terms of an MIT-style license.

 * For details, see the Prototype web site: http://prototype.conio.net/

 *

/*--------------------------------------------------------------------------*/
 

var Prototype = {

 Version: '1.5.0',

 BrowserFeatures: {

 XPath: !!document.evaluate

 },
 

 ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',

 emptyFunction: function() {},

 K: function(x) { return x }

}
 

var Class = {

 create: function() {

 return function() {

 this.initialize.apply(this, arguments);

 }

 }

}
 

var Abstract = new Object();
 

Object.extend = function(destination, source) {

 for (var property in source) {

 destination[property] = source[property];

 }

 return destination;

}
 

Object.extend(Object, {

 inspect: function(object) {

 try {

 if (object === undefined) return 'undefined';

 if (object === null) return 'null';

 return object.inspect ? object.inspect() : object.toString();

 } catch (e) {

 if (e instanceof RangeError) return '...';

 throw e;

 }

 },
 

 keys: function(object) {

 var keys = [];

 for (var property in object)

 keys.push(property);

 return keys;

 },
 

 values: function(object) {

 var values = [];

 for (var property in object)

 values.push(object[property]);

 return values;

 },
 

 clone: function(object) {

 return Object.extend({}, object);

 }

});
 

Function.prototype.bind = function() {

 var __method = this, args = $A(arguments), object = args.shift();

 return function() {

 return __method.apply(object, args.concat($A(arguments)));

 }

}
 

Function.prototype.bindAsEventListener = function(object) {

 var __method = this, args = $A(arguments), object = args.shift();

 return function(event) {

 return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));

 }

}
 

Object.extend(Number.prototype, {

 toColorPart: function() {

 var digits = this.toString(16);

 if (this < 16) return '0' + digits;

 return digits;

 },
 

 succ: function() {

 return this + 1;

 },
 

 times: function(iterator) {

 $R(0, this, true).each(iterator);

 return this;

 }

});
 

var Try = {

 these: function() {

 var returnValue;
 

 for (var i = 0, length = arguments.length; i < length; i++) {

 var lambda = arguments[i];

 try {

 returnValue = lambda();

 break;

 } catch (e) {}

 }
 

 return returnValue;

 }

}
 

/*--------------------------------------------------------------------------*/
 

var PeriodicalExecuter = Class.create();

PeriodicalExecuter.prototype = {

 initialize: function(callback, frequency) {

 this.callback = callback;

 this.frequency = frequency;

 this.currentlyExecuting = false;
 

 this.registerCallback();

 },
 

 registerCallback: function() {

 this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);

 },
 

 stop: function() {

 if (!this.timer) return;

 clearInterval(this.timer);

 this.timer = null;

 },
 

 onTimerEvent: function() {

 if (!this.currentlyExecuting) {

 try {

 this.currentlyExecuting = true;

 this.callback(this);

 } finally {

 this.currentlyExecuting = false;

 }

 }

 }

}

String.interpret = function(value){

 return value == null ? '' : String(value);

}
 

Object.extend(String.prototype, {

 gsub: function(pattern, replacement) {

 var result = '', source = this, match;

 replacement = arguments.callee.prepareReplacement(replacement);
 

 while (source.length > 0) {

 if (match = source.match(pattern)) {

 result += source.slice(0, match.index);

 result += String.interpret(replacement(match));

 source = source.slice(match.index + match[0].length);

 } else {

 result += source, source = '';

 }

 }

 return result;

 },
 

 sub: function(pattern, replacement, count) {

 replacement = this.gsub.prepareReplacement(replacement);

 count = count === undefined ? 1 : count;
 

 return this.gsub(pattern, function(match) {

 if (--count < 0) return match[0];

 return replacement(match);

 });

 },
 

 scan: function(pattern, iterator) {

 this.gsub(pattern, iterator);

 return this;

 },
 

 truncate: function(length, truncation) {

 length = length || 30;

 truncation = truncation === undefined ? '...' : truncation;

 return this.length > length ?

 this.slice(0, length - truncation.length) + truncation : this;

 },
 

 strip: function() {

 return this.replace(/^\s+/, '').replace(/\s+$/, '');

 },
 

 stripTags: function() {

 return this.replace(/<\/?[^>]+>/gi, '');

 },
 

 stripScripts: function() {

 return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');

 },
 

 extractScripts: function() {

 var matchAll = new RegExp(Prototype.ScriptFragment, 'img');

 var matchOne = new RegExp(Prototype.ScriptFragment, 'im');

 return (this.match(matchAll) || []).map(function(scriptTag) {

 return (scriptTag.match(matchOne) || ['', ''])[1];

 });

 },
 

 evalScripts: function() {

 return this.extractScripts().map(function(script) { return eval(script) });

 },
 

 escapeHTML: function() {

 var div = document.createElement('div');

 var text = document.createTextNode(this);

 div.appendChild(text);

 return div.innerHTML;

 },
 

 unescapeHTML: function() {

 var div = document.createElement('div');

 div.innerHTML = this.stripTags();

 return div.childNodes[0] ? (div.childNodes.length > 1 ?

 $A(div.childNodes).inject('',function(memo,node){ return memo+node.nodeValue }) :

 div.childNodes[0].nodeValue) : '';

 },
 

 toQueryParams: function(separator) {

 var match = this.strip().match(/([^?#]*)(#.*)?$/);

 if (!match) return {};
 

 return match[1].split(separator || '&').inject({}, function(hash, pair) {

 if ((pair = pair.split('='))[0]) {

 var name = decodeURIComponent(pair[0]);

 var value = pair[1] ? decodeURIComponent(pair[1]) : undefined;
 

 if (hash[name] !== undefined) {

 if (hash[name].constructor != Array)

 hash[name] = [hash[name]];

 if (value) hash[name].push(value);

 }

 else hash[name] = value;

 }

 return hash;

 });

 },
 

 toArray: function() {

 return this.split('');

 },
 

 succ: function() {

 return this.slice(0, this.length - 1) +

 String.fromCharCode(this.charCodeAt(this.length - 1) + 1);

 },
 

 camelize: function() {

 var parts = this.split('-'), len = parts.length;

 if (len == 1) return parts[0];
 

 var camelized = this.charAt(0) == '-'

 ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)

 : parts[0];
 

 for (var i = 1; i < len; i++)

 camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
 

 return camelized;

 },
 

 capitalize: function(){

 return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();

 },
 

 underscore: function() {

 return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();

 },
 

 dasherize: function() {

 return this.gsub(/_/,'-');

 },
 

 inspect: function(useDoubleQuotes) {

 var escapedString = this.replace(/\\/g, '\\\\');

 if (useDoubleQuotes)

 return '"' + escapedString.replace(/"/g, '\\"') + '"';

 else

 return "'" + escapedString.replace(/'/g, '\\\'') + "'";

 }

});
 

String.prototype.gsub.prepareReplacement = function(replacement) {

 if (typeof replacement == 'function') return replacement;

 var template = new Template(replacement);

 return function(match) { return template.evaluate(match) };

}
 

String.prototype.parseQuery = String.prototype.toQueryParams;
 

var Template = Class.create();

Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;

Template.prototype = {

 initialize: function(template, pattern) {

 this.template = template.toString();

 this.pattern = pattern || Template.Pattern;

 },
 

 evaluate: function(object) {

 return this.template.gsub(this.pattern, function(match) {

 var before = match[1];

 if (before == '\\') return match[2];

 return before + String.interpret(object[match[3]]);

 });

 }

}
 

var $break = new Object();

var $continue = new Object();
 

var Enumerable = {

 each: function(iterator) {

 var index = 0;

 try {

 this._each(function(value) {

 try {

 iterator(value, index++);

 } catch (e) {

 if (e != $continue) throw e;

 }

 });

 } catch (e) {

 if (e != $break) throw e;

 }

 return this;

 },
 

 eachSlice: function(number, iterator) {

 var index = -number, slices = [], array = this.toArray();

 while ((index += number) < array.length)

 slices.push(array.slice(index, index+number));

 return slices.map(iterator);

 },
 

 all: function(iterator) {

 var result = true;

 this.each(function(value, index) {

 result = result && !!(iterator || Prototype.K)(value, index);

 if (!result) throw $break;

 });

 return result;

 },
 

 any: function(iterator) {

 var result = false;

 this.each(function(value, index) {

 if (result = !!(iterator || Prototype.K)(value, index))

 throw $break;

 });

 return result;

 },
 

 collect: function(iterator) {

 var results = [];

 this.each(function(value, index) {

 results.push((iterator || Prototype.K)(value, index));

 });

 return results;

 },
 

 detect: function(iterator) {

 var result;

 this.each(function(value, index) {

 if (iterator(value, index)) {

 result = value;

 throw $break;

 }

 });

 return result;

 },
 

 findAll: function(iterator) {

 var results = [];

 this.each(function(value, index) {

 if (iterator(value, index))

 results.push(value);

 });

 return results;

 },
 

 grep: function(pattern, iterator) {

 var results = [];

 this.each(function(value, index) {

 var stringValue = value.toString();

 if (stringValue.match(pattern))

 results.push((iterator || Prototype.K)(value, index));

 })

 return results;

 },
 

 include: function(object) {

 var found = false;

 this.each(function(value) {

 if (value == object) {

 found = true;

 throw $break;

 }

 });

 return found;

 },
 

 inGroupsOf: function(number, fillWith) {

 fillWith = fillWith === undefined ? null : fillWith;

 return this.eachSlice(number, function(slice) {

 while(slice.length < number) slice.push(fillWith);

 return slice;

 });

 },
 

 inject: function(memo, iterator) {

 this.each(function(value, index) {

 memo = iterator(memo, value, index);

 });

 return memo;

 },
 

 invoke: function(method) {

 var args = $A(arguments).slice(1);

 return this.map(function(value) {

 return value[method].apply(value, args);

 });

 },
 

 max: function(iterator) {

 var result;

 this.each(function(value, index) {

 value = (iterator || Prototype.K)(value, index);

 if (result == undefined || value >= result)

 result = value;

 });

 return result;

 },
 

 min: function(iterator) {

 var result;

 this.each(function(value, index) {

 value = (iterator || Prototype.K)(value, index);

 if (result == undefined || value < result)

 result = value;

 });

 return result;

 },
 

 partition: function(iterator) {

 var trues = [], falses = [];

 this.each(function(value, index) {

 ((iterator || Prototype.K)(value, index) ?

 trues : falses).push(value);

 });

 return [trues, falses];

 },
 

 pluck: function(property) {

 var results = [];

 this.each(function(value, index) {

 results.push(value[property]);

 });

 return results;

 },
 

 reject: function(iterator) {

 var results = [];

 this.each(function(value, index) {

 if (!iterator(value, index))

 results.push(value);

 });

 return results;

 },
 

 sortBy: function(iterator) {

 return this.map(function(value, index) {

 return {value: value, criteria: iterator(value, index)};

 }).sort(function(left, right) {

 var a = left.criteria, b = right.criteria;

 return a < b ? -1 : a > b ? 1 : 0;

 }).pluck('value');

 },
 

 toArray: function() {

 return this.map();

 },
 

 zip: function() {

 var iterator = Prototype.K, args = $A(arguments);

 if (typeof args.last() == 'function')

 iterator = args.pop();
 

 var collections = [this].concat(args).map($A);

 return this.map(function(value, index) {

 return iterator(collections.pluck(index));

 });

 },
 

 size: function() {

 return this.toArray().length;

 },
 

 inspect: function() {

 return '#<Enumerable:' + this.toArray().inspect() + '>';

 }

}
 

Object.extend(Enumerable, {

 map: Enumerable.collect,

 find: Enumerable.detect,

 select: Enumerable.findAll,

 member: Enumerable.include,

 entries: Enumerable.toArray

});

var $A = Array.from = function(iterable) {

 if (!iterable) return [];

 if (iterable.toArray) {

 return iterable.toArray();

 } else {

 var results = [];

 for (var i = 0, length = iterable.length; i < length; i++)

 results.push(iterable[i]);

 return results;

 }

}
 

Object.extend(Array.prototype, Enumerable);
 

if (!Array.prototype._reverse)

 Array.prototype._reverse = Array.prototype.reverse;
 

Object.extend(Array.prototype, {

 _each: function(iterator) {

 for (var i = 0, length = this.length; i < length; i++)

 iterator(this[i]);

 },
 

 clear: function() {

 this.length = 0;

 return this;

 },
 

 first: function() {

 return this[0];

 },
 

 last: function() {

 return this[this.length - 1];

 },
 

 compact: function() {

 return this.select(function(value) {

 return value != null;

 });

 },
 

 flatten: function() {

 return this.inject([], function(array, value) {

 return array.concat(value && value.constructor == Array ?

 value.flatten() : [value]);

 });

 },
 

 without: function() {

 var values = $A(arguments);

 return this.select(function(value) {

 return !values.include(value);

 });

 },
 

 indexOf: function(object) {

 for (var i = 0, length = this.length; i < length; i++)

 if (this[i] == object) return i;

 return -1;

 },
 

 reverse: function(inline) {

 return (inline !== false ? this : this.toArray())._reverse();

 },
 

 reduce: function() {

 return this.length > 1 ? this : this[0];

 },
 

 uniq: function() {

 return this.inject([], function(array, value) {

 return array.include(value) ? array : array.concat([value]);

 });

 },
 

 clone: function() {

 return [].concat(this);

 },
 

 size: function() {

 return this.length;

 },
 

 inspect: function() {

 return '[' + this.map(Object.inspect).join(', ') + ']';

 }

});
 

Array.prototype.toArray = Array.prototype.clone;
 

function $w(string){

 string = string.strip();

 return string ? string.split(/\s+/) : [];

}
 

if(window.opera){

 Array.prototype.concat = function(){

 var array = [];

 for(var i = 0, length = this.length; i < length; i++) array.push(this[i]);

 for(var i = 0, length = arguments.length; i < length; i++) {

 if(arguments[i].constructor == Array) {

 for(var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)

 array.push(arguments[i][j]);

 } else {

 array.push(arguments[i]);

 }

 }

 return array;

 }

}

var Hash = function(obj) {

 Object.extend(this, obj || {});

};
 

Object.extend(Hash, {

 toQueryString: function(obj) {

 var parts = [];
 

 this.prototype._each.call(obj, function(pair) {

 if (!pair.key) return;
 

 if (pair.value && pair.value.constructor == Array) {

 var values = pair.value.compact();

 if (values.length < 2) pair.value = values.reduce();

 else {

 key = encodeURIComponent(pair.key);

 values.each(function(value) {

 value = value != undefined ? encodeURIComponent(value) : '';

 parts.push(key + '=' + encodeURIComponent(value));

 });

 return;

 }

 }

 if (pair.value == undefined) pair[1] = '';

 parts.push(pair.map(encodeURIComponent).join('='));

 });
 

 return parts.join('&');

 }

});
 

Object.extend(Hash.prototype, Enumerable);

Object.extend(Hash.prototype, {

 _each: function(iterator) {

 for (var key in this) {

 var value = this[key];

 if (value && value == Hash.prototype[key]) continue;
 

 var pair = [key, value];

 pair.key = key;

 pair.value = value;

 iterator(pair);

 }

 },
 

 keys: function() {

 return this.pluck('key');

 },
 

 values: function() {

 return this.pluck('value');

 },
 

 merge: function(hash) {

 return $H(hash).inject(this, function(mergedHash, pair) {

 mergedHash[pair.key] = pair.value;

 return mergedHash;

 });

 },
 

 remove: function() {

 var result;

 for(var i = 0, length = arguments.length; i < length; i++) {

 var value = this[arguments[i]];

 if (value !== undefined){

 if (result === undefined) result = value;

 else {

 if (result.constructor != Array) result = [result];

 result.push(value)

 }

 }

 delete this[arguments[i]];

 }

 return result;

 },
 

 toQueryString: function() {

 return Hash.toQueryString(this);

 },
 

 inspect: function() {

 return '#<Hash:{' + this.map(function(pair) {

 return pair.map(Object.inspect).join(': ');

 }).join(', ') + '}>';

 }

});
 

function $H(object) {

 if (object && object.constructor == Hash) return object;

 return new Hash(object);

};

ObjectRange = Class.create();

Object.extend(ObjectRange.prototype, Enumerable);

Object.extend(ObjectRange.prototype, {

 initialize: function(start, end, exclusive) {

 this.start = start;

 this.end = end;

 this.exclusive = exclusive;

 },
 

 _each: function(iterator) {

 var value = this.start;

 while (this.include(value)) {

 iterator(value);

 value = value.succ();

 }

 },
 

 include: function(value) {

 if (value < this.start)

 return false;

 if (this.exclusive)

 return value < this.end;

 return value <= this.end;

 }

});
 

var $R = function(start, end, exclusive) {

 return new ObjectRange(start, end, exclusive);

}
 

var Ajax = {

 getTransport: function() {

 return Try.these(

 function() {return new XMLHttpRequest()},

 function() {return new ActiveXObject('Msxml2.XMLHTTP')},

 function() {return new ActiveXObject('Microsoft.XMLHTTP')}

 ) || false;

 },
 

 activeRequestCount: 0

}
 

Ajax.Responders = {

 responders: [],
 

 _each: function(iterator) {

 this.responders._each(iterator);

 },
 

 register: function(responder) {

 if (!this.include(responder))

 this.responders.push(responder);

 },
 

 unregister: function(responder) {

 this.responders = this.responders.without(responder);

 },
 

 dispatch: function(callback, request, transport, json) {

 this.each(function(responder) {

 if (typeof responder[callback] == 'function') {

 try {

 responder[callback].apply(responder, [request, transport, json]);

 } catch (e) {}

 }

 });

 }

};
 

Object.extend(Ajax.Responders, Enumerable);
 

Ajax.Responders.register({

 onCreate: function() {

 Ajax.activeRequestCount++;

 },

 onComplete: function() {

 Ajax.activeRequestCount--;

 }

});
 

Ajax.Base = function() {};

Ajax.Base.prototype = {

 setOptions: function(options) {

 this.options = {

 method: 'post',

 asynchronous: true,

 contentType: 'application/x-www-form-urlencoded',

 encoding: 'UTF-8',

 parameters: ''

 }

 Object.extend(this.options, options || {});
 

 this.options.method = this.options.method.toLowerCase();

 if (typeof this.options.parameters == 'string')

 this.options.parameters = this.options.parameters.toQueryParams();

 }

}
 

Ajax.Request = Class.create();

Ajax.Request.Events =

 ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
 

Ajax.Request.prototype = Object.extend(new Ajax.Base(), {

 _complete: false,
 

 initialize: function(url, options) {

 this.transport = Ajax.getTransport();

 this.setOptions(options);

 this.request(url);

 },
 

 request: function(url) {

 this.url = url;

 this.method = this.options.method;

 var params = this.options.parameters;
 

 if (!['get', 'post'].include(this.method)) {

 // simulate other verbs over post

 params['_method'] = this.method;

 this.method = 'post';

 }
 

 params = Hash.toQueryString(params);

 if (params && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) params += '&_='
 

 // when GET, append parameters to URL

 if (this.method == 'get' && params)

 this.url += (this.url.indexOf('?') > -1 ? '&' : '?') + params;
 

 try {

 Ajax.Responders.dispatch('onCreate', this, this.transport);
 

 this.transport.open(this.method.toUpperCase(), this.url,

 this.options.asynchronous);
 

 if (this.options.asynchronous)

 setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);
 

 this.transport.onreadystatechange = this.onStateChange.bind(this);

 this.setRequestHeaders();
 

 var body = this.method == 'post' ? (this.options.postBody || params) : null;
 

 this.transport.send(body);
 

 /* Force Firefox to handle ready state 4 for synchronous requests */

 if (!this.options.asynchronous && this.transport.overrideMimeType)

 this.onStateChange();
 

 }

 catch (e) {

 this.dispatchException(e);

 }

 },
 

 onStateChange: function() {

 var readyState = this.transport.readyState;

 if (readyState > 1 && !((readyState == 4) && this._complete))

 this.respondToReadyState(this.transport.readyState);

 },
 

 setRequestHeaders: function() {

 var headers = {

 'X-Requested-With': 'XMLHttpRequest',

 'X-Prototype-Version': Prototype.Version,

 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'

 };
 

 if (this.method == 'post') {

 headers['Content-type'] = this.options.contentType +

 (this.options.encoding ? '; charset=' + this.options.encoding : '');
 

 /* Force "Connection: close" for older Mozilla browsers to work

 * around a bug where XMLHttpRequest sends an incorrect

 * Content-length header. See Mozilla Bugzilla #246651.

 */

 if (this.transport.overrideMimeType &&

 (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)

 headers['Connection'] = 'close';

 }
 

 // user-defined headers

 if (typeof this.options.requestHeaders == 'object') {

 var extras = this.options.requestHeaders;
 

 if (typeof extras.push == 'function')

 for (var i = 0, length = extras.length; i < length; i += 2)

 headers[extras[i]] = extras[i+1];

 else

 $H(extras).each(function(pair) { headers[pair.key] = pair.value });

 }
 

 for (var name in headers)

 this.transport.setRequestHeader(name, headers[name]);

 },
 

 success: function() {

 return !this.transport.status

 || (this.transport.status >= 200 && this.transport.status < 300);

 },
 

 respondToReadyState: function(readyState) {

 var state = Ajax.Request.Events[readyState];

 var transport = this.transport, json = this.evalJSON();
 

 if (state == 'Complete') {

 try {

 this._complete = true;

 (this.options['on' + this.transport.status]

 || this.options['on' + (this.success() ? 'Success' : 'Failure')]

 || Prototype.emptyFunction)(transport, json);

 } catch (e) {

 this.dispatchException(e);

 }
 

 if ((this.getHeader('Content-type') || 'text/javascript').strip().

 match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i))

 this.evalResponse();

 }
 

 try {

 (this.options['on' + state] || Prototype.emptyFunction)(transport, json);

 Ajax.Responders.dispatch('on' + state, this, transport, json);

 } catch (e) {

 this.dispatchException(e);

 }
 

 if (state == 'Complete') {

 // avoid memory leak in MSIE: clean up

 this.transport.onreadystatechange = Prototype.emptyFunction;

 }

 },
 

 getHeader: function(name) {

 try {

 return this.transport.getResponseHeader(name);

 } catch (e) { return null }

 },
 

 evalJSON: function() {

 try {

 var json = this.getHeader('X-JSON');

 return json ? eval('(' + json + ')') : null;

 } catch (e) { return null }

 },
 

 evalResponse: function() {

 try {

 return eval(this.transport.responseText);

 } catch (e) {

 this.dispatchException(e);

 }

 },
 

 dispatchException: function(exception) {

 (this.options.onException || Prototype.emptyFunction)(this, exception);

 Ajax.Responders.dispatch('onException', this, exception);

 }

});
 

Ajax.Updater = Class.create();
 

Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {

 initialize: function(container, url, options) {

 this.container = {

 success: (container.success || container),

 failure: (container.failure || (container.success ? null : container))

 }
 

 this.transport = Ajax.getTransport();

 this.setOptions(options);
 

 var onComplete = this.options.onComplete || Prototype.emptyFunction;

 this.options.onComplete = (function(transport, param) {

 this.updateContent();

 onComplete(transport, param);

 }).bind(this);
 

 this.request(url);

 },
 

 updateContent: function() {

 var receiver = this.container[this.success() ? 'success' : 'failure'];

 var response = this.transport.responseText;
 

 if (!this.options.evalScripts) response = response.stripScripts();
 

 if (receiver = $(receiver)) {

 if (this.options.insertion)

 new this.options.insertion(receiver, response);

 else

 receiver.update(response);

 }
 

 if (this.success()) {

 if (this.onComplete)

 setTimeout(this.onComplete.bind(this), 10);

 }

 }

});
 

Ajax.PeriodicalUpdater = Class.create();

Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {

 initialize: function(container, url, options) {

 this.setOptions(options);

 this.onComplete = this.options.onComplete;
 

 this.frequency = (this.options.frequency || 2);

 this.decay = (this.options.decay || 1);
 

 this.updater = {};

 this.container = container;

 this.url = url;
 

 this.start();

 },
 

 start: function() {

 this.options.onComplete = this.updateComplete.bind(this);

 this.onTimerEvent();

 },
 

 stop: function() {

 this.updater.options.onComplete = undefined;

 clearTimeout(this.timer);

 (this.onComplete || Prototype.emptyFunction).apply(this, arguments);

 },
 

 updateComplete: function(request) {

 if (this.options.decay) {

 this.decay = (request.responseText == this.lastText ?

 this.decay * this.options.decay : 1);
 

 this.lastText = request.responseText;

 }

 this.timer = setTimeout(this.onTimerEvent.bind(this),

 this.decay * this.frequency * 1000);

 },
 

 onTimerEvent: function() {

 this.updater = new Ajax.Updater(this.container, this.url, this.options);

 }

});

function $(element) {

 if (arguments.length > 1) {

 for (var i = 0, elements = [], length = arguments.length; i < length; i++)

 elements.push($(arguments[i]));

 return elements;

 }

 if (typeof element == 'string')

 element = document.getElementById(element);

 return Element.extend(element);

}
 

if (Prototype.BrowserFeatures.XPath) {

 document._getElementsByXPath = function(expression, parentElement) {

 var results = [];

 var query = document.evaluate(expression, $(parentElement) || document,

 null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

 for (var i = 0, length = query.snapshotLength; i < length; i++)

 results.push(query.snapshotItem(i));

 return results;

 };

}
 

document.getElementsByClassName = function(className, parentElement) {

 if (Prototype.BrowserFeatures.XPath) {

 var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";

 return document._getElementsByXPath(q, parentElement);

 } else {

 var children = ($(parentElement) || document.body).getElementsByTagName('*');

 var elements = [], child;

 for (var i = 0, length = children.length; i < length; i++) {

 child = children[i];

 if (Element.hasClassName(child, className))

 elements.push(Element.extend(child));

 }

 return elements;

 }

};
 

/*--------------------------------------------------------------------------*/
 

if (!window.Element)

 var Element = new Object();
 

Element.extend = function(element) {

 if (!element || _nativeExtensions || element.nodeType == 3) return element;
 

 if (!element._extended && element.tagName && element != window) {

 var methods = Object.clone(Element.Methods), cache = Element.extend.cache;
 

 if (element.tagName == 'FORM')

 Object.extend(methods, Form.Methods);

 if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName))

 Object.extend(methods, Form.Element.Methods);
 

 Object.extend(methods, Element.Methods.Simulated);
 

 for (var property in methods) {

 var value = methods[property];

 if (typeof value == 'function' && !(property in element))

 element[property] = cache.findOrStore(value);

 }

 }
 

 element._extended = true;

 return element;

};
 

Element.extend.cache = {

 findOrStore: function(value) {

 return this[value] = this[value] || function() {

 return value.apply(null, [this].concat($A(arguments)));

 }

 }

};
 

Element.Methods = {

 visible: function(element) {

 return $(element).style.display != 'none';

 },
 

 toggle: function(element) {

 element = $(element);

 Element[Element.visible(element) ? 'hide' : 'show'](element);

 return element;

 },
 

 hide: function(element) {

 $(element).style.display = 'none';

 return element;

 },
 

 show: function(element) {

 $(element).style.display = '';

 return element;

 },
 

 remove: function(element) {

 element = $(element);

 element.parentNode.removeChild(element);

 return element;

 },
 

 update: function(element, html) {

 html = typeof html == 'undefined' ? '' : html.toString();

 $(element).innerHTML = html.stripScripts();

 setTimeout(function() {html.evalScripts()}, 10);

 return element;

 },
 

 replace: function(element, html) {

 element = $(element);

 html = typeof html == 'undefined' ? '' : html.toString();

 if (element.outerHTML) {

 element.outerHTML = html.stripScripts();

 } else {

 var range = element.ownerDocument.createRange();

 range.selectNodeContents(element);

 element.parentNode.replaceChild(

 range.createContextualFragment(html.stripScripts()), element);

 }

 setTimeout(function() {html.evalScripts()}, 10);

 return element;

 },
 

 inspect: function(element) {

 element = $(element);

 var result = '<' + element.tagName.toLowerCase();

 $H({'id': 'id', 'className': 'class'}).each(function(pair) {

 var property = pair.first(), attribute = pair.last();

 var value = (element[property] || '').toString();

 if (value) result += ' ' + attribute + '=' + value.inspect(true);

 });

 return result + '>';

 },
 

 recursivelyCollect: function(element, property) {

 element = $(element);

 var elements = [];

 while (element = element[property])

 if (element.nodeType == 1)

 elements.push(Element.extend(element));

 return elements;

 },
 

 ancestors: function(element) {

 return $(element).recursivelyCollect('parentNode');

 },
 

 descendants: function(element) {

 return $A($(element).getElementsByTagName('*'));

 },
 

 immediateDescendants: function(element) {

 if (!(element = $(element).firstChild)) return [];

 while (element && element.nodeType != 1) element = element.nextSibling;

 if (element) return [element].concat($(element).nextSiblings());

 return [];

 },
 

 previousSiblings: function(element) {

 return $(element).recursivelyCollect('previousSibling');

 },
 

 nextSiblings: function(element) {

 return $(element).recursivelyCollect('nextSibling');

 },
 

 siblings: function(element) {

 element = $(element);

 return element.previousSiblings().reverse().concat(element.nextSiblings());

 },
 

 match: function(element, selector) {

 if (typeof selector == 'string')

 selector = new Selector(selector);

 return selector.match($(element));

 },
 

 up: function(element, expression, index) {

 return Selector.findElement($(element).ancestors(), expression, index);

 },
 

 down: function(element, expression, index) {

 return Selector.findElement($(element).descendants(), expression, index);

 },
 

 previous: function(element, expression, index) {

 return Selector.findElement($(element).previousSiblings(), expression, index);

 },
 

 next: function(element, expression, index) {

 return Selector.findElement($(element).nextSiblings(), expression, index);

 },
 

 getElementsBySelector: function() {

 var args = $A(arguments), element = $(args.shift());

 return Selector.findChildElements(element, args);

 },
 

 getElementsByClassName: function(element, className) {

 return document.getElementsByClassName(className, element);

 },
 

 readAttribute: function(element, name) {

 element = $(element);

 if (document.all && !window.opera) {

 var t = Element._attributeTranslations;

 if (t.values[name]) return t.values[name](element, name);

 if (t.names[name]) name = t.names[name];

 var attribute = element.attributes[name];

 if(attribute) return attribute.nodeValue;

 }

 return element.getAttribute(name);

 },
 

 getHeight: function(element) {

 return $(element).getDimensions().height;

 },
 

 getWidth: function(element) {

 return $(element).getDimensions().width;

 },
 

 classNames: function(element) {

 return new Element.ClassNames(element);

 },
 

 hasClassName: function(element, className) {

 if (!(element = $(element))) return;

 var elementClassName = element.className;

 if (elementClassName.length == 0) return false;

 if (elementClassName == className ||

 elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))

 return true;

 return false;

 },
 

 addClassName: function(element, className) {

 if (!(element = $(element))) return;

 Element.classNames(element).add(className);

 return element;

 },
 

 removeClassName: function(element, className) {

 if (!(element = $(element))) return;

 Element.classNames(element).remove(className);

 return element;

 },
 

 toggleClassName: function(element, className) {

 if (!(element = $(element))) return;

 Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className);

 return element;

 },
 

 observe: function() {

 Event.observe.apply(Event, arguments);

 return $A(arguments).first();

 },
 

 stopObserving: function() {

 Event.stopObserving.apply(Event, arguments);

 return $A(arguments).first();

 },
 

 // removes whitespace-only text node children

 cleanWhitespace: function(element) {

 element = $(element);

 var node = element.firstChild;

 while (node) {

 var nextNode = node.nextSibling;

 if (node.nodeType == 3 && !/\S/.test(node.nodeValue))

 element.removeChild(node);

 node = nextNode;

 }

 return element;

 },
 

 empty: function(element) {

 return $(element).innerHTML.match(/^\s*$/);

 },
 

 descendantOf: function(element, ancestor) {

 element = $(element), ancestor = $(ancestor);

 while (element = element.parentNode)

 if (element == ancestor) return true;

 return false;

 },
 

 scrollTo: function(element) {

 element = $(element);

 var pos = Position.cumulativeOffset(element);

 window.scrollTo(pos[0], pos[1]);

 return element;

 },
 

 getStyle: function(element, style) {

 element = $(element);

 if (['float','cssFloat'].include(style))

 style = (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat');

 style = style.camelize();

 var value = element.style[style];

 if (!value) {

 if (document.defaultView && document.defaultView.getComputedStyle) {

 var css = document.defaultView.getComputedStyle(element, null);

 value = css ? css[style] : null;

 } else if (element.currentStyle) {

 value = element.currentStyle[style];

 }

 }
 

 if((value == 'auto') && ['width','height'].include(style) && (element.getStyle('display') != 'none'))

 value = element['offset'+style.capitalize()] + 'px';
 

 if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))

 if (Element.getStyle(element, 'position') == 'static') value = 'auto';

 if(style == 'opacity') {

 if(value) return parseFloat(value);

 if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))

 if(value[1]) return parseFloat(value[1]) / 100;

 return 1.0;

 }

 return value == 'auto' ? null : value;

 },
 

 setStyle: function(element, style) {

 element = $(element);

 for (var name in style) {

 var value = style[name];

 if(name == 'opacity') {

 if (value == 1) {

 value = (/Gecko/.test(navigator.userAgent) &&

 !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0;

 if(/MSIE/.test(navigator.userAgent) && !window.opera)

 element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');

 } else if(value === '') {

 if(/MSIE/.test(navigator.userAgent) && !window.opera)

 element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');

 } else {

 if(value < 0.00001) value = 0;

 if(/MSIE/.test(navigator.userAgent) && !window.opera)

 element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') +

 'alpha(opacity='+value*100+')';

 }

 } else if(['float','cssFloat'].include(name)) name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat';

 element.style[name.camelize()] = value;

 }

 return element;

 },
 

 getDimensions: function(element) {

 element = $(element);

 var display = $(element).getStyle('display');

 if (display != 'none' && display != null) // Safari bug

 return {width: element.offsetWidth, height: element.offsetHeight};
 

 // All *Width and *Height properties give 0 on elements with display none,

 // so enable the element temporarily

 var els = element.style;

 var originalVisibility = els.visibility;

 var originalPosition = els.position;

 var originalDisplay = els.display;

 els.visibility = 'hidden';

 els.position = 'absolute';

 els.display = 'block';

 var originalWidth = element.clientWidth;

 var originalHeight = element.clientHeight;

 els.display = originalDisplay;

 els.position = originalPosition;

 els.visibility = originalVisibility;

 return {width: originalWidth, height: originalHeight};

 },
 

 makePositioned: function(element) {

 element = $(element);

 var pos = Element.getStyle(element, 'position');

 if (pos == 'static' || !pos) {

 element._madePositioned = true;

 element.style.position = 'relative';

 // Opera returns the offset relative to the positioning context, when an

 // element is position relative but top and left have not been defined

 if (window.opera) {

 element.style.top = 0;

 element.style.left = 0;

 }

 }

 return element;

 },
 

 undoPositioned: function(element) {

 element = $(element);

 if (element._madePositioned) {

 element._madePositioned = undefined;

 element.style.position =

 element.style.top =

 element.style.left =

 element.style.bottom =

 element.style.right = '';

 }

 return element;

 },
 

 makeClipping: function(element) {

 element = $(element);

 if (element._overflow) return element;

 element._overflow = element.style.overflow || 'auto';

 if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')

 element.style.overflow = 'hidden';

 return element;

 },
 

 undoClipping: function(element) {

 element = $(element);

 if (!element._overflow) return element;

 element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;

 element._overflow = null;

 return element;

 }

};
 

Object.extend(Element.Methods, {childOf: Element.Methods.descendantOf});
 

Element._attributeTranslations = {};
 

Element._attributeTranslations.names = {

 colspan: "colSpan",

 rowspan: "rowSpan",

 valign: "vAlign",

 datetime: "dateTime",

 accesskey: "accessKey",

 tabindex: "tabIndex",

 enctype: "encType",

 maxlength: "maxLength",

 readonly: "readOnly",

 longdesc: "longDesc"

};
 

Element._attributeTranslations.values = {

 _getAttr: function(element, attribute) {

 return element.getAttribute(attribute, 2);

 },
 

 _flag: function(element, attribute) {

 return $(element).hasAttribute(attribute) ? attribute : null;

 },
 

 style: function(element) {

 return element.style.cssText.toLowerCase();

 },
 

 title: function(element) {

 var node = element.getAttributeNode('title');

 return node.specified ? node.nodeValue : null;

 }

};
 

Object.extend(Element._attributeTranslations.values, {

 href: Element._attributeTranslations.values._getAttr,

 src: Element._attributeTranslations.values._getAttr,

 disabled: Element._attributeTranslations.values._flag,

 checked: Element._attributeTranslations.values._flag,

 readonly: Element._attributeTranslations.values._flag,

 multiple: Element._attributeTranslations.values._flag

});
 

Element.Methods.Simulated = {

 hasAttribute: function(element, attribute) {

 var t = Element._attributeTranslations;

 attribute = t.names[attribute] || attribute;

 return $(element).getAttributeNode(attribute).specified;

 }

};
 

// IE is missing .innerHTML support for TABLE-related elements

if (document.all && !window.opera){

 Element.Methods.update = function(element, html) {

 element = $(element);

 html = typeof html == 'undefined' ? '' : html.toString();

 var tagName = element.tagName.toUpperCase();

 if (['THEAD','TBODY','TR','TD'].include(tagName)) {

 var div = document.createElement('div');

 switch (tagName) {

 case 'THEAD':

 case 'TBODY':

 div.innerHTML = '<table><tbody>' + html.stripScripts() + '</tbody></table>';

 depth = 2;

 break;

 case 'TR':

 div.innerHTML = '<table><tbody><tr>' + html.stripScripts() + '</tr></tbody></table>';

 depth = 3;

 break;

 case 'TD':

 div.innerHTML = '<table><tbody><tr><td>' + html.stripScripts() + '</td></tr></tbody></table>';

 depth = 4;

 }

 $A(element.childNodes).each(function(node){

 element.removeChild(node)

 });

 depth.times(function(){ div = div.firstChild });
 

 $A(div.childNodes).each(

 function(node){ element.appendChild(node) });

 } else {

 element.innerHTML = html.stripScripts();

 }

 setTimeout(function() {html.evalScripts()}, 10);

 return element;

 }

};
 

Object.extend(Element, Element.Methods);
 

var _nativeExtensions = false;
 

if(/Konqueror|Safari|KHTML/.test(navigator.userAgent))

 ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) {

 var className = 'HTML' + tag + 'Element';

 if(window[className]) return;

 var klass = window[className] = {};

 klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__;

 });
 

Element.addMethods = function(methods) {

 Object.extend(Element.Methods, methods || {});
 

 function copy(methods, destination, onlyIfAbsent) {

 onlyIfAbsent = onlyIfAbsent || false;

 var cache = Element.extend.cache;

 for (var property in methods) {

 var value = methods[property];

 if (!onlyIfAbsent || !(property in destination))

 destination[property] = cache.findOrStore(value);

 }

 }
 

 if (typeof HTMLElement != 'undefined') {

 copy(Element.Methods, HTMLElement.prototype);

 copy(Element.Methods.Simulated, HTMLElement.prototype, true);

 copy(Form.Methods, HTMLFormElement.prototype);

 [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) {

 copy(Form.Element.Methods, klass.prototype);

 });

 _nativeExtensions = true;

 }

}
 

var Toggle = new Object();

Toggle.display = Element.toggle;
 

/*--------------------------------------------------------------------------*/
 

Abstract.Insertion = function(adjacency) {

 this.adjacency = adjacency;

}
 

Abstract.Insertion.prototype = {

 initialize: function(element, content) {

 this.element = $(element);

 this.content = content.stripScripts();
 

 if (this.adjacency && this.element.insertAdjacentHTML) {

 try {

 this.element.insertAdjacentHTML(this.adjacency, this.content);

 } catch (e) {

 var tagName = this.element.tagName.toUpperCase();

 if (['TBODY', 'TR'].include(tagName)) {

 this.insertContent(this.contentFromAnonymousTable());

 } else {

 throw e;

 }

 }

 } else {

 this.range = this.element.ownerDocument.createRange();

 if (this.initializeRange) this.initializeRange();

 this.insertContent([this.range.createContextualFragment(this.content)]);

 }
 

 setTimeout(function() {content.evalScripts()}, 10);

 },
 

 contentFromAnonymousTable: function() {

 var div = document.createElement('div');

 div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';

 return $A(div.childNodes[0].childNodes[0].childNodes);

 }

}
 

var Insertion = new Object();
 

Insertion.Before = Class.create();

Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {

 initializeRange: function() {

 this.range.setStartBefore(this.element);

 },
 

 insertContent: function(fragments) {

 fragments.each((function(fragment) {

 this.element.parentNode.insertBefore(fragment, this.element);

 }).bind(this));

 }

});
 

Insertion.Top = Class.create();

Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {

 initializeRange: function() {

 this.range.selectNodeContents(this.element);

 this.range.collapse(true);

 },
 

 insertContent: function(fragments) {

 fragments.reverse(false).each((function(fragment) {

 this.element.insertBefore(fragment, this.element.firstChild);

 }).bind(this));

 }

});
 

Insertion.Bottom = Class.create();

Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {

 initializeRange: function() {

 this.range.selectNodeContents(this.element);

 this.range.collapse(this.element);

 },
 

 insertContent: function(fragments) {

 fragments.each((function(fragment) {

 this.element.appendChild(fragment);

 }).bind(this));

 }

});
 

Insertion.After = Class.create();

Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {

 initializeRange: function() {

 this.range.setStartAfter(this.element);

 },
 

 insertContent: function(fragments) {

 fragments.each((function(fragment) {

 this.element.parentNode.insertBefore(fragment,

 this.element.nextSibling);

 }).bind(this));

 }

});
 

/*--------------------------------------------------------------------------*/
 

Element.ClassNames = Class.create();

Element.ClassNames.prototype = {

 initialize: function(element) {

 this.element = $(element);

 },
 

 _each: function(iterator) {

 this.element.className.split(/\s+/).select(function(name) {

 return name.length > 0;

 })._each(iterator);

 },
 

 set: function(className) {

 this.element.className = className;

 },
 

 add: function(classNameToAdd) {

 if (this.include(classNameToAdd)) return;

 this.set($A(this).concat(classNameToAdd).join(' '));

 },
 

 remove: function(classNameToRemove) {

 if (!this.include(classNameToRemove)) return;

 this.set($A(this).without(classNameToRemove).join(' '));

 },
 

 toString: function() {

 return $A(this).join(' ');

 }

};
 

Object.extend(Element.ClassNames.prototype, Enumerable);

var Selector = Class.create();

Selector.prototype = {

 initialize: function(expression) {

 this.params = {classNames: []};

 this.expression = expression.toString().strip();

 this.parseExpression();

 this.compileMatcher();

 },
 

 parseExpression: function() {

 function abort(message) { throw 'Parse error in selector: ' + message; }
 

 if (this.expression == '') abort('empty expression');
 

 var params = this.params, expr = this.expression, match, modifier, clause, rest;

 while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) {

 params.attributes = params.attributes || [];

 params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});

 expr = match[1];

 }
 

 if (expr == '*') return this.params.wildcard = true;
 

 while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {

 modifier = match[1], clause = match[2], rest = match[3];

 switch (modifier) {

 case '#': params.id = clause; break;

 case '.': params.classNames.push(clause); break;

 case '':

 case undefined: params.tagName = clause.toUpperCase(); break;

 default: abort(expr.inspect());

 }

 expr = rest;

 }
 

 if (expr.length > 0) abort(expr.inspect());

 },
 

 buildMatchExpression: function() {

 var params = this.params, conditions = [], clause;
 

 if (params.wildcard)

 conditions.push('true');

 if (clause = params.id)

 conditions.push('element.readAttribute("id") == ' + clause.inspect());

 if (clause = params.tagName)

 conditions.push('element.tagName.toUpperCase() == ' + clause.inspect());

 if ((clause = params.classNames).length > 0)

 for (var i = 0, length = clause.length; i < length; i++)

 conditions.push('element.hasClassName(' + clause[i].inspect() + ')');

 if (clause = params.attributes) {

 clause.each(function(attribute) {

 var value = 'element.readAttribute(' + attribute.name.inspect() + ')';

 var splitValueBy = function(delimiter) {

 return value + ' && ' + value + '.split(' + delimiter.inspect() + ')';

 }
 

 switch (attribute.operator) {

 case '=': conditions.push(value + ' == ' + attribute.value.inspect()); break;

 case '~=': conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break;

 case '|=': conditions.push(

 splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect()

 ); break;

 case '!=': conditions.push(value + ' != ' + attribute.value.inspect()); break;

 case '':

 case undefined: conditions.push('element.hasAttribute(' + attribute.name.inspect() + ')'); break;

 default: throw 'Unknown operator ' + attribute.operator + ' in selector';

 }

 });

 }
 

 return conditions.join(' && ');

 },
 

 compileMatcher: function() {

 this.match = new Function('element', 'if (!element.tagName) return false; \

 element = $(element); \

 return ' + this.buildMatchExpression());

 },
 

 findElements: function(scope) {

 var element;
 

 if (element = $(this.params.id))

 if (this.match(element))

 if (!scope || Element.childOf(element, scope))

 return [element];
 

 scope = (scope || document).getElementsByTagName(this.params.tagName || '*');
 

 var results = [];

 for (var i = 0, length = scope.length; i < length; i++)

 if (this.match(element = scope[i]))

 results.push(Element.extend(element));
 

 return results;

 },
 

 toString: function() {

 return this.expression;

 }

}
 

Object.extend(Selector, {

 matchElements: function(elements, expression) {

 var selector = new Selector(expression);

 return elements.select(selector.match.bind(selector)).map(Element.extend);

 },
 

 findElement: function(elements, expression, index) {

 if (typeof expression == 'number') index = expression, expression = false;

 return Selector.matchElements(elements, expression || '*')[index || 0];

 },
 

 findChildElements: function(element, expressions) {

 return expressions.map(function(expression) {

 return expression.match(/[^\s"]+(?:"[^"]*"[^\s"]+)*/g).inject([null], function(results, expr) {

 var selector = new Selector(expr);

 return results.inject([], function(elements, result) {

 return elements.concat(selector.findElements(result || element));

 });

 });

 }).flatten();

 }

});
 

function $$() {

 return Selector.findChildElements(document, $A(arguments));

}

var Form = {

 reset: function(form) {

 $(form).reset();

 return form;

 },
 

 serializeElements: function(elements, getHash) {

 var data = elements.inject({}, function(result, element) {

 if (!element.disabled && element.name) {

 var key = element.name, value = $(element).getValue();

 if (value != undefined) {

 if (result[key]) {

 if (result[key].constructor != Array) result[key] = [result[key]];

 result[key].push(value);

 }

 else result[key] = value;

 }

 }

 return result;

 });
 

 return getHash ? data : Hash.toQueryString(data);

 }

};
 

Form.Methods = {

 serialize: function(form, getHash) {

 return Form.serializeElements(Form.getElements(form), getHash);

 },
 

 getElements: function(form) {

 return $A($(form).getElementsByTagName('*')).inject([],

 function(elements, child) {

 if (Form.Element.Serializers[child.tagName.toLowerCase()])

 elements.push(Element.extend(child));

 return elements;

 }

 );

 },
 

 getInputs: function(form, typeName, name) {

 form = $(form);

 var inputs = form.getElementsByTagName('input');
 

 if (!typeName && !name) return $A(inputs).map(Element.extend);
 

 for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {

 var input = inputs[i];

 if ((typeName && input.type != typeName) || (name && input.name != name))

 continue;

 matchingInputs.push(Element.extend(input));

 }
 

 return matchingInputs;

 },
 

 disable: function(form) {

 form = $(form);

 form.getElements().each(function(element) {

 element.blur();

 element.disabled = 'true';

 });

 return form;

 },
 

 enable: function(form) {

 form = $(form);

 form.getElements().each(function(element) {

 element.disabled = '';

 });

 return form;

 },
 

 findFirstElement: function(form) {

 return $(form).getElements().find(function(element) {

 return element.type != 'hidden' && !element.disabled &&

 ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());

 });

 },
 

 focusFirstElement: function(form) {

 form = $(form);

 form.findFirstElement().activate();

 return form;

 }

}
 

Object.extend(Form, Form.Methods);
 

/*--------------------------------------------------------------------------*/
 

Form.Element = {

 focus: function(element) {

 $(element).focus();

 return element;

 },
 

 select: function(element) {

 $(element).select();

 return element;

 }

}
 

Form.Element.Methods = {

 serialize: function(element) {

 element = $(element);

 if (!element.disabled && element.name) {

 var value = element.getValue();

 if (value != undefined) {

 var pair = {};

 pair[element.name] = value;

 return Hash.toQueryString(pair);

 }

 }

 return '';

 },
 

 getValue: function(element) {

 element = $(element);

 var method = element.tagName.toLowerCase();

 return Form.Element.Serializers[method](element);

 },
 

 clear: function(element) {

 $(element).value = '';

 return element;

 },
 

 present: function(element) {

 return $(element).value != '';

 },
 

 activate: function(element) {

 element = $(element);

 element.focus();

 if (element.select && ( element.tagName.toLowerCase() != 'input' ||

 !['button', 'reset', 'submit'].include(element.type) ) )

 element.select();

 return element;

 },
 

 disable: function(element) {

 element = $(element);

 element.disabled = true;

 return element;

 },
 

 enable: function(element) {

 element = $(element);

 element.blur();

 element.disabled = false;

 return element;

 }

}
 

Object.extend(Form.Element, Form.Element.Methods);

var Field = Form.Element;

var $F = Form.Element.getValue;
 

/*--------------------------------------------------------------------------*/
 

Form.Element.Serializers = {

 input: function(element) {

 switch (element.type.toLowerCase()) {

 case 'checkbox':

 case 'radio':

 return Form.Element.Serializers.inputSelector(element);

 default:

 return Form.Element.Serializers.textarea(element);

 }

 },
 

 inputSelector: function(element) {

 return element.checked ? element.value : null;

 },
 

 textarea: function(element) {

 return element.value;

 },
 

 select: function(element) {

 return this[element.type == 'select-one' ?

 'selectOne' : 'selectMany'](element);

 },
 

 selectOne: function(element) {

 var index = element.selectedIndex;

 return index >= 0 ? this.optionValue(element.options[index]) : null;

 },
 

 selectMany: function(element) {

 var values, length = element.length;

 if (!length) return null;
 

 for (var i = 0, values = []; i < length; i++) {

 var opt = element.options[i];

 if (opt.selected) values.push(this.optionValue(opt));

 }

 return values;

 },
 

 optionValue: function(opt) {

 // extend element because hasAttribute may not be native

 return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;

 }

}
 

/*--------------------------------------------------------------------------*/
 

Abstract.TimedObserver = function() {}

Abstract.TimedObserver.prototype = {

 initialize: function(element, frequency, callback) {

 this.frequency = frequency;

 this.element = $(element);

 this.callback = callback;
 

 this.lastValue = this.getValue();

 this.registerCallback();

 },
 

 registerCallback: function() {

 setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);

 },
 

 onTimerEvent: function() {

 var value = this.getValue();

 var changed = ('string' == typeof this.lastValue && 'string' == typeof value

 ? this.lastValue != value : String(this.lastValue) != String(value));

 if (changed) {

 this.callback(this.element, value);

 this.lastValue = value;

 }

 }

}
 

Form.Element.Observer = Class.create();

Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {

 getValue: function() {

 return Form.Element.getValue(this.element);

 }

});
 

Form.Observer = Class.create();

Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {

 getValue: function() {

 return Form.serialize(this.element);

 }

});
 

/*--------------------------------------------------------------------------*/
 

Abstract.EventObserver = function() {}

Abstract.EventObserver.prototype = {

 initialize: function(element, callback) {

 this.element = $(element);

 this.callback = callback;
 

 this.lastValue = this.getValue();

 if (this.element.tagName.toLowerCase() == 'form')

 this.registerFormCallbacks();

 else

 this.registerCallback(this.element);

 },
 

 onElementEvent: function() {

 var value = this.getValue();

 if (this.lastValue != value) {

 this.callback(this.element, value);

 this.lastValue = value;

 }

 },
 

 registerFormCallbacks: function() {

 Form.getElements(this.element).each(this.registerCallback.bind(this));

 },
 

 registerCallback: function(element) {

 if (element.type) {

 switch (element.type.toLowerCase()) {

 case 'checkbox':

 case 'radio':

 Event.observe(element, 'click', this.onElementEvent.bind(this));

 break;

 default:

 Event.observe(element, 'change', this.onElementEvent.bind(this));

 break;

 }

 }

 }

}
 

Form.Element.EventObserver = Class.create();

Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {

 getValue: function() {

 return Form.Element.getValue(this.element);

 }

});
 

Form.EventObserver = Class.create();

Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {

 getValue: function() {

 return Form.serialize(this.element);

 }

});

if (!window.Event) {

 var Event = new Object();

}
 

Object.extend(Event, {

 KEY_BACKSPACE: 8,

 KEY_TAB: 9,

 KEY_RETURN: 13,

 KEY_ESC: 27,

 KEY_LEFT: 37,

 KEY_UP: 38,

 KEY_RIGHT: 39,

 KEY_DOWN: 40,

 KEY_DELETE: 46,

 KEY_HOME: 36,

 KEY_END: 35,

 KEY_PAGEUP: 33,

 KEY_PAGEDOWN: 34,
 

 element: function(event) {

 return event.target || event.srcElement;

 },
 

 isLeftClick: function(event) {

 return (((event.which) && (event.which == 1)) ||

 ((event.button) && (event.button == 1)));

 },
 

 pointerX: function(event) {

 return event.pageX || (event.clientX +

 (document.documentElement.scrollLeft || document.body.scrollLeft));

 },
 

 pointerY: function(event) {

 return event.pageY || (event.clientY +

 (document.documentElement.scrollTop || document.body.scrollTop));

 },
 

 stop: function(event) {

 if (event.preventDefault) {

 event.preventDefault();

 event.stopPropagation();

 } else {

 event.returnValue = false;

 event.cancelBubble = true;

 }

 },
 

 // find the first node with the given tagName, starting from the

 // node the event was triggered on; traverses the DOM upwards

 findElement: function(event, tagName) {

 var element = Event.element(event);

 while (element.parentNode && (!element.tagName ||

 (element.tagName.toUpperCase() != tagName.toUpperCase())))

 element = element.parentNode;

 return element;

 },
 

 observers: false,
 

 _observeAndCache: function(element, name, observer, useCapture) {

 if (!this.observers) this.observers = [];

 if (element.addEventListener) {

 this.observers.push([element, name, observer, useCapture]);

 element.addEventListener(name, observer, useCapture);

 } else if (element.attachEvent) {

 this.observers.push([element, name, observer, useCapture]);

 element.attachEvent('on' + name, observer);

 }

 },
 

 unloadCache: function() {

 if (!Event.observers) return;

 for (var i = 0, length = Event.observers.length; i < length; i++) {

 Event.stopObserving.apply(this, Event.observers[i]);

 Event.observers[i][0] = null;

 }

 Event.observers = false;

 },
 

 observe: function(element, name, observer, useCapture) {

 element = $(element);

 useCapture = useCapture || false;
 

 if (name == 'keypress' &&

 (navigator.appVersion.match(/Konqueror|Safari|KHTML/)

 || element.attachEvent))

 name = 'keydown';
 

 Event._observeAndCache(element, name, observer, useCapture);

 },
 

 stopObserving: function(element, name, observer, useCapture) {

 element = $(element);

 useCapture = useCapture || false;
 

 if (name == 'keypress' &&

 (navigator.appVersion.match(/Konqueror|Safari|KHTML/)

 || element.detachEvent))

 name = 'keydown';
 

 if (element.removeEventListener) {

 element.removeEventListener(name, observer, useCapture);

 } else if (element.detachEvent) {

 try {

 element.detachEvent('on' + name, observer);

 } catch (e) {}

 }

 }

});
 

/* prevent memory leaks in IE */

if (navigator.appVersion.match(/\bMSIE\b/))

 Event.observe(window, 'unload', Event.unloadCache, false);

var Position = {

 // set to true if needed, warning: firefox performance problems

 // NOT neeeded for page scrolling, only if draggable contained in

 // scrollable elements

 includeScrollOffsets: false,
 

 // must be called before calling withinIncludingScrolloffset, every time the

 // page is scrolled

 prepare: function() {

 this.deltaX = window.pageXOffset

 || document.documentElement.scrollLeft

 || document.body.scrollLeft

 || 0;

 this.deltaY = window.pageYOffset

 || document.documentElement.scrollTop

 || document.body.scrollTop

 || 0;

 },
 

 realOffset: function(element) {

 var valueT = 0, valueL = 0;

 do {

 valueT += element.scrollTop || 0;

 valueL += element.scrollLeft || 0;

 element = element.parentNode;

 } while (element);

 return [valueL, valueT];

 },
 
 

 cumulativeOffset: function(element) {

 var valueT = 0, valueL = 0;

 do {

 valueT += element.offsetTop || 0;

 valueL += element.offsetLeft || 0;

 element = element.offsetParent;

 } while (element);

 return [valueL, valueT];

 },
 

 positionedOffset: function(element) {

 var valueT = 0, valueL = 0;

 do {

 valueT += element.offsetTop || 0;

 valueL += element.offsetLeft || 0;

 element = element.offsetParent;

 if (element) {

 if(element.tagName=='BODY') break;

 var p = Element.getStyle(element, 'position');

 if (p == 'relative' || p == 'absolute') break;

 }

 } while (element);

 return [valueL, valueT];

 },
 

 offsetParent: function(element) {

 if (element.offsetParent) return element.offsetParent;

 if (element == document.body) return element;
 

 while ((element = element.parentNode) && element != document.body)

 if (Element.getStyle(element, 'position') != 'static')

 return element;
 

 return document.body;

 },
 

 // caches x/y coordinate pair to use with overlap

 within: function(element, x, y) {

 if (this.includeScrollOffsets)

 return this.withinIncludingScrolloffsets(element, x, y);

 this.xcomp = x;

 this.ycomp = y;

 this.offset = this.cumulativeOffset(element);
 

 return (y >= this.offset[1] &&

 y < this.offset[1] + element.offsetHeight &&

 x >= this.offset[0] &&

 x < this.offset[0] + element.offsetWidth);

 },
 

 withinIncludingScrolloffsets: function(element, x, y) {

 var offsetcache = this.realOffset(element);
 

 this.xcomp = x + offsetcache[0] - this.deltaX;

 this.ycomp = y + offsetcache[1] - this.deltaY;

 this.offset = this.cumulativeOffset(element);
 

 return (this.ycomp >= this.offset[1] &&

 this.ycomp < this.offset[1] + element.offsetHeight &&

 this.xcomp >= this.offset[0] &&

 this.xcomp < this.offset[0] + element.offsetWidth);

 },
 

 // within must be called directly before

 overlap: function(mode, element) {

 if (!mode) return 0;

 if (mode == 'vertical')

 return ((this.offset[1] + element.offsetHeight) - this.ycomp) /

 element.offsetHeight;

 if (mode == 'horizontal')

 return ((this.offset[0] + element.offsetWidth) - this.xcomp) /

 element.offsetWidth;

 },
 

 page: function(forElement) {

 var valueT = 0, valueL = 0;
 

 var element = forElement;

 do {

 valueT += element.offsetTop || 0;

 valueL += element.offsetLeft || 0;
 

 // Safari fix

 if (element.offsetParent==document.body)

 if (Element.getStyle(element,'position')=='absolute') break;
 

 } while (element = element.offsetParent);
 

 element = forElement;

 do {

 if (!window.opera || element.tagName=='BODY') {

 valueT -= element.scrollTop || 0;

 valueL -= element.scrollLeft || 0;

 }

 } while (element = element.parentNode);
 

 return [valueL, valueT];

 },
 

 clone: function(source, target) {

 var options = Object.extend({

 setLeft: true,

 setTop: true,

 setWidth: true,

 setHeight: true,

 offsetTop: 0,

 offsetLeft: 0

 }, arguments[2] || {})
 

 // find page position of source

 source = $(source);

 var p = Position.page(source);
 

 // find coordinate system to use

 target = $(target);

 var delta = [0, 0];

 var parent = null;

 // delta [0,0] will do fine with position: fixed elements,

 // position:absolute needs offsetParent deltas

 if (Element.getStyle(target,'position') == 'absolute') {

 parent = Position.offsetParent(target);

 delta = Position.page(parent);

 }
 

 // correct by body offsets (fixes Safari)

 if (parent == document.body) {

 delta[0] -= document.body.offsetLeft;

 delta[1] -= document.body.offsetTop;

 }
 

 // set position

 if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px';

 if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px';

 if(options.setWidth) target.style.width = source.offsetWidth + 'px';

 if(options.setHeight) target.style.height = source.offsetHeight + 'px';

 },
 

 absolutize: function(element) {

 element = $(element);

 if (element.style.position == 'absolute') return;

 Position.prepare();
 

 var offsets = Position.positionedOffset(element);

 var top = offsets[1];

 var left = offsets[0];

 var width = element.clientWidth;

 var height = element.clientHeight;
 

 element._originalLeft = left - parseFloat(element.style.left || 0);

 element._originalTop = top - parseFloat(element.style.top || 0);

 element._originalWidth = element.style.width;

 element._originalHeight = element.style.height;
 

 element.style.position = 'absolute';

 element.style.top = top + 'px';

 element.style.left = left + 'px';

 element.style.width = width + 'px';

 element.style.height = height + 'px';

 },
 

 relativize: function(element) {

 element = $(element);

 if (element.style.position == 'relative') return;

 Position.prepare();
 

 element.style.position = 'relative';

 var top = parseFloat(element.style.top || 0) - (element._originalTop || 0);

 var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
 

 element.style.top = top + 'px';

 element.style.left = left + 'px';

 element.style.height = element._originalHeight;

 element.style.width = element._originalWidth;

 }

}
 

// Safari returns margins on body which is incorrect if the child is absolutely

// positioned. For performance reasons, redefine Position.cumulativeOffset for

// KHTML/WebKit only.

if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {

 Position.cumulativeOffset = function(element) {

 var valueT = 0, valueL = 0;

 do {

 valueT += element.offsetTop || 0;

 valueL += element.offsetLeft || 0;

 if (element.offsetParent == document.body)

 if (Element.getStyle(element, 'position') == 'absolute') break;
 

 element = element.offsetParent;

 } while (element);
 

 return [valueL, valueT];

 }

}
 

Element.addMethods();

/**

 * SWFObject v1.4.4: Flash Player detection and embed - http://blog.deconcept.com/swfobject/

 *

 * SWFObject is (c) 2006 Geoff Stearns and is released under the MIT License:

 * http://www.opensource.org/licenses/mit-license.php

 *

 * **SWFObject is the SWF embed script formerly known as FlashObject. The name was changed for

 * legal reasons.

 */

if(typeof deconcept == "undefined") var deconcept = new Object();

if(typeof deconcept.util == "undefined") deconcept.util = new Object();

if(typeof deconcept.SWFObjectUtil == "undefined") deconcept.SWFObjectUtil = new Object();

deconcept.SWFObject = function(swf, id, w, h, ver, c, useExpressInstall, quality, xiRedirectUrl, redirectUrl, detectKey){

 if (!document.getElementById) { return; }

 this.DETECT_KEY = detectKey ? detectKey : 'detectflash';

 this.skipDetect = deconcept.util.getRequestParameter(this.DETECT_KEY);

 this.params = new Object();

 this.variables = new Object();

 this.attributes = new Array();

 if(swf) { this.setAttribute('swf', swf); }

 if(id) { this.setAttribute('id', id); }

 if(w) { this.setAttribute('width', w); }

 if(h) { this.setAttribute('height', h); }

 if(ver) { this.setAttribute('version', new deconcept.PlayerVersion(ver.toString().split("."))); }

 this.installedVer = deconcept.SWFObjectUtil.getPlayerVersion();

 if(c) { this.addParam('bgcolor', c); }

 var q = quality ? quality : 'high';

 this.addParam('quality', q);

 this.setAttribute('useExpressInstall', useExpressInstall);

 this.setAttribute('doExpressInstall', false);

 var xir = (xiRedirectUrl) ? xiRedirectUrl : window.location;

 this.setAttribute('xiRedirectUrl', xir);

 this.setAttribute('redirectUrl', '');

 if(redirectUrl) { this.setAttribute('redirectUrl', redirectUrl); }

}

deconcept.SWFObject.prototype = {

 setAttribute: function(name, value){

 this.attributes[name] = value;

 },

 getAttribute: function(name){

 return this.attributes[name];

 },

 addParam: function(name, value){

 this.params[name] = value;

 },

 getParams: function(){

 return this.params;

 },

 addVariable: function(name, value){

 this.variables[name] = value;

 },

 getVariable: function(name){

 return this.variables[name];

 },

 getVariables: function(){

 return this.variables;

 },

 getVariablePairs: function(){

 var variablePairs = new Array();

 var key;

 var variables = this.getVariables();

 for(key in variables){

 variablePairs.push(key +"="+ variables[key]);

 }

 return variablePairs;

 },

 getSWFHTML: function() {

 var swfNode = "";

 if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) { // netscape plugin architecture

 if (this.getAttribute("doExpressInstall")) { this.addVariable("MMplayerType", "PlugIn"); }

 swfNode = '<embed type="application/x-shockwave-flash" src="'+ this.getAttribute('swf') +'" width="'+ this.getAttribute('width') +'" height="'+ this.getAttribute('height') +'"';

 swfNode += ' id="'+ this.getAttribute('id') +'" name="'+ this.getAttribute('id') +'" ';

 var params = this.getParams();

 for(var key in params){ swfNode += [key] +'="'+ params[key] +'" '; }

 var pairs = this.getVariablePairs().join("&");

 if (pairs.length > 0){ swfNode += 'flashvars="'+ pairs +'"'; }

 swfNode += '/>';

 } else { // PC IE

 if (this.getAttribute("doExpressInstall")) { this.addVariable("MMplayerType", "ActiveX"); }

 swfNode = '<object id="'+ this.getAttribute('id') +'" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+ this.getAttribute('width') +'" height="'+ this.getAttribute('height') +'">';

 swfNode += '<param name="movie" value="'+ this.getAttribute('swf') +'" />';

 var params = this.getParams();

 for(var key in params) {

 swfNode += '<param name="'+ key +'" value="'+ params[key] +'" />';

 }

 var pairs = this.getVariablePairs().join("&");

 if(pairs.length > 0) {swfNode += '<param name="flashvars" value="'+ pairs +'" />';}

 swfNode += "</object>";

 }

 return swfNode;

 },

 write: function(elementId){

 if(this.getAttribute('useExpressInstall')) {

 // check to see if we need to do an express install

 var expressInstallReqVer = new deconcept.PlayerVersion([6,0,65]);

 if (this.installedVer.versionIsValid(expressInstallReqVer) && !this.installedVer.versionIsValid(this.getAttribute('version'))) {

 this.setAttribute('doExpressInstall', true);

 this.addVariable("MMredirectURL", escape(this.getAttribute('xiRedirectUrl')));

 document.title = document.title.slice(0, 47) + " - Flash Player Installation";

 this.addVariable("MMdoctitle", document.title);

 }

 }

 if(this.skipDetect || this.getAttribute('doExpressInstall') || this.installedVer.versionIsValid(this.getAttribute('version'))){

 var n = (typeof elementId == 'string') ? document.getElementById(elementId) : elementId;

 n.innerHTML = this.getSWFHTML();

 return true;

 }else{

 if(this.getAttribute('redirectUrl') != "") {

 document.location.replace(this.getAttribute('redirectUrl'));

 }

 }

 return false;

 }

}
 

/* ---- detection functions ---- */

deconcept.SWFObjectUtil.getPlayerVersion = function(){

 var PlayerVersion = new deconcept.PlayerVersion([0,0,0]);

 if(navigator.plugins && navigator.mimeTypes.length){

 var x = navigator.plugins["Shockwave Flash"];

 if(x && x.description) {

 PlayerVersion = new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/, "").replace(/(\s+r|\s+b[0-9]+)/, ".").split("."));

 }

 }else{

 // do minor version lookup in IE, but avoid fp6 crashing issues

 // see http://blog.deconcept.com/2006/01/11/getvariable-setvariable-crash-internet-explorer-flash-6/

 try{

 var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");

 }catch(e){

 try {

 var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");

 PlayerVersion = new deconcept.PlayerVersion([6,0,21]);

 axo.AllowScriptAccess = "always"; // throws if player version < 6.0.47 (thanks to Michael Williams @ Adobe for this code)

 } catch(e) {

 if (PlayerVersion.major == 6) {

 return PlayerVersion;

 }

 }

 try {

 axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");

 } catch(e) {}

 }

 if (axo != null) {

 PlayerVersion = new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));

 }

 }

 return PlayerVersion;

}

deconcept.PlayerVersion = function(arrVersion){

 this.major = arrVersion[0] != null ? parseInt(arrVersion[0]) : 0;

 this.minor = arrVersion[1] != null ? parseInt(arrVersion[1]) : 0;

 this.rev = arrVersion[2] != null ? parseInt(arrVersion[2]) : 0;

}

deconcept.PlayerVersion.prototype.versionIsValid = function(fv){

 if(this.major < fv.major) return false;

 if(this.major > fv.major) return true;

 if(this.minor < fv.minor) return false;

 if(this.minor > fv.minor) return true;

 if(this.rev < fv.rev) return false;

 return true;

}

/* ---- get value of query string param ---- */

deconcept.util = {

 getRequestParameter: function(param) {

 var q = document.location.search || document.location.hash;

 if(q) {

 var pairs = q.substring(1).split("&");

 for (var i=0; i < pairs.length; i++) {

 if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {

 return pairs[i].substring((pairs[i].indexOf("=")+1));

 }

 }

 }

 return "";

 }

}

/* fix for video streaming bug */

deconcept.SWFObjectUtil.cleanupSWFs = function() {

 if (window.opera || !document.all) return;

 var objects = document.getElementsByTagName("OBJECT");

 for (var i=0; i < objects.length; i++) {

 objects[i].style.display = 'none';

 for (var x in objects[i]) {

 if (typeof objects[i][x] == 'function') {

 objects[i][x] = function(){};

 }

 }

 }

}

// fixes bug in fp9 see http://blog.deconcept.com/2006/07/28/swfobject-143-released/

deconcept.SWFObjectUtil.prepUnload = function() {

 __flash_unloadHandler = function(){};

 __flash_savedUnloadHandler = function(){};

 if (typeof window.onunload == 'function') {

 var oldUnload = window.onunload;

 window.onunload = function() {

 deconcept.SWFObjectUtil.cleanupSWFs();

 oldUnload();

 }

 } else {

 window.onunload = deconcept.SWFObjectUtil.cleanupSWFs;

 }

}

if (typeof window.onbeforeunload == 'function') {

 var oldBeforeUnload = window.onbeforeunload;

 window.onbeforeunload = function() {

 deconcept.SWFObjectUtil.prepUnload();

 oldBeforeUnload();

 }

} else {

 window.onbeforeunload = deconcept.SWFObjectUtil.prepUnload;

}

/* add Array.push if needed (ie5) */

if (Array.prototype.push == null) { Array.prototype.push = function(item) { this[this.length] = item; return this.length; }}
 

/* add some aliases for ease of use/backwards compatibility */

var getQueryParamValue = deconcept.util.getRequestParameter;

var FlashObject = deconcept.SWFObject; // for legacy support

var SWFObject = deconcept.SWFObject;

Open in new window

0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21845623
Near line 44 in getpics.php you have something like this:

    closedir($handle);
  }
  return($files);
}

Try inserting this right before return($files); and see what's getting put into that array.

Also, near line 26 in getpics.php, you might try making a change to this:

  $pattern="\.(jpg|jpeg|png|gif|bmp/swf)$";

Let's see if we can learn something from those two changes.  I may not live long enough to read 2,735 lines of Prototype -- and I suspect the issue is not with Prototype anyway.  HTH, ~Ray
echo "<!-- \n";

var_dump($files);

echo " -->\n";

Open in new window

0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21845638
One other thought... Have you tested this with other suffixes besides swf and jpg?  For example have you tried png and gif?  If not please test one of those, too.  Thanks.
0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21845677
Sorry - I fatfingered an earlier post. Near line 26 try changing to this (pipe, not slash):
  $pattern="\.(jpg|jpeg|png|gif|bmp|swf)$";

Open in new window

0
 

Author Comment

by:sany101
ID: 21845921
Thanks Ray,

Tried the two extra lines as above and no thumbs show if I go toi mpage.php, if I go direct to the getpics.php I get the following:

var galleryarray=new Array();
<!--
array(0) {
}
 -->


(this is with the  

$pattern="\.(jpg|jpeg|png|gif|bmp|swf)$";

and

echo "<!-- \n";
var_dump($files);
echo " -->\n";

)

If I only add the swf extension in line 26 as per your last post it works as before but doesn't show the swf file.

And finally I've added a png and Gif which both work well.
0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21846013
Just looked at the page and did not see the output of var_dump($files).  Is there a new link I should try to see that output?  I went here:

http://sany.co.uk/page.php

0
 

Author Comment

by:sany101
ID: 21846094
No sorry, removed the line when I tried the second version with just line 26 amended as the thumbs were not showing at all.

Its now back in.

http://sany.co.uk/page.php

So to recap I have added:

  echo "<!-- \n";
  var_dump($files);
  echo " -->\n";

before line: return($files);

and I have added the swf extension to:
  $pattern="\.(jpg|jpeg|png|gif|bmp|swf)$";

I have also added the Gif and Png files.

Thanks
0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21846175
I'm still not seeing the output of var_dump.  Can you try it this way (without the HTML comment lines)

var_dump($files);
before line: return($files);

It should print to the web page if the return($files) line is getting executed.
0
 

Author Comment

by:sany101
ID: 21846220
Just amended as requested now reads:

   closedir($handle);
  }
var_dump($files);
  return($files);
}

Still not seeing anything on page.php though?
0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21846342
Please post a link to getpics.php script.  Fully qualified, starting with http...
0
 

Author Comment

by:sany101
ID: 21846413
0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21846575
Looks like it is NOT executing the var_dump, so it is not returning the $files variable.

Can you please check and be sure we are looking at the correct files.  I'm beginning to think the directory structure may be askew.
0
 

Author Comment

by:sany101
ID: 21846859
Ok here is the Structure to the site and you can access any of these directly by using sany.co.uk/....

Root:
        page.php
       
        scripts:
                   getpics.php
                   swfobject.js
       
        projcets:
                     si_ab_01:
                                    large:
                                            1_small.jpg
                                            2_small.jpg
                                            3_small.jpg
                                            4_small.jpg
                                            5_small.png
                                            6_small.gif
                                            swf_small.swf
                                    thumbs:
                                            1_small.jpg
                                            2_small.jpg
                                            3_small.jpg
                                            4_small.jpg
                                            5_small.png
                                            6_small.gif
                                            swf_small.jpg

So seems to work if the extensions are the same but does not seem to strip them out and therefore work just with the file name..

I've removed the var_dump again so let me know if you want to re-instate it?

Thanks again
0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21847067
Yes, let's try it with the var_dump included.  Also, can you try putting another mismatched extension example, like maybe large/5_small.png and thumbs/5_small.jpg
0
 

Author Comment

by:sany101
ID: 21849012
Hi Ray,

Right I've just reverse engineered all the steps I took so that the script works again.. including the SWF and PNG files.

I've also added the line you wanted to the getpics.php script:   var_dump($files);

to get anything you will now need to use the following link for the getpics.php script so that you get the var:
http://sany.co.uk/projects/si_ab_01/getpics.php?project=si_ab_01

Also in order to get the page to display everything again I've had to move both the swfobject and getpics scripts to the root of that perticular project i.e. above the thumbs and large folder so that the directory now looks like this:

Root:
        page.php
       
        scripts:
                    IS NOW EMPTY
       
        projcets:
                     getpics.php
                     swfobject.js
                     si_ab_01:
                                    large:
                                            1_small.jpg
                                            2_small.jpg
                                            3_small.jpg
                                            4_small.jpg
                                            5_small.png
                                            6_small.gif
                                            swf_small.swf
                                    thumbs:
                                            1_small.jpg
                                            2_small.jpg
                                            3_small.jpg
                                            4_small.jpg
                                            5_small.jpg
                                            6_small.gif
                                            swf_small.jpg

Maybe from this working example it will be easier for you to see if I've missed any crucial paths for the two scripts to work in the common scripts folder?

Again thanks for your time.
0
 

Author Comment

by:sany101
ID: 21849080
OK only problem is I have to remove your line var_dump if you want to see it all working if you only want to see the result of adding that line by going direct to the getpic.php then use the link as above:


http://sany.co.uk/projects/si_ab_01/getpics.php?project=si_ab_01

and let me know when you want me to remove it again to see the page load properly.

Thanks

0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21849773
OK, it looks like the function returnimages may have some unnecessary moving parts.  Go ahead and pull the var_dump out - we know it's not reutrning anything.  I'll take a look again in a little while.  Cheers!
0
 

Author Comment

by:sany101
ID: 21850130
Thanks Ray,

I've removed the line now.
0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21850255
OK, I'm traveling from computer to computer, but here is what I see now.  When I run this script:
http://sany.co.uk/projects/si_ab_01/getpics.php?project=si_ab_01

I get output that says:

var galleryarray=new Array();
galleryarray[0]=["1_small.jpg", "May 29, 2008 15:26:08",""];
galleryarray[1]=["2_small.jpg", "May 29, 2008 15:26:09",""];
galleryarray[2]=["3_small.jpg", "May 29, 2008 15:26:10",""];
galleryarray[3]=["4_small.jpg", "May 29, 2008 15:26:11",""];
galleryarray[4]=["swf_small.jpg", "May 29, 2008 15:26:18","swf_small.swf"];
galleryarray[5]=["5_small.png", "Jun 23, 2008 16:58:42",""];
galleryarray[6]=["6_small.gif", "Jun 23, 2008 15:22:29",""];

Now try moving the scripts and let's run that script again.  We can compare the outputs and see if there is a good clue to the differences.
0
 

Author Comment

by:sany101
ID: 21850417
Ok just moved them new link to the getpics.php is :

http://sany.co.uk/scripts/getpics.php?project=si_ab_01

and now getting:

var galleryarray=new Array();
galleryarray[0]=["1_small.jpg", "May 29, 2008 15:26:08",""];
galleryarray[1]=["2_small.jpg", "May 29, 2008 15:26:09",""];
galleryarray[2]=["3_small.jpg", "May 29, 2008 15:26:10",""];
galleryarray[3]=["4_small.jpg", "May 29, 2008 15:26:11",""];
galleryarray[4]=["swf_small.jpg", "May 29, 2008 15:26:18",""];
galleryarray[5]=["5_small.png", "Jun 23, 2008 16:58:42",""];
galleryarray[6]=["6_small.gif", "Jun 23, 2008 15:22:29",""];

One thing I don't quite grasp however is why this is messing up the SWF extension but not the png one....
0
 

Author Comment

by:sany101
ID: 21853770
Correction It actually doesn't work with PNG files sorry...
0
 

Author Comment

by:sany101
ID: 21854627
OK After further investigation I've removed line 53 which was making me look in the wrong place and shouldn't be there and also amended line 54:

from

returnimages($imagesdirpath);

to:

returnimages();

I suspect its now not showing anything as the scandir function is looking in the wrong place ( root of scripts instead of the project folder).

I'm afraid I know very little about PHP or the scandir function to be able to make it look in a specific directory and follow that through where needed in the script...

Any ideas?

0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21854865
I think the differences between the galleryarray output shown above hold the clues.  I will look at it again this morning.  If you have changed the script, please rerun the tests, gather the galleryarray output and post the new script along with the test results from the two directories that we tested above.  Thanks.  Will be back in a few hours. ~Ray
0
 

Author Comment

by:sany101
ID: 21855130
Thanks Ray.

I've everything is back to where it was last night i.e. Scripts are now in the scripts folder and the getpics.PHP now outputs the following (without the var_dump Line):

var galleryarray=new Array();
galleryarray[0]=["1_small.jpg", "May 29, 2008 15:26:08",""];
galleryarray[1]=["2_small.jpg", "May 29, 2008 15:26:09",""];
galleryarray[2]=["3_small.jpg", "May 29, 2008 15:26:10",""];
galleryarray[3]=["4_small.jpg", "May 29, 2008 15:26:11",""];
galleryarray[4]=["swf_small.jpg", "May 29, 2008 15:26:18",""];
galleryarray[5]=["5_small.jpg", "Jun 24, 2008 11:19:52",""];
galleryarray[6]=["6_small.gif", "Jun 23, 2008 15:22:29",""];


you will be able to get this by going directly to the script: http://sany.co.uk/scripts/getpics.php?project=si_ab_01

I've attached the getpics code below as it stands now.

I do think though that as you said it is likely to be a directory path issue with the scandir function.

 I think line 53 below and line 54 are red hearings causing something to come back when in realitythe array isn't working hence why the var_dump line wont work when added. As I mentioned I wouldnt know how to amend the function for it to look in the projects dir with the $project its getting at the start?

I get the feeling that to truely solve the issue we would need to remove line 53 and amend line 54.


<? 

$_GET[$projects];
 

Header("content-type: application/x-javascript");
 

if (!function_exists("scandir")) {

  function scandir($dir,$listDirectories=false, $skipDots=true) {

      $dirArray = array();

      if ($handle = opendir($dir)) {

          while (false !== ($file = readdir($handle))) {

              if (($file != "." && $file != "..") || $skipDots == true) {

                  if($listDirectories == false) { if(is_dir($file)) { continue; } }

                  array_push($dirArray,basename($file));

              }

          }

          closedir($handle);

      }

      return $dirArray;

  }

}

 

function returnimages($smallFolder="thumbs",$largeFolder="large") {

 

  $largeListing = array_diff(scandir($largeFolder),array(".",".."));

 

  $pattern="\.(jpg|jpeg|png|gif|bmp|swf)$";

  $files = array();

  $curimage=0;

  if($handle = opendir($smallFolder)) {

    while(false !== ($file = readdir($handle))){

      if(eregi($pattern, $file)){

        $filedate=date ("M d, Y H:i:s", filemtime("$smallFolder/$file"));

 

        $matches=array();

        preg_match('/(.+)(?:\/|\\\)(([^\/\\\]+)\.([a-z0-9]+))$/i',"$smallFolder/$file",$matches);

        list(,$dirname,$filename,$filenameNoExt,$ext)=$matches;

 

        $largeFlashFile = in_array( ($filenameNoExt.".swf"), $largeListing );

        echo 'galleryarray[' . $curimage .']=["' . $file . '", "'.$filedate.'","' . ($largeFlashFile?($filenameNoExt.".swf"):"") . '"];' . "\n";

        $curimage++;

      }

    }

 

    closedir($handle);

  }

  return($files);

}

 

echo "var galleryarray=new Array();" . "\n";
 
 
 

$imagesdirpath=$_SERVER['DOCUMENT_ROOT'] . "/projects/$project/thumbs/"; //server path to images directory

returnimages($imagesdirpath);
 
 
 
 

?>

Open in new window

0
 

Author Comment

by:sany101
ID: 21855423
Sorry if I'm still barcking up the wrong tree.

In an effort to get to the bottom of when the array works and when it  doesn't I've put copies of the two scripts in the project root folder accessible @  http://sany.co.uk/projects/si_ab_01/getpics.php the swfobject.js file has not been changed and the getpics.php file has the following amendments: commented out line 53 and amended line 54 (see code snippet).  

and outputs:

var galleryarray=new Array();
galleryarray[0]=["1_small.jpg", "May 29, 2008 15:26:08",""];
galleryarray[1]=["2_small.jpg", "May 29, 2008 15:26:09",""];
galleryarray[2]=["3_small.jpg", "May 29, 2008 15:26:10",""];
galleryarray[3]=["4_small.jpg", "May 29, 2008 15:26:11",""];
galleryarray[4]=["swf_small.jpg", "May 29, 2008 15:26:18","swf_small.swf"];
galleryarray[5]=["5_small.jpg", "Jun 24, 2008 11:19:52",""];
galleryarray[6]=["6_small.gif", "Jun 23, 2008 15:22:29",""];

You can see from the result that it is all working perfectly, including swapping the swf extension.

So again I think finding a way to point the scandir function to the projects root folder using the variable $projects from the scripts folder is the key.


PLEASE NOTE: That these two files above won't interfere in what your doing or what you have requested I do in you last post as the links to the scripts in sany.co.uk/page.php still point to the two unamended files in sany.co.uk/scripts/



Thanks again for all your efforts.


<? 

$_GET[$projects];
 

Header("content-type: application/x-javascript");
 

if (!function_exists("scandir")) {

  function scandir($dir,$listDirectories=false, $skipDots=true) {

      $dirArray = array();

      if ($handle = opendir($dir)) {

          while (false !== ($file = readdir($handle))) {

              if (($file != "." && $file != "..") || $skipDots == true) {

                  if($listDirectories == false) { if(is_dir($file)) { continue; } }

                  array_push($dirArray,basename($file));

              }

          }

          closedir($handle);

      }

      return $dirArray;

  }

}

 

function returnimages($smallFolder="thumbs",$largeFolder="large") {

 

  $largeListing = array_diff(scandir($largeFolder),array(".",".."));

 

  $pattern="\.(jpg|jpeg|png|gif|bmp|swf)$";

  $files = array();

  $curimage=0;

  if($handle = opendir($smallFolder)) {

    while(false !== ($file = readdir($handle))){

      if(eregi($pattern, $file)){

        $filedate=date ("M d, Y H:i:s", filemtime("$smallFolder/$file"));

 

        $matches=array();

        preg_match('/(.+)(?:\/|\\\)(([^\/\\\]+)\.([a-z0-9]+))$/i',"$smallFolder/$file",$matches);

        list(,$dirname,$filename,$filenameNoExt,$ext)=$matches;

 

        $largeFlashFile = in_array( ($filenameNoExt.".swf"), $largeListing );

        echo 'galleryarray[' . $curimage .']=["' . $file . '", "'.$filedate.'","' . ($largeFlashFile?($filenameNoExt.".swf"):"") . '"];' . "\n";

        $curimage++;

      }

    }

 

    closedir($handle);

  }

  return($files);

}

 

echo "var galleryarray=new Array();" . "\n";
 
 
 

//$imagesdirpath=$_SERVER['DOCUMENT_ROOT'] . "/projects/$project/thumbs/"; //server path to images directory

returnimages();
 
 
 
 

?>

Open in new window

0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21857355
sany101: are you using PHP4 or PHP5+ ?
0
IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 

Author Comment

by:sany101
ID: 21857548
Hi Ray, well just double checked this its running PHP 5.2.6.

0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21857612
Great, thanks.  Now regarding this from the most recent post:

var galleryarray=new Array();
galleryarray[0]=["1_small.jpg", "May 29, 2008 15:26:08",""];
galleryarray[1]=["2_small.jpg", "May 29, 2008 15:26:09",""];
galleryarray[2]=["3_small.jpg", "May 29, 2008 15:26:10",""];
galleryarray[3]=["4_small.jpg", "May 29, 2008 15:26:11",""];
galleryarray[4]=["swf_small.jpg", "May 29, 2008 15:26:18","swf_small.swf"];
galleryarray[5]=["5_small.jpg", "Jun 24, 2008 11:19:52",""];
galleryarray[6]=["6_small.gif", "Jun 23, 2008 15:22:29",""];

The small swf is linked to the small swf, not to the large swf, as the other files are linked.  Also, it seems to have dropped the test case for png.  So it may appear to work, but may not meet all your future expectations.

How about if I try to rewrite the script for you.  I will treat the small files as the authoritative list of files (ie: If there is no small file, there will be no link, and if there is no large file, the small file will result in a broken link).  Give me a few minutes.  I'll be back.
0
 

Author Comment

by:sany101
ID: 21857653
Further investigation has revealed that my Host is actually running both versions of PHP (4&5) and that in order to run php5 scripts I need to add the extension .php5 otherwise the server sees it as PHP4.

However they also said that functions which have been introduced into PHP5 (i.e. scandir I take it) will still run using .php extension and PHP4....
0
 

Author Comment

by:sany101
ID: 21857675
Yep sounds good... Thanks again!
0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21858086
Try this.  I'm not able to test it, so please send me the error messages.
<? 

$_GET[$projects];

 

Header("content-type: application/x-javascript");

/* ******************************************************************** */

function my_scandir($dir) {
 

// ESTABLISH FILE EXTENSIONS THAT WILL BE LISTED IN THE GALLERY

    $pattern = "\.(jpg|jpeg|png|gif|bmp|swf)$";

    $dirArray = array();

    if ($handle = opendir($dir)) {

        while (false !== ($file = readdir($handle))) {

// DISCARD DOTS, DIRECTORIES, AND NON-GALLERY FILES        

            if ($file == "." || $file == "..") { continue; }

            if (is_dir($file)) { continue; } 

            if (!eregi($pattern, $file) { continue; }

// SAVE GALLERY FILES            

            array_push($dirArray,basename($file));

         } // end while

         closedir($handle);

    } // end if

    

return $dirArray;

} // end function

/* ******************************************************************** */

function returnimages($smallFolder="thumbs",$largeFolder="large") {
 

// GET ARRAYS OF FILE NAMES IN BOTH FOLDERS

    $largeListing = my_scandir($largeFolder);

    $smallListing = my_scandir($smallFolder);

    

// NOW WE CREATE TWO ASSOCIATIVE ARRAYS 

// WHERE THE FILENAME WITHOUT EXTENSION IS THE KEY 

// AND THE FILENAME WITH EXTENSION IS THE VALUE

    $smallNames = array();

    foreach ($smallListing as $smallName) {

        unset($x);

    	$x = explode('.', $smallName);

    	$name_noExt = $x[0];

        $smallNames["$name_noExt"] = $smallName;

    }
 

    $largeNames = array();

    foreach ($largeListing as $largeName) {

        unset($x);

    	$x = explode('.', $largeName);

    	$name_noExt = $x[0];

        $largeNames["$name_noExt"] = $largeName;

    }
 

// NEXT WE ITERATE THROUGH THE SMALL FILE NAME ARRAY GENERATING THE GALLERY ARRAY STATEMENTS

// AUTHORITATIVE FILE NAMES WITHOUT EXTENSIONS FROM $smallFolder

    $curimage=0;

    foreach ($smallNames as $key => $smallName) {

    	$largeName = $largeNames["$key"];

        $filedate=date ("M d, Y H:i:s", filemtime("$smallFolder/$smallName"));

        echo 'galleryarray[' . $curimage . ']=["' . $smallName . '", "' . $filedate . '","' . $largeName . '"];' . "\n";

        $curimage++;

    } // end foreach

} // end function

/* ******************************************************************** */

 

echo "var galleryarray=new Array();" . "\n";

returnimages();

?>

Open in new window

0
 

Author Comment

by:sany101
ID: 21858242
Excellent thanks.

Just had to add a ) on line 16 (letting you know only so you can amedn it your end if required)

I ran this as a PHP 4 file (so let me know if I should use the PHP5 extension?)

If I put the file directly above the thmbs and large folders in the si_ab_01 root (direct link: http://sany.co.uk/projects/si_ab_01/getpics.php?project=si_ab_01     )            I get the following:

var galleryarray=new Array();
galleryarray[0]=["1_small.jpg", "May 29, 2008 15:26:08","1_small.jpg"];
galleryarray[1]=["2_small.jpg", "May 29, 2008 15:26:09","2_small.jpg"];
galleryarray[2]=["3_small.jpg", "May 29, 2008 15:26:10","3_small.jpg"];
galleryarray[3]=["4_small.jpg", "May 29, 2008 15:26:11","4_small.jpg"];
galleryarray[4]=["swf_small.jpg", "May 29, 2008 15:26:18","swf_small.swf"];
galleryarray[5]=["5_small.jpg", "Jun 24, 2008 11:19:52","5_small.png"];
galleryarray[6]=["6_small.gif", "Jun 23, 2008 15:22:29","6_small.gif"];

If I put it in the scripts folder I get the usual:

 var galleryarray=new Array();

Direct link : http://sany.co.uk/scripts/getpics.php


Also the .png is now working!
0
 

Author Comment

by:sany101
ID: 21858350
I take it line 26 is where you select the two folders but how would I change this line to use a path including the var $projects?

i.e. something like


function returnimages($smallFolder= $domain/projects/$projects/thumbs ,$largeFolder=$domain/projects/$projects/large)

?
0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21858694
Try this one in the scripts folder.  It should use absolute addressing to get to the /projects/ folder and should substitute the GET string into the address.
<? 

$project = $_GET[$project];

 

Header("content-type: application/x-javascript");

/* ******************************************************************** */

function my_scandir($dir) {

 

// ESTABLISH FILE EXTENSIONS THAT WILL BE LISTED IN THE GALLERY

    $pattern = "\.(jpg|jpeg|png|gif|bmp|swf)$";

    $dirArray = array();

    if ($handle = opendir($dir)) {

        while (false !== ($file = readdir($handle))) {

// DISCARD DOTS, DIRECTORIES, AND NON-GALLERY FILES        

            if ($file == "." || $file == "..") { continue; }

            if (is_dir($file)) { continue; } 

            if (!eregi($pattern, $file)) { continue; }

// SAVE GALLERY FILES            

            array_push($dirArray,basename($file));

         } // end while

         closedir($handle);

    } // end if

    

return $dirArray;

} // end function

/* ******************************************************************** */

function returnimages($smallFolder="thumbs",$largeFolder="large") {

 

// GET ARRAYS OF FILE NAMES IN BOTH FOLDERS

    $largeListing = my_scandir("/projects/" . $project . "/" . $largeFolder");

    $smallListing = my_scandir("/projects/" . $project . "/" . $smallFolder");

    

// NOW WE CREATE TWO ASSOCIATIVE ARRAYS 

// WHERE THE FILENAME WITHOUT EXTENSION IS THE KEY 

// AND THE FILENAME WITH EXTENSION IS THE VALUE

    $smallNames = array();

    foreach ($smallListing as $smallName) {

        unset($x);

    	$x = explode('.', $smallName);

    	$name_noExt = $x[0];

        $smallNames["$name_noExt"] = $smallName;

    }

 

    $largeNames = array();

    foreach ($largeListing as $largeName) {

        unset($x);

    	$x = explode('.', $largeName);

    	$name_noExt = $x[0];

        $largeNames["$name_noExt"] = $largeName;

    }

 

// NEXT WE ITERATE THROUGH THE SMALL FILE NAME ARRAY GENERATING THE GALLERY ARRAY STATEMENTS

// AUTHORITATIVE FILE NAMES WITHOUT EXTENSIONS FROM $smallFolder

    $curimage=0;

    foreach ($smallNames as $key => $smallName) {

    	$largeName = $largeNames["$key"];

        $filedate=date ("M d, Y H:i:s", filemtime("$smallFolder/$smallName"));

        echo 'galleryarray[' . $curimage . ']=["' . $smallName . '", "' . $filedate . '","' . $largeName . '"];' . "\n";

        $curimage++;

    } // end foreach

} // end function

/* ******************************************************************** */

 

echo "var galleryarray=new Array();" . "\n";

returnimages();

?>

Open in new window

0
 

Author Comment

by:sany101
ID: 21858935
Thanks Ray.

Its saying syntax error on line 29.

Unfortunatelly I have no idea why.
0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21859633
Normal debugging cycle.  You can try this.  Also, if it gives an error message it's useful to have the entire error message.   There is usually more than just "syntax error" ;-)
<? 

$project = $_GET[$project];

 

Header("content-type: application/x-javascript");

/* ******************************************************************** */

function my_scandir($dir) {

 

// ESTABLISH FILE EXTENSIONS THAT WILL BE LISTED IN THE GALLERY

    $pattern = "\.(jpg|jpeg|png|gif|bmp|swf)$";

    $dirArray = array();

    if ($handle = opendir($dir)) {

        while (false !== ($file = readdir($handle))) {

// DISCARD DOTS, DIRECTORIES, AND NON-GALLERY FILES        

            if ($file == "." || $file == "..") { continue; }

            if (is_dir($file)) { continue; } 

            if (!eregi($pattern, $file)) { continue; }

// SAVE GALLERY FILES            

            array_push($dirArray,basename($file));

         } // end while

         closedir($handle);

    } // end if

    

return $dirArray;

} // end function

/* ******************************************************************** */

function returnimages($smallFolder="thumbs",$largeFolder="large") {
 

    global $project;

// GET ARRAYS OF FILE NAMES IN BOTH FOLDERS

    $Xlarge = "/projects/" . "$project" . "/" . $largeFolder";

    $Xsmall = "/projects/" . "$project" . "/" . $smallFolder";

    $largeListing = my_scandir($Xlarge);

    $smallListing = my_scandir($Xsmall);

    

// NOW WE CREATE TWO ASSOCIATIVE ARRAYS 

// WHERE THE FILENAME WITHOUT EXTENSION IS THE KEY 

// AND THE FILENAME WITH EXTENSION IS THE VALUE

    $smallNames = array();

    foreach ($smallListing as $smallName) {

        unset($x);

    	$x = explode('.', $smallName);

    	$name_noExt = $x[0];

        $smallNames["$name_noExt"] = $smallName;

    }

 

    $largeNames = array();

    foreach ($largeListing as $largeName) {

        unset($x);

    	$x = explode('.', $largeName);

    	$name_noExt = $x[0];

        $largeNames["$name_noExt"] = $largeName;

    }

 

// NEXT WE ITERATE THROUGH THE SMALL FILE NAME ARRAY GENERATING THE GALLERY ARRAY STATEMENTS

// AUTHORITATIVE FILE NAMES WITHOUT EXTENSIONS FROM $smallFolder

    $curimage=0;

    foreach ($smallNames as $key => $smallName) {

    	$largeName = $largeNames["$key"];

        $filedate=date ("M d, Y H:i:s", filemtime("$smallFolder/$smallName"));

        echo 'galleryarray[' . $curimage . ']=["' . $smallName . '", "' . $filedate . '","' . $largeName . '"];' . "\n";

        $curimage++;

    } // end foreach

} // end function

/* ******************************************************************** */

 

echo "var galleryarray=new Array();" . "\n";

returnimages();

?>

Open in new window

0
 

Author Comment

by:sany101
ID: 21859841
Point taken :)

Parse error: syntax error, unexpected '"' in mysharedserverroot/scripts/getpics.php on line 30

Thanks
0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21860093
Sorry, my bad.
<? 

$project = $_GET[$project];

 

Header("content-type: application/x-javascript");

/* ******************************************************************** */

function my_scandir($dir) {

 

// ESTABLISH FILE EXTENSIONS THAT WILL BE LISTED IN THE GALLERY

    $pattern = "\.(jpg|jpeg|png|gif|bmp|swf)$";

    $dirArray = array();

    if ($handle = opendir($dir)) {

        while (false !== ($file = readdir($handle))) {

// DISCARD DOTS, DIRECTORIES, AND NON-GALLERY FILES        

            if ($file == "." || $file == "..") { continue; }

            if (is_dir($file)) { continue; } 

            if (!eregi($pattern, $file)) { continue; }

// SAVE GALLERY FILES            

            array_push($dirArray,basename($file));

         } // end while

         closedir($handle);

    } // end if

    

return $dirArray;

} // end function

/* ******************************************************************** */

function returnimages($smallFolder="thumbs",$largeFolder="large") {

 

    global $project;

// GET ARRAYS OF FILE NAMES IN BOTH FOLDERS

    $Xlarge = "/projects/" . "$project" . "/" . "$largeFolder";

    $Xsmall = "/projects/" . "$project" . "/" . "$smallFolder";

    $largeListing = my_scandir($Xlarge);

    $smallListing = my_scandir($Xsmall);

    

// NOW WE CREATE TWO ASSOCIATIVE ARRAYS 

// WHERE THE FILENAME WITHOUT EXTENSION IS THE KEY 

// AND THE FILENAME WITH EXTENSION IS THE VALUE

    $smallNames = array();

    foreach ($smallListing as $smallName) {

        unset($x);

    	$x = explode('.', $smallName);

    	$name_noExt = $x[0];

        $smallNames["$name_noExt"] = $smallName;

    }

 

    $largeNames = array();

    foreach ($largeListing as $largeName) {

        unset($x);

    	$x = explode('.', $largeName);

    	$name_noExt = $x[0];

        $largeNames["$name_noExt"] = $largeName;

    }

 

// NEXT WE ITERATE THROUGH THE SMALL FILE NAME ARRAY GENERATING THE GALLERY ARRAY STATEMENTS

// AUTHORITATIVE FILE NAMES WITHOUT EXTENSIONS FROM $smallFolder

    $curimage=0;

    foreach ($smallNames as $key => $smallName) {

    	$largeName = $largeNames["$key"];

        $filedate=date ("M d, Y H:i:s", filemtime("$smallFolder/$smallName"));

        echo 'galleryarray[' . $curimage . ']=["' . $smallName . '", "' . $filedate . '","' . $largeName . '"];' . "\n";

        $curimage++;

    } // end foreach

} // end function

/* ******************************************************************** */

 

echo "var galleryarray=new Array();" . "\n";

returnimages();

?>

Open in new window

0
 

Author Comment

by:sany101
ID: 21860450
Ok quick recap:

http://sany.co.uk/scripts/getpics.php?project=si_ab_01

gives me:  

var galleryarray=new Array();

and I'm using the attached code but could you briefly check lines 30 and 31 to make sure that they follow your above specification regarding the use of absolute path and the $project variable?
<? 

$project = $_GET[$project];

 

Header("content-type: application/x-javascript");

/* ******************************************************************** */

function my_scandir($dir) {

 

// ESTABLISH FILE EXTENSIONS THAT WILL BE LISTED IN THE GALLERY

    $pattern = "\.(jpg|jpeg|png|gif|bmp|swf)$";

    $dirArray = array();

    if ($handle = opendir($dir)) {

        while (false !== ($file = readdir($handle))) {

// DISCARD DOTS, DIRECTORIES, AND NON-GALLERY FILES        

            if ($file == "." || $file == "..") { continue; }

            if (is_dir($file)) { continue; } 

            if (!eregi($pattern, $file)) { continue; }

// SAVE GALLERY FILES            

            array_push($dirArray,basename($file));

         } // end while

         closedir($handle);

    } // end if

    

return $dirArray;

} // end function

/* ******************************************************************** */

function returnimages($smallFolder="thumbs",$largeFolder="large") {

 

    global $project;

// GET ARRAYS OF FILE NAMES IN BOTH FOLDERS

    $Xlarge = "/homepages/44/mysharedserver/htdocs/Sany/projects/" . "$project" . "/" . "$largeFolder";

    $Xsmall = "/homepages/44/mysharedserver/htdocs/Sany/projects/" . "$project" . "/" . "$smallFolder";

    $largeListing = my_scandir($Xlarge);

    $smallListing = my_scandir($Xsmall);

    

// NOW WE CREATE TWO ASSOCIATIVE ARRAYS 

// WHERE THE FILENAME WITHOUT EXTENSION IS THE KEY 

// AND THE FILENAME WITH EXTENSION IS THE VALUE

    $smallNames = array();

    foreach ($smallListing as $smallName) {

        unset($x);

    	$x = explode('.', $smallName);

    	$name_noExt = $x[0];

        $smallNames["$name_noExt"] = $smallName;

    }

 

    $largeNames = array();

    foreach ($largeListing as $largeName) {

        unset($x);

    	$x = explode('.', $largeName);

    	$name_noExt = $x[0];

        $largeNames["$name_noExt"] = $largeName;

    }

 

// NEXT WE ITERATE THROUGH THE SMALL FILE NAME ARRAY GENERATING THE GALLERY ARRAY STATEMENTS

// AUTHORITATIVE FILE NAMES WITHOUT EXTENSIONS FROM $smallFolder

    $curimage=0;

    foreach ($smallNames as $key => $smallName) {

    	$largeName = $largeNames["$key"];

        $filedate=date ("M d, Y H:i:s", filemtime("$smallFolder/$smallName"));

        echo 'galleryarray[' . $curimage . ']=["' . $smallName . '", "' . $filedate . '","' . $largeName . '"];' . "\n";

        $curimage++;

    } // end foreach

} // end function

/* ******************************************************************** */

 

echo "var galleryarray=new Array();" . "\n";

returnimages();

?>

Open in new window

0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21860485
Have you tried the script as above with these lines:

    $Xlarge = "/projects/" . "$project" . "/" . "$largeFolder";
    $Xsmall = "/projects/" . "$project" . "/" . "$smallFolder";

If not, please try it that way, and let me know what you get.
0
 

Author Comment

by:sany101
ID: 21860524
yes... I get:

var galleryarray=new Array();

just changed them to this now so they are as post above:


    $Xlarge = "/projects/" . "$project" . "/" . "$largeFolder";
    $Xsmall = "/projects/" . "$project" . "/" . "$smallFolder";


Thanks
0
 
LVL 108

Accepted Solution

by:
Ray Paseur earned 500 total points
ID: 21860653
Next try...
<? 

$project = $_GET[$project];

 

Header("content-type: application/x-javascript");

/* ******************************************************************** */

function my_scandir($dir) {

 

// ESTABLISH FILE EXTENSIONS THAT WILL BE LISTED IN THE GALLERY

    $pattern = "\.(jpg|jpeg|png|gif|bmp|swf)$";

    $dirArray = array();

    if ($handle = opendir($dir)) {

        while (false !== ($file = readdir($handle))) {

// DISCARD DOTS, DIRECTORIES, AND NON-GALLERY FILES        

            if ($file == "." || $file == "..") { continue; }

            if (is_dir($file)) { continue; } 

            if (!eregi($pattern, $file)) { continue; }

// SAVE GALLERY FILES            

            array_push($dirArray,basename($file));

         } // end while

         closedir($handle);

    } // end if

    

return $dirArray;

} // end function

/* ******************************************************************** */

function returnimages($smallFolder="thumbs",$largeFolder="large") {

 

    global $project;

// GET ARRAYS OF FILE NAMES IN BOTH FOLDERS

    $Xlarge = "../projects/" . "$project" . "/" . "$largeFolder";

    $Xsmall = "../projects/" . "$project" . "/" . "$smallFolder";

    $largeListing = my_scandir($Xlarge);

    $smallListing = my_scandir($Xsmall);

    

// NOW WE CREATE TWO ASSOCIATIVE ARRAYS 

// WHERE THE FILENAME WITHOUT EXTENSION IS THE KEY 

// AND THE FILENAME WITH EXTENSION IS THE VALUE

    $smallNames = array();

    foreach ($smallListing as $smallName) {

        unset($x);

    	$x = explode('.', $smallName);

    	$name_noExt = $x[0];

        $smallNames["$name_noExt"] = $smallName;

    }

 

    $largeNames = array();

    foreach ($largeListing as $largeName) {

        unset($x);

    	$x = explode('.', $largeName);

    	$name_noExt = $x[0];

        $largeNames["$name_noExt"] = $largeName;

    }

 

// NEXT WE ITERATE THROUGH THE SMALL FILE NAME ARRAY GENERATING THE GALLERY ARRAY STATEMENTS

// AUTHORITATIVE FILE NAMES WITHOUT EXTENSIONS FROM $smallFolder

    $curimage=0;

    foreach ($smallNames as $key => $smallName) {

    	$largeName = $largeNames["$key"];

        $filedate=date ("M d, Y H:i:s", filemtime("$smallFolder/$smallName"));

        echo 'galleryarray[' . $curimage . ']=["' . $smallName . '", "' . $filedate . '","' . $largeName . '"];' . "\n";

        $curimage++;

    } // end foreach

} // end function

/* ******************************************************************** */

 

echo "var galleryarray=new Array();" . "\n";

returnimages();

?>

Open in new window

0
 

Author Comment

by:sany101
ID: 21860771
OK.. Still

var galleryarray=new Array();


and I took the liberty of trying them with:

"projects/" (i.e. without the foward slash at the start) as I know that that is the way the paths need to be for my includes on other pages to work.

0
 

Author Comment

by:sany101
ID: 21865877
YEAY! after further investigation it's now working.

just changed line 2 to the following:

$_GET[$project];


So finally how would I show the first image in the array in my target DIV?

i.e. if I get the following result from the getpics.php:

var galleryarray=new Array();
galleryarray[0]=["1_small.jpg", "Jan 01, 1970 01:00:00","1_small.jpg"];
galleryarray[1]=["2_small.jpg", "Jan 01, 1970 01:00:00","2_small.jpg"];
galleryarray[2]=["3_small.jpg", "Jan 01, 1970 01:00:00","3_small.jpg"];
galleryarray[3]=["4_small.jpg", "Jan 01, 1970 01:00:00","4_small.jpg"];
galleryarray[4]=["swf_small.jpg", "Jan 01, 1970 01:00:00","swf_small.swf"];
galleryarray[5]=["5_small.jpg", "Jan 01, 1970 01:00:00","5_small.png"];
galleryarray[6]=["6_small.gif", "Jan 01, 1970 01:00:00","6_small.gif"];

how would I pass the first large image to my target div to load as the first image?

All your help has been greatly appreciated.
0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21865966
If I recall correctly, your file structure is something like this:

Root:
        page.php
       
        scripts:
                    IS NOW EMPTY
       
        projcets:
                     getpics.php
                     swfobject.js
                     si_ab_01:
                                    large:
                                            1_small.jpg
                                            2_small.jpg
                                            3_small.jpg
                                            4_small.jpg
                                            5_small.png
                                            6_small.gif
                                            swf_small.swf
                                    thumbs:
                                            1_small.jpg
                                            2_small.jpg
                                            3_small.jpg
                                            4_small.jpg
                                            5_small.jpg
                                            6_small.gif
                                            swf_small.jpg

From that, it looks like maybe the "large" directory has small images in it?  Can't really tell from here.
0
 

Author Comment

by:sany101
ID: 21866201
Hi Ray,

Actually the directory is now as follows:

Root:
        page.php
       
        scripts:
                     getpics.php
                     swfobject.js
       
        projcets:
                     si_ab_01:
                                    large:
                                            1_small.jpg
                                            2_small.jpg
                                            3_small.jpg
                                            4_small.jpg
                                            5_small.png
                                            6_small.gif
                                            swf_small.swf
                                    thumbs:
                                            1_small.jpg
                                            2_small.jpg
                                            3_small.jpg
                                            4_small.jpg
                                            5_small.jpg
                                            6_small.jpg
                                            swf_small.jpg

As far as the two directories (thumbs and large) have the same file names ONLY and the files themselves are actually differing pixel sizes they are only called 1small.jpg etc. because both sets had to have the same name in order for the script to work.

FYI all images inside the thumbs folder are 100x67 and all in the large forlder are 300x200.

Hope this helps.
0
 

Author Comment

by:sany101
ID: 21866277
To save confusion I've now renamed all images with _small removed so the directory now looks like this:

Root:
        page.php
       
        scripts:
                     getpics.php
                     swfobject.js
       
        projcets:
                     si_ab_01:
                                    large:
                                            1.jpg
                                            2.jpg
                                            3.jpg
                                            4.jpg
                                            5.png
                                            6.gif
                                            swf.swf
                                    thumbs:
                                            1.jpg
                                            2.jpg
                                            3.jpg
                                            4.jpg
                                            5.jpg
                                            6.jpg
                                            swf.jpg
0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21866338
Sorry, I'm doing my best to help you, but things keep getting moved on the web site.  You really should get rid of that 403 blocker while you're trying to debug a path-related problem.  It is hiding both the symptoms and the solutions.

Where is this: http://sany.co.uk/page.php now?
0
 

Author Comment

by:sany101
ID: 21866421
Hi Sorry Ray its there.  wont touch till you say.
0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21866473
OK, I just visited http://sany.co.uk/page.php

Now tell me what is wrong?
0
 

Author Comment

by:sany101
ID: 21866517
The first image in the large folder isn't loading. so when you land on the page the first image in the sequence should be displayed above the thumbs this was being executed the code bellow in page.php


<div id="targetdiv"><script type="text/javascript">

document.write('<img src="'+imagepath+galleryarray[0]+'">');

</script></div>

Open in new window

0
 

Author Comment

by:sany101
ID: 21866525
...where "targetdive" is the container where all the large images are loaded in.
0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 21867803
sany101, if I were you, I would hire a developer, give them the specs for what you want and then relax while a professional takes control.  You are in way over your head and it's been very difficult to  help you because files and code keep changing.  If you insist on doing this yourself, you simply MUST take some basic programming courses and learn the technologies you are trying to use.  I don't know what this application is expected to do once it is in "production" but here are a couple of things you need to think about.

Version control!!  You can't make changes while someone else is working on the code.

Obfuscation.  The rendered contents of page.php can be different, but there is no way to link to the differences.  So someone who wants to send a link to image 2 can't do it - the URL does not reflect reality.  The javascript, in addition to being a huge source of confusion for you, makes it all the more obscure.

Confusion.  "Free" scripts like those from Dynamic Drive are usually worth just what you pay for them.  If you have the skills to use them, great.  If not, you'll be lost once you need a change.  That's sort of what I've observed over the last few days.

Compatibility.  What thought have you given to the client who has Javascript turned off?  It is axiomatic in web design that a site must degrade gracefully.  This thing simply falls apart.  If you were to design this application to current thinking, you would need to get away from the javascript and just use something in PHP and HTML that uses the server file system.   Maybe look into the way JAlbum works.

Follow Instructions!  The docs for this script are explicit: "Then, upload this file to the SAME directory on your server containing all the images..." Emphasis theirs.  It is an issue of fitness for a particular purpose and you are trying to change the use case.  I appreciate the intellectual challenge of trying different things, but maybe it would have been better use of time to get a script that didn't have explicit instructions telling you not to do what you are trying to do.

Expectations:  The demo page does not have a large image shown first.  It probably was not part of the designer's thinking.

Anyway, as to the targetdiv, here is what the Javascript is putting into the Document (you can find this out with Firebug):

<img src="http://sany.co.uk/projects/si_ab_01/thumbs/1.jpg,Jan 01, 1970 01:00:00,1.jpg"/>

That is an incorrectly formed statement and browsers will not render it, hence no large image.

But that's not all, the imagepath variable points to the thumbs directory, and the rest of the script depends on that.  So once you get inside the galleryarray[0] you will have to (1) extract the file name and (2) somehow discover the name of the directory with the large files.  Currently that information is hardcoded inside the PHP getpics script, so it is unavailable to the Javascript.  Catch-22.

You may be able to get some traction here:
http://www.google.com/search?hl=en&q=PHP+Photo+Album

I'm finished.  Over and out.  Good luck as you go forward, ~Ray
0
 

Author Comment

by:sany101
ID: 21868628
Hi Ray thanks for all your time, effort and closing comments.

Really there was only ever three amendments that I required for the script they were:

1 - Work with Flash : MCUK_STORM did an excellent job in no time amending this as stated at the start of this post.

2 - Work from a differing directory from the root project folder which there is a solution for on the Dynamicdrive site for the NONE Flash compatible version (you managed to rectify this superbly for the flash version)

3 - Load the first image which has already been addressed on the DynamicDrive website with the code I last uploaded (unfortunately this does not seem to work when the scripts are moved and is the only thing outstanding)

Besides point 3 all works well and as I require it, so I have every faith that the finished product will serve my purpose:

Regarding Javascript yes its true that users with this feature turned off will not be able to see certain content as it is intended, but then I if I was concerned about this I should probably not use Flash either.. Its a risk I have been happy to commit to early on.

On the way over your head part, I agree that unfortunately I am not able to know everything hence why I am here asking Experts.

Although there were simple coding errors which I understand enough to correct and therefore did make changes myself otherwise we would still be working on it weeks from now. I have to stress that every change that I made was catalogued above as I made it and for the most part these were carried out early morning your time due to our time difference.

Regarding my expectations for loading the first image I agree that it probably wasn't something the designer thought about but then nor was using the script with swf files. I truly believe that if it is possible to have thumbs load on the page in order and have their larger counterparts load into the targetdiv then it is not inconceivable that it would be possible to load the first large image at the same time as all the thumbs are loaded using the script.

I have spent a considerable time looking through google.com (and yes I was aware there was such a site before you kindly pointed it out) for a script that would serve my purpose and the dynamicdrive script is the best fit I found.

Having backed myself up a bit I am not foolish enough to not recognise or appreciate the hard work that you have put into this, regardless of whether there is a finished solution. I will of course award you with the full 500 points as I always felt, even before posting the question that it was worth considerably more than the maximum points available for me to dish out.

I wish you all the best, thank you again for your help.

Sany
0
 

Author Closing Comment

by:sany101
ID: 31469267
Thanks
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Author Note: Since this E-E article was originally written, years ago, formal testing has come into common use in the world of PHP.  PHPUnit (http://en.wikipedia.org/wiki/PHPUnit) and similar technologies have enjoyed wide adoption, making it possib…
Things That Drive Us Nuts Have you noticed the use of the reCaptcha feature at EE and other web sites?  It wants you to read and retype something that looks like this.Insanity!  It's not EE's fault - that's just the way reCaptcha works.  But it is …
The viewer will learn how to create and use a small PHP class to apply a watermark to an image. This video shows the viewer the setup for the PHP watermark as well as important coding language. Continue to Part 2 to learn the core code used in creat…
This tutorial will teach you the core code needed to finalize the addition of a watermark to your image. The viewer will use a small PHP class to learn and create a watermark.

747 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

9 Experts available now in Live!

Get 1:1 Help Now