| /* file: carousel.js |
| date: oct 2008 |
| author: jeremydw,smain |
| info: operates the carousel widget for announcements on |
| the android developers home page. modified from the |
| original market.js from jeremydw. */ |
| |
| /* -- video switcher -- */ |
| |
| var oldVid = "multi"; // set the default video |
| var nowPlayingString = "Now playing:"; |
| var assetsRoot = "assets/"; |
| |
| |
| /* -- app thumbnail switcher -- */ |
| |
| var currentDroid; |
| var oldDroid; |
| |
| // shows a random application |
| function randomDroid(){ |
| |
| // count the total number of apps |
| var droidListLength = 0; |
| for (var k in droidList) |
| droidListLength++; |
| |
| // pick a random app and show it |
| var j = 0; |
| var i = Math.floor(droidListLength*Math.random()); |
| for (var x in droidList) { |
| if(j++ == i){ |
| currentDroid = x; |
| showPreview(x); |
| centerSlide(x); |
| } |
| } |
| |
| } |
| |
| // shows a bulletin, swaps the carousel highlighting |
| function droid(appName){ |
| |
| oldDroid = $("#droidlink-"+currentDroid); |
| currentDroid = appName; |
| |
| var droid = droidList[appName]; |
| |
| $("#"+appName).show().siblings().hide(); |
| |
| if(oldDroid) |
| oldDroid.removeClass("selected"); |
| |
| $("#droidlink-"+appName).addClass("selected"); |
| } |
| |
| |
| // -- * build the carousel based on the droidList * -- // |
| function buildCarousel() { |
| var appList = document.getElementById("app-list"); |
| for (var x in droidList) { |
| var droid = droidList[x]; |
| var icon = droid.icon; |
| var name = droid.name; |
| var a = document.createElement("a"); |
| var img = document.createElement("img"); |
| var br = document.createElement("br"); |
| var span = document.createElement("span"); |
| var text = document.createTextNode(droid.name); |
| |
| a.setAttribute("id", "droidlink-" + x); |
| a.className = x; |
| a.setAttribute("href", "#"); |
| a.onclick = function() { showPreview(this.className); return false; } |
| img.setAttribute("src", toRoot + assetsRoot + "images/home/" + droid.icon); |
| img.setAttribute("alt", ""); |
| |
| span.appendChild(text); |
| a.appendChild(img); |
| a.appendChild(br); |
| a.appendChild(span); |
| appList.appendChild(a); |
| |
| |
| /* add the bulletins */ |
| var layout = droid.layout; |
| var div = document.createElement("div"); |
| var imgDiv = document.createElement("div"); |
| var descDiv = document.createElement("div"); |
| |
| div.setAttribute("id", x); |
| div.setAttribute("style", "display:none"); |
| imgDiv.setAttribute("class", "bulletinImg"); |
| descDiv.setAttribute("class", "bulletinDesc"); |
| |
| if (layout == "imgLeft") { |
| $(imgDiv).addClass("img-left"); |
| $(descDiv).addClass("desc-right"); |
| } else if (layout == "imgTop") { |
| $(imgDiv).addClass("img-top"); |
| $(descDiv).addClass("desc-bottom"); |
| } else if (layout == "imgRight") { |
| $(imgDiv).addClass("img-right"); |
| $(descDiv).addClass("desc-left"); |
| } |
| |
| imgDiv.innerHTML = "<img src='" + toRoot + assetsRoot + "images/home/" + droid.img + "'>"; |
| descDiv.innerHTML = (droid.title != "") ? "<h3>" + droid.title + "</h3>" + droid.desc : droid.desc; |
| $(div).append(imgDiv); |
| $(div).append(descDiv); |
| |
| $("#carouselMain").append(div); |
| |
| } |
| } |
| |
| // -- * slider * -- // |
| |
| // -- dependencies: |
| // (1) div containing slides, (2) a "clip" div to hide the scroller |
| // (3) control arrows |
| |
| // -- * config below * -- // |
| |
| var slideCode = droidList; // the dictionary of slides |
| var slideList = 'app-list'; // the div containing the slides |
| var arrowRight = 'arrow-right'; // the right control arrow |
| var arrowLeft = 'arrow-left'; // the left control arrow |
| |
| |
| function showPreview(slideName) { |
| centerSlide(slideName); |
| if (slideName.indexOf('selected') != -1) { |
| return false; |
| } |
| droid(slideName); // do this function when slide is clicked |
| } |
| |
| var thumblist = document.getElementById(slideList);// the div containing the slides |
| |
| var slideWidth = 144; // width of a slide including all margins, etc. |
| var slidesAtOnce = 3; // no. of slides to appear at once (requires odd number to have a centered slide) |
| |
| // -- * no editing should be needed below * -- // |
| |
| var originPosition = {}; |
| var is_animating = 0; |
| var currentStripPosition = 0; |
| var centeringPoint = 0; |
| var rightScrollLimit = 0; |
| |
| // makeSlideStrip() |
| // - figures out how many slides there are |
| // - determines the centering point of the slide strip |
| function makeSlideStrip() { |
| var slideTotal = 0; |
| centeringPoint = Math.ceil(slidesAtOnce/2); |
| for (var x in slideCode) { |
| slideTotal++; |
| } |
| var i = 0; |
| for (var code in slideCode) { |
| if (i <= centeringPoint-1) { |
| originPosition[code] = 0; |
| } else { |
| if (i >= slideTotal-centeringPoint+1) { |
| originPosition[code] = (slideTotal-slidesAtOnce)*slideWidth; |
| } else { |
| originPosition[code] = (i-centeringPoint+1)*slideWidth; |
| } |
| } |
| i++; |
| } |
| rightScrollLimit = -1*(slideTotal-slidesAtOnce)*slideWidth; |
| } |
| |
| // slides with acceleration |
| function slide(goal, id, go_left, cp) { |
| var div = document.getElementById(id); |
| var animation = {}; |
| animation.time = 0.5; // in seconds |
| animation.fps = 60; |
| animation.goal = goal; |
| origin = 0.0; |
| animation.origin = Math.abs(origin); |
| animation.frames = (animation.time * animation.fps) - 1.0; |
| var current_frame = 0; |
| var motions = Math.abs(animation.goal - animation.origin); |
| function animate() { |
| var ease_right = function (t) { return (1 - Math.cos(t * Math.PI))/2.0; }; |
| var ease = ease_right; |
| if (go_left == 1) { |
| ease = function(t) { return 1.0 - ease_right(t); }; |
| } |
| var left = (ease(current_frame/animation.frames) * Math.abs(animation.goal - animation.origin)) - cp; |
| if(left < 0) { |
| left = 0; |
| } |
| if(!isNaN(left)) { |
| div.style.left = '-' + Math.round(left) + 'px'; |
| } |
| current_frame += 1; |
| if (current_frame == animation.frames) { |
| is_animating = 0; |
| window.clearInterval(timeoutId) |
| } |
| } |
| var timeoutId = window.setInterval(animate, animation.time/animation.fps * 1000); |
| } |
| |
| //Get style property |
| function getStyle(element, cssProperty){ |
| var elem = document.getElementById(element); |
| if(elem.currentStyle){ |
| return elem.currentStyle[cssProperty]; //IE |
| } else{ |
| var style = document.defaultView.getComputedStyle(elem, null); //firefox, Opera |
| return style.getPropertyValue(cssProperty); |
| } |
| } |
| |
| // Left and right arrows |
| function page_left() { |
| var amount = slideWidth; |
| animateSlide(amount, 'left'); |
| } |
| |
| function page_right() { |
| var amount = slideWidth; |
| animateSlide(amount, 'right'); |
| } |
| |
| |
| // animates the strip |
| // - sets arrows to on or off |
| function animateSlide(amount,dir) { |
| var currentStripPosition = parseInt(getStyle(slideList,'left')); |
| var motionDistance; |
| if (amount == slideWidth ) { |
| motionDistance = slideWidth; |
| } else { |
| motionDistance = amount; |
| } |
| |
| var rightarrow = document.getElementById(arrowRight); |
| var leftarrow = document.getElementById(arrowLeft); |
| |
| function aToggle(state,aDir) { |
| if (state == 'on') { |
| if (aDir =='right') { |
| rightarrow.className = 'arrow-right-on'; |
| rightarrow.href = "javascript:page_right()"; |
| } else { |
| leftarrow.className = 'arrow-left-on'; |
| leftarrow.href = "javascript:page_left()"; |
| } |
| } else { |
| if (aDir =='right') { |
| rightarrow.href = "javascript:{}"; |
| rightarrow.className = 'arrow-right-off'; |
| } else { |
| leftarrow.href = "javascript:{}"; |
| leftarrow.className = 'arrow-left-off'; |
| } |
| } |
| } |
| |
| function arrowChange(rP) { |
| if (rP >= rightScrollLimit) { |
| aToggle('on','right'); |
| } |
| if (rP <= rightScrollLimit) { |
| aToggle('off','right'); |
| } |
| if (rP <= slideWidth) { |
| aToggle('on','left'); |
| } |
| if (rP >= 0) { |
| aToggle('off','left'); |
| } |
| } |
| |
| if (dir == 'right' && is_animating == 0) { |
| arrowChange(currentStripPosition-motionDistance); |
| is_animating = 1; |
| slide(motionDistance, slideList, 0, currentStripPosition); |
| } else if (dir == 'left' && is_animating == 0) { |
| arrowChange(currentStripPosition+motionDistance); |
| is_animating = 1; |
| rightStripPosition = currentStripPosition + motionDistance; |
| slide(motionDistance, slideList, 1, rightStripPosition); |
| } |
| } |
| |
| function centerSlide(slideName) { |
| var currentStripPosition = parseInt(getStyle(slideList,'left')); |
| var dir = 'left'; |
| var originpoint = Math.abs(currentStripPosition); |
| if (originpoint <= originPosition[slideName]) { |
| dir = 'right'; |
| } |
| var motionValue = Math.abs(originPosition[slideName]-originpoint); |
| animateSlide(motionValue,dir); |
| } |
| |
| |
| function initCarousel(def) { |
| buildCarousel(); |
| showPreview(def); |
| makeSlideStrip(); |
| } |