the carousel bulletin items also move the IO announcement into the carousel and add an ADC2 announcement ALSO change the carousel script to write all bulletins to the DOM right away and show/hide them, instead of reading from the JSON and writing to the DOM each time on the fly Automated import of CL 150594
315 lines
8.4 KiB
JavaScript
315 lines
8.4 KiB
JavaScript
/* 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();
|
|
}
|