/* 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(); }