/****************************************************** 
 * IKAÖ JavaScript
 *
 * Erstellt: 3.3.2007   FSI
 *
 * Revision History
 * ================
 *
 * 05.03.2007   FSI   Anpassungen für FF-Kompatibilität * 06.03.2007   FSI   Ergänzung für Scrolling * 07.03.2007   FSI   Optimierte Positionierung des ToolTips * 09.03.2007   FSI   Code für Reset-Funktionalität * 12.03.2007   FSI   Anpassungen für IE 7.
 * 12.03.2007   FSI   Ergänzung für Reset (Advanced Search)
 *
 *****************************************************/

// Memberdocument.onmousemove = updateTooltip; 
var scrollableObjects = new Array();
var bToolTipClicked = false;
var bMouseIsOverScrollObject = false;
var bMouseIsOverDownArrow = false;
var bMouseIsOverUpArrow = false;
var strAeraName;
var tooltip = null;

// Add key for each object which should be scrollable
var scrollableObjectsKeys = ['contentWissenschaftsmanagement', 'contentVoraussetzungen','contentSchwierigkeiten', 
                             'contentOrientierung', // map 2
                             'contentAllgemeineWissenschaftspropaedeutik', // map 3
                             'contentWissenschaftsbereiche'];  // Map 4


/**
 * Definition of a contains function for array.
 **/
Array.prototype.contains = 
	function(oElement) 
	{	   	var nCount;	   	for (nCount = 0; nCount < this.length; nCount++)
	   	{	   		if (this[nCount] === oElement) 
	   		{
	   			return true;	       	}	   	}	   	return false;	}


/*****************  REGION : Page Init ********************/
/**
 * Initializes the web page.
 **/  function initPage() 
{	
	// Initializes the scrollabel object
	for (var nCount = 0; nCount < scrollableObjectsKeys.length; nCount++)
	{ 
		var strKey = scrollableObjectsKeys[nCount];
		initScrollableObject(strKey);
	}
}

function HandlePostBack()
{
	alert('Reset');
	// Reset selection
	resetComboBoxSelection();
}
/*********************** END REGION **********************/


/*****************  REGION : ToolTip  ********************/

/**
 *  Updates the position of the tooltip
 *  currently displayed as long as it is
 *  not fixed (bToolTipClicked).
 **/function updateTooltip(e)
{
	var nWidth = 0, nHeight = 0;
	
	/**
	 * Internal function. Returns the scroll X
	 **/
	function getScrollX() 
	{	    
		if( typeof(window.pageYOffset) == 'number' )
		{    		return window.pageXOffset;		} 
		else if( document.body && document.body.scrollLeft ) 
		{								    return  document.body.scrollLeft;		    
		}  		else if( document.documentElement && document.documentElement.scrollLeft ) 
  		{  					    return document.documentElement.scrollLeft;		    		}
		else if ( window.scrollX )
		{
			return window.scrollX;
		}				return 0;	}
	
	/**
	 * Internal function. Returns the scrollY
	 **/
	function getScrollY(e) 
	{
		if( typeof(window.pageYOffset) == 'number' )
		{   		    return window.pageYOffset;		    		} 
		else if( document.body && document.body.scrollTop ) 
		{		    return document.body.scrollTop;		    
		}  		else if( document.documentElement && document.documentElement.scrollTop ) 
  		{		   return document.documentElement.scrollTop;		    		}		return 0;	}
	
	/**
	 * Interneal method: Get the y-coordinate of the current mouse position. 
	 **/
	function mouseY(evt) 
	{		if (evt.pageY) 
		{
			 return evt.pageY;		}
		else if (evt.clientY)   		{
   			return evt.clientY + (document.documentElement.scrollTop ?
   								  document.documentElement.scrollTop : document.body.scrollTop);
   		}
   		else return null;	}
	
	/**
	 * Interneal method: Calculates the browser size. 
	 **/
	function calcBrowserSize() 
	{  		if( typeof( window.innerWidth ) == 'number' ) 
  		{			//Non-IE    		nWidth = window.innerWidth;    		nHeight = window.innerHeight;  		} 
  		else if( document.documentElement &&
  		         (document.documentElement.clientWidth || document.documentElement.clientHeight) ) 
  		{    		//IE 6+ in 'standards compliant mode'		    nWidth = document.documentElement.clientWidth;		    nHeight = document.documentElement.clientHeight;  		} 
  		else if( document.body &&
  		         (document.body.clientWidth || document.body.clientHeight) )
  		{    		//IE 4 compatible		    nWidth = document.body.clientWidth;		    nHeight = document.body.clientHeight;
  		}	}  

	if (!bToolTipClicked)
	{			    try 
	    {
	    	x = (document.all) ? window.event.x + getScrollX() : e.pageX;	      	y = (document.all) ? window.event.y + getScrollY() : e.pageY;	      		      	
	      	if (tooltip != null) 
	      	{
	      		// Calculate the browser window size (and set nWidth and nHeight)
	      		calcBrowserSize();	      		     		
	      			      		
	      		// The position of the tooltip is
	      		// optimized depending on the free 
	      		// visible space within the browser window.
	      		//	  	      		
	      		var nPosX = x - getScrollX();    	
	      		if ( (nPosX > (nWidth / 2)) && (nWidth > 200))
	      		{
					tooltip.style.left = (x - 200) + "px";	
	      		}
	      		else
	      		{	      		
	      			tooltip.style.left = (x + 20) + "px";
	      		}
	      		
	      		// If there's more space below, show tooltip
	      		// on the bottom, else on top.
	      		var nPosY = y - getScrollY();
	      		//alert('Posy: '+ nPosY+', y:'+y+', scroll:' + getScrollY()+',nHeight:'+nHeight);
	      		
	      		if ( (nPosY > (nHeight / 2)) && (nHeight > 200))	   			{
	   				//alert('u Mitte');	         		tooltip.style.top = (y - 240) + "px";
	   			}
	         	else
	      		{
	      			//alert('o Mitte');
	      			tooltip.style.top = (y + 20) + "px";
	      		}      	
	      		
	      		// Check if the scroll object needs scrolling.
	      		var strKey = 'content' + tooltip.id;
	      		if (!scrollableObjectsKeys.contains(strKey))
				{					
					tooltip.getElementsByTagName("div")[1].style.display = 'none';
					tooltip.getElementsByTagName("div")[2].style.display = 'none';							
				}	    	}	    } 
	    catch (error) { error=null; }
	}}


/**
 *  Shows a ttoltip for the specified DOM element.
 **/function showTooltip(id) 
{	
	bMouseIsOverScrollObject = true;
	if (!bToolTipClicked)
	{
		try 
		{	      tooltip = document.getElementById(id);	      tooltip.style.display = "block"	    }
	    catch (error) { error=null; }
	}}

/**
 *  Hides a tooltip for the specified DOM element.
 **/function hideTooltip() 
{
	bMouseIsOverScrollObject = false;
	if (!bToolTipClicked)
	{	    try 
	    {      		tooltip.style.display = "none";    	}
    	catch (error) { error=null; }
	}}

/**
 *  Closes the tooltip.
 **/
function closeTooltip()
{
    bToolTipClicked = false;
    hideTooltip();	
}

/*********************** END REGION **********************/


/****************  REGION : SCROLLING  *******************/
/**
 *  This method is called if the down-arrow is clicked.
 **/
function scrollDown()
{
	bMouseIsOverDownArrow = true;
}

/**
 *  This method is called if the down-arrow is clicked.
 **/
function scrollUp()
{
	bMouseIsOverUpArrow = true;
}

function clearScrolling()
{
	bMouseIsOverDownArrow = false;
	bMouseIsOverUpArrow = false;
}


/**
 * Scroll a given Element.
 *
 * Provides four privileged methods which were
 * accessible to the public methods and the
 * outside. They can not be altered.
 **/      function scroll(oElement, nHeight) 
{	   var self = this;   this._y = 0;   oElement.style.top  = "0px";
   
   // privileged method: Sets the given position.   this.setPosition = function(nPos, y) 
   {         if (nPos > 0)
         {
         	 nPos = 0;         }
         if (nPos < nHeight - oElement.offsetHeight)         {
         	nPos = nHeight - oElement.offsetHeight;         }
         this._y = nPos;         oElement.style.top  = this._y +"px";    };    
    // privileged method: Scrolls (up or down) in y direction
    this.scrollY =
    	function(y) 
    	{ 
    		this.setPosition(this._y + y, y); 
    	};    
    // privileged method: Starts the scroll timer.
    this.start = 
    	function(y) {    		    		this.scrollTimer = window.setInterval(
	    	function() 
	    	{ 
	    		self.scrollY(y); 
	    	}, 25 );		};
 	
 	// privileged method: Stops the scroll timer.
 	this.stop =
 		function() {	    	if (this.scrollTimer) 
	    	{
	    		window.clearInterval(this.scrollTimer); 
	    	}
	    };};
 
/**
 * Initializes the scrollable objects.
 **/  
function initScrollableObject(strName)
{
	var oElementToInitialize = document.getElementById(strName);
	if (oElementToInitialize != null)
	{
		// NOTE: The number here has to correspond
		//       with the CSS scrollArea-element width 
		scrollableObjects[strName] = 
	  		new scroll(oElementToInitialize, 145); 
	}
}

/**
 * Handles the mouse down event (depending on the o
 * mouse position).
 * 
 * NOTE: The parameter e is important for FireFox.
 *       It must be called as follows: 
 *       onMouseDown_EventHandler(event);
 *
 * param e: The mouse down event.
 **/
function onMouseDown_EventHandler(e)
{
	//Internal helper method. Stores the area's name.
	function getAreaName(e)
	{
		// Get area ID (NOTE: cross-browser check needed)
		var oTarget = (window.event) ? window.event.srcElement : e.target;
					
		if (oTarget.nodeType == 3) // defeat Safari bug
		{
			oTarget = oTarget.parentNode
		}
		strAeraName = oTarget.id;
		
		// remove prefix '_'
		strAeraName = strAeraName.substring(1, strAeraName.length);
	}
		
	if (bMouseIsOverScrollObject)
	{		
		bToolTipClicked = true;		    
		getAreaName(e);		
	}	
	else if (bMouseIsOverDownArrow || bMouseIsOverUpArrow)
	{
	  doScrolling();
	}
}

/**
 * Handles the mouse up event.
 **/
function onMouseUp_EventHandler(e)
{
	// Stop scrolling if necessary.
	stopScrolling();
}


/**
 * Does the scrolling.
 *
 * NOTE: The member variable strAeraName must
 *       be set. It refers to the area that 
 *       must be scrolled.
 *
 **/  
function doScrolling()
{			
	// FOR DEBUGGING PURPOSE ONLY:
	//alert("AREA-ID: >" + strAeraName + "<");
	
	if (bMouseIsOverDownArrow)
	{
		scrollableObjects[strAeraName].start(-4);		
	}
	else // scroll up
	{
		scrollableObjects[strAeraName].start(4);
	}	
}

/**
 * Stops scrolling
 **/
function stopScrolling()
{
	for (var nCount = 0; nCount < scrollableObjectsKeys.length; nCount++)
	{ 
		try
		{
			var strKey = scrollableObjectsKeys[nCount];
			scrollableObjects[strKey].stop();
		}
		catch (error) { error=null; }
	}
}
/*********************** END REGION **********************/


/************* REGION : Selection Handler ****************/

/**
 * Stores the currently selected item 
 * of the keyowords combo box.
 **/
function cbKeywords_selectedIndexChanged(sender)
{
	document.getElementById('cbKeywords_SelectedIndex').value = sender.selectedIndex;		
}

/**
 * Stores the state of the checkbox within a hidden field's value.
 **/
function chkShowKeywords_selectionChanged(sender)
{
	document.getElementById('chkShowKeywords_Checked').value = sender.checked;
}

/**
 *  Stores the textfield's value within the related hidden field.
 **/
function textBoxValueChanged(sender)
{
	var strHiddenFieldId = '_' + sender.id;
	document.getElementById(strHiddenFieldId).value = sender.value;	
}

/**
 *  Stores the checkbox's selected index within the related hidden field.
 **/
function checkBox_SelectedIndexChanged(sender)
{
	var strHiddenFieldId = '_' + sender.id;
	document.getElementById(strHiddenFieldId).value = sender.selectedIndex;	
}

/**
 * This method is responsible for reselection.
 **/
function resetSelection()
{
	// ComboBox
	var cbKeywords = document.getElementById('cbKeywords');
	if (cbKeywords != null)
	{
		cbKeywords.selectedIndex = document.getElementById('cbKeywords_SelectedIndex').value;
	}
	
	// CheckBox
	var chkShowKeywords = document.getElementById('chkShowKeywords');
	if (chkShowKeywords != null)
	{
		if (document.getElementById('chkShowKeywords_Checked').value == "true")
		{			
			chkShowKeywords.checked = true;
		}
		else
		{
			chkShowKeywords.checked = false;
		}
	}	
}


/**
 * This method is responsible for reselection (advanced search form).
 **/
function resetSelectionAdvancedSearch()
{
	/**
	 * Private method: Resets the selected index from hidden field.
	 **/
	function setSelectedIndex(strComboBoxName)
	{
		var cmbToSet = document.getElementById(strComboBoxName);
		if (cmbToSet != null)
		{
			cmbToSet.selectedIndex = document.getElementById('_'+strComboBoxName).value;
		}
	}
	
	setSelectedIndex('cmbKeyword1');
	setSelectedIndex('cmbKeyword2');
	setSelectedIndex('cmbKeyword3');
	setSelectedIndex('cmbDiscipline');
	setSelectedIndex('cmbLOP');	
}



/**
 * this method is called whenever the reset button on advanced search form is clicked.
 **/
function resetButton_Clicked()
{
	/**
	 * Private method: Clears the value of a hidden field
	 *                 given by the related control.
	 **/
    function resetRelatedHiddenField(strControlName) 
    { 
		var hiddenFieldToReset = document.getElementById('_'+strControlName);
		if (hiddenFieldToReset != null)
		{
			hiddenFieldToReset.value = '';
		}
	}
	
	/**
	 * Private method: Clears a given textbox.
	 **/
	function resetTextBox(strTextBoxName)
	{
		var txtToReset = document.getElementById(strTextBoxName);
		if (txtToReset != null)
		{
			txtToReset.value = '';
		}		
		resetRelatedHiddenField(strTextBoxName);
	}	
	
	/**
	 * Private method: Clears a given combobox.
	 **/
	function resetComboBox(strComboBoxName)
	{
		var cmbToReset = document.getElementById(strComboBoxName);
		if (cmbToReset != null)
		{
			cmbToReset.selectedIndex = 0;
		}				
		resetRelatedHiddenField(strComboBoxName);
	}
	
	// Reset controls
	resetTextBox('txtAuthor');
	resetTextBox('txtYear');
	resetTextBox('txtTitle');
	resetTextBox('txtFulltextSearch');
	resetComboBox('cmbKeyword1');
	resetComboBox('cmbKeyword2');
	resetComboBox('cmbKeyword3');
	resetComboBox('cmbDiscipline');
	resetComboBox('cmbLOP');	
}


/*********************** END REGION **********************/


