// the image path to use, with an {ITEMID} placeholder embedded in it
var WOWstrCoverPath = "http://www.syndetics.com/hw7.pl?isbn={ITEMID}/mc.gif&client=randp&type=hw7";
// the widget's width (in pixels)
var WOWiWidgetWidth=300;
// the widget's height
var WOWiWidgetHeight=210;
// the slide speed (larger is faster 1-10)
var WOWslidespeed=2;
// cycles to pause per title
var WOWiPause=100;
// max width of visible titles in characters - however, a more precise method is used to ensure title fits onscreen
var WOWiTitleMaxShowingLength = 70;
// configure S curve - this is really percentages
var WOWarraySpeedRamp = new Array(-0.50,-0.37,-0.26,-0.17,-0.10,-0.05,-0.02,-0.01,0,0.01,0.02,0.05,0.10,0.17,0.26,0.37);
// bar-separated list of ASIN-or-ISBN/WowbraryURL/Title (no final bar)
var WOWstrRawData = "9781439197516|http://www.wowbrary.org/l.aspx?l=1348&c=273632&i=9781439197516&t=The+Obama+Diaries&widget|The Obama Diaries|9780307272584|http://www.wowbrary.org/l.aspx?l=1348&c=273764&i=9780307272584&t=Star+Island&widget|Star Island|9780670021871|http://www.wowbrary.org/l.aspx?l=1348&c=273619&i=9780670021871&t=Faithful+Place%3a+A+Novel&widget|Faithful Place: A Novel|9780385340854|http://www.wowbrary.org/l.aspx?l=1348&c=273804&i=9780385340854&t=The+Cookbook+Collector%3a+A+Novel&widget|The Cookbook Collector: A Novel|9781414339436|http://www.wowbrary.org/l.aspx?l=1348&c=273751&i=9781414339436&t=Coming+Back+Stronger%3a+Unleashing+the+Hidden+Power+of+Adversity&widget|Coming Back Stronger: Unleashing the Hidden Power of Adversity|9780345511324|http://www.wowbrary.org/l.aspx?l=1348&c=273662&i=9780345511324&t=Star+Wars%3a+The+Old+Republic%3a+Fatal+Alliance&widget|Star Wars: The Old Republic: Fatal Alliance|9780061774157|http://www.wowbrary.org/l.aspx?l=1348&c=273788&i=9780061774157&t=Fifth+Avenue%2c+5+A.M.%3a+Audrey+Hepburn%2c+Breakfast+at+Tiffany%27s%2c+and+the+Dawn+of+the+Modern+Woman&widget|Fifth Avenue, 5 A.M.: Audrey Hepburn, Breakfast at Tiffany\'s, and the Dawn of the Modern Woman|9780061566172|http://www.wowbrary.org/l.aspx?l=1348&c=273784&i=9780061566172&t=Pretty+Little+Liars+%238%3a+Wanted&widget|Pretty Little Liars #8: Wanted|9780061566103|http://www.wowbrary.org/l.aspx?l=1348&c=273785&i=9780061566103&t=Pretty+Little+Liars+%235%3a+Wicked&widget|Pretty Little Liars #5: Wicked|9780679643579|http://www.wowbrary.org/l.aspx?l=1348&c=273612&i=9780679643579&t=The+Korean+War%3a+A+History+(Modern+Library+Chronicles)&widget|The Korean War: A History (Modern Library Chronicles)|9780525951568|http://www.wowbrary.org/l.aspx?l=1348&c=273653&i=9780525951568&t=Talking+to+Girls+About+Duran+Duran%3a+One+Young+Man%27s+Quest+for+True+Love+and+a+Cooler+Haircut&widget|Talking to Girls About Duran Duran: One Young Man\'s Quest for True Love and a Cooler Haircut|9780451232618|http://www.wowbrary.org/l.aspx?l=1348&c=273777&i=9780451232618&t=Home+Team%3a+Coaching+the+Saints+and+New+Orleans+Back+to+Life&widget|Home Team: Coaching the Saints and New Orleans Back to Life|9781594202568|http://www.wowbrary.org/l.aspx?l=1348&c=273510&i=9781594202568&t=Four+Fish%3a+The+Future+of+the+Last+Wild+Food&widget|Four Fish: The Future of the Last Wild Food|9780805093384|http://www.wowbrary.org/l.aspx?l=1348&c=273511&i=9780805093384&t=In+a+Heartbeat%3a+Sharing+the+Power+of+Cheerful+Giving&widget|In a Heartbeat: Sharing the Power of Cheerful Giving|9786312755067|http://www.wowbrary.org/l.aspx?l=1348&c=273508&i=9786312755067&t=Lost+in+Austen&widget|Lost in Austen|9780780660892|http://www.wowbrary.org/l.aspx?l=1348&c=273501&i=9780780660892&t=Hamlet+(2009)&widget|Hamlet (2009)|9780345511874|http://www.wowbrary.org/l.aspx?l=1348&c=273512&i=9780345511874&t=Captive+Queen%3a+A+Novel+of+Eleanor+of+Aquitaine&widget|Captive Queen: A Novel of Eleanor of Aquitaine|9780307452016|http://www.wowbrary.org/l.aspx?l=1348&c=273787&i=9780307452016&t=Grow+Great+Grub%3a+Organic+Food+from+Small+Spaces&widget|Grow Great Grub: Organic Food from Small Spaces|9781423128991|http://www.wowbrary.org/l.aspx?l=1348&c=273487&i=9781423128991&t=Kingdom+Keepers+III%3a+Disney+in+Shadow&widget|Kingdom Keepers III: Disney in Shadow|9780375801389|http://www.wowbrary.org/l.aspx?l=1348&c=272737&i=9780375801389&t=Where+is+Elmo%27s+Blanket%3f+(Nifty+Lift-and-Look)&widget|Where is Elmo\'s Blanket? (Nifty Lift-and-Look)";
// gap between each image (use HTML):
var WOWimagegap=" "
var WOWslidebgcolor="white";
var WOWiMoveDirection = 1; // -1, 0, 1
var WOWarraySlideWidths = new Array();
var WOWstrSlideContents = "";
var WOWarrayRawData = WOWstrRawData.split("|");
for (WOWi = 0; WOWi < WOWarrayRawData.length; WOWi += 3)
WOWstrSlideContents += "
";
WOWstrSlideContents += '';
var WOWiedom=document.all||document.getElementById;
if (WOWiedom) document.write(''+WOWstrSlideContents+'')
var WOWiSlides = 0;
var WOWarraySlideCenters = new Array();
var WOWarraySlideTitles = new Array();
var WOWactualwidth;
var WOWcross_slide, WOWcross_slide2, WOWns_slide, WOWns_slide2;
// this isn't called until all images have loaded
function WOWfillup(){
// figure out which images loaded and use just those to create the title array, eliminate gaps in the width array,
// recreate WOWstrSlideContents for display, sum the image widths, and count valid slides
var iTotalWidths = 0;
WOWstrSlideContents = "";
WOWiSlides = 0;
var i;
for (i = 0; i < WOWarrayRawData.length; i += 3)
if (document.getElementById("WOWimage" + i).width > 1) {
WOWarraySlideTitles[WOWiSlides] = WOWarrayRawData[i+2],
WOWarraySlideWidths[WOWiSlides] = document.getElementById("WOWimage" + i).width;
iTotalWidths += WOWarraySlideWidths[WOWiSlides];
WOWstrSlideContents += "![Click to see more about " + WOWarrayRawData[i+2] + "](" +
WOWstrCoverPath.replace("{ITEMID}", WOWarrayRawData[i]) +
")
"; // +WOWimagegap;
WOWiSlides++;
}
WOWstrSlideContents += '';
// for unclear reasons, sometimes the slides haven't really loaded in yet, so if none have arrived, exit and try again later
if (WOWiSlides == 0) {
setTimeout("WOWfillup()",100);
return;
}
if (WOWiedom){
WOWcross_slide = document.getElementById? document.getElementById("WOWtest2") : document.all.WOWtest2;
WOWcross_slide2 = document.getElementById? document.getElementById("WOWtest3") : document.all.WOWtest3;
WOWcross_slide.innerHTML = WOWcross_slide2.innerHTML = WOWstrSlideContents;
// bug: Firefox reports wrong .offsetWidth initially (it takes it a bit to calculate it) - so we use a different method
// WOWactualwidth = document.all ? WOWcross_slide.offsetWidth : document.getElementById("WOWtest2").offsetWidth;
WOWactualwidth = iTotalWidths + 10*WOWiSlides;
WOWcross_slide2.style.left = WOWactualwidth + "px";
}
else if (document.layers){
WOWns_slide=document.ns_slidemenu.document.ns_slidemenu2;
WOWns_slide2=document.ns_slidemenu.document.ns_slidemenu3;
WOWns_slide.document.write(WOWstrSlideContents);
WOWns_slide.document.close();
WOWactualwidth=WOWns_slide.document.width;
WOWns_slide2.left=WOWactualwidth;
WOWns_slide2.document.write(WOWstrSlideContents);
WOWns_slide2.document.close();
}
// alert("WOWactualwidth: " + WOWactualwidth + "; slides: " + WOWiSlides + "; sum of widths: " + iTotalWidths + "; widths: " + strWidths);
// alert("try2: WOWactualwidth: " + WOWcross_slide.offsetWidth);
// compute the distance between each image (this is slightly off)
// var fDistanceBetweenImages = (WOWactualwidth - iTotalWidths)/WOWiSlides;
// compute the mid position of each slide
var fSpot = 0;
var strWidths = "";
var i;
for (i = 0; i < WOWiSlides; i++) {
WOWarraySlideCenters[i] = Math.round(fSpot + WOWarraySlideWidths[i]/2);
fSpot += WOWarraySlideWidths[i] + 10;
strWidths += WOWarraySlideWidths[i] + ":" + WOWarraySlideCenters[i] + " ";
}
// alert(strWidths + ' | ' + WOWiSlides + ' ' + iTotalWidths + ' | ' + WOWarrayRawData.length + ' ' + WOWstrSlideContents);
// use timer to start slides moving
lefttime=setInterval("WOWmoveSlides()",30);
}
function WOWAddOnload()
{
if(window.addEventListener) window.addEventListener('load', WOWfillup, false);
else if(window.attachEvent) window.attachEvent('onload', WOWfillup);
else window.onload = WOWfillup;
}
// put self into calling chain
WOWAddOnload()
// converts a number up to 255 to a two-digit hex representation
function WOWtoHex(iValue) {
var strHex = "0123456789ABCDEF";
return String(strHex.charAt(Math.floor(iValue / 16))) + String(strHex.charAt(iValue % 16));
}
// low level: simply sets slide 1 or 2 so that its iPosition'th part is at the left of the slider area
function WOWsetSlide(iSlide, iPosition) {
// determine the slide
var slide = WOWiedom ? (iSlide == 1 ? WOWcross_slide : WOWcross_slide2) : (iSlide == 1 ? WOWns_slide : WOWns_slide2);
// put the new position in
if (WOWiedom) slide.style.left = -iPosition + "px"; else slide.left = -iPosition;
}
// sets the two slides to the indicated position
function WOWsetPosition(iPosition) {
// the first slide goes at the position
WOWsetSlide(1, iPosition);
// the second slide goes after it if necessary, or else before
WOWsetSlide(2, iPosition + (WOWactualwidth - iPosition >= WOWiWidgetWidth ? WOWactualwidth : -WOWactualwidth));
}
// returns the x position associated with the given step, using ramping
function WOWStepToX(WOWiStep)
{
// determine which slides we are between
var bBeforeSlide = (WOWiStep % WOWarraySpeedRamp.length) < (WOWarraySpeedRamp.length / 2);
var iSlide1 = Math.floor(WOWiStep / WOWarraySpeedRamp.length);
var iSlide2 = (bBeforeSlide ? iSlide1 - 1 + WOWiSlides : iSlide1 + 1) % WOWiSlides;
// compute the distance between the slides, taking into account that iSlide1 may be before or after iSlide2 AND they may be on opposing ends of the slider
var iDistance = Math.min(Math.abs(WOWarraySlideCenters[iSlide1] - WOWarraySlideCenters[iSlide2]),
Math.min((WOWarraySlideCenters[iSlide1] - WOWarraySlideCenters[iSlide2] + WOWactualwidth) % WOWactualwidth,
(WOWarraySlideCenters[iSlide2] - WOWarraySlideCenters[iSlide1] + WOWactualwidth) % WOWactualwidth));
// return the x position
return Math.round(WOWarraySlideCenters[iSlide1] + iDistance*WOWarraySpeedRamp[WOWiStep % WOWarraySpeedRamp.length]);
}
// returns the slide nearest to the given step - this can be off if a wide slide is near a thin one
function WOWStepToSlide(WOWiStep)
{
// step 0 .. WOWarraySpeedRamp.length - 1 is slide 0, etc.
return Math.floor(WOWiStep / WOWarraySpeedRamp.length);
}
// returns the distance as a percentage to the nearest slide (0 means on top of it and 1 means between slides) - this can be off if a wide slide is near a thin one
function WOWDistanceToSlide(WOWiStep)
{
return Math.abs(WOWarraySpeedRamp[WOWiStep % WOWarraySpeedRamp.length]*2.0);
}
var WOWiSlideShowing = -1; // this causes the first slide to roll in immediately
var WOWbSuspended = false;
var WOWiPausing = 0;
var WOWiPauseSuppression = 0; // number of next steps to not pause during
var WOWiStep = 0;
function WOWmoveSlides() {
// do nothing if suspended
if (WOWbSuspended) return;
// reduce pause suppression if it's on
if (WOWiPauseSuppression > 0) WOWiPauseSuppression--;
// countdown timer for when paused on an image
if (WOWiPausing > 0) {
WOWiPausing--;
return;
}
// do nothing if not supposed to move
if (!WOWiMoveDirection) return;
// advance the step
var iTotalSteps = WOWiSlides*WOWarraySpeedRamp.length;
WOWiStep = (WOWiStep + WOWiMoveDirection + iTotalSteps) % iTotalSteps;
// if this puts us at a slide, pause unless pause suppression is in place
if (WOWDistanceToSlide(WOWiStep) == 0 && WOWiPauseSuppression == 0) WOWiPausing = WOWiPause;
// set the new position
WOWsetPosition((WOWStepToX(WOWiStep) - WOWiWidgetWidth/2) % WOWactualwidth);
// see if the slide has changed
if (WOWStepToSlide(WOWiStep) != WOWiSlideShowing) {
// set the new slide
WOWiSlideShowing = WOWStepToSlide(WOWiStep);
// shorten titles initially
var strTitle = WOWarraySlideTitles[WOWiSlideShowing];
while (strTitle.length > WOWiTitleMaxShowingLength) strTitle = strTitle.replace(/ [^ ]*( ...)?$/," ...");
// put the possibly shortened title in place
document.getElementById("WOWTitle").innerHTML = strTitle;
// if the title is too long, truncate it (20 is used for the height because the type is set at 16 pt below
while (document.getElementById("WOWTitle").offsetWidth > WOWiWidgetWidth || document.getElementById("WOWTitle").offsetHeight > 20)
document.getElementById("WOWTitle").innerHTML = document.getElementById("WOWTitle").innerHTML.replace(/ [^ ]*( ...)?$/," ...");
}
// adjust the title color
var iIntensity = Math.round(WOWDistanceToSlide(WOWiStep)*255);
document.getElementById("WOWTitle").style.color = "#" + WOWtoHex(iIntensity) + WOWtoHex(iIntensity)+ WOWtoHex(iIntensity);
}
function WOWsetSpeed(iSpeedNew)
{
WOWiMoveDirection = iSpeedNew;
WOWiPausing = 0;
if (iSpeedNew) WOWiPauseSuppression = Math.round(WOWarraySpeedRamp.length/3);
}
// write out material for the area
if (WOWiedom||document.layers){
with (document){
write('
| Newest Arrivals |
| |
')
if (WOWiedom){
write('')
write(' '); //
write(' ')
write(' ')
write(' ')
}
else if (document.layers){
write('')
write(''); // onMouseover="copyspeed=0" onMouseout="copyspeed=WOWslidespeed"
write(''); // onMouseover="copyspeed=0" onMouseout="copyspeed=WOWslidespeed"
write('')
}
write(' |
| ');
write('    |
')
write('
')
}
}