/* BioDigital Systems */

// Currying function used for creating closures
// sample:  function add(a,b) { return a+b; }
// curried: var add3 = curry(add,3); -> function(b) { return 3+b; }
//          var answer = add3(4); // answer = 7
function curry(f)
{
    var curried = new Array();
    for(var i=1;i<arguments.length;i++) { curried.push(arguments[i]); }
    return function() 
    {            
        var args = new Array();
        for(var i=0;i<curried.length;i++) { args.push(curried[i]); }
        for(var i=0;i<arguments.length;i++) { args.push(arguments[i]); } 
        return f.apply(null,args);
    }
}

// sets up sliding images via easySlider script
var SLIDE_IMAGE_LIST_CLASS = 'SlideList';
function initSlideImages(e) {
    var selector = '.' + SLIDE_IMAGE_LIST_CLASS;
    if ($) {
        $(selector).easySlider({
            auto: true,
            continuous: true,
            // controls how fast the slides move
            speed: 800, /*1100*/
            // time between slides
            pause: 8000,
            // the id of the next button
            prevId: 'prev',
            // the id of the prev button
            nextId: 'next',
            controlsShow: false
        });
        }
}
function stopBubble(e)
{ 
    e = e || event;
   if(window.attachEvent) { e.cancelBubble = true; e.returnValue = false; } else { e.stopPropagation(); if(e.preventDefault) e.preventDefault(); } 
}
function findInArray(a,c) { for(var i=0;i<a.length;i++) { if(a[i]==c) return true; } return false; }
function showNode(n) { n.style.display = ''; }
function hideNode(n) { n.style.display = 'none'; }

/* -- Start Objects and Global Variables -- */
var graphicBannerRoot = "images/mainGraphic"; 

var navBoxes = new Array();
var activeNode = ''; //active menuitem (left menu) div

// A simple object hash of banners
// Key values correspond to the Id of the second div tag in the MainGraphic section
var Banners = 
{
	index :
	{
		'1' : { src: 'su2c.jpg' },
		'2' : { src: 'dna.jpg' },
		'3' : { src: 'dental.jpg' },
		'4' : { src: 'bdshuman.jpg'},
		'5' : { src: 'embryology.jpg'}
	},
	biotech :
	{
	    '1' : { src: 'ind_biotech_redcells.jpg' },
		'2' : { src: 'ind_biotech_blueneurons.jpg' },
		'3' : { src: 'ind_biotech_expcells.jpg' }
	},
	casestudies:
	{
		'1' : { src: 'case-nyu.jpg' }, 
		'2' : { src: 'case-caisis.jpg' }, 
		'3' : { src: 'case-medtronic.jpg' }, 
		'4' : { src: 'case-smithandnephew.jpg' },
		'5' : { src: 'case-aab.jpg' }, 
		'6' : { src: 'case-stc.jpg' }
	}
};
/* -- End Objects and Global Variables -- */


/* -- Start Helper Functions -- */
function wireEvent(node,eventName, eventRef)
{
	if(node.attachEvent) { node.attachEvent('on' + eventName, eventRef); }
	else if(node.addEventListener) { node.addEventListener(eventName, eventRef, false); }
}

function getQueryString(key, default_)
{
  if (default_==null) default_="";
  key = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regex = new RegExp("[\\?&]"+key+"=([^&#]*)");
  var qs = regex.exec(window.location.href);
  if(qs == null)
    return default_; //return empty string if not found and no default value assigned
  else
    return qs[1]; 
} 
/* -- End Helper Functions -- */


/* -- Start Page Load SetUp -- */
function setup()
{	
	wireNavigationBar(); // NOTE: right now, this gets called for all pages, but some might not need the check even
	
	setActiveNodeFromQS(); // onload of a page, checks qs for id to set active node (left menu); used from site map
	setSelectedBoxFromQS(); //onload of a page, checks qs for id to set selected box for main graphic
}
/* -- End Page Load SetUp -- */


/* NOTE: need to abstract so that it works for any page, not just when linking to the case-studies page */
function setSelectedBoxFromQS()
{
	var myCaseBox = getQueryString('case');
	if(myCaseBox.length > 0)
	{
		//alert(myCaseBox);	
		document.getElementById('1').className = 'numberedBox';
		document.getElementById(myCaseBox).className = 'numberedBoxOn';
		
		var banner = Banners['casestudies'];
		var obj = banner[myCaseBox];
		var src = obj.src;
		setMainGraphic(src, 'block');
	}
}

/* sets active node (highlight menu item) from query string AND sets maingraphic (single) */
function setActiveNodeFromQS()
{
    //alert(window.location.href);
	//var myURL = window.location.href.split('?section=');
	var mySection = getQueryString('section');
	//alert(t);
	
	//if(myURL.length==2)
	if(mySection.length > 0)
	{
		//var myDivId = 'mi_' + myURL[1];
		var myDivId = 'mi_' + mySection;
		//alert(myDivId);
		
		activeNode = document.getElementById(myDivId);
		if(activeNode) 
		{ 
		    activeNode.className = 'leftMenuItemActive'; 
    		
		    var myDivIdArr = myDivId.split('_');
		    toggleContentDiv(activeNode,myDivIdArr[1]);
			
			
			var bannerKey = myDivIdArr[1].split('-');
			var banner = Banners[bannerKey[0]]; //get array from banners
			
			var obj = banner[bannerKey[1]];  // only 1 graphic, so key is always 1
			setMainGraphic(obj.src,'none');
		}
		//alert('must set active node from QS to: ' + myDivIdArr[1]);
	}
}

/* -- Start Main Graphic Section SetUp -- */
function wireNavigationBar() {
    return;// TEMP
	var pageDivs = document.getElementsByTagName('DIV');
	for(j = 0;j<pageDivs.length;j++)
	{
		var bannerElement = pageDivs[j];
		if(bannerElement.className == 'navigationBar')
		{
			var bannerKey = bannerElement.id;
			var banner = Banners[bannerKey];
			var boxes = bannerElement.getElementsByTagName('DIV');
			var boxCount = boxes.length;
	
			for(var i=0;i<boxCount;i++)
			{
				// NOTE: Since boxes are floated, boxes to the left (i.e. box 1) is last in DOM
				
				// Get box ref and set helper properties
				var box = boxes[i];
				box.isFirst = i == boxCount - 1;
				box.isLast = i==0;
								
				// Add box to global box list
				navBoxes.unshift(box);
				
				var obj = banner[box.id];
				var src = obj.src;
				var title = obj.title ? obj.title : '';
				// Special parseable string parameters used for showing tooltip
				box.paramText = box.title;
				
				box.title = title;
				// Set main image and main image tool tip
				if(box.isFirst) 
				{ 
				    setMainGraphic(src, 'block');
				    setMainGraphicToolTip(box);
				}
				
				// Add event handlers
				var boxClick = getBoxOnClick(box,src);
				box.clickHandler = boxClick;
				var boxMouseOver = getBoxOnMouseOverOut(box,'numberedBoxOver');
				var boxMouseOut = getBoxOnMouseOverOut(box,'numberedBox');
				wireEvent(box,'click',boxClick);
				wireEvent(box,'mouseover',boxMouseOver);
				wireEvent(box,'mouseout',boxMouseOut);					
			}	
		}
	}
		
	// Wire events for prev/next
	var prev = document.getElementById('prev');
	var next = document.getElementById('next');
	if(prev!= null && next != null)
	{
		wireEvent(prev,'click',getArrowClick(-1,'isFirst'));
		wireEvent(next,'click',getArrowClick(1,'isLast'));
		wireEvent(prev,'mouseover',getArrowMouseOverOut(prev,'ArrowOver'));
		wireEvent(next,'mouseover',getArrowMouseOverOut(next,'ArrowOver'));
		wireEvent(prev,'mouseout',getArrowMouseOverOut(prev,'Arrow'));
		wireEvent(next,'mouseout',getArrowMouseOverOut(next,'Arrow'));
	}
}
function setMainGraphic(src, navBarDisplay)
{
	var graphic = document.getElementById('mainGraphic');
	var imgPath = graphicBannerRoot + '/' + src;
	graphic.style.backgroundImage= "url('"+ imgPath +"')";
	
	// hide or show the navigation bar + boxes
	var pageDivs = document.getElementsByTagName('DIV');
	for(j = 0;j<pageDivs.length;j++)
	{
		var bannerElement = pageDivs[j];
		if(bannerElement.className == 'navigationBar')
		{
			bannerElement.style.display = navBarDisplay;
		}
	}
}

// BOX Helpers
function toopTipParams(p) {  }
function getBoxOnClick(box,src)
{
	return function(e)
	{
		setMainGraphic(src, 'block');
	    setMainGraphicToolTip(box);
		// Set box claasses
		for(var i=0;i<navBoxes.length;i++)
		{
			var navBox = navBoxes[i];
			navBox.className = navBox == box ? 'numberedBoxOn' : 'numberedBox';
		}
		//alert(box);
		
		// Set arrows
		document.getElementById('prev').className = box.isFirst ? 'prevArrowInactive' : 'prevArrow';
		document.getElementById('next').className = box.isLast ? 'nextArrowInactive' : 'nextArrow';
	}
}


/*START - MAIN GRAPHIC TOOL TIP */

// A list of style parameters which are defined in a numberbox node
// parameters container in @title attribute of node.
// Format: 'key==val'
// Seperator: ';;'
// Ex:  
//    markup: <div class="numberedBox" title="opacity=45;width=400px;title=Hello World">
//    styles modified: opacity set to 45%
//                     width set to 400px
// Object properties are example format for parameters
var GRAPHIC_TOOL_TIP_LAYER_PARAMS = 
{ 
    opacity: '60', // layer opacity 1  - 100
    top: '100px', 
    right: '25px',
    color: '#cccfff', 
    backgroundColor: '#000000', 
    width: '300px',
    height: '125px',
    fontSize: '16px',
    fontFamily: 'verdana',
    textAlign: 'center',
    border: '1px solid #fff000',
	borderRight: '1px solid #fff000'
};

var PAIRS_SEPERATOR = ';;'
var PAIR_SEPERATOR = '==';

// Sets main tool tip, either node or parameters as argument
function setMainGraphicToolTip(config)
{
    // verify tool tip items are initalized
    initalizeMainGraphicToolTip();

    var params =  config.nodeName && config.nodeName != '' ? getToolTipParams(config) : config;

    var toolTipLayer = document.getElementById('mainGraphicToolTip');
    var toolTipText = document.getElementById('mainGraphicToolTipText');
    if(toolTipLayer && toolTipText)
    {
        if(params.title && params.title!='')
        {
            // Show tool tip layer and text
            toolTipText.show();
            toolTipLayer.show();
            // Revert node styles
            toolTipText.reset();
            toolTipLayer.reset();
 
            // Apply styles to main tool tip layer
            setNodeStylesFromParams(toolTipLayer,params);
            // DO NOT want to modify these styles on text layer
            params.opacity = null;
            params.backgroundColor = null;
            // Apply styles to text layer
            setNodeStylesFromParams(toolTipText,params);
            
            // Set Text in Tool Tip
            toolTipText.innerHTML = params.title; 
        }
        else
        {
            toolTipText.innerHTML = '';
            toolTipText.hide();
            toolTipLayer.hide();
        }
    }
}

function setNodeStylesFromParams(node,params)
{
    for(var styleKey in GRAPHIC_TOOL_TIP_LAYER_PARAMS) 
    { 
        var paramVal = params[styleKey];
        if(paramVal) 
        { 
            if(styleKey == 'opacity') {  setNodeTransparency(node,paramVal); } // special case
            else { node.style[styleKey] = paramVal; }
        } 
    }
}

// Gets a simple config node for main tool tip
function getToolTipParams(node)
{
    var params = { title: '' };
    var keyVals = node.paramText.split(PAIRS_SEPERATOR);
    // If no parameters are defined, use parameter text as title
    if(keyVals.length==1)
    {
        params.title = node.paramText;
    }
    else
    {
        for(var i=0;i<keyVals.length;i++)
        {
            var keyVal = keyVals[i].split(PAIR_SEPERATOR);
            var key = keyVal[0];
            var val = keyVal[1];
            params[key] = val;
        }
    }
    return params;
}
// Initalize Main Graphic Tooltip
function initalizeMainGraphicToolTip()
{
    var toolTipLayer = document.getElementById('mainGraphicToolTip');
    var toolTipText = document.getElementById('mainGraphicToolTipText');
    if(toolTipLayer && toolTipText)
    {
        initalizeMainGraphicToolTipItem(toolTipLayer);
        initalizeMainGraphicToolTipItem(toolTipText);
    }
}

// Adds special function helpers to node
function initalizeMainGraphicToolTipItem(node)
{
    if(node.init) { return; }
    // Returns a function which when activated, resets styles to inital values
    var resetStyles = function(n)
    {
        var origStyles = {};
        // Copy inital styles into hash, used to reset styles
        for(var key in GRAPHIC_TOOL_TIP_LAYER_PARAMS) 
        {
            if(window.getComputedStyle) { origStyles[key] = window.getComputedStyle(n,null).getPropertyValue(key); }
            else if(node.currentStyle) { origStyles[key] = n.style[key]; }
        }
        return function() { for(var key in GRAPHIC_TOOL_TIP_LAYER_PARAMS) { n.style[key] = origStyles[key]; } }
    }
    // Returns a function which moddifies node's display property
    var showHideNode = function(n,d) 
    { 
        return function() { n.style.display = d; } 
    };
        
    node.reset = resetStyles(node);
    node.show = showHideNode(node,'');
    node.hide = showHideNode(node,'none');
    
    node.init = true;
}

wireEvent(window,'load',initalizeMainGraphicToolTip);

/* END - MAIN GRAPHIC TOOL TIP */

// sets a node's transparency
function setNodeTransparency(node,level)
{
    if(node.style.filter!=null) { node.style.filter = 'alpha(opacity=' + level + ')'; }
    else if(node.style.opacity!=null) { node.style.opacity = level/100.0; }
}

function getBoxOnMouseOverOut(box,clsName) { return function(e) { box.className = box.className!='numberedBoxOn' ? clsName : "numberedBoxOn"; } }

//ARROW Helpers
function getArrowClick(increment,compareExpr)
{
	return function(e)
	{
		// Set box claasses
		for(var i=0;i<navBoxes.length;i++)
		{
			var navBox = navBoxes[i];
			if(navBox.className == 'numberedBoxOn' && !navBox[compareExpr])
			{
				navBoxes[i + increment].clickHandler(e);
				break;
			}
		}
	}
}
function getArrowMouseOverOut(arrow,clsSuffix)
{
	return function(e) { arrow.className = arrow.className!= arrow.id +'ArrowInactive' ? arrow.id + clsSuffix : arrow.id +'ArrowInactive'; }
}
/* -- End Main Graphic Section SetUp -- */


/* -- Start Main Content Section SetUp -- */

// LEFT MENU toggle content
function toggleContentDiv(item,theId)
{
	var pageDivs = document.getElementsByTagName('DIV');
	for(j = 0;j<pageDivs.length;j++)
	{
		var rcDiv = pageDivs[j];
		if(rcDiv.className == 'rightColumn')
		{
			rcDiv.className = 'rightColumnHidden';
		}
	}
	
	document.getElementById(theId).className = 'rightColumn';
	
	if(item.id == 'leftMenuHeader') { activeNode.className = 'leftMenuItem'; activeNode = ''; }
}

function handleLeftMenuMouseClick(item,contentDivId,e)
{   
	if(activeNode) 
	{ 
		if(activeNode==item) { return; } 
		activeNode.className = 'leftMenuItem'; 
	}

	activeNode = item; 
    activeNode.className = 'leftMenuItemActive';
	
	toggleContentDiv(item,contentDivId);
}

function handleLeftMenuMouseOver(item,e)
{
   if(activeNode!= item)
   {
      item.className = 'leftMenuItemOver';
   }
}

function handleLeftMenuMouseOut(item,e)
{
   if(item.className!='' && activeNode != item)
   {
      item.className = 'leftMenuItem';
   }
}



// LEFT MENU go to new page
function goToPageAndSelect(item, theURL)
{	
	var itemIdArr = item.id.split('_');
	window.location.href = theURL + '?section=' + itemIdArr[1];
	//alert(theURL + '?' + item.id);
}

function goToPageOnly(theURL)
{	
	window.location.href = theURL;
}

// set class to active for node with given id; for left menu 
function setActiveNode(myDivId)
{
	// if there is activeNode, change class to inactive
	if(activeNode) { activeNode.className = 'leftMenuItem'; }
	
	// set new activeNode
	activeNode = document.getElementById(myDivId);
	activeNode.className = 'leftMenuItemActive';
}

/* -- End Main Content Section SetUp (with leftMenu toggle) -- */


// Wire events on page load
wireEvent(window, 'load', setup);
wireEvent(window, 'load', initSlideImages);


// -------------- Google Search Utiltiy --------------------------

var googleSearchIframeName = "cse-search-results";
var googleSearchFormName = "cse-search-box";
var googleNumSearchResults = 8;
var googleSearchDomain = "www.google.com";
var googleSearchPath = "/cse";

 function closeSearchLayer()
 {  
    document.getElementById('cse-search-results').style.display = 'none';
 }
 
 function InitializeGoogleSearchFrame()
 {
         if(window.location.href.indexOf('?cx=') > -1)
        {
              var searchText =  document.getElementById('searchTextBox');
          
              if (searchText.value != "")
              {
                  var searchLayer = document.getElementById('cse-search-results');
                  searchLayer.style.display = '';
              }
        }
        
        var iframes = document.getElementsByTagName('IFRAME');
        for(var i=0;i<iframes.length;i++)
        {
            if(iframes[i].name =='googleSearchFrame')
            {
                var googleFrame = iframes[i];
                googleFrame.className = 'googleFrame';
            }
        } 
 }
 
 
/* Google Analytics Code */
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
try 
{
    var pageTracker = _gat._getTracker("UA-1141985-4");
    pageTracker._trackPageview();
} 
catch(err) {}
