var msvArrList = new Array();
var msvCSSfilters = new Array();
var msvTextFilter = "";

function getElementsByClassName(className, tag, elm){
// http://www.robertnyman.com/index.php?p=256 
	var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
	var tag = tag || "*";
	var elm = elm || document;
	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
	var returnElements = [];
	var current;
	var length = elements.length;
	for(var i=0; i<length; i++){
		current = elements[i];
		if(testClass.test(current.className)){
			returnElements.push(current);
		}
	}
	return returnElements;
}

function msvFilterByAll() 
{
    var divPartnersListContainer = document.getElementById("divPartnersListContainer");
    if(divPartnersListContainer != null)
        divPartnersListContainer.style.display = "block";
        
	if(msvArrList.length==0)
	{
		populateCaseStudyList();
	}
	
	var msvObjCurrent;
	var msvCSSMatch;
	var msvCSSCount = 0;
	var msvObjMsg = document.getElementById("msvFilterMessage");
	for(i=0; i<msvArrList.length; i++) {
		msvObjCurrent = msvArrList[i];
		msvCSSMatch = true;
		for(j=0; j<msvCSSfilters.length; j++) {
			if(!(msvMatchesCSS(msvObjCurrent,msvCSSfilters[j].value))) {
				msvCSSMatch = false;
			}
		}
		if(msvCSSMatch && msvMatchesString(msvObjCurrent,msvTextFilter)) {	// if the current item matches all CSS filter(s) and text filter, if any
			msvObjCurrent.style.display = "block";	// make it visible
			msvCSSCount++;
		} else {
			msvObjCurrent.style.display = "none";	// else make it hidden
		}			
	}
	if(msvCSSCount == 0) {
		if(msvObjMsg) {
			msvObjMsg.style.display="block";
		}
	} else {
		if(msvObjMsg) {
			msvObjMsg.style.display="none";
		}	
	}
}


function msvSearchFilter(strFilter, evt) 
{	
    evt = (evt) ? evt : ((window.event) ? window.event : "")
	if (evt)
	{
	    // ignore the enter key
		if (evt.keyCode == 13)
		{
            return false;
        }
        else
        {   
            msvTextFilter = strFilter;
            msvFilterByAll();
        }
	}
}

function msvClearLists()
{
    if(msvArrList.length==0)
    {
        populateCaseStudyList();
    }
    var msvObjCurrent;
    var msvCSSMatch;
    var msvCSSCount = 0;
    for(i=0; i<msvArrList.length; i++) 
    {
        msvObjCurrent = msvArrList[i];
        msvCSSMatch = false;
        msvObjCurrent.style.display = "none";
    }
    document.getElementById("msvFilterTxt").value="";
}


function msvMatchesCSS(objTest,strFilter) 
{
// Returns a boolean indicating whether objTest has CSS class strFilter
	var regFilter = new RegExp("(^|\\s)" + strFilter + "(\\s|$)");	// regular expression to match for the indicated CSS class, even in multiple classes have been attached to the object 
	return regFilter.test(objTest.className);
}


function msvMatchesString(objTest,strFilter) {
// Returns a boolean indicating whether the objTest's first child of type <a> contains the text string strFilter
	var objChild = objTest.getElementsByTagName("a")[0];
	if(objChild) {
		var childText = objChild.innerHTML.toLowerCase();
		return (childText.indexOf(strFilter.toLowerCase())>=0);
	} else {
		return false;
	}
}


function populateCaseStudyList() {
  // code to run on page load  

	// Populate array of pointers to the actual case studies
	
	var msvObjList = document.getElementById("msvFilterList");
	if(msvObjList) {
		msvArrList = msvObjList.getElementsByTagName("li");
	}

	
	msvCSSfilters = getElementsByClassName("msvCSSfilter","select");

	
}

function addLoadEvent(func) {
// http://simonwillison.net/2004/May/26/addLoadEvent/  
// Unobtrusively add onLoad events to the window, without losing any onLoad events hard-coded elsewhere 

  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
        oldonload();
      }
      func();

    }
  }
}

function msvSetOpac(msvOp) 
{
    // Change the opacity of global object msvObjFadeIn to value msvOp; different means for different browsers
    var msvOOS = msvObjFadeIn.style;
    msvOOS.opacity = (msvOp / 100);
    msvOOS.MozOpacity = (msvOp / 100);
    msvOOS.KhtmlOpacity = (msvOp / 100);
    msvOOS.filter = "alpha(opacity=" + msvOp + ")";
}

function msvFadeIn() 
{
    // Hard-wired fade-in for global object msvObjFadeIn
    msvMakeVisible(msvObjFadeIn);
    msvObjFadeIn.style.zIndex = msvZ; // Set z-index above currently visible object
    msvZ++;
    msvSetOpac(2);	// Set initial opacity very low to ease into fade-in
    for(i=1;i<=msvFadeSteps;i++) 
    {
        // Need to multiply by 0.9999 to eliminate flicker bug in some browsers
        setTimeout("msvSetOpac("+(i*(100/msvFadeSteps)*0.9999)+")",(msvFadeInterval*i));
    }
}

function msvMakeVisible(msvObjVis) 
{
    msvObjVis.style.visibility="visible";

}

function msvMakeInvisible(msvObjInv) 
{
    msvObjInv.style.visibility="hidden";
}

function msvSwapVis() 
{
    if(msvPointer < (msvArrFPT.length)) 
    {
        msvObjFadeIn = msvArrFPT[msvPointer];
        msvObjFadeOut = msvArrFPT[msvPointer-1];
        msvFadeIn(msvObjFadeIn);
        msvPointer++;
    } 
    else 
    {
        msvObjFadeIn = msvArrFPT[0];
        msvObjFadeOut = msvArrFPT[msvPointer-1];
        msvFadeIn(msvObjFadeIn);
        msvPointer = 1;
    }
    // document.getElementById("debug").innerHTML = msvPointer;
    setTimeout("msvSwapVis()",msvSwapTime);
}	

addLoadEvent(populateCaseStudyList);