﻿// Author: David Leghorn    Date:31/05/2007
// Purpose: 
// * Utilised to implement results table row hover highlighting for results html tables created
// via ResultGrid.cs class (typically utilised for ajax based data/results table requests)
// * Utilised by Ajax based pager to implement data paging, jump to page and number of items per page functionality

// When To Utilise/Import this file:
// IMPORT this javascript file if your page utilises a results grid/html table created via ResultGrid.cs
// class and / or ajax based pager created with AjaxPager.cs class

// TO DO : Paging functionality on this page may need encompassed in a Pager Class to facilitate 
// muiltiple pageable results grids on same page. At least, functions must except custom id's via
// global variables, or variables to utilse in functions could be read from an AjaxPagerManager object
// that simply stores ids of buttons etc utilised by a particular pager (rather than functions below becoming
// class methods?)


    // ________________________ GRID ROW HIGHLIGHTING (MOUSEOVER / MOUSEOUT table row) ____________________
    
    
    var RowClass = "";
    var HoverClass = "searchResultsHighlight";

    function gridViewRowMouseOver(rowID)
    {
        var rowRef = document.getElementById(rowID);
        RowClass = rowRef.className;  // store current row class name
        rowRef.className = HoverClass;
    }
    

    function gridViewRowMouseOut(rowID)
    {
        if( RowClass != "" )
        {
            document.getElementById(rowID).className = RowClass;
        }
    }
        
        
    // __________________________ KEYPRESS AND JUMP TO PAGE FUNCTIONS ______________________________________

    
    var jumpboxId = "txtPageNumberJump";
    
    // checks that the page number entered by user is a number and that it is not outside page range
    
    function JumpToPage()
    {
        var jumpPageNum;
        var startPageNum = _getStartPageNumber();
        var lastPageNum = _getLastPageNumber();
        var jumpPage = document.getElementById(jumpboxId).value;
       
        
       try
       {
            jumpPageNum = Number(jumpPage.Trim());
       }
       catch(error)
       {
            alert("Page to jump to must be a number!");
            document.getElementById(jumpboxId).focus();
       }
        
        // test
        //alert(startPage + " of " + lastPage + " jump = " + jumpPage);
        
        if( jumpPageNum <= lastPageNum && jumpPageNum >= 1)
        {
            GoToPage = jumpPageNum;
           // alert("do page jump code here"); // test
            FetchSearchResults();
        }
        else
        {
            alert("The page number you entered is out of range! Must be a number > 0 and <= maximum number of pages.");
            document.getElementById(jumpboxId).value = "";
            document.getElementById(jumpboxId).focus();
        }
        
        return false;
        
    }

    
    // event handler for keypress events on jump to page textbox

	function PageJumpTextboxKeyPress( e )
	{
	    var isReturnKey = false;
	    
	    if ( window.event )     // Internet Explorer
		{
			if( event.keyCode == 13 )
			{
				isReturnKey = true;
				event.cancelBubble = true;
			}
		}

		else    // W3C , Firefox
		{
			if( e.keyCode == 13 )   // return key press
			{
			    isReturnKey = true;
			}
		}
		
		if( isReturnKey == true )
		{
		    JumpToPage();
		    return false;   // prevent browser default form submit behaviour
		}
		else
		{
		    return true;
		}
	}

// event handler for keypress events on jump to page textbox

//	function PageJumpTextboxKeyPress( evt )
//	{
//	    var returnKeyPressed = _checkForReturnKeyPress(e);
//	    
//	    //alert("return key was pressed = " + returnKeyPressed );
//	    
//	    if( returnKeyPressed == true)
//	    {
//	        JumpToPage();
//	        
//	        if(window.event)
//	        {
//				event.cancelBubble = true;
//				event.returnValue = false;
//		    }
//	        return false;   // prevent default browser submit form behaviour
//	    }
//	}
	
	
	// checks for return key press - returns true if key press was return key, else returns false
//	NOT WORKING IN FIREFOX
//
//	function _checkForReturnKeyPress(e)
//	{
//	    var isReturnKey = false;
//	    
//	    if ( window.event )     // Internet Explorer
//		{
//			if( event.keyCode == 13 )
//			{
//				isReturnKey = true;
//				event.cancelBubble = true;
//			}
//		}

//		else    // W3C , Firefox
//		{
//			if( e.keyCode == 13 )   // return key press
//			{
//			    isReturnKey = true;
//			}
//		}
//		
//		return isReturnKey;
//	}
	
	
	// _______________________ PAGING BUTTON CLICK HANDLERS __________________________
	
	
	var GoToPage = 1;   // defaults to 1 for first page data request
	var ItemsPerPage = 10;   // default value for first page request when no page size list object exists
	
	function FirstPageClick()
	{
	    var currentPage = _getStartPageNumber();
	    
	    if( currentPage != 1)
	    {
	        GoToPage = 1;
	       // document.getElementById("StartPage").innerHTML = GoToPage;  // test
	        FetchSearchResults();
	    }
	}

    function PreviousPageClick()
    {
	    var prevPage = _getStartPageNumber() - 1;
	   // alert("previous page = " + prevPage)
	    if( prevPage > 0)
	    {
	        GoToPage = prevPage;
	       // document.getElementById("StartPage").innerHTML = GoToPage;  // test
	        FetchSearchResults();
	    }
	}
    
    function NextPageClick()
    {
	    var nextPage = _getStartPageNumber() + 1;
	    var totalPages = _getLastPageNumber();
	   // alert("next page = " + nextPage);
	    
	    if( nextPage <= totalPages)
	    {
	        GoToPage = nextPage;
	       // document.getElementById("StartPage").innerHTML = GoToPage;  // test
	        FetchSearchResults();
	     }
	}
    
    function LastPageClick()
    {
	    var thisPage = _getStartPageNumber();
	    var lastPage = _getLastPageNumber();
	    
	    if(thisPage < lastPage)
	    {
	        GoToPage = lastPage;
	       // document.getElementById("StartPage").innerHTML = GoToPage;  // test
	       FetchSearchResults();
	    }
	}
	
	
	// ___________________________ SORT HEADER LINK CLICKED _____________________________
	
	// TO DO : Function takes 2nd parameter denoting id of image tag (or div) in header that should
	// receive sort direction arrow graphic
	
	function SortHeaderLinkClick(dbField, sortDirDiv)
	{
	    _setSortDirectionDiv(sortDirDiv);
	    
	    // GET DETAILS OF HEADER LINK CLICKED (via params to this function)
	    // NOTE CURRENT SORT DIRECTION (if set) FROM HIDDEN TEXTBOX and switch to opposite sort direction
	    var sortOn = _getCurrentSortField();
	    var newSortDir, sortExp;
	    
	    if( dbField == sortOn )
	    {
	        newSortDir = _establishSortDirection();
	        sortExp = dbField + " " + newSortDir;
	    }
	    else 
	    {  
	        newSortDir = "ASC"
	        sortExp = dbField + " ASC";  
	    }
	    	        
	    _setSortExpression(sortExp);
	    _setSortDirection(newSortDir);
	    _setSortField(dbField);
	    
	    GoToPage = 1;
	    FetchSearchResults();
	}
	
    function _establishSortDirection()    // gets what the current sort direction should be
	{
	    var direction = _getSortDirection();
	    
	    if ( direction == "ASC" ) { direction = "DESC"; }
	    else { direction = "ASC"; }
	    
	    return direction;
	}
	
	
    function SetGridSortDirectionArrow()
    {
        var sortDir = _getSortDirection();
        var sortDirDiv = _getSortDirectionDiv();
        var sortImageUrl = "";
        
        if( sortDir != "" && sortDirDiv != "")  // a column is sorted so set sort direction arrow
        {
            if(sortDir == "ASC") 
            { 
                sortImageUrl = "<img src='../Images/DownArrow10px.jpg' alt='' class='sortArrow' />"; // until have img 
            } 
            else 
            { sortImageUrl = "<img src='../Images/UpArrow10px.jpg' alt='' class='sortArrow' />"; }
            
            document.getElementById(sortDirDiv).innerHTML = sortImageUrl;   // likely set backgroundImage property or render an img tag
        }
        
    }

	
	// ______________________ PAGE SIZE RELATED FUNCTIONS __________________
	
	// (note:items per page functionality would actually be simpler if user entered page size in textbox)
	
	
	// called after successful or failed ajax data load webservice call returns to set items per page 
	// list to current/last selection before ajax data request
	
	function _restoreItemsPerPageSelection()
	{
	    var storedItemsPerPage = _getItemsPerPage();
	    
	    // loop list and once items per page value matched, set list selectedIndex to matched at index  
	    var pagesizeListRef = document.getElementById("ddlItemsPerPage");
	    var numitems = pagesizeListRef.length;
	    
	    for(i=0; i < numitems; i++)
        {
            listval = Number(pagesizeListRef.options[i].value); 
            //alert("value = " + listval);
            
            if (listval == storedItemsPerPage)
            {
                //alert("matched at index = " + i);
                pagesizeListRef.selectedIndex = i;
                break;
            }
        }
	}
	
	
	function PageSizeList_SelectedIndexChanged()
	{
	    //alert("items per page list change");
	    document.getElementById("txtItemsPerPage").value = _getItemsPerPageSelection();
	    GoToPage = 1;
	    FetchSearchResults();
	}
	
	// ______________________ get functions __________________________
	
	    
    function _getStartPageNumber()
    {
        return Number(document.getElementById("StartPage").innerHTML);
    }
    
    function _getLastPageNumber()
    {
        return Number(document.getElementById("LastPage").innerHTML);
    }
    
    function _getItemsPerPageSelection()
    {
        var listObjRef = document.getElementById("ddlItemsPerPage");
	    var selIndex = listObjRef.selectedIndex;
	    return Number(listObjRef.options[selIndex].value);
    }

    // 4/6/07 - _getItemsPerPage updated to retrieve from textbox rather than list as
    // list will not exist on 1st data request or if no data grid/pager returned
    
    function _getItemsPerPage()
    {
        return Number(document.getElementById("txtItemsPerPage").value);
    }
    
    function _getContractId()
    {
        return Number(document.getElementById("txtContractId").value);
    }
    
	function _getWhereExpression()
	{
    	return document.getElementById("WhereString").value;
	}
	
	function _getSortDirection()
	{
	    return document.getElementById("SortDirection").value;
	}
	
	function _getCurrentSortField()
	{
	    return document.getElementById("SortField").value;
	}
	
	function _getSortExpression()
	{
	    return document.getElementById("SortExpression").value;
	}
	
    function _getSortDirectionDiv()
    {
        return document.getElementById("SortDirectionDiv").value;
    }
	
	
	// _________________ set functions ________________________
	
	function _setSortExpression(exp)
	{
	    document.getElementById("SortExpression").value = exp;
	}
	
	function _setSortDirection(dir)
	{
	    document.getElementById("SortDirection").value = dir;
	}
	
	function _setSortField(field)
	{
	    document.getElementById("SortField").value = field;
	}
	
	function _setSortDirectionDiv(divId)
	{
	    document.getElementById("SortDirectionDiv").value = divId;
	}
	


	function FetchSearchResults()
	{
	    ItemsPerPage = _getItemsPerPage();  // now reads num items from hidden txtbox rather than directly from pagesize list
	    AjaxGetData();   // AjaxGetData function implemented as required within search page utilising this script
	}
	
	

