1 /* file: carousel.js 2 date: oct 2008 3 author: jeremydw,smain 4 info: operates the carousel widget for announcements on 5 the android developers home page. modified from the 6 original market.js from jeremydw. */ 7 8 /* -- video switcher -- */ 9 10 var oldVid = "multi"; // set the default video 11 var nowPlayingString = "Now playing:"; 12 var assetsRoot = "assets/"; 13 14 15 /* -- app thumbnail switcher -- */ 16 17 var currentDroid; 18 var oldDroid; 19 20 // shows a random application 21 function randomDroid(){ 22 23 // count the total number of apps 24 var droidListLength = 0; 25 for (var k in droidList) 26 droidListLength++; 27 28 // pick a random app and show it 29 var j = 0; 30 var i = Math.floor(droidListLength*Math.random()); 31 for (var x in droidList) { 32 if(j++ == i){ 33 currentDroid = x; 34 showPreview(x); 35 centerSlide(x); 36 } 37 } 38 39 } 40 41 // shows a bulletin, swaps the carousel highlighting 42 function droid(appName){ 43 44 oldDroid = $("#droidlink-"+currentDroid); 45 currentDroid = appName; 46 47 var droid = droidList[appName]; 48 49 $("#"+appName).show().siblings().hide(); 50 51 if(oldDroid) 52 oldDroid.removeClass("selected"); 53 54 $("#droidlink-"+appName).addClass("selected"); 55 } 56 57 58 // -- * build the carousel based on the droidList * -- // 59 function buildCarousel() { 60 var appList = document.getElementById("app-list"); 61 for (var x in droidList) { 62 var droid = droidList[x]; 63 var icon = droid.icon; 64 var name = droid.name; 65 var a = document.createElement("a"); 66 var img = document.createElement("img"); 67 var br = document.createElement("br"); 68 var span = document.createElement("span"); 69 var text = document.createTextNode(droid.name); 70 71 a.setAttribute("id", "droidlink-" + x); 72 a.className = x; 73 a.setAttribute("href", "#"); 74 a.onclick = function() { showPreview(this.className); return false; } 75 img.setAttribute("src", toRoot + assetsRoot + "images/home/" + droid.icon); 76 img.setAttribute("alt", ""); 77 78 span.appendChild(text); 79 a.appendChild(img); 80 a.appendChild(br); 81 a.appendChild(span); 82 appList.appendChild(a); 83 84 85 /* add the bulletins */ 86 var layout = droid.layout; 87 var div = document.createElement("div"); 88 var imgDiv = document.createElement("div"); 89 var descDiv = document.createElement("div"); 90 91 div.setAttribute("id", x); 92 div.setAttribute("style", "display:none"); 93 imgDiv.setAttribute("class", "bulletinImg"); 94 descDiv.setAttribute("class", "bulletinDesc"); 95 96 if (layout == "imgLeft") { 97 $(imgDiv).addClass("img-left"); 98 $(descDiv).addClass("desc-right"); 99 } else if (layout == "imgTop") { 100 $(imgDiv).addClass("img-top"); 101 $(descDiv).addClass("desc-bottom"); 102 } else if (layout == "imgRight") { 103 $(imgDiv).addClass("img-right"); 104 $(descDiv).addClass("desc-left"); 105 } 106 107 imgDiv.innerHTML = "<img src='" + toRoot + assetsRoot + "images/home/" + droid.img + "'>"; 108 descDiv.innerHTML = (droid.title != "") ? "<h3>" + droid.title + "</h3>" + droid.desc : droid.desc; 109 $(div).append(imgDiv); 110 $(div).append(descDiv); 111 112 $("#carouselMain").append(div); 113 114 } 115 } 116 117 // -- * slider * -- // 118 119 // -- dependencies: 120 // (1) div containing slides, (2) a "clip" div to hide the scroller 121 // (3) control arrows 122 123 // -- * config below * -- // 124 125 var slideCode = droidList; // the dictionary of slides 126 var slideList = 'app-list'; // the div containing the slides 127 var arrowRight = 'arrow-right'; // the right control arrow 128 var arrowLeft = 'arrow-left'; // the left control arrow 129 130 131 function showPreview(slideName) { 132 centerSlide(slideName); 133 if (slideName.indexOf('selected') != -1) { 134 return false; 135 } 136 droid(slideName); // do this function when slide is clicked 137 } 138 139 var thumblist = document.getElementById(slideList);// the div containing the slides 140 141 var slideWidth = 144; // width of a slide including all margins, etc. 142 var slidesAtOnce = 3; // no. of slides to appear at once (requires odd number to have a centered slide) 143 144 // -- * no editing should be needed below * -- // 145 146 var originPosition = {}; 147 var is_animating = 0; 148 var currentStripPosition = 0; 149 var centeringPoint = 0; 150 var rightScrollLimit = 0; 151 152 // makeSlideStrip() 153 // - figures out how many slides there are 154 // - determines the centering point of the slide strip 155 function makeSlideStrip() { 156 var slideTotal = 0; 157 centeringPoint = Math.ceil(slidesAtOnce/2); 158 for (var x in slideCode) { 159 slideTotal++; 160 } 161 var i = 0; 162 for (var code in slideCode) { 163 if (i <= centeringPoint-1) { 164 originPosition[code] = 0; 165 } else { 166 if (i >= slideTotal-centeringPoint+1) { 167 originPosition[code] = (slideTotal-slidesAtOnce)*slideWidth; 168 } else { 169 originPosition[code] = (i-centeringPoint+1)*slideWidth; 170 } 171 } 172 i++; 173 } 174 rightScrollLimit = -1*(slideTotal-slidesAtOnce)*slideWidth; 175 } 176 177 // slides with acceleration 178 function slide(goal, id, go_left, cp) { 179 var div = document.getElementById(id); 180 var animation = {}; 181 animation.time = 0.5; // in seconds 182 animation.fps = 60; 183 animation.goal = goal; 184 origin = 0.0; 185 animation.origin = Math.abs(origin); 186 animation.frames = (animation.time * animation.fps) - 1.0; 187 var current_frame = 0; 188 var motions = Math.abs(animation.goal - animation.origin); 189 function animate() { 190 var ease_right = function (t) { return (1 - Math.cos(t * Math.PI))/2.0; }; 191 var ease = ease_right; 192 if (go_left == 1) { 193 ease = function(t) { return 1.0 - ease_right(t); }; 194 } 195 var left = (ease(current_frame/animation.frames) * Math.abs(animation.goal - animation.origin)) - cp; 196 if(left < 0) { 197 left = 0; 198 } 199 if(!isNaN(left)) { 200 div.style.left = '-' + Math.round(left) + 'px'; 201 } 202 current_frame += 1; 203 if (current_frame == animation.frames) { 204 is_animating = 0; 205 window.clearInterval(timeoutId) 206 } 207 } 208 var timeoutId = window.setInterval(animate, animation.time/animation.fps * 1000); 209 } 210 211 //Get style property 212 function getStyle(element, cssProperty){ 213 var elem = document.getElementById(element); 214 if(elem.currentStyle){ 215 return elem.currentStyle[cssProperty]; //IE 216 } else{ 217 var style = document.defaultView.getComputedStyle(elem, null); //firefox, Opera 218 return style.getPropertyValue(cssProperty); 219 } 220 } 221 222 // Left and right arrows 223 function page_left() { 224 var amount = slideWidth; 225 animateSlide(amount, 'left'); 226 } 227 228 function page_right() { 229 var amount = slideWidth; 230 animateSlide(amount, 'right'); 231 } 232 233 234 // animates the strip 235 // - sets arrows to on or off 236 function animateSlide(amount,dir) { 237 var currentStripPosition = parseInt(getStyle(slideList,'left')); 238 var motionDistance; 239 if (amount == slideWidth ) { 240 motionDistance = slideWidth; 241 } else { 242 motionDistance = amount; 243 } 244 245 var rightarrow = document.getElementById(arrowRight); 246 var leftarrow = document.getElementById(arrowLeft); 247 248 function aToggle(state,aDir) { 249 if (state == 'on') { 250 if (aDir =='right') { 251 rightarrow.className = 'arrow-right-on'; 252 rightarrow.href = "javascript:page_right()"; 253 } else { 254 leftarrow.className = 'arrow-left-on'; 255 leftarrow.href = "javascript:page_left()"; 256 } 257 } else { 258 if (aDir =='right') { 259 rightarrow.href = "javascript:{}"; 260 rightarrow.className = 'arrow-right-off'; 261 } else { 262 leftarrow.href = "javascript:{}"; 263 leftarrow.className = 'arrow-left-off'; 264 } 265 } 266 } 267 268 function arrowChange(rP) { 269 if (rP >= rightScrollLimit) { 270 aToggle('on','right'); 271 } 272 if (rP <= rightScrollLimit) { 273 aToggle('off','right'); 274 } 275 if (rP <= slideWidth) { 276 aToggle('on','left'); 277 } 278 if (rP >= 0) { 279 aToggle('off','left'); 280 } 281 } 282 283 if (dir == 'right' && is_animating == 0) { 284 arrowChange(currentStripPosition-motionDistance); 285 is_animating = 1; 286 slide(motionDistance, slideList, 0, currentStripPosition); 287 } else if (dir == 'left' && is_animating == 0) { 288 arrowChange(currentStripPosition+motionDistance); 289 is_animating = 1; 290 rightStripPosition = currentStripPosition + motionDistance; 291 slide(motionDistance, slideList, 1, rightStripPosition); 292 } 293 } 294 295 function centerSlide(slideName) { 296 var currentStripPosition = parseInt(getStyle(slideList,'left')); 297 var dir = 'left'; 298 var originpoint = Math.abs(currentStripPosition); 299 if (originpoint <= originPosition[slideName]) { 300 dir = 'right'; 301 } 302 var motionValue = Math.abs(originPosition[slideName]-originpoint); 303 animateSlide(motionValue,dir); 304 } 305 306 307 function initCarousel(def) { 308 buildCarousel(); 309 showPreview(def); 310 makeSlideStrip(); 311 } 312