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