<HTML>
<HEAD>
<TITLE>Javascript Filmstrip: Example #5</title>
<style type='text/css'>
.thumbnail {
margin-right: 5px;
width: 75px;
height: 75px;
}
.filmstrip {
position: absolute;
float: left;
overflow: hidden;
height: 75px;
cursor: w-resize;
}
.detail {
position: absolute;
border: 1px solid black;
background-color: #DDDDDD;
display: none;
cursor:move;
}
.detailLink {
text-decoration: none;
color: black;
}
.detailLink:hover {
background-color: black;
color: white;
}
.detailComments {
font-family: verdana;
font-size: 9pt;
color: black;
display: none;
}
.detailImg {
cursor: move;
padding: 5px;
}
</style>
</HEAD>
<BODY onResize='bindStrip();'>
<div id='filmstrip' class='filmstrip'></div>
<BR><BR><BR>
<center>
<table style='border: 1px solid black' width=50% height=75 cellspacing=0 cellpadding=0 id='landingZone'>
<tr><td> </Td></tr>
</table>
</center>
<BR><BR>
<div id='detailFrame' class='detail'>
<A HREF="javascript:flickrGo()" class='detailLink'>LINK</A>
<A HREF="javascript:flickrZoom()" class='detailLink'>ZOOM</A>
<A HREF="javascript:showPic()" class='detailLink'>CLOSE</A>
<div id='detailPic' onMouseOver='document.getElementById("comments").style.display="block"' onMouseOut='document.getElementById("comments").style.display="none"'></div>
<div id='comments' class='detailComments'></div>
</div>
<script type='text/javascript'>
var _allImages = new Array(); // Holds all of the image data from server
var _filmstrip = document.getElementById('filmstrip'); // Our filmstrip layer
var _landingZone= document.getElementById('landingZone'); // Table which creates the filmstrip bondary
var _topOffset = 0; // Y position of the table in the web page
var _leftOffset = 0; // X position of the table in the web page.
var _totalOffset = 0; // Current X offset of the filmstrip.
var _totalChange = 0; // Total pixels moved/changed
var _savedTarget = null; // Target object of drag event
var _orgCursor = null; // Original cursor Style
var _dragXOffset = 0; // X offset of the move event
var _dragYOffset = 0; // Y offset of the move event
var _scrollOK = false; // True if we can scroll filmstrip
var _originalOffset=0; // Original offset (before drag event)
var _currentPic = 0; // Index of current Picture
// Begin Ajax functions to import data
function importData(fileName) {
var AJAX = null; // Initialize the AJAX variable.
if (window.XMLHttpRequest) { // Are we working with mozilla?
AJAX=new XMLHttpRequest(); // Yes -- this is mozilla.
} else { // Not Mozilla, must be IE
AJAX=new ActiveXObject("Microsoft.XMLHTTP"); // Wheee, ActiveX, how do we format c: again?
} // End setup Ajax.
if (AJAX==null) { // If we couldn't initialize Ajax...
alert("Your browser doesn't support AJAX."); // Sorry msg.
return false // Return false (WARNING - SAME AS ALREADY PROCESSING!)
} else {
AJAX.onreadystatechange = function() { // When the browser has the request info..
if (AJAX.readyState==4 || AJAX.readyState=="complete") { // see if the complete flag is set.
processData(AJAX.responseText);
} // End Ajax readystate check.
} // End create post-process fucntion block.
AJAX.open("GET", fileName, true); // Open the url
AJAX.send(null); // Send the request.
return true; // Everything went a-ok.
} // End Ajax setup aok if/else block
}
function processData (dat) {
allImages = dat.split('``'); // Explode the server image data into array elements
var ktr=0; // Initialize our counter
_filmstrip.innerHTML=''; // Initialize our filmstrip
_filmWidth=0; // Initiaize the film width.
var tmp = ''; // Temp variable to hold our HTML as we build it.
while ((ktr<allImages.length)&&(allImages[ktr].indexOf('EOF*EOF')<0)) { // For each record in allImages.
record = allImages[ktr].split('~|~'); // Explode record into individual fields.
// The next line builds our HTML in a variable, this is faster than doing X innerHTML insertions.
tmp+='<img src="'+record[1]+'_s.jpg" class="thumbnail" onMouseUp="showPic(\''+ktr+'\')">';
_filmWidth+=80; // Increment our filmstrip Width counter.
ktr++; // Increment our counter
} // End WHILE loop
_filmstrip.innerHTML=tmp; // Insert tmp into our filmstrip layer.
}
// End AJAX functions
// These functions help anchor the filmstrip to the landingZone table
function findPos(obj) {
// Credit for this function: http://www.quirksmode.org/js/findpos.html
// Visit the URL for a complete tutorial on this function
var curleft = curtop = 0;
if (obj.offsetParent) {
curleft = obj.offsetLeft
curtop = obj.offsetTop
curwidth = obj.offsetWidth;
while (obj = obj.offsetParent) {
curleft += obj.offsetLeft
curtop += obj.offsetTop
}
}
return [curleft,curtop,curwidth];
}
function bindStrip() { // moves filmstrip into the landingZone table.
ofs=findPos(_landingZone); // Find the left/top & width of table
_filmstrip.style.top=ofs[1]+'px'; // Set filmstrip's top location
_filmstrip.style.left=ofs[0]+'px'; // Set filmstrip's left location
_topOffset = ofs[1]; // Remember top offset globally
_leftOffset= ofs[0]; // Remember the left offset globally
// The next line crops the filmstrip and shows only a small section of it
_filmstrip.style.clip='rect(0px,'+(_landingZone.offsetWidth+_totalOffset)+'px,80px,'+_totalOffset+'px)';
_filmstrip.style.left=(_leftOffset-_totalOffset)+'px'; // set the left offset of the filmstrip
}
// End filmstrip anchor functions.
// Begin Drag/Scroll Handlers
function scrollHandler(e) {
// This function handles the draging of the filmstrip from left to right
if (e == null) { e = window.event; } // Get event data
if (e.button<=1&&_scrollOK){ // Is mouse down and scroll enabled?
_totalOffset=_originalOffset+(_dragXoffset-e.clientX); // Find the distance mouse has moved
if ((_totalOffset) < 0) { // Are we scrolling too far left?
_totalOffset=0; // Yes, set the offset to 0
_originalOffset=0; // and the original
_dragXoffset=e.clientX; // and reset the mouse.
}
if ((_totalOffset+_landingZone.offsetWidth)>=(_filmWidth-5)) { // Are we too far right?
_totalOffset=(_filmWidth-_landingZone.offsetWidth-5); // Yes, set offset to max
_originalOffset=(_filmWidth-_landingZone.offsetWidth-5);// and the original
_dragXoffset=e.clientX; // reset the mouse
}
_totalChange=(_dragXoffset-e.clientX); // Calculate total movement
// Set the visible clip here.
_filmstrip.style.clip='rect(0px,'+(_landingZone.offsetWidth+_totalOffset)+'px,80px,'+_totalOffset+'px)';
// And set the left offset
_filmstrip.style.left=(_leftOffset-_totalOffset)+'px';
// return false so the browser won't try to do it's events!
return false;
}
}
function cleanup(e) {
// called when user releases a mouse button after a drag event
_scrollOK = false; // Setting this to false disables scrollHandler
_savedTarget.style.cursor=_orgCursor; // Change back to the original cursor shape
document.onmousemove=null; // Disable the mousemove handler
document.onmouseup=null; // Disable the mouseup handler
}
function dragHandler(e) {
_totalChange=0; // Total pixels moved
var cursorType='-moz-grabbing'; // Set hand to "grab"
if (e == null) { e = window.event; cursorType='w-resize';} // Package event for IE
var target = e.target != null ? e.target : e.srcElement; // Get the target object
//Handle filmstrip
if (target.className=="filmstrip"||target.className=="thumbnail") { // Check if event over filmstrip
_savedTarget=target; // This is our target object
_orgCursor=target.style.cursor; // This was our orginal cursor
_originalOffset=_totalOffset; // Mark the current offset
target.style.cursor=cursorType; // Set mouse to grab if possible
_scrollOK=true; // flag filmstrip as scrollable
_dragXoffset=e.clientX; // remember original X position
document.onmousemove=scrollHandler; // set up a mouse-move handler
document.onmouseup=cleanup; // set up a button-up handler
return false; // return FALSE -- IMPORTANT!!!!
}
}
// End drag/scroll Handlers
// These functions handle the detail window actions
function showPic(idx) {
if ((_totalChange<-5)||(_totalChange>5)) { return false } // User scrolled, not a click event so return.
detail=document.getElementById('detailFrame'); // get the detail window
detailComments=document.getElementById('comments'); // get the comments window
detailImg=document.getElementById('detailPic'); // get the picture window
if (idx==null) {idx=_currentPic} // set idx if nothing was passed.
if ((detail.style.display=='block')&&(idx==_currentPic)) { // If the detail window is visible
detail.style.display='none'; // Make it invisible
detailImg.innerHTML=''; // Clear out last picture
detailComments.innerHTML=''; // Clear out last comments
} else { // Detail Window is not visible
var record = allImages[idx].split('~|~'); // Get the image record
detailImg.innerHTML='<img src="'+record[1]+'.jpg" class="detailImg">'; // Insert the pic
detailComments.innerHTML=record[3]; // Insert the comments
detail.style.display='block'; // Make the detail window visible
_currentPic=idx; // Remember the current picture.
}
}
function flickrGo() {
var record = allImages[_currentPic].split('~|~'); // Get the image record
document.location.href=record[2]; // Navigate to the photo's web page on flickr.
}
function flickrZoom() {
var record = allImages[_currentPic].split('~|~'); // Get the image record
document.location.href=record[1]+'_o.jpg'; // Navigate to the original resolution picture on flickr
}
// End detail window functions
// This section is run as the web page loads.
importData("filmstrip.txt");
bindStrip();
document.onmousedown = dragHandler; // Call dragHandler on mouse down
</script>
</body>
</HTML>