312 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			312 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();
 | |
| }
 |