/* 
 * SMSTAGING 9/18/2008: 
 * var i
 */

function $(el) {
	return document.getElementById(el);
}

/* older functions */

function sniffBrowsers() {
	ns4 = document.layers;
	op5 = (navigator.userAgent.indexOf("Opera 5")!=-1) ||(navigator.userAgent.indexOf("Opera/5")!=-1);
	op6 = (navigator.userAgent.indexOf("Opera 6")!=-1) ||(navigator.userAgent.indexOf("Opera/6")!=-1);
	opera = (navigator.userAgent.indexOf("Opera")!=-1);
	agt=navigator.userAgent.toLowerCase();
	mac = (agt.indexOf("mac")!=-1);
	ie = (agt.indexOf("msie") != -1); 
	ie6 = (navigator.appVersion.indexOf("MSIE 6.0") > -1);
	mac_ie = mac && ie;
	webkit = navigator.userAgent.toLowerCase().indexOf("webkit") > -1;
	iphone = navigator.userAgent.toLowerCase().indexOf("iphone") > -1;
}
sniffBrowsers();

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

function MM_jumpMenu(targ,selObj,restore){ //v3.0
  eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
  if (restore) selObj.selectedIndex=0;

}

function MM_jumpMenuGo(selName,targ,restore){ //v3.0
  var selObj = MM_findObj(selName); if (selObj) MM_jumpMenu(targ,selObj,restore);
}

function MM_showHideLayers() { //v6.0
  var i,p,v,obj,args=MM_showHideLayers.arguments;
  for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args[i]))!=null) { v=args[i+2];
    if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v=='hide')?'hidden':v; }
    obj.visibility=v; }
}

function write_e(usr,domain,name) {
	if (!domain) domain = "stanford.edu";
	var e = usr + "@" + domain;
	document.write('<a href="mailto:' + e + '">' + ((!name) ? e : name) + '</a>');	
}

/* New functions introduced since SM Web 1.0 */

SM = {}

SM.getValueFromClass = function (obj, attrib) {
	if (obj.className.indexOf(" "+attrib) != -1) {
		start = obj.className.indexOf(" "+attrib) + 1
		end = obj.className.indexOf(" ", start);
		end = (end == -1) ? obj.className.length - start : end - start;
		var aLength = attrib.length;
		return obj.className.substr(start+aLength, end-aLength);
	} else {
		return "";
	}
}

SM.dateUtils = {

	/*
		Collection of utilities any author can use to write the date, year, etc.
		Automatically corrects the year in the copyright footer if it's out of date.
	*/

	init: function() {
		var d = new Date();
		SM.theDay = d.getDay();
		SM.theMonth = d.getMonth();
		SM.theYear = d.getFullYear();
		SM.theDate = d.getDate();
		SM.theYear = d.getFullYear();
		SM.theHour = d.getHours();
		SM.theMin = d.getMinutes();
		SM.theSec = d.getSeconds();
	},
	
	writeDate: function() {
		if (!SM.theDay) SM.dateUtils.init();
		return SM.theDay;	
	},
	
	checkYear: function() {
		if (!SM.theYear) SM.dateUtils.init();
		var spans = document.getElementsByTagName("span");
		for (var i=0;i<spans.length;i++) {
			if (spans[i].className == "currentYear") {
				spans[i].innerHTML = SM.theYear;	
			}
		}
	},
	
	calculateTime: function() {
		var theTime = SM.theHour+":"+SM.theMin+":"+SM.theSec;
		return theTime;
	},
	
	timeAsString: function() {
		if (!SM.theMin) SM.dateUtils.init();
		if (SM.theMin < 10) SM.theMin = "0" + SM.theMin;
		var theTime = SM.theHour+":"+SM.theMin;
		return theTime;
	},

	writeYear: function() {
		if (!SM.theYear) SM.dateUtils.init();
		document.write(SM.theYear);
	},
	
	theDateAsString: function() {
		SM.dateUtils.init();
		if (SM.theDay == 0) SM.theDay = "Sunday, ";
		else if (SM.theDay == 1) SM.theDay = "Monday, ";
		else if (SM.theDay == 2) SM.theDay = "Tuesday, ";
		else if (SM.theDay == 3) SM.theDay = "Wednesday, ";
		else if (SM.theDay == 4) SM.theDay = "Thursday, ";
		else if (SM.theDay == 5) SM.theDay = "Friday, ";
		else if (SM.theDay == 6) SM.theDay = "Saturday, ";
		else SM.theDay = "error!SM.theDay:";
		
		if (SM.theMonth == 0) SM.theMonth = "January ";
		else if (SM.theMonth == 1) SM.theMonth = "February ";
		else if (SM.theMonth == 2) SM.theMonth = "March ";
		else if (SM.theMonth == 3) SM.theMonth = "April ";
		else if (SM.theMonth == 4) SM.theMonth = "May ";
		else if (SM.theMonth == 5) SM.theMonth = "June ";
		else if (SM.theMonth == 6) SM.theMonth = "July ";
		else if (SM.theMonth == 7) SM.theMonth = "August ";
		else if (SM.theMonth == 8) SM.theMonth = "September ";
		else if (SM.theMonth == 9) SM.theMonth = "October ";
		else if (SM.theMonth == 10) SM.theMonth = "November ";
		else if (SM.theMonth == 11) SM.theMonth = "December ";
		else SM.theMonth = "error!SM.theMonth:";
			
		var str = SM.theDay + SM.theMonth + SM.theDate + ", " + SM.theYear;
		return str;
	},
	
	theDateAndTimeAsString: function() {
		SM.dateUtils.init();
		var str =  SM.dateUtils.theDateAsString() + " - " + SM.dateUtils.timeAsString();
		return str;
	}
}

SM.setNav = function() {
	/*
		Selects the current link in the nav (aka tabs). 
	*/
	if($("navList")) {
		function applyClass(targetNode) {
			var existingClass = targetNode.className;
			var newClass = (existingClass) ? existingClass + " x_selected" : "x_selected";
			if (ie6) newClass = "x_selected"; // ie6 doesn't like the doubled up class. Revisit when adding IE6 nav support.
			targetNode.setAttribute("class", newClass);
			if (ie) targetNode.setAttribute("className", newClass);
		}
		if ($("tabOverride") && $("tabOverride").innerHTML) {
			var whichOne = ($("tabOverride").innerHTML*2) - 1;
			if (ie) whichOne = ($("tabOverride").innerHTML) - 1;
			// whichOne might be -1 if they want to make sure no tabs are selected
			if (whichOne != -1) applyClass($("navList").childNodes[whichOne]);
		} else {
			var loc = document.location.toString();
			var pathAndDoc = document.location.pathname;
			var pathArray = pathAndDoc.split("/");
			var doc = pathArray[pathArray.length-1];
			//var path = pathAndDoc.substr(0,pathAndDoc.length-doc.length);
			var serverAndPath = loc.substr(0,loc.length-doc.length);
			var links = $("navList").getElementsByTagName("a");
			for (var i=0;i<links.length;i++) {
				if(serverAndPath == links[i].href) {
					//alert("We have a match.");
					var pNode = links[i].parentNode;
					/**/
					if (!ie && (pNode.getAttribute("class") == "x_hasChildren")) {
						pNode = pNode.parentNode.parentNode;
					}
					else if (ie && (pNode.getAttribute("className") == "x_hasChildren")) {
						pNode = pNode.parentNode.parentNode;
					}
					applyClass(pNode);
				}
			}
		}
	}
}

SM.setSubNav = function() {
	/*
		Selects the current link in the subnav. 
	*/
	if($("subNav")) {
		var links = $("subNav").getElementsByTagName("a");
		var loc = document.location.toString();
		// trim off any # at end of url
		while (loc.lastIndexOf("#") == (loc.length-1)) loc = loc.slice(0,-1);
		// make index.html and / equivalent
		if (loc.lastIndexOf("index.html") == (loc.length-10)) loc = loc.slice(0,-10);
		// if either value ends with a /, trim it off for comparison purposes
		if (loc.lastIndexOf("/") == (loc.length-1)) loc = loc.slice(0,-1);
		for (var i=0;i<links.length;i++) {
			var lnk = links[i].href;
			if (lnk.lastIndexOf("index.html") == (lnk.length-10)) lnk = lnk.slice(0,-10);
			if (lnk.lastIndexOf("/") == (lnk.length-1)) lnk = lnk.slice(0,-1);
			if(loc == lnk) {
				//alert("We have a match.");
				links[i].parentNode.setAttribute("class", "x_selected");
				if (ie) links[i].parentNode.setAttribute("className", "x_selected");
				// now test to see if we should select the greatgrandparent element, too, 
				// that is, if this is a sub-menu item.
				var ggp = links[i].parentNode.parentNode.parentNode;
				//alert(ggp.nodeName);
				if (ggp.nodeName=="LI") { 
					ggp.setAttribute("class", "x_highlighted");
					ggp.setAttribute("className", "x_highlighted");
				}
			}
		}
	}
}

SM.writeBrandedSiteName = function() {
	/*
		Writes the branded site name with Flash.
		Easier to update the site color, font, or transparency without using images.
		Webkit browsers can use downloadable fonts; Safari Mobile and browsers 
		without flash use the default fonts, for better or for worse. 
	*/
	if (AC_FL_RunContent == 0 || DetectFlashVer == 0) {
		alert("This page requires /Templates/AC_RunActiveContent.js.");
	} 
	else {
		var requiredMajorVersion = 8;
		var requiredMinorVersion = 0;
		var requiredRevision = 24;
		var hasRightVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);
		var webkit = navigator.userAgent.toLowerCase().indexOf("webkit") > -1;
		if (!webkit && hasRightVersion && $("brandedSiteName")) {
			// get the branded site name and subtitle from the xhtml
			// get the a tag inside of branded SiteName, and use it to define the link for the flash movie
			var bsnanchors = $("brandedSiteName").getElementsByTagName("a");
			var bsnanchor = bsnanchors[0];
			// only continue if there even is an anchor; some pages may not have a 
			// branded site name or anchor, just an empty brandedSiteName div
			if (bsnanchor) {
				/*
					Currently, values are escaped since ActionScript 2.0 does not support decodeURI, and
					I want to support as broad a range of flash players as possible. (ActionScript 3.0 requires
					Flash 9 and greater.) But escape does not support non-latin characters. At a later date, 
					we can switch to encodeURIComponent() to better support localization of our sites, if we
					are still using this Flash write implementation at all.
				*/
				var brandedSiteNameLink = escape(bsnanchor.href);
				// get the subtitle
				var brandedSiteNameSubtitle = ($("brandedSiteNameSubtitle")) ? escape($("brandedSiteNameSubtitle").innerHTML.toUpperCase()) : "";
				//brandedSiteNameSubtitle = brandedSiteNameSubtitle.replace("%3CBR%3E","\n");
				// remove the subtitle and any spans inserted for accessibility
				var spans = bsnanchor.getElementsByTagName("span");
				var spansLength = spans.length;
				for (var i=0;i<spansLength;i++) {
					bsnanchor.removeChild(spans[0]);
				}
				// finally, pull the text used for the brandedSiteName itself
				var brandedSiteNameText = bsnanchor.innerHTML;
				// trim off any trailing spaces or return chars, they will look bad when underlined
				brandedSiteNameText = brandedSiteNameText.replace("\n"," ");
				brandedSiteNameText = brandedSiteNameText.replace("\r"," ");
				brandedSiteNameText = brandedSiteNameText.replace("  "," ");
				while (brandedSiteNameText.lastIndexOf(" ") == (brandedSiteNameText.length-1)) brandedSiteNameText = brandedSiteNameText.slice(0,-1);
				brandedSiteNameText = escape(brandedSiteNameText);
				brandedSiteNameText = brandedSiteNameText.replace("%3CBR%3E","\n"); // replaces br with line break				
				// create flashvars
				var flashvars = 'brandedSiteNameText='+brandedSiteNameText+'&brandedSiteNameSubtitle='+brandedSiteNameSubtitle+'&brandedSiteNameLink='+brandedSiteNameLink;
				//alert("FlashVars: " + flashvars);
				flashstring = '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="275" height="58" id="brandedSiteNameMovie" align="middle">';
				flashstring += '<param name="allowScriptAccess" value="sameDomain" />';
				flashstring += '<param name="FlashVars" value="' + flashvars + '" />';
				flashstring += '<param name="allowFullScreen" value="false" />';
				flashstring += '<param name="wmode" value="transparent" />';
				flashstring += '<param name="movie" value="/Templates/images/brandedSiteNameMovie.swf" />';
				flashstring += '<param name="quality" value="high" /><param name="bgcolor" value="#ffffff" />';
				flashstring += '<embed src="/Templates/images/brandedSiteNameMovie.swf" quality="high" bgcolor="#ffffff" ';
				flashstring += 'FlashVars="'+ flashvars + '" ';
				flashstring += 'width="275" height="58" name="brandedSiteNameMovie" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" wmode="transparent" />';
				flashstring += '</object>';
				//alert("Full flashstring: " + flashstring);
				$("brandedSiteName").innerHTML = flashstring;
			}
		}
	}
	// div may be hidden to prevent "jumping around", especially in IE
	$("brandedSiteName").style.display = "block";
}

SM.ie6HoverSupport = function(el,tagName) {
	/*
		Generically add hover events to IE6 since IE6 does not support the :hover selector properly.
		Control the look via CSS with x_hover stylesheet classes.
	*/
	if (ie6) {
		var nodes = el.getElementsByTagName(tagName);
		for (var i=0; i<nodes.length; i++) {
			nodes[i].onmouseover=function() {
				this.className += " x_hover";
			}
			nodes[i].onmouseout = function() {
				this.className = this.className.replace(new RegExp(" x_hover\\b"), "");
			}
		}
	}
}

SM.ie6navSupport = function() {
	/*
		Add hover to nav and superheader.
	*/
	if (ie6) {
		if ($("superheader")) SM.ie6HoverSupport($("superheader"),"li");
		if ($("nav")) SM.ie6HoverSupport($("nav"),"li");
	}
}

SM.searchBoxUtils = function() {
	/*
		Sets up the search box with params from siteparams.js, and
		allows one to switch between site search and SM search. 
		Requires global sm_siteurl set in siteparams.js.
	*/
	// this string can be one or more domains to search, separated by commas
	var sitesArray = sm_siteurl.split(",");
	var sitesToSearch = "";
	for (var i=0;i<sitesArray.length;i++) {
		sitesToSearch += ("site:" + sitesArray[i] + " ");
	}
	// remove trailing " "
	sitesToSearch = sitesToSearch.slice(0,-1)
	// strings to display in search field as help text
	//var ssm = "Search Stanford Medicine";
	var ssm = "Search Stanford Medical Sites";
	var sts = "Search This Site";
	var qs = $("q"); //query string box and value
	function setSearchThisSite() {
		$('as_oq_1').value=sitesToSearch;
		$('as_oq_1').checked=true;
		$('numgm').value=0;
		if (qs.value=="" || qs.value==ssm) qs.value = sts;
	}
	function setSearchStanfordMedicine() {
		$('as_oq_2').value='';
		$('as_oq_2').checked=true;
		$('as_oq_1').checked=false;
		$('numgm').value=5;
		if (qs.value=="" || qs.value==sts) qs.value = ssm;
	}
	function setFocus() {
		if (qs.value==sts || qs.value==ssm) qs.value = "";
		if (ie) qs.setAttribute("className","x_focusState");
		else qs.setAttribute("class", "x_focusState");
	}
	function setBlur() {
		if (qs.value=="") {
			if ($("as_oq_1").checked) qs.value = sts;
			else qs.value = ssm;
			if (ie) qs.setAttribute("className","");
			else qs.setAttribute("class", "");
		}
	}
	function submitCheck() {
		//alert("submitCheck()");
		if (qs.value == ssm || qs.value == sts) qs.value = "";
	}
	if (document.all) {
		qs.attachEvent("onfocus", setFocus);
		qs.attachEvent("onblur", setBlur);
		$("as_oq_1").attachEvent("onclick", setSearchThisSite);
		$("as_oq_2").attachEvent("onclick", setSearchStanfordMedicine);
		$("searchform").attachEvent("onsubmit", submitCheck);
	} else {
		qs.addEventListener('focus',setFocus,false);
		qs.addEventListener('blur',setBlur,false);
		$("as_oq_1").addEventListener('click',setSearchThisSite,false);
		$("as_oq_2").addEventListener('click',setSearchStanfordMedicine,false);
		$("searchform").addEventListener("submit", submitCheck,false);
	}
	setSearchThisSite(); // by default, now
	try {
		if (sm_searchStanfordMedicine) setSearchStanfordMedicine();
	} 
	catch(e) {
		// do nothing;
	}
}

SM.adjustLastTabMenu = function() {
	/*
		Hack to remedy a rendering bug.
	*/
	if ((navigator.userAgent.indexOf("Firefox") > -1) && (navigator.userAgent.indexOf("Windows") > -1)) {
		if($("navList")) $("navList").setAttribute("class", "x_adjusted");
	}
}

SM.getElementsByClassName = function (className, tag, elm){
/*
	Developed by Robert Nyman, http://www.robertnyman.com
	Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/	
	if (document.getElementsByClassName) {
		getElementsByClassName = function (className, tag, elm) {
			elm = elm || document;
			var elements = elm.getElementsByClassName(className),
				nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
			for(var i=0, il=elements.length; i<il; i+=1){
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	else if (document.evaluate) {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
			for(var j=0, jl=classes.length; j<jl; j+=1){
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try	{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			}
			catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) {
				returnElements.push(node);
			}
			return returnElements;
		};
	}
	else {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for(var k=0, kl=classes.length; k<kl; k+=1){
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for(var l=0, ll=elements.length; l<ll; l+=1){
				current = elements[l];
				match = false;
				for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassName(className, tag, elm);
};

SM.addToInit = function(additionalFunction) {
	if (window.addEventListener) window.addEventListener('load', additionalFunction, false);
	else if (window.attachEvent) window.attachEvent('onload', additionalFunction);
}

SM.checkHeight = function() {
	/*
		Ensures that the height of the mainContent div is never less than the height of the subNav in
		the current design, since the subNav is positioned arbitrarily using absolute positioning.
	*/
	if ($("mainContent") && $("subNav")) {
		var sh = $("subNav").offsetHeight + $("subNav").offsetTop;
		var mh = $("mainContent").offsetHeight;
		//alert(sh + ":" + mh);
		if (sh >= mh) {
			if (!ie6) sh -= ($("subNav").offsetTop-10);
			$("mainContent").style.height = sh+"px";
		}
		else {
			$("mainContent").style.height = "auto";
			var sh = $("subNav").offsetHeight + $("subNav").offsetTop;
			var mh = $("mainContent").offsetHeight;
			if (sh >= mh) {
				if (!ie6) sh -= ($("subNav").offsetTop-10);
				$("mainContent").style.height = sh+"px";
			}
		}
	}
}

SM.applyClass = function(targetNode,newClassName) {
	YAHOO.util.Dom.addClass(targetNode,newClassName);
}

SM.checkCapsules = function() {
	/*
	 * function to convert capsules to "superlong" style if they are chock full of content for some reason.
	 */
	var collection = SM.getElementsByClassName("capsule","",$("mainContent"));
	for (var i=0;i<collection.length;i++) {
		var capsule = collection[i];
		if (capsule.offsetHeight > 15000) {
			SM.applyClass(capsule,"infinite");
		}
		else if (capsule.offsetHeight > 3000) {
			SM.applyClass(capsule,"superlong");
		}
		else if (capsule.offsetHeight > 1400) {
			SM.applyClass(capsule,"long");
		}
	}
}

SM.getRequestParameter = function(param) {
/**
 *  Generic request helper
 */
	var q = document.location.search || document.location.hash;
	if (param === null) { return q; }
	if (q) {
		var pairs = q.substring(1).split("&");
		for (var i=0; i < pairs.length; i++) {
			if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
				return pairs[i].substring((pairs[i].indexOf("=") + 1));
			}
		}
	}
	return "";
}

SM.emergencyUtils = function() {
	var closeEmergencyBox = function() {
		document.getElementById("emergency").style.display = "none";
	}
	var collection = SM.getElementsByClassName("x_closeEmergencyBox");
	for (var i=0; i< collection.length; i++) {
		var el = collection[i];
		if (document.all) {
			el.attachEvent("click", closeEmergencyBox);
		} else {
			el.addEventListener('click',closeEmergencyBox,false);
		}
	}
}

SM.init = function() {
	SM.writeBrandedSiteName();
	if ($("search")) SM.searchBoxUtils();
	SM.setNav();
	SM.setSubNav();
	SM.emergencyUtils();
	SM.ie6navSupport();
	SM.adjustLastTabMenu();
	SM.dateUtils.checkYear();
	YAHOO.util.Event.addListener(window,"load",SM.checkCapsules);
	YAHOO.util.Event.addListener(window,"load",SM.checkHeight);
}

/**
 * Window.onload is often hijacked by Dreamweaver (or other scripts). 
 * This triggers init via alternate means.
 * IE6, IE7 do not support DOMContentLoaded event.
 * IE work-around is via main_sm_ie.css (a body behavior) and loaded.htc file.
 * ...transition into using YUI full-time.
 */
if (document.addEventListener) document.addEventListener("DOMContentLoaded", SM.init, false);
if (window.onload) window.onload = SM.checkHeight();
