Javascript  |  267行  |  8.59 KB


/* API LEVEL TOGGLE */
addLoadEvent(changeApiLevel);
var API_LEVEL_COOKIE = "api_level";
var minLevel = 1;

function buildApiLevelToggle() {
	var maxLevel = SINCE_DATA.length;
	var userApiLevel = readCookie(API_LEVEL_COOKIE);
	
	if (userApiLevel != 0) {
		selectedLevel = userApiLevel;
	} else {
	  selectedLevel = maxLevel;
	}
	
  minLevel = $("body").attr("class");
	var select = $("#apiLevelControl").html("").change(changeApiLevel);
	for (var i = maxLevel-1; i >= 0; i--) {
		var option = $("<option />").attr("value",""+SINCE_DATA[i]).append(""+SINCE_DATA[i]);
//		if (SINCE_DATA[i] < minLevel) option.addClass("absent"); // always false for strings (codenames)
		select.append(option);
	}
	
  // get the DOM element and use setAttribute cuz IE6 fails when using jquery .attr('selected',true)
	var selectedLevelItem = $("#apiLevelControl option[value='"+selectedLevel+"']").get(0); 
  selectedLevelItem.setAttribute('selected',true); 
}

function changeApiLevel() {
	var selectedLevel = $("#apiLevelControl option:selected").val();
  toggleVisisbleApis(selectedLevel, "body");
  
  var date = new Date();
  date.setTime(date.getTime()+(50*365*24*60*60*1000)); // keep this for 50 years
  writeCookie(API_LEVEL_COOKIE, selectedLevel, null, date);
  
	if (selectedLevel < minLevel) {
	  var thing = ($("#jd-header").html().indexOf("package") != -1) ? "package" : "class";
	  $("#naMessage").show().html("<div><p><strong>This " + thing + " is not available with API Level " + selectedLevel + ".</strong></p>"
                              + "<p>To use this " + thing + ", your application must specify API Level " + minLevel + " or higher in its manifest "
                              + "and be compiled against a version of the Android library that supports an equal or higher API Level. To reveal this "
                              + "document, change the value of the API Level filter above.</p>"
                              + "<p><a href='" +toRoot+ "guide/appendix/api-levels.html'>What is the API Level?</a></p></div>");
	} else {
    $("#naMessage").hide();
  }
}

function toggleVisisbleApis(selectedLevel, context) {
	var apis = $(".api",context);
	apis.each(function(i) {
		var obj = $(this);
		var className = obj.attr("class");
		var apiLevelIndex = className.lastIndexOf("-")+1;
		var apiLevelEndIndex = className.indexOf(" ", apiLevelIndex);
		apiLevelEndIndex = apiLevelEndIndex != -1 ? apiLevelEndIndex : className.length;
		var apiLevel = className.substring(apiLevelIndex, apiLevelEndIndex);
		if (apiLevel > selectedLevel) obj.addClass("absent").attr("title","Requires API Level "+apiLevel+" or higher");
		else obj.removeClass("absent").removeAttr("title");
	});
}

/* NAVTREE */

function new_node(me, mom, text, link, children_data, api_level)
{
  var node = new Object();
  node.children = Array();
  node.children_data = children_data;
  node.depth = mom.depth + 1;

  node.li = document.createElement("li");
  mom.get_children_ul().appendChild(node.li);

  node.label_div = document.createElement("div");
  node.label_div.className = "label";
  if (api_level != null) {
    $(node.label_div).addClass("api");
    $(node.label_div).addClass("api-level-"+api_level);
  }
  node.li.appendChild(node.label_div);
  node.label_div.style.paddingLeft = 10*node.depth + "px";

  if (children_data == null) {
    // 12 is the width of the triangle and padding extra space
    node.label_div.style.paddingLeft = ((10*node.depth)+12) + "px";
  } else {
    node.label_div.style.paddingLeft = 10*node.depth + "px";
    node.expand_toggle = document.createElement("a");
    node.expand_toggle.href = "javascript:void(0)";
    node.expand_toggle.onclick = function() {
          if (node.expanded) {
            $(node.get_children_ul()).slideUp("fast");
            node.plus_img.src = me.toroot + "assets/images/triangle-closed-small.png";
            node.expanded = false;
          } else {
            expand_node(me, node);
          }
       };
    node.label_div.appendChild(node.expand_toggle);

    node.plus_img = document.createElement("img");
    node.plus_img.src = me.toroot + "assets/images/triangle-closed-small.png";
    node.plus_img.className = "plus";
    node.plus_img.border = "0";
    node.expand_toggle.appendChild(node.plus_img);

    node.expanded = false;
  }

  var a = document.createElement("a");
  node.label_div.appendChild(a);
  node.label = document.createTextNode(text);
  a.appendChild(node.label);
  if (link) {
    a.href = me.toroot + link;
  } else {
    if (children_data != null) {
      a.className = "nolink";
      a.href = "javascript:void(0)";
      a.onclick = node.expand_toggle.onclick;
      // This next line shouldn't be necessary.  I'll buy a beer for the first
      // person who figures out how to remove this line and have the link
      // toggle shut on the first try. --joeo@android.com
      node.expanded = false;
    }
  }
  

  node.children_ul = null;
  node.get_children_ul = function() {
      if (!node.children_ul) {
        node.children_ul = document.createElement("ul");
        node.children_ul.className = "children_ul";
        node.children_ul.style.display = "none";
        node.li.appendChild(node.children_ul);
      }
      return node.children_ul;
    };

  return node;
}

function expand_node(me, node)
{
  if (node.children_data && !node.expanded) {
    if (node.children_visited) {
      $(node.get_children_ul()).slideDown("fast");
    } else {
      get_node(me, node);
      if ($(node.label_div).hasClass("absent")) $(node.get_children_ul()).addClass("absent");
      $(node.get_children_ul()).slideDown("fast");
    }
    node.plus_img.src = me.toroot + "assets/images/triangle-opened-small.png";
    node.expanded = true;
    
    // perform api level toggling because new nodes are new to the DOM 
	  var selectedLevel = $("#apiLevelControl option:selected").val();
    toggleVisisbleApis(selectedLevel, "#side-nav");
  }
}

function get_node(me, mom)
{
  mom.children_visited = true;
  for (var i in mom.children_data) {
    var node_data = mom.children_data[i];
    mom.children[i] = new_node(me, mom, node_data[0], node_data[1],
        node_data[2], node_data[3]);
  }
}

function this_page_relative(toroot)
{
  var full = document.location.pathname;
  var file = "";
  if (toroot.substr(0, 1) == "/") {
    if (full.substr(0, toroot.length) == toroot) {
      return full.substr(toroot.length);
    } else {
      // the file isn't under toroot.  Fail.
      return null;
    }
  } else {
    if (toroot != "./") {
      toroot = "./" + toroot;
    }
    do {
      if (toroot.substr(toroot.length-3, 3) == "../" || toroot == "./") {
        var pos = full.lastIndexOf("/");
        file = full.substr(pos) + file;
        full = full.substr(0, pos);
        toroot = toroot.substr(0, toroot.length-3);
      }
    } while (toroot != "" && toroot != "/");
    return file.substr(1);
  }
}

function find_page(url, data)
{
  var nodes = data;
  var result = null;
  for (var i in nodes) {
    var d = nodes[i];
    if (d[1] == url) {
      return new Array(i);
    }
    else if (d[2] != null) {
      result = find_page(url, d[2]);
      if (result != null) {
        return (new Array(i).concat(result));
      }
    }
  }
  return null;
}

function load_navtree_data(toroot) {
  var navtreeData = document.createElement("script");
  navtreeData.setAttribute("type","text/javascript");
  navtreeData.setAttribute("src", toroot+"navtree_data.js");
  $("head").append($(navtreeData));
}

function init_default_navtree(toroot) {
  init_navtree("nav-tree", toroot, NAVTREE_DATA);
  
  // perform api level toggling because because the whole tree is new to the DOM 
	var selectedLevel = $("#apiLevelControl option:selected").val();
  toggleVisisbleApis(selectedLevel, "#side-nav");
}

function init_navtree(navtree_id, toroot, root_nodes)
{
  var me = new Object();
  me.toroot = toroot;
  me.node = new Object();

  me.node.li = document.getElementById(navtree_id);
  me.node.children_data = root_nodes;
  me.node.children = new Array();
  me.node.children_ul = document.createElement("ul");
  me.node.get_children_ul = function() { return me.node.children_ul; };
  //me.node.children_ul.className = "children_ul";
  me.node.li.appendChild(me.node.children_ul);
  me.node.depth = 0;

  get_node(me, me.node);

  me.this_page = this_page_relative(toroot);
  me.breadcrumbs = find_page(me.this_page, root_nodes);
  if (me.breadcrumbs != null && me.breadcrumbs.length != 0) {
    var mom = me.node;
    for (var i in me.breadcrumbs) {
      var j = me.breadcrumbs[i];
      mom = mom.children[j];
      expand_node(me, mom);
    }
    mom.label_div.className = mom.label_div.className + " selected";
    addLoadEvent(function() {
      scrollIntoView("nav-tree");
      });
  }
}