//------------------------------------------------------------------------------
// Copyright (c) 2005-2006 Javerdel Oy. All Rights Reserved.
//------------------------------------------------------------------------------

///////////////////////////////////////////////////////////
//                                                       //
//          JavaScrip List Object                        //
//                                                       // 
///////////////////////////////////////////////////////////
function WebGridList(ListName){
	//////////////////////////////////////////////////
	//  Private Class variables                     //
	//////////////////////////////////////////////////
	
	this.Grid;
	var MultiSelect = false;
	var selectedLines = new collection();
	var currentLine = -1;
	var gridLines = new Array();
	var lastLine;
	var startLine;
	var lastIndex;
	var selectedClass = 'SelectedLineCss';
	var everyOtherLineClass = 'EveryOtherLineCss';
	var ctrlMask = false;
	var shiftMask = false;
	var identityIndex = 0;
    var isReady;
	
	var oldOnSelectionEnd; 
	var oldOnSelection;
	
	var base = this; 
	var changedLines = new Array();
	var visibleColumns;
	this.openedRows = new Array();
	
	//////////////////////////////////////////////////
	// Object interface                             //
	//////////////////////////////////////////////////
	this.oToolTip = new toolTip(ListName);
	this.getItems = getItems;
	this.setItems = setItems;
	this.removeItems = removeItems;
	this.moveUp = moveUp; 
	this.moveDown = moveDown;
	this.columns = new columns(this); 
	this.goPage = goPage;
	this.sort = sort;
	this.initialize = initialize;
	this.Data;
	this.onSelection = new Function();
	this.onSelectionEnd = new Function();
	this.onBuild = new Function();
	this.onInit = new Function();
	this.selectedValues = new Array();
	this.toolTipText; 
	this.Navi = new basicNavi(this);
	this.popupMenu = new Menu(ListName,'popup',base.oToolTip);
	this.webMenu = new Menu(ListName,'web',base.oToolTip)
	this.pageSize = 25;
	this.dblClickMenu = ''; 
	this.finder = new basicSearchMachine(base);
	this.popupMenu.setDefaults(setMenuDefaults);		 
	this.webMenu.setDefaults(setMenuDefaults);		 
	this.lock = lock; 
	this.unlock = unlock; 
    this.virtualDirectory; 
    this.multiSelect = true;
    this.pageNavi = true; 
    this.summLineText;
    this.canSelect = true; 
    this.onResize = new Function('');
    this.serverSearch = false;
    this.activeElement; 
    this.changedLines = getChangedLines;
    this.getAllLines = getAllLines;
    this.check = check;
    this.language = 'suomi';
    this.dateType = "ddmmyy";
	this.dateDelimeter = ".";
	this.writeErrorMessage = writeErrorMessage;
	this.writeMessage = writeMessage;
    this.errorLayout = new errorLayout();
    this.onReady = new Function();
    this.onPageChange = new Function();
    this.exportControl = new exportControl(base);
    this.printControl = new printControl(base);
    this.oBusy = new busyHandler(document.getElementById(ListName),this); 
    this.mouseoutGrid = mouseoutGrid;
    this.currentPage = 1;
    this.numberOfPages = 0;
    this.ListName = ListName; 
    this.locked = false; 
    this.setKeyMask = setKeyMask;
    this.unSelectAll = unSelectAll; 
    this.setChangedLines = setChangedLines; 
    this.setActiveElement = setActiveElement; 
    this.relaseActiveElement = relaseActiveElement; 
    this.colorIndex;
    this.classIndex;
    this.setLine = setLine; 
    this.AddHeader = AddHeader;
    this.sortIndex; 
    this.onSetDefaultSearch = new Function();
    this.selectAll = selectAll;
    this.unSelectAll = unSelectAll;
    this.onChangedLinesChange = new Function('');
    this.onSearch = new Function('');
    this.getItemsCount = getItemsCount;
    this.openAllColumn = openAllColumn;
    this.closeAllColumn = closeAllColumn;
    this.width = '100%'
    this.spaceTopLine = 0;
    this.spaceBottomLine = 0;
    this.onOpenRow = new Function('');
    this.onCloseRow = new Function('');
    this.openRow = openRow;
    this.closeRow = closeRow;
    this.busy = false;
    this.isAllRowsOpen = isAllRowsOpen;
    this.showHeader = true;
    
    function isAllRowsOpen()
    {
        var elements = this.Grid.getElementsByTagName('td');
        for(var i=0;i<elements.length;i++)
        {
            if (elements[i].openrow)
            {
                if (elements[i].className == 'RowOpenCss')
                {
                    return false;
                }
            }
        }
        return true;
    }
    
    
    function openRow(key)
    {
        base.busy = true;
        var elements = this.Grid.getElementsByTagName('td');
        for(var i=0;i<elements.length;i++)
        {
            if (elements[i].openrow)
            {
                if (elements[i].className == 'RowOpenCss')
                {
                    if (elements[i].rDataID.toString() == key.toString())
                    {
                        elements[i].onclick();
                    }
                }
            }
        }
        base.busy = false;
    }
    
    function closeRow(key)
    {
        base.busy = true;
        var elements = this.Grid.getElementsByTagName('td');
        for(var i=0;i<elements.length;i++)
        {
            if (elements[i].openrow)
            {
                if (elements[i].className == 'RowCloseCss')
                {
                    if (elements[i].rDataID.toString() == key.toString())
                    {
                        elements[i].onclick();
                    }
                }
            }
        }
        base.busy = false;
    }
    
    function openAllColumn()
    {
        var elements = this.Grid.getElementsByTagName('td');
        for(var i=0;i<elements.length;i++)
        {
            if (elements[i].openrow)
            {
                if (elements[i].className == 'RowOpenCss')
                {
                    elements[i].onclick();
                }
            }
        }  
    }
    
    function closeAllColumn()
    {
        var elements = this.Grid.getElementsByTagName('td');
        for(var i=0;i<elements.length;i++)
        {
            if (elements[i].openrow)
            {
                if (elements[i].className == 'RowCloseCss')
                {
                    elements[i].onclick();
                }
            }
        }
    }
    
    
    // kaynnistaa validation operaation 
    function check(message,firstErrorKey){
        if (changedLines.length == 0){return false;}
        if (!message){ 
            var oCheck = new validateList(base,base.Data);
            message = oCheck.check();
            firstErrorKey = oCheck.firstErrorKey
        }
        base.errorLayout.writeError(base,message,document.getElementById(ListName),new findError());                             
        if (message){if (message.length > 0){return false;}}
        return true;
            
        function findError(){
            this.execute = execute;
            function execute(){
                var page = FindSelectedPage();
                base.unSelectAll();
                for (var i=0;i<base.Data.length;i++){
                     if (base.Data[i][0].toString() == firstErrorKey){
                        if (page != base.currentPage){
                            selectLine(null,i);
                            goPage(page);
                        }else{
                            for (var l=0;l<gridLines.length;l++){
                                if (gridLines[l].DataId == i){
                                    selectLine(gridLines[l],null);
                                    break;
                                } 
                            }
                        }
                        break;
                    }
                }
            }
        }
    }
    
    // tulostaa errorviestin ( Lista pitaa olla alustetuna ) 
    function writeErrorMessage(message,firstErrorKey){
        if (!firstErrorKey){base.errorLayout.writeError(base,message,document.getElementById(ListName));                             
        }else {check(message,firstErrorKey.toString());} 
    }
    // tulostaa errorviestin ( Lista pitaa olla alustetuna ) 
    function writeMessage(message){
        base.errorLayout.writeMessage(base,message,document.getElementById(ListName));                             
    }
    
    
    // palauttaa muuttuneet rivit 
    function getChangedLines(){
        if (changedLines.length>0){
            return getItems(changedLines,true);
        }else{
            return '';
        }
    }    
    // palauttaa muuttuneet rivit 
    function getAllLines(events){
        return getItems(null,events);
    }    
    function getItemsCount(){
        return base.finder.dataArray.length;
    }
    // asetttaa muuttujaan uuden rivin 
    function setChangedLines(){
        var value;
        var find = false;
        for(var i=0;i<changedLines.length;i++){
            if (changedLines[i] == this.dataId){
                
                find = true;
                break;
            }
        }
        if (!find)
        {
            changedLines[changedLines.length] = this.dataId;
            base.onChangedLinesChange();
        } 
        Data = new Array();
        Data = Data.concat(base.finder.dataArray);
        for(var i=0;i<Data.length;i++){
            if (Data[i][0] == this.dataId ){
                var column = base.columns.getColumn(this.dataInxex);
                if (this.cell){value = column.element.getElementValue(this.cell);
                }else{value = column.element.getElementValue(this);}
                if (column.autoRanking){
                    changedLines = new Array(); 
                    var origValue = parseInt(Data[i][this.dataInxex + 2]);
                    value = parseInt(value); 
                    var iVal;
                    var key;
                    var count = 0;
                    for(var i=0;i<Data.length;i++){
                        changedLines[i] = Data[i][0];
                        iVal = parseInt(Data[i][this.dataInxex + 2]);
                        key = Data[i][0];
                        if (iVal.toString() != '9999' |  this.dataId.toString() == key.toString()){
                            if (value > origValue){ 
                                if (iVal <= value && iVal > origValue){Data[i][this.dataInxex + 2] = parseInt(iVal - 1);} 
                                else if (iVal > value ){Data[i][this.dataInxex + 2] = parseInt(iVal + 0 * 1);} 
                                else if (iVal == origValue ){Data[i][this.dataInxex + 2] = parseInt(value);} 
                                else if (iVal < value ){}  
                                else { Data[i][this.dataInxex + 2] = parseInt(value);}
                            } else {
                                if (iVal >= value && iVal < origValue){Data[i][this.dataInxex + 2] = parseInt(iVal + 1);} 
                                else if (iVal < value ){Data[i][this.dataInxex + 2] = parseInt(iVal + 0 * 1);} 
                                else if (iVal == origValue ){Data[i][this.dataInxex + 2] = parseInt(value);} 
                                else if (iVal > value ){}                                
                                else {Data[i][this.dataInxex + 2] = parseInt(value);}
                            }
                        }
                        if ( parseInt(Data[i][this.dataIndex + 2]).toString() == '9999' ){count ++;}    
                    }
                    column.ranked = count;                      
                }
                else if (column.element.elementType == 'addatecontrol' | column.element.elementType == 'addate' | column.element.elementType == 'addivdatecontrol')
                {
                    if (value.length > 0)
                    {
                        var arr = value.split(base.dateDelimeter);
                        if (arr.length >= 3)
                        {
                            var valuedate = ''; 
                            if (base.dateType == "ddmmyy")
                            {
                                valuedate = arr[1] + '/' + arr[0] + '/' + arr[2] + ' 12:00:00 AM';
                            }
                            else if (base.dateType == "mmddyy")
                            {
                                valuedate = arr[0] + '/' + arr[1] + '/' + arr[2] + ' 12:00:00 AM';
                            }
                            else if (base.dateType == "yymmdd")
                            {
                                valuedate = arr[1] + '/' + arr[2] + '/' + arr[0] + ' 12:00:00 AM';
                            }
                            Data[i][this.dataInxex + 2] = valuedate;        
                        }
                    }     
                    else 
                    {
                        Data[i][this.dataInxex + 2] = '';        
                    }
                }
                else
                {
                    Data[i][this.dataInxex + 2] = value;
                }
                base.finder.dataArray = Data;
		        base.finder.updateData(); 
		        base.Data = new Array() 
		        base.Data = base.Data.concat(base.finder.getData());
	    	    if (column.autoRanking){
	    	        for(var i=0;i<base.columns.length;i++){base.columns.sorts[i] = null;}    
    	            base.columns.sorts[this.dataInxex] = 'desc'; 
    	            sort(parseInt(this.dataInxex), true)
	    	            
                }
		        break;
            } 
        }
        return true; 
    }
    
    function setActiveElement(){
        var element = this;
        window.setTimeout(SetActiveElement,0);
        function SetActiveElement(){
            base.activeElement = element;
            for (var c=0;c<gridLines.length;c++){ 
                var elements = gridLines[c].getElementsByTagName('*');
                for (var i=0;i<elements.length;i++){
                    if (elements[i] == base.activeElement){    
                        base.unSelectAll(); 
                        currentLine = c;
                        selectLine(gridLines[currentLine]);
                        lastIndex = gridLines[currentLine].DataId;        
                        return;
                    }
                }
            }
        }
    }
    
    function relaseActiveElement(){    
        base.activeElement = null;
    }
    
    // Lukitsee koko lista objektin menuineen 
	// ja sulkee menun / tooltipin 
    function lock(){
		
		base.locked = true; 
		base.webMenu.lock(); 
		base.popupMenu.lock(); 
		base.oToolTip.lock();
		base.popupMenu.closePopMenu();
		lockCursor('default'); 
		base.finder.lockFinderCursor('default');
		
		
    }
    function unlock(){
		base.locked = false;
		base.webMenu.unlock(); 
		base.popupMenu.unlock(); 
		lockCursor(''); 
		base.finder.lockFinderCursor('')
    }
    function lockCursor(value){
		var els = base.Grid.getElementsByTagName('*'); 
		for (var i=0;i<els.length;i++){
			els[i].style.cursor = value;
		}
    }
      
    ////////////////////////////////////////////////////////////////////////
    //
    //          Alustaa Listan 
    //
    ////////////////////////////////////////////////////////////////////////
    function initialize(){
        isReady = false; 
        var update = false; 
        var finderOpen = false;
        var listControl =  document.getElementById(ListName);
        if (base.Grid){ 
			update = true; 
		}
		
        base.Navi.initialize();
        base.currentPage = 1;
        currentLine = -1;
        oldOnSelectionEnd = null; 
		oldOnSelection = null;
        visibleColumns = null;
        changedLines = new Array();
        
        if (!update){ 
            base.Navi.initialize();
            initLanguage(this.language);
			// suoritetaan kun listaa luodaan ensimmaisen kerran 
			base.webMenu.setVirtualDirectory(base.virtualDirectory);
			base.popupMenu.setVirtualDirectory(base.virtualDirectory);
			privateOnSelection(selectedLines.items());
			privateOnSelectionEnd(selectedLines.items());
		
			// alustaa hakukoneen 
			base.webMenu.writeWebMenu(listControl);
			base.finder.serverSearch = this.serverSearch;
			base.finder.initialize(listControl);
			base.exportControl.initialize(listControl);
			base.printControl.initialize(listControl);
			base.onSetDefaultSearch();
		}else{
			// suoritetaan kun listaa paivitetaan 
			base.unSelectAll();
			privateOnSelection(selectedLines.items());
			privateOnSelectionEnd(selectedLines.items());
			finderOpen = base.finder.visible;
			base.finder.initialize(listControl);
			//debugger;
			if (finderOpen && !base.finder.serverSearch)
			{
			    removeGridRows(false);    
			}
			else 
			{
			    removeGridRows(true);
			}
			//document.getElementById(ListName).removeChild(base.Grid);
		}
	    
		base.onInit();
        
		if (!update){
            // Haetaan paatable jonne lista rakennetaan 
            base.Grid = document.createElement('table');
            base.Grid.cellSpacing = 0; 
		    base.Grid.cellPadding = 0; 
		    base.Grid.width = base.width;
		    base.Grid.border = 0;   
            base.Grid.className = "ListTableCss";
            listControl.appendChild(base.Grid);
        }
        gridLines = new Array();
        
        // Suorittaa haku toiminnon aitomaattisesti jos data muuttuu ja hakukone on auki 
        if (finderOpen && !base.finder.serverSearch){	
			
						
			// sorttaus laitetaan takaisin 
			var tempSort = base.columns.sortBack();
			if (tempSort){ 
				base.columns.setSort(tempSort[0], tempSort[1]);
				sort(tempSort[1],true,true);
			}
			
			// Lisataan Header osio 
			base.AddHeader(false);
	        if (!base.finder.visible)
	        {
	            // tulostetaan hakukone 
			    base.finder.show();		
	        }
			
			// paivitetaan haku 
			base.finder.update();
	            
        } else {
            
			// Lisataan Header osio 
			base.AddHeader(false);
	        
		    // Lisataan navikointi ja siirrytaan ensimmaiselle sivulle 
	        base.Navi.setPage(0); 
    	}
		
		
		try{this.selectedValues=this.selectedValues.toString().split(',') ;}catch(e){}
	    setLine(this.selectedValues);	
		
        // asetetaan koko listaa koskevat eventit 
        if (!update)
        {
            if (document.attachEvent){ 
                base.Grid.onkeydown = gridKeyDown;
                base.Grid.onkeyup = gridKeyUp;      
            }else{ 
                document.addEventListener('keydown' ,    gridKeyDown , false);
                document.addEventListener('keyup' , gridKeyUp , false);
            }
        }
        if (finderOpen && base.finder.serverSearch && !base.finder.visible ){
             // tulostetaan hakukone 
			base.finder.show();	
        }	    
        
        // laitetaan eventti lista on valmis
        base.onReady();
        base.onResize();
        isReady = true;
    }
    
    // valitsee raakasti kaikki
    function selectAll()
    {
        selectedLines.removeAll();
        for (var ii=0;ii<base.Data.length;ii++)
        {
		    selectedLines.add(ii, base.Data[ii][identityIndex]);  
	    }
	    privateOnSelection(selectedLines.items());
        privateOnSelectionEnd(selectedLines.items());
        goPage(1);
        base.onResize();
        
    }
    function setLine(values)
    {
	    if (values.length > 0){
	        for (var i=0;i<values.length;i++){
			    for (var ii=0;ii<base.Data.length;ii++){
			        if (base.Data[ii][0].toString() == values[i].toString()){ 	    
					    selectLine(null,ii);    
					    break;
				    }
			    }
	        }
	        privateOnSelection(selectedLines.items());
			privateOnSelectionEnd(selectedLines.items());
	    
	        var selectedpage = FindSelectedPage();
		    if (selectedpage){ 
		        if (selectedpage != 0){
		            goPage(selectedpage);
		        } 
            }
            base.onResize();
        }
    }
     
    //////////////////////////////////////////////////////////////////////////
    //                                                                      //
    //  Functiot jotka luovat gridin selaimeen                              //
    //                                                                      //
    //////////////////////////////////////////////////////////////////////////
    function Sort(){
		//alert(this.offsetWidth);
		innerSort(this.Index);
    }
    function innerSort(index){
		if (!base.locked){
			base.oBusy.start();
			window.setTimeout('o' + ListName + '.sort(' + index + ')',1);
		}
    }
    
    // asettaa listan header osion
    function AddHeader(InitData, columnId){
        var oRow;
        var oCell;
        var Image;
      
        if(!InitData){
			// Lisataan menut     
            oRow = base.Grid.insertRow(0);
        }else{
            oRow = base.Grid.rows[0];
        }           
        //oRow.style.backgroundColor = '#D6E7FB';
        oRow.onmouseover = base.mouseoutGrid;
          
        // Lisataan Header Osio 
        for (var cells = 0 ; cells < base.columns.length; cells++ ){
            var column = base.columns.getColumn(cells);
				
        
			if (!InitData){ 
				oCell = oRow.insertCell(cells);
				oCell.Index = cells;
				oCell.innerHTML = column.header;
				if (column.sortable == true){
					Image = '<img style=\'visibility:hidden;cursor:pointer;\' src=\'' + base.virtualDirectory + 'jdm/jdasp/SortDesc.gif\' border=\'0\'>';
					oCell.onclick = Sort;
					var els = oCell.getElementsByTagName('*');
					if (els.length > 0){
						if (els[els.length-1].canHaveHTML)
						{
						    els[els.length-1].style.cursor = 'pointer';
						    els[els.length-1].innerHTML = '<nobr>' + els[els.length-1].innerHTML + Image + '</nobr>';
						}
						else 
						{
    						oCell.innerHTML = '<nobr>' + oCell.innerHTML + Image + '</nobr>';
						}
					}else{
						oCell.innerHTML = '<nobr>' + oCell.innerHTML + Image + '</nobr>';
					}
				}
			}
			else 
			{
			    oCell = oRow.cells[cells];
			}
			
			
			oCell.style.display=''; 
			oCell.className='ListHeaderCellCss';
			oRow.className ='ListHeaderRowCss';
			if (column.sortable == true){
				var oImage = oCell.getElementsByTagName('img')[0];
				if (base.columns.sorts[cells] != null){
					if (base.columns.sorts[cells] == 'asc'){
						Image = base.virtualDirectory + 'jdm/jdasp/SortAsc.gif';
					}else if (base.columns.sorts[cells] == 'desc'){
						Image = base.virtualDirectory + 'jdm/jdasp/SortDesc.gif';
					}
					oImage.style.visibility = '';
					oImage.src = Image;
				}else{
					oImage.style.visibility = 'hidden';
				}
			
			}else{
				// ei voi sortata joten hiiren kursori on oltava normaali 
				oCell.style.cursor = 'default';	
			}
			if (!column.show )
				oCell.style.display='none'; 
			else 
				oCell.style.display=''; 
			
			oCell.style.width = column.calculatedWidt;	
			
		}
		if (!base.showHeader)
		{
		    oRow.style.display = 'none'
		}
    }
    function removeGridRows(header)
    {
        
    	while (base.Grid.rows.length > 2)
		{
			oRow = base.Grid.rows[1];
			oRow.onmouseover = null;
		    oRow.onmouseout = null;
		    oRow.onmousedown = null;
		    oRow.onmouseup = null;
		    oRow.onclick = null;
		    oRow.onselectstart = null;
		    oRow.ondblclick = null;			
            oRow.className = null;
            oRow.DataId = null;    
            oRow.Index = null;
            oRow.toolTip = null;
        	oRow.everyOtherLineClass = null;
			base.Grid.deleteRow(1);
		}
		if(header)
		{
		    oRow = base.Grid.rows[0];
		    oRow.onmouseover = null;
            oRow.className =null;
            for (var i=0;i<oRow.cells.length;i++)
            {
                oRow.cells[i].Index = null;
                oRow.cells[i].onclick = null;
            }
            base.Grid.deleteRow(0);
            
            try
            {
            oRow = base.Grid.rows[0];
            oRow.onmouseover = null;
            base.Grid.deleteRow(0);
            }catch(e){}
		}
    }

    //////////////////////////////////////////////////////////////////////////
    //                                                                      //
    //  Lisaa Listalle Rivit                                                //
    //		                                                                 //
    //////////////////////////////////////////////////////////////////////////
    function AddData(insertData){
        var oRow;
        var oCell;
        var count = 1;
        var Class = everyOtherLineClass;
		var headerRow;
		
		removeGridRows();
		gridLines = new Array();
		
         // Suoritetaan tarvittavat laskelmat 
		try{
			base.numberOfPages = (base.Data.length / base.pageSize);
			if (base.numberOfPages - parseInt(base.numberOfPages) > 0 )
				base.numberOfPages = parseInt(base.numberOfPages) +1;
		}catch(e){
			base.numberOfPages = 0;
		}
		// lasketaan summarivi jos se on maaritelty paalle 
	    if (base.summLineText) if (base.summLineText.length > 0 ) AddSummLine(Class,true);        
                
        // Lisataan varsinainen Data 
        var start = (base.currentPage * base.pageSize) - base.pageSize;
        var end = (base.currentPage * base.pageSize);
        if (start < 0 )
        {
            start = 0;
        }
        if (end == 0)
        {
            end = base.pageSize;
        }
        try
            {
                if (!insertData){
                    if(base.Data[start][2].toString().length == 0)
                    {
                        base.onPageChange(base.currentPage);
                    }
                }
            }
        catch(e){}
        
        if (!visibleColumns)
        { 
            visibleColumns = new Array()
            for (var cells = 0 ; cells < base.columns.length; cells++ )
            {   
                var column = base.columns.getColumn(cells);
                if (column.show)
                {
                    visibleColumns[visibleColumns.length] = [column,cells,base.columns.getHtmlBeginColumn(column)];
                } 
            }
        }
        // poistutaan jos ei ole dataa alkuvalmistelut on kuitenkin tehty 
        if (!base.Data)
        {
            return;
        } 
        base.busy = true;
        // tulostellaan vain jos on dataa mita tulostaa
        if (base.Data.length > 0 )
        {
            var grid = base.Grid;
            headerRow = grid.rows[0];
            for (var i = start ; i < end ;i++){
			    
			    if (base.spaceTopLine > 0)
			    {
			        oRow = grid.insertRow(grid.rows.length -1 );
			        oCell = oRow.insertCell(0);
			        oCell.colSpan = visibleColumns.length;
			        oCell.height = 5; 
			    }
			    
			    oRow = grid.insertRow(grid.rows.length -1 );
			    //oRow = grid.insertRow(i- start +1);
			    oRow.onmouseover = Mouseover;
			    oRow.onmouseout = Mouseout;
			    oRow.onmousedown = Mousedown;
			    oRow.onmouseup = Mouseup;
			    oRow.onclick = Click;
			    oRow.onselectstart = Onselectstart;
			    
			    
			    if (document.addEventListener)
			    {
			        oRow.style.weight = 'unselectable';// = true;
			        oRow.unselectable = '1';
			    } 
			    oRow.ondblclick = dblClick;			
	            oRow.style.cursor = 'default';
    	        
			    oRow.className = Class;
                // apu arvoja asetetaan suoraan row objektiin 
                oRow.DataId = i;    
                oRow.Index = count - 1;
                
                // asetetaan tooltip vain jos sellainen on olemassa 
                if (base.toolTipText.length > 0)
                {
                    var str = setTooltip(base.Data[i]);
            	    if (str.length > 0)
            	    {
            	        oRow.toolTip = base.oToolTip.initialize(str,oRow,false);
            	    } 
                } 
    				
    			var openrowCell = null;
                // loopataan esilla olevat columit ja asetetaan arvot taulukkoon 
                for (var cells = 0 ; cells < visibleColumns.length; cells++)
                {   
				    oCell = oRow.insertCell(cells);
                    //if (headerRow)
                    //{ 
                    //   oCell.style.width = headerRow.cells[cells].offsetWidth;
                    //}
                    // haetaan ja alustetaan columnit
                    var column = visibleColumns[cells][0];
                    var index = visibleColumns[cells][1];
                    var htmlBeginIndex = visibleColumns[cells][2];
                    var htmlBeginData = new Array();
                    
                    if (i == start)
                    {
                        column.elementCount = 0;
                    }
              
                    if (htmlBeginIndex)
                    {
                        for(var hbi = 0;hbi<htmlBeginIndex.length;hbi++)
                        {
                            htmlBeginData[htmlBeginData.length] = base.Data[i][htmlBeginIndex[hbi]];
                        }
                        //htmlBeginData = base.Data[i][htmlBeginIndex];
                    }
                    
                    if (base.colorIndex)
                    {
					    column.setData(oCell,base.Data[i][index + 2],base.Data[i][base.colorIndex],null,base.Data[i][0],htmlBeginData,"CellCss");
                    }
                    else if (base.classIndex)
                    {
                        column.setData(oCell,base.Data[i][index + 2],null,null,base.Data[i][0],htmlBeginData,base.Data[i][base.classIndex]);
                    }
                    else
                    {
                	    column.setData(oCell,base.Data[i][index + 2],null,null,base.Data[i][0],htmlBeginData,"CellCss");
                    }
                    if (oCell.openrow)
                    {
                        for (var or=0;or<base.openedRows.length ;or++)
                        {
                            if (base.openedRows[or] == base.Data[i][0])
                            {
                                openrowCell = oCell;    
                                break;
                            }
                        }
                    }
                }
                
                
                
                // asetetaan riville tyylimaarityukset 
			    oRow.everyOtherLineClass = Class;
			    if (Class == everyOtherLineClass)
			    {
			        Class = 'LineCss';
			    }
			    else 
			    {
			        Class = everyOtherLineClass;
			    }
			    
			    if (openrowCell)
			    {
			        openrowCell.onclick();
			    }
				
                // asetetaan valutut rivit 
                if (selectedLines.length > 0)
                { 
                    if (selectedLines.exists(i))
                    {
                        selectLine(oRow);   
                        if (currentLine == -1)
                        {
                            currentLine = count-1;
                        }
                    }
                }
                
                // asetetaan omaan array objektiin helpottaa kasittelya 
			    gridLines[count - 1] = oRow;
    	            
                if (base.spaceBottomLine > 0)
			    {
			        oRow = grid.insertRow(grid.rows.length -1 );
			        oCell = oRow.insertCell(0);
			        oCell.colSpan = visibleColumns.length;
			        oCell.height = 5; 
			    }    	            
    	               
                count ++;
                if ( i >= base.Data.length -1  )
                {
                    // jos data loppuu poistutaan loopista 
                    break;      
                }    
            }
        }
        
        
        // tulostetaan summarivi jos se on maaritelty paalle 
        if (base.summLineText)
        {
            if (base.summLineText.length > 0 ) 
            {
                AddSummLine(Class,false);
            }
        } 
        
        // roskat pois 
        try{CollectGarbage();}catch(e){}
        base.busy = false;
    }
	
	function AddSummLine(Class,initialize){
        var oRow;
        var oCell;
        var init = false;
        
        if (initialize){
			for (var cells = 0 ; cells < base.columns.length; cells++ ){   
				var column = base.columns.getColumn(cells);
				if (column.dataType == 'summ'){
					for (var i=0;i<base.Data.length;i++) 
						calculateSumm(column,base.Data[i]);
				}
			}	
        }
        else
        {
			oRow = base.Grid.insertRow(gridLines.length + 1);	            
			oRow.onmouseover = base.mouseoutGrid;
			oRow.className = 'SummLineCss';	        
			var textCell;
			for (var cells = 0 ; cells < base.columns.length; cells++ ){   
				
	            oCell = null;
				var column = base.columns.getColumn(cells);
				if (!init){ 
				    oCell = oRow.insertCell(cells);
					oCell.innerHTML = base.summLineText;
					textCell = oCell;    
					init = true;
				}else if (column.calculateType == 'summ'){ 
					oCell = oRow.insertCell(oRow.cells.length);
					column.setData(oCell,calculateRowSumm(column),null);
					textCell = null 
				}else{	
            		if (textCell)
            		{
            		    textCell.colSpan = cells + 1;
            		}
            		else
            		{
            		    oCell = oRow.insertCell(oRow.cells.length);
            		    column.setData(oCell,'',null);
            		}
				}
				if (oCell)
				{
				oCell.className = 'SummLineCss';	        
				if (!column.show)
					oCell.style.display='none'; 
				else 
					oCell.style.display=''; 			
		        }
			}
        }
        
        function calculateRowSumm(column){
			var index = column.key + 2 * 1;
			var result = 0; 
			for ( var i =0;i<base.Data.length;i++){
				if (base.Data[i][index]) 
					result += base.Data[i][index];
			}
			if (parseInt(result) != result) 
				return parseInt(result * 100 + .5) /100 ;
			else 
				return result;
        }
    }
   
   
    // asettaa tooltip tekstin tietojoukon perusteella 
    var tooltipColumns;
    function setTooltip(DataArray){
		var text = new String(); 
		var column;
		text = base.toolTipText; 
		if (text.lastIndexOf('#') > 0 ){ 
			if (!tooltipColumns)
			{
			    tooltipColumns = new Array();
			    for (var cells = 0 ; cells < base.columns.length; cells++ ){
		            column = base.columns.getColumn(cells);
			        if (text.indexOf('#' + column.dataKey + '#') > -1)
			        {
			            text = text.replace('#' + column.dataKey + '#',column.htmlBegin + DataArray[column.key + 2] + column.htmlEnd);    
			            tooltipColumns[tooltipColumns.length] = column;
			        }
			    }
			}
			else 
			{
			    for (var cells = 0 ; cells < tooltipColumns.length; cells++ ){
				    column = tooltipColumns[cells];
				    text = text.replace('#' + column.dataKey + '#',column.htmlBegin + DataArray[column.key + 2] + column.htmlEnd);
			    }
			}
		}
		return trim(text);
    }
    function trim(str)
    {
       return str.replace(/^\s*|\s*$/g,"");
    }

    
    function calculateSumm(column,DataArray){
		// laskenta suoritataan aina koska jatkossa data voimuuttua ksesken listan elinian ja 
		// lsakenta ei hidasta listan esittamista oleellisesti
		var  result = 0;  
		for (i = 0;i<column.sumFields.length;i++){
			if (column.sumFields[i]){ 
				var o = parseInt(column.sumFields[i]);	
				result += (DataArray[o + 2] * 1); // ei parseInt koska halutaan desimaalit samassa muodossa 
			}
		}
		DataArray[column.key+2] = result;   
		return result; 
    }
   
   
      
   	
    
    //////////////////////////////////////////////////////////////////////
    //  Privaatit apufunctiot                                           //
    //////////////////////////////////////////////////////////////////////
      
    // valitsee rivin listalta                                          
    function selectLine(oRow,DataIndex){
        if (!base.canSelect) return;  
        if (!base.multiSelect) 
			base.unSelectAll();
        // Select Line 
        if (oRow){ 
            oRow.className = selectedClass;
//            if (!base.multiSelect){ 
//                for (var i=0;i<oRow.cells.length;i++){
//                    var els = oRow.cells[i].getElementsByTagName('*');
//                    for (var e=0;e<els.length;e ++){
//                        if (els[e].tagName != 'OPTION'){ 
//                            els[e].origClass= els[e].className;
//                            els[e].className = selectedClass;
//                        }
//                    }
//                }
//            }
            if (!selectedLines.exists(oRow.DataId)){
				selectedLines.add(oRow.DataId, base.Data[oRow.DataId][identityIndex]);
			}
        }else{
            if (!selectedLines.exists(DataIndex)){
				selectedLines.add(DataIndex, base.Data[DataIndex][identityIndex]);
			}
        }
    }
      
    // poistaa rivivalinnen listalta 
    function unSelectLine(oRow,DataId){
        // Unselect Line 
        if (oRow){
			if (selectedLines.exists(oRow.DataId)){ 
				oRow.className = oRow.everyOtherLineClass;
				oRow.style.color = oRow.lineColor;
//				if (!base.multiSelect){ 
//				    for (var i=0;i<oRow.cells.length;i++){
//                        var els = oRow.cells[i].getElementsByTagName('*');
//                        for (var e=0;e<els.length;e++){
//                            if (els[e].tagName != 'OPTION'){ 
//                                els[e].className = els[e].origClass;
//                                els[e].style.color = oRow.lineColor;
//                            }
//                        }
//                    }
//                }
				DataId = oRow.DataId;
				selectedLines.remove(DataId);
			}
        }else{
			if (selectedLines.exists(DataId)) 
				selectedLines.remove(DataId);
		}
    }

    // poistaa kaikki valinnat 
    function unSelectAll(){
		for (var i = 0;i< gridLines.length;i++){
			unSelectLine(gridLines[i]);
		}
		selectedLines.removeAll();
    }
    
      
    // suorittaa lajittelun 
    function sort(columnId, resort,simple){
        var colSort;
        var PageId = 1;
        base.activeElement = null;
        if (base.Data.length == 0){
             base.oBusy.relase();  
             return;		
		}else{
			if (columnId == null){
				for( var i = 0;i< base.columns.sorts.length;i++){
					if (base.columns.sorts[i] != null){
						columnId = i;
						break;
					}
				}
				if(columnId == null){
					goPage(base.numberOfPages+1);
					return;
				}
			}
			var origColumnId = columnId; 
			var sortIndex = base.columns.getColumn(columnId).sortIndex;
			if (sortIndex){columnId = sortIndex; }
			
			var listData = new Array(); 
			listData = listData.concat(base.Data);
			var oldSort = base.columns.sorts[origColumnId];
            
            if (oldSort == null | resort){ 
				if (!base.sortIndex)
				{
				    base.sortIndex = base.Data[0].length;		 
				}
				
				if (base.columns.getColumn(columnId).dataType == 'date' | base.columns.getColumn(columnId).dataType == 'shortdate' ){
			        // konvertoidaan kaikki pvm tiedoksi jotta vertailu onnistuu 
			        //for (var i = 0; i < base.Data.length ;i++){
                    //    base.Data[i][parseInt(columnId + 2)] = Date.parse(base.Data[i][parseInt(columnId + 2)]); 
                    //}
//					colSort = new Function('a','b',
//                    ' var a_value = a[' + parseInt(columnId + 2) + '];' +
//					' var b_value = b[' + parseInt(columnId + 2) + '];' +
//					'if (!a_value){a_value=0;}' +
//					'if (!b_value){b_value=0;}' +
//					'if (parseInt(a_value) < parseInt(b_value)) return -1;' +
//					'else if (parseInt(a_value) > parseInt(b_value)) return 1;' +
//					'else return 0;');					                    
                    
                    
                    colSort = new Function('a','b',
                    ' var a_value = Date.parse(a[' + parseInt(columnId + 2) + ']);' +
					' var b_value = Date.parse(b[' + parseInt(columnId + 2) + ']);' +
					'if (!a_value){a_value=0;}' +
					'if (!b_value){b_value=0;}' +
					'if (parseInt(a_value) < parseInt(b_value)) return -1;' +
					'else if (parseInt(a_value) > parseInt(b_value)) return 1;' +
					'else return 0;');					
				}else if (base.columns.getColumn(columnId).dataType == 'int'  ){
					colSort = new Function('a','b',
					' var a_value = a[' + parseInt(columnId + 2)  + '];' +
					' var b_value = b[' + parseInt(columnId + 2) + '];' +
					'if (!a_value){a_value=0;}' +
					'if (!b_value){b_value=0;}' +
					'if (a_value < b_value) return -1;' +
					'else if (a_value > b_value) return 1;' +
					'else return 0;');
				}else if(typeof (base.Data[0][columnId + 2]) == 'string'){
				    //for (var i = 0; i < base.Data.length ;i++){
                    //    base.Data[i][base.sortIndex] = base.Data[i][parseInt(columnId + 2)].toLowerCase();
                    //}
//					colSort = new Function('a','b',
//					' var a_value = a[' + base.sortIndex + '];' +
//					' var b_value = b[' + base.sortIndex + '];' + 
//					'if (!a_value){a_value=\'\';}' +
//					'if (!b_value){b_value=\'\';}' +
//					'if (a_value < b_value) return -1;' +
//					'else if (a_value > b_value) return 1;' +
//					'else return 0;');				
					colSort = new Function('a','b',
					' var a_value = a[' + parseInt(columnId + 2)+ '].toLowerCase();' +
					' var b_value = b[' + parseInt(columnId + 2) + '].toLowerCase();' + 
					'if (!a_value){a_value=\'\';}' +
					'if (!b_value){b_value=\'\';}' +
					'if (a_value < b_value) return -1;' +
					'else if (a_value > b_value) return 1;' +
					'else return 0;');				
				}else{
				
					colSort = new Function('a','b',
					' var a_value = a[' + parseInt(columnId + 2) + '];' +
					' var b_value = b[' + parseInt(columnId + 2) + '];' +
					'if (!a_value){a_value=0;}' +
					'if (!b_value){b_value=0;}' +
					'if (a_value < b_value) return -1;' +
					'else if (a_value > b_value) return 1;' +
					'else return 0;');				
				} 
			
				
				// suoritetaan sorttaus
				listData.sort(colSort); 
				
				if (resort && oldSort == 'asc'){
					listData.reverse();
				}
            }else
            {
				listData.reverse();
            }
            
			if (!resort){ 
				if (base.columns.sorts[origColumnId] == 'desc'){
					base.columns.setSort('asc',origColumnId);
				}else{
					base.columns.setSort('desc',origColumnId);
				}
			}
		    base.Data = new Array();
		    base.Data = base.Data.concat(listData);
		    if (!simple){
				selectedLines.refresh(base.Data,identityIndex);
				base.oBusy.relase();  
				// Poistetaan entiset rivit   
				PageId = FindSelectedPage();
				base.AddHeader(true, origColumnId);
				goPage(PageId);
			}
		}
    }
   
    // etsii valitun sivun 
    function FindSelectedPage(){
        var pageId = 1;
        var counter = 0;
        var find = false;
        for (var i = 0; i < base.Data.length ;i++){
            if ( base.Data[i][identityIndex] ==  selectedLines.items()[0]){
                find = true;
                break;
            }
            counter = counter + 1 
            if (counter == base.pageSize){
                pageId = pageId + 1;
                counter = 0;
            }
        }
        if (!find){ 
            return 1;
        }else{
            return pageId;
        }
    }
    // Navikointia vaihtaa esitettavan sivun
    function goPage(pageId){
        if (!base.locked)
        {    
			base.activeElement = null;
		
			// Suoritetaan tarvittavat laskelmat
			base.numberOfPages = (base.Data.length / base.pageSize);
			if (base.numberOfPages - parseInt(base.numberOfPages) > 0 )
				base.numberOfPages = parseInt(base.numberOfPages) +1;
			if (parseInt(pageId) < base.numberOfPages){
			base.currentPage = pageId;
			}else if (parseInt(pageId) >= base.numberOfPages){
				base.currentPage = base.numberOfPages;
			} else {
				base.currentPage = 1;
			}
			currentLine = -1;
			AddData();
			base.Navi.setPage(pageId);
			
			// disabloi menut tilanteessa jossa dataa ei ole ja menuille on asetettu 
			// disableWhenNoItems arvoon true 
			base.webMenu.onItemsChange(base.Data.length);
			base.popupMenu.onItemsChange(base.Data.length);
			
			// palautetaan lopuksi eventti joka muuttaa ikkunan kokoa 
			base.onResize();
		}
    }
    
    
    function setKeyMask(e){
		if (!base.locked){
			var Key; 
			if (navigator.appName=='Microsoft Internet Explorer'){
				Key = window.event.keyCode; 
				shiftMask = window.event.shiftKey;
				ctrlMask = window.event.ctrlKey;
			} else if (navigator.appName=='Netscape'){
				Key = e.which;
				shiftMask = e.shiftKey;
				ctrlMask = e.ctrlKey;
			}
			return Key;
		}
    }

      
    ///////////////////////////////////////////////////////////////////////////////////////////////
    //      Gridin Eventit
    //
	///////////////////////////////////////////////////////////////////////////////////////////////
    function gridKeyDown(e){
		if (base.locked)return; 
		
		// suljetaan tooltip ja menut 
		base.oToolTip.enable(false);
		base.popupMenu.closePopMenu();
		
		var Key;
		var cancelEvent = true;
		var oKey;
		
		if (navigator.appName=='Microsoft Internet Explorer'){
			e = window.event;
			Key =e.keyCode; 
			shiftMask = e.shiftKey;
			ctrlMask = e.ctrlKey;
		} else if (navigator.appName=='Netscape'){
			Key = e.which;
			shiftMask = e.shiftKey;
			ctrlMask = e.ctrlKey;
		}
        oKey = Key;
        if (base.Grid.style.display == 'none')return;
        //if (!base.canSelect && Key == 9){return;} 
        if (base.activeElement && (Key == 38 | Key == 40)){
            if (base.activeElement.tagName == 'SELECT'){return;} 
            try // poistaa valinnan kivasti kun vaihdetaan rivia 
            { 
                base.activeElement.style.display='none';
                base.activeElement.style.display='';
            } catch(exp){}
            relaseActiveElement();
        }else if (base.activeElement && Key == 9){
            if (shiftMask && currentLine == 0 ){
                
                for (var i=0;i<visibleColumns.length;i++){
			        var column = visibleColumns[i][0];
			        var index = visibleColumns[i][1]; ;
			        if (column.element){
		                var els = gridLines[0].cells[i].getElementsByTagName(column.element.Element.tagName);
	                    needPageChange(els,38);
	                    break; 		            
			        } 
		        }
		        if (Key == 9)return; 		            	
            } else if (!shiftMask && currentLine == (gridLines.length-1) ){
                for (var i=visibleColumns.length -1 ;i>=0;i--){
                    var column = visibleColumns[i][0];
			        var index = visibleColumns[i][1]; ;
			        if (column.element){
		                var els = gridLines[gridLines.length-1].cells[i].getElementsByTagName(column.element.Element.tagName);
	                    needPageChange(els,40);
                        break; 		            
			        }
                }
                if (Key == 9)return; 
            } else {
                return;
            }
        }else if (base.activeElement){
            return;
        } 
        
        
        if (!ctrlMask){
            if (Key == 9){
                setFocus();
            }else if (Key == 37){
				if ( base.currentPage > 1) 
					goPage(base.currentPage - 1);
			} else if (Key == 39){
				if ( base.currentPage < base.numberOfPages) 
					goPage(base.currentPage + 1);	
			} else if (Key == 40){
                if (currentLine == -1){
                    if(!shiftMask)
                        base.unSelectAll(); 
                    currentLine = 0;
                    selectLine(gridLines[currentLine]);
                    lastIndex = gridLines[currentLine].DataId;
                }else{
                    if (currentLine < gridLines.length - 1){ 
                        currentLine++;
                        if (!shiftMask  && selectedLines.length == 1){ 
							unSelectLine(gridLines[currentLine-1]);
                        }else if (!shiftMask){ 
                            base.unSelectAll();   
                        }else if (shiftMask){ 
                            if (selectedLines.exists(gridLines[currentLine].DataId))
                                unSelectLine(gridLines[currentLine-1]); 
                        }
                        selectLine(gridLines[currentLine]);
                        lastIndex = gridLines[currentLine].DataId;
                    }else{
                        if (base.currentPage < base.numberOfPages){
                            goPage(base.currentPage + 1);
                            currentLine = 0;
                            if(!shiftMask)
                                base.unSelectAll(); 
                            else if (shiftMask)
                                if (selectedLines.exists(gridLines[currentLine].DataId))
                                    unSelectLine(null, gridLines[currentLine].DataId - 1); 
                            selectLine(gridLines[0]);
                            lastIndex = gridLines[0].DataId;
                        }
                    }
                }
            }else if (Key == 38) {
                if (currentLine == -1){
                    if(!shiftMask)
                        base.unSelectAll(); 
                    currentLine = gridLines.length-1;
                    selectLine(gridLines[currentLine]);
                    lastIndex = gridLines[currentLine].DataId;
                }else{
                    if (currentLine > 0){ 
                        currentLine--;
                        if (!shiftMask  && selectedLines.length == 1){ 
							unSelectLine(gridLines[currentLine + 1]);
                        }else if (!shiftMask ){
                            base.unSelectAll();
                        }else if (shiftMask){
                            if (selectedLines.exists(gridLines[currentLine].DataId))
                                unSelectLine(gridLines[currentLine + 1]); 
                        }
                        selectLine(gridLines[currentLine]);
                        lastIndex = gridLines[currentLine].DataId;
                    }else{
                        if (base.currentPage > 1){
                            goPage(base.currentPage - 1);
                            currentLine = gridLines.length-1;
                            if(!shiftMask)
                                base.unSelectAll(); 
                            else if (shiftMask) 
                                if (selectedLines.exists(gridLines[currentLine].DataId))
                                    unSelectLine(null,gridLines[currentLine].DataId + 1); 
                            selectLine(gridLines[gridLines.length-1]);
                            lastIndex = gridLines[gridLines.length-1].DataId;
                        }
                    }
                }
            }
            else{
				//finder.keyPress(Key);	
				base.popupMenu.keyPress(Key,shiftMask,ctrlMask);	
				
            }
            
            if (oKey != Key && oKey == 9){
                window.setTimeout(setFocus,0);
            } 
            
            if (cancelEvent){
				try{
				    if (e.target)
					{
					    return;
					}
				    // lopetetaan event 
					if (e.preventDefault){
						e.preventDefault();
						return false;
					}
					else {
						e.keyCode = 0;
						e.returnValue = false;
					}	
				}catch(ee){}					
			}
			
		}
		
		// asettaa fokuksen elementille kun sivu muuttuu tai kun ei ole viela valittuna 
		// mitaan
		function setFocus(){
            if(!shiftMask){
                for (var i=0;i<visibleColumns.length;i++){
		            var column = visibleColumns[i][0];
			        var index = visibleColumns[i][1]; ;
		            if (column.element){
		                if (currentLine == -1) currentLine = 0;
	                    if (column.element.elementType == 'adradio' | column.element.elementType == 'adcheckbox'){ 
	                        var els = gridLines[currentLine].cells[i].getElementsByTagName('INPUT');
	                        els = els[0].focus();
	                    }else{
	                        var els = gridLines[currentLine].cells[index].getElementsByTagName(column.element.Element.tagName);
	                        els[0].focus();
	                    }
	                    break;    
		            } 
	            }	
            } else {
                for (var i=visibleColumns.length -1 ;i>=0;i--){
		            var column = visibleColumns[i][0];
			        var index = visibleColumns[i][1]; ;
		            if (column.element){
		                if (currentLine == -1) currentLine = gridLines.length-1;
	                    if (column.element.elementType == 'adradio' | column.element.elementType == 'adcheckbox'){ 
	                        var els = gridLines[currentLine].cells[i].getElementsByTagName('INPUT');
	                        els = els[els.length -1].focus();
	                    }else{
	                        var els = gridLines[currentLine].cells[index].getElementsByTagName(column.element.Element.tagName);
	                        els[0].focus();
	                    }
	                    break;    
		            } 
	            }
            }
        }
        
        // tarkistaa tarvitaanko sivunvaihtoa
        function needPageChange(els,newKey){
            if (base.activeElement == els[0]){
                Key = newKey;
                cancelEvent = true;
                return;        
            } else {
                if (column.element.elementType == 'adradio'){
                    for (var t =0;t<els.length;t++){
                        var subEls = els[t].getElementsByTagName('*');
                        for ( var c=0;c<subEls.length;c++){
                            if (base.activeElement == subEls[c]){    
                                Key = newKey;
                                cancelEvent = true;
                                return;        
                            } 
                        }
                    } 
                }else if (column.element.elementType == 'adcheckbox'){
                    els = els[0].getElementsByTagName('INPUT');
                    if (currentLine == 0 ){
                        if (els[0] == base.activeElement){
                            Key = newKey;
                            cancelEvent = true;
                            return;        
                        }
                    } else {
                        if (els[els.length-1] == base.activeElement){
                            Key = newKey;
                            cancelEvent = true;
                            return;        
                        }
                    }
                } 
            }
        }
        return true;    
    }
	function gridKeyUp(e){
        if (!base.locked){
			base.setKeyMask(e);
			if (!shiftMask)
				privateOnSelectionEnd(selectedLines.items());
			privateOnSelection(selectedLines.items());
		}
	}
    function Onselectstart(e){
        if (!e)
        {
            e = event;
        }
        
        if (base.activeElement) 
        {
            return true; 
        }
        else 
        {   
            if (base.canSelect)
            {
                if (e.preventDefault){e.preventDefault();}
            }
            // lisatty toiminto jos ei voi valita voi maalata 
            return !base.canSelect;
        }
        
    }
    function mouseoutGrid(e){
        if (!base.locked){
			base.setKeyMask(e);
			MultiSelect = false;
			privateOnSelectionEnd(selectedLines.items());
			privateOnSelection(selectedLines.items());
		}
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////
	//      Data Rown Eventit
    //
    ///////////////////////////////////////////////////////////////////////////////////////////////
    function Click(e){
        if (!base.locked){
			if (!e) e = event;
			if (e.button != 2){
				
				var startIndex = -1;
				var endIndex = -1;
				if (shiftMask){
					if (selectedLines.length > 0 ){
						base.unSelectAll();
					} 
					for (var i = 0;i< base.Data.length;i++){
						if ( i == lastIndex | i == this.DataId){
							if (startIndex == -1){
								startIndex = i;
							}else {
								endIndex = i + 1;
								break;
							}   
						} 
					}
					var find;
					if (startIndex > -1 && endIndex > -1){
						for (var i = startIndex;i < endIndex;i++){
							find = false;
							for (var ii = 0;ii < gridLines.length;ii++){
								if (gridLines[ii].DataId == i){
									find = true;
									selectLine(gridLines[ii]);
									break;
								}
							}
							if (!find)
								selectLine(null,i);
						}
					}
					if (!shiftMask)
						privateOnSelectionEnd(selectedLines.items());
					privateOnSelection(selectedLines.items());
				}else{
					lastIndex = this.DataId;
				}
			}
		}
	}	  
    function Mouseover(e){
        if (!base.locked){
			if (this.toolTip)this.toolTip.showTip();
			if (!shiftMask && !ctrlMask){
				if(MultiSelect){ 
					selectLine(this);
					if (startLine > this.Index){
						// valitaan valilta jotka eivat saa evnttia 
						for(var i = this.Index;i<lastLine;i++){
							selectLine(gridLines[i]);
						}
						if (lastLine < this.Index ){
							// poistetaan kaikki valilta jotka eivat saa eventtia 
							for(var i = lastLine;i<this.Index;i++){
								unSelectLine(gridLines[i]);
							}
							unSelectLine(gridLines[lastLine]);
						}
					}else if (startLine < this.Index){
						// valitaan valilta jotka eivat saa evnttia 
						for(var i = lastLine;i<this.Index;i++){
							selectLine(gridLines[i]);
						}
						if (lastLine > this.Index ){
							// poistetaan kaikki valilta jotka eivat saa eventtia 
							for(var i = this.Index;i<lastLine;i++){
								unSelectLine(gridLines[i]);
							}
							unSelectLine(gridLines[lastLine]);
						}
					}
					else{
						if (lastLine != this.Index ){
							unSelectLine(gridLines[lastLine]);
						}
					}
					privateOnSelection(selectedLines.items()); 
				}
			}
		}
    }
    function Mouseout(e){
        if (!base.locked){
			if(this.toolTip)this.toolTip.hideTip();
			if (!shiftMask && !ctrlMask){
				lastLine = this.Index;
			}
		}
    }
    function Mousedown(e){
		if (!base.locked){
			if (!e) e = event;
			if (e.button != 2){
			base.setKeyMask(e);
			if (!shiftMask && !ctrlMask && e.button != 2){
				base.unSelectAll();
				if (base.multiSelect) 
					MultiSelect = true;
				selectLine(this);
				startLine = this.Index;
			
			} else if (ctrlMask && e.button != 2){
				if (selectedLines.exists(this.DataId))
					unSelectLine(this); 
				else
					selectLine(this);
				} 
			} 
		}
		this.onselectstart(e);
	}
    function Mouseup(e){
		if (!base.locked){
			if (!e) e = event;
			if (e.button != 2){
				MultiSelect = false;
				currentLine = this.Index;
				if (!shiftMask)
					privateOnSelectionEnd(selectedLines.items());
				privateOnSelection(selectedLines.items()); 
			}
		}
	}
    function dblClick(){
		if (!base.locked){
			try{ base.webMenu.onDblClic(base.dblClickMenu);}catch(e){}
			try{ base.popupMenu.onDblClic(base.dblClickMenu);}catch(e){}
		}
    }
      
    function privateOnSelection(objarray){
		if (!objarray) return;
		base.onSelection(objarray);
    }
    
    function privateOnSelectionEnd(objarray){
		if (!objarray) return;
		base.popupMenu.setValue(objarray);
		base.webMenu.setValue(objarray);
	    
		//if (objarray.toString().length > 0) 
		if (isReady)
		    base.onSelectionEnd(objarray);
	}
     
    
    // asettaa menuille disabled arvot oletuksena 
    // puun oikeus tason mukaan 
	function setMenuDefaults(Menu,values){
	 
		if (Menu.workingMode == 'normal'){
			if (values.toString().length == 0){
				Menu.disabled = true;
			}else{
				if (values.toString().split(',').length > 1){ 
					Menu.disabled = true;
				}else{
					Menu.disabled = false;
				}
			}
		}else if (Menu.workingMode == 'multiselect'){
			if (values.toString().length == 0){
				Menu.disabled = true;
			}else{
				Menu.disabled = false;
			}
		}else if (Menu.workingMode == 'noselecion'){
			Menu.disabled = false;
			return;
		}
		if (!Menu.roleLevel )
		{
		    return; 
		}
		else if (Menu.roleLevel > 0)
        {					
            // 0 = NoPermission 
		    // maaritellaan disabled roolitason mukaan 
		    if (!Menu.disabled){
			    for (var i=0;i<values.length;i++){
				    for(var ii=0;ii<base.Data.length;ii++){
					    if (base.Data[ii][0] == values[i]){
						    if (Menu.roleLevel > base.Data[ii][1] && base.Data[ii][1] > 0 && base.Data[ii][1].toString().length == 1){
							    // menun oikeudet list ittemiin ei riita tavallinen case RoleLevel valilta 0 - 4 
							    Menu.disabled = true;
						    }else if (base.Data[ii][1].toString().charAt(Menu.roleLevel) != '1'  && base.Data[ii][1] > 0 && base.Data[ii][1].toString().length > 1){
							    // AccessString Case RoleLEvel muotoa 1000000
							    // menun oikeudet nodeen ei riita 
							    Menu.disabled = true;
						    }	
						    break;
					    } 
				    }
				    if (Menu.disabled){
					    break;
				    } 
			    }
		    }
		}
    }
    
    
	// tama ei toimi oikein suorittaa koodia ilman naita maarityksia 
	// pitaa laittaa doevents jotta saa tiomimaan 
	function busyHandler(object,parentObject){
		this.start = start; 
		this.relase = relase;
		this.busy = false; 
		this.label = "Ladataan ...";
		var base = this;
		
		var elements;
		var div = document.createElement("div"); 
		div.style.position = 'absolute';
		div.style.display = 'none'; 
		div.style.backgroundColor = 'white';	
		object.appendChild(div);
		
		function start(){
		    if (!base.busy)
		    {
		        try
		        {
		            var top = getAbsoluteTop(parentObject.Grid.rows[1]);
		            var height =  parentObject.Grid.offsetHeight - parentObject.Grid.rows[1].offsetTop;
		            //height = height - parentObject.Grid.rows[parentObject.Grid.rows.length-1].offsetHeight;
		            div.style.width = object.offsetWidth; 
			        div.style.height = object.offsetHeight; 
			        div.style.display = ''; 
			        div.style.top = top;
			        div.style.height = height;
			        div.innerHTML = "<center><table height='100%'><tr><td valign='middle' class='textcss' >" + base.label + "</td></tr></table></center>";
			    }
			    catch(e){}
			}     
		}
		function relase(){
			div.style.display = 'none'; 
			this.busy = false;
		}
	}
	
	
	// poistaa listalta kaiken datan 
	function setAllItems(Items){
	
	    //removeAllItems();
		var newData = new Array();
		newData = newData.concat(Items);
        
        base.Data = new Array();
        base.finder.setData(new Array());
        
        base.Data = base.Data.concat(base.finder.getData());
        
        base.unSelectAll();
        base.finder.setData(newData);
        base.Data = base.Data.concat(base.finder.getData());
        
        goPage(base.currentPage);
	}
	
	// Paivittaa listalle dataa 
	function setItems(Items,insertData,addtop){

		var find;
		var lastNew = -1;
		var Data = new Array();
		Data = Data.concat(base.finder.dataArray);

        // paivitetaan data 
		for (var it=0;it<Items.length;it++){
			find = false;
			for (var i = 0; i < Data.length ;i++){
				if ( Data[i][0] ==  Items[it][0]){
					Data[i] = Items[it];			
					find = true;
				}    
            }
            if (!find){
			    if (addtop)
			    {
			        lastNew	= 0;
				    var Data2 = new Array();
				    Data2[0] = Items[it];
				    Data2 = Data2.concat(Data);
				    Data = Data2;
			    }
			    else
			    {
			        lastNew	= Data.length;
				    Data[Data.length] = Items[it];		
			    }
            } 
        } 

        base.finder.dataArray = Data;
		base.finder.updateData(); 
		base.Data = new Array() 
		base.Data = base.Data.concat(base.finder.getData());
		
		if (!insertData){
		    if (lastNew > -1){
		        // valitaan viimeinen uusi arvo 
		        base.unSelectAll();
		        selectLine(null,lastNew);
		    }
    	
    		if (base.columns.isSort) 
    		{
    		    // sortataan lista uudelleen koska datan sisalto on muuttunut 
                sort(null,true);
    		}
		
            // paivitetaan esilla oleva sivu 
            goPage(base.currentPage);
    	
	        // paivitetaan kaikki menut uudestaan
	        privateOnSelectionEnd(selectedLines.items());
		    privateOnSelection(selectedLines.items());
		} else 
		{
		    AddData(true);
		}	
		
	}
	
	// poistaa listalta kaiken datan 
	function removeAllItems(){
	
		var Data = new Array();
		
        // poistetaan kaikki valitut arvot 
        base.unSelectAll();
        base.finder.setData(Data);
        base.Data = Data; 
		base.Data = base.Data.concat(base.finder.getData());
	}
	
	// poistaa listalta dataa 
	function removeItems(Items){
	
		var items = new Array(); 
		var value = Items.toString();
		items = value.split(',');
		var Data = new Array();
		Data = Data.concat(base.finder.dataArray);
        
        // paivitetaan data         
		for (var it=0;it<items.length;it++){
			for (var i = 0; i < Data.length ;i++){
				if ( Data[i][0] ==  items[it]){
					Data.splice(i,1);
				}    
            }
        }
        
        // poistetaan kaikki valitut arvot 
        base.unSelectAll();
        base.finder.setData(Data);
        base.Data = new Array(); 
		base.Data = base.Data.concat(base.finder.getData());
        // paivitetaan esilla oleva sivu 
        goPage(base.currentPage);
	}
	
	// palauttaa Listalta valitut rivit objektina / string muodossa 
	function getItems(Items,Event, displayData){
		
		var newItems = new Array(); 
		var Data = new Array();
		var temp = new Array();
		if (displayData && !Items) 
		{
		    //newItems = Data.concat(base.finder.getData());  // ei muista lajittelua 
		    newItems = Data.concat(base.Data); // muistaa lajittelun 
		}
		else if (Items)
		{ 
		    if (displayData) 
		    {
		        //Data = Data.concat(base.finder.getData());    // ei muista lajittelua 
		        Data = Data.concat(base.Data);                  // muistaa lajittelun 
		    }
		    else 
		    {
		        Data = Data.concat(base.finder.dataArray);
		    }
		    Items = Items.toString().split(',');		    
		    for (var it=0;it<Items.length;it++){
			    for (var i = 0; i < Data.length ;i++){
				    if ( Data[i][0].toString() ==  Items[it].toString()){
					    newItems[newItems.length] = new Array(); 
					    newItems[newItems.length-1] = newItems[newItems.length-1].concat(Data[i]);			
				    }    
                }
            }
        }else{  
            // halutaan kaiki ittemit
            newItems = newItems.concat(base.finder.dataArray);
        }
        
        // poistetaan sorttaus apu kentta sita ei valiteta clientille 
    	if (newItems)
    	{
    	    if (base.sortIndex && newItems.length > 0 )
		    {
    		    if (newItems[0].length == base.sortIndex + 1)
    		    {
    		        for (var i=0;i<newItems.length;i++)
    		        {
    		            var nArr = new Array();
    		            nArr = nArr.concat(newItems[i]);
    		            newItems[i] = nArr.slice(0, base.sortIndex);
    		        }
    		    } 
		    }
    	}
    	
        
        if (!Event)
        {
        	// palautetaan uusi array() 
			return newItems;
        }
        else
        { 
			// Palautetaan array muodossa jossa se kay eventhandlerille 
			// muotoillaan data sellaiseeen muotoon ettei virheita paase syntymaan 
			// datan sisalla olevat pilkut muotoillaan muotoon #Comma#
			var rExp = /,/gi;
			var rExp2 = /<<<>>>/gi;
			var keys = new Array();
			var itemCount = base.columns.length;
			for (var i=0;i<newItems.length;i++){	
				var narr = new Array();
	            narr = narr.concat(newItems[i]);
	            newItems[i] = narr.join('<<<>>>').toString().replace(rExp,'#Comma#').replace(rExp2,',');
			}	
			keys[0] = "Key";
			keys[1] = "RoleLevel";
			for (var i=0;i<itemCount;i++){
				keys[keys.length] = base.columns.getColumn(i).Key.replace(rExp,'#Comma#');
			}			
			var result = keys.join(',') + "##__##" + newItems.join("##__##");	
				
			// posti data on valimiin palautetaan functiosta 
			return result;
        }
	}
	
	function moveDown(Items)
	{
	    var items = new Array(); 
	    items = items.concat(Items); 	    
	    if (!items)
        {
            return; 
        }
        else if (items.length == 1 )
        {
            var movedItems = new Array();
            var oldItems =  new Array();
            var newItems = new Array(); 
            var startItems = new Array();
            var endItems = new Array();
            
            
            movedItems = getItems(items);
            oldItems = oldItems.concat(base.Data);
            
            for (var i=0;i<oldItems.length;i++)
            {
                if (oldItems[i][0].toString()== movedItems[0][0].toString())
                {
                    break;    
                }
            }
            if (i == oldItems.length-1)
            {
                return;
            }
            
            startItems = startItems.concat(oldItems.slice(0,i));
            endItems = endItems.concat(oldItems.slice(i+1,oldItems.length ));
            startItems = startItems.concat(endItems.slice(0,1));
            endItems.splice(0,1);


            // liitetaan data taas yhteen                         
            newItems = newItems.concat(startItems);
            newItems = newItems.concat(movedItems);
            newItems = newItems.concat(endItems);
            
            base.selectedValues = Items.toString();
            base.Data = newItems;
            base.initialize();
            return;
//            setAllItems(newItems);
//            selectLine(gridLines[parseInt(i + 1)]);
//            privateOnSelection(selectedLines.items());
//			  privateOnSelectionEnd(selectedLines.items());
		
        }
	
	}
	function moveUp(Items)
    {
       var items = new Array(); 
	    items = items.concat(Items); 	    
	    if (!items)
        {
            return; 
        }
        else if (items.length == 1 )
        {
            var movedItems = new Array();
            var oldItems =  new Array();
            var newItems = new Array(); 
            var startItems = new Array();
            var endItems = new Array();
            
            
            movedItems = getItems(items);
            oldItems = oldItems.concat(base.Data);
            
            for (var i=0;i<oldItems.length;i++)
            {
                if (oldItems[i][0].toString()== movedItems[0][0].toString())
                {
                    break;    
                }
            }
            if (i == 0)
            {
                return;
            }
            
            startItems = startItems.concat(oldItems.slice(0,i));
            endItems = endItems.concat(oldItems.slice(i+1,oldItems.length ));
            
            // startIttems kokoelmasta siirretaan yksi alas endIttems taulukkoon 
            endItems.reverse();
            endItems = endItems.concat(startItems.slice(startItems.length -1 ,startItems.length));             
            endItems.reverse();
            startItems.splice(startItems.length -1 ,startItems.length )
            
            
            // liitetaan data taas yhteen 
            newItems = newItems.concat(startItems);
            newItems = newItems.concat(movedItems);
            newItems = newItems.concat(endItems);
            
            base.selectedValues = Items.toString();
            base.Data = newItems;
            base.initialize();
            return;
//            setAllItems(newItems);
//            selectLine(gridLines[parseInt(i - 1)]);
//            privateOnSelection(selectedLines.items());
//			privateOnSelectionEnd(selectedLines.items());
//		
        }
    }
}




////////////////////////////////////////////////////////////////////////////////////////////
//
//  Apuobjektit ovat alapuolella 
//
////////////////////////////////////////////////////////////////////////////////////////////

    /// Objekti huolehtii listan Export toiminnoista
    function exportControl(base)
    {
        // julkinen interface 
        this.initialize = initialize;
        this.columnsArray = new Array();
        this.show = show;
        this.hide = hide; 
        this.visible = false;
        this.infoText;
        this.buttonLabel = 'Export';
        this.execute = execute; 
        this.inLine = 3;
        this.buttonImage = 'Export.gif';
        this.onEvent = onEvent;
        this.exportMenuValign = 'bottom'; // top , bottom 
        this.exportMenuAlign = '';        // left , right 
        this.exportMenuX = null;            
        this.exportMenuY = null;
    
        
        // privaatit muuttujat / objektit 
        var control = this;
        var oTable = new table('FinderCss'); 
        oTable.style.borderWidth = 0;
        var oButtonTable = new table('FinderCss','100%'); 
        var element = new objElement(control);
        var menu; 
        var oButton; 
        
        //disabloi menun jos ei ole mita Exportata
        function onEvent()
        {
            if (control.visible)
            {
                if (oButton)
                {                
                    if (!base.Data | element.getElementValue().length == 0 | base.Data.length == 0 )
                    {
                        oButton.disabled = true; 
                        oButton.style.cursor = 'default'; 
                    }
                    else 
                    {
                        oButton.disabled = false; 
                        oButton.style.cursor = 'pointer'; 
                    }
                }
            } 
        } 
        
        
        // postittaa suodatetun tulosjoukon parametreineen palvelimelle joka luo 
        // tuloksesta tiedoston
        function execute()
        {   
            var value = element.getElementValue();
            if (base.Data)
            {                
                if (base.Data.length > 0 && value)
                {
                    var exportCheckBokses = base.columns.getColumnByKey('ExportSelect');
                    var sendExport = eval( 'sendExport_' + base.ListName);
                    if (exportCheckBokses)
                    {
                        var Items = new Array(); 
                        for (var i=0;i<base.Data.length;i++)
                        {
                            if (base.Data[i][exportCheckBokses.key + 2] == 'selected')
                            {
                                Items[Items.length] = base.Data[i][0];
                            }
                        }
                        if (Items.length > 0)
                        {
                            sendExport(value , base.getItems(Items.join(','),true,true));
                            return; 
                        } 
                    }
                    sendExport(value , base.getItems(null,true,true));
                }
            } 
        }
        
        // Rakentaa varsinaisen exportControllin 
        function initialize(object)
        {
            var oRow;
            var oCell;
    		if (oTable && !object)
    		{
    		    object = oTable.parentNode.parentNode.parentNode.parentNode;
    		    object.removeChild(oTable);
    		    oTable = new table('FinderCss'); 
    		    oTable.style.borderWidth = 0;
    		    oButtonTable = new table('FinderCss','100%'); 
    		    element = new objElement(control);
    		}    
            if (control.columnsArray.length > 0)
            {    		
	            // import toiminnon paa table 
	            oRow = oTable.addRow();
	            oCell = oTable.addCell();
    	        
			    if (control.infoText)
			    {
			        if (control.infoText.length > 0)
			        {
			            var oLabel = document.createElement('label');
			            oLabel.className = 'TextCss';
			            oLabel.innerHTML = control.infoText;
    			        
			            oTable.setCellData(oLabel); 	
			            oRow = oTable.addRow();
	                    oCell = oTable.addCell();
			        }
			    } 
    			
		        oCell.style.textAlign = 'left';
                oCell.style.paddingLeft = 80;
                element.elementType = 'adcheckbox';
                element.key = "ExportValues";
	            element.value = control.columnsArray.join(",");
	            element.labelCss = 'textCss';
	            element.children.inLine = control.inLine;
	            element.width = '300';
	            element.children.labelLocation = 'right';
    	        
	            for (var index=0;index<control.columnsArray.length;index++){ 
                    element.children.add('<nobr>' + base.columns.getColumn(control.columnsArray[index]).header + '</nobr>',control.columnsArray[index].toString() ,'');
	            }			    
		        oTable.setCellData(element.getElement()); 	
		        
	            oButton = new button();
	            oButton.virtualDirectory = base.virtualDirectory ; 
                oButton.image = 'jdm/WebControls/images/' + control.buttonImage;
                oButton.label = control.buttonLabel;
                oButton.onClick = control.execute;
                oButton.key = 'Export';
                oButton = oButton.getButton();
	            oButton.style.paddingTop = 10;
	            
	            var oButtonCell;
                if (this.exportMenuValign == 'bottom' && this.exportMenuAlign == 'right')
	            {
	                oButtonTable.addRow();
	                oButtonTable.addCell();
	                oButtonTable.setCellData(oTable);
	                oButtonTable.addCell();
	                oButtonTable.addRow();
	                oButtonTable.addCell();
	                oButtonCell = oButtonTable.addCell();
	                oButtonCell.style.width = '100%';
	                oButtonTable.setCellData(oButton);
	            }
                else if (this.exportMenuValign == 'top' && this.exportMenuAlign == 'right')
	            {
	                oButtonTable.addRow();
	                oButtonTable.addCell();
	                oButtonCell = oButtonTable.addCell();
	                oButtonCell.style.width = '100%';
	                oButtonTable.setCellData(oButton);
	                oButtonTable.addRow();
	                oButtonTable.addCell();
	                oButtonTable.setCellData(oTable);
	                oButtonTable.addCell();
	            }
	            else if (this.exportMenuValign == 'top' && this.exportMenuAlign == 'left')
	            {
	                oButtonTable.addRow();
	                oButtonCell = oButtonTable.addCell();
	                oButtonCell.style.width = '100%';
	                oButtonTable.setCellData(oButton);
	                oButtonTable.addCell();
	                oButtonTable.addRow();
	                oButtonTable.addCell();
	                oButtonTable.addCell();
	                oButtonTable.setCellData(oTable);
	            }
	            else if (this.exportMenuValign == 'bottom' && this.exportMenuAlign == 'left')
	            {
	                oButtonTable.addRow();
	                oButtonTable.addCell();
	                oButtonTable.addCell();
	                oButtonTable.setCellData(oTable);
	                oButtonTable.addRow();
	                oButtonCell = oButtonTable.addCell();
	                oButtonCell.style.width = '100%';
	                oButtonTable.setCellData(oButton);
	                oButtonTable.addCell();
	            }
	            else if (this.exportMenuValign == 'bottom')
	            {
	                oButtonTable.addRow();
	                oButtonTable.addCell();
	                oButtonTable.setCellData(oTable);
	                oButtonTable.addRow();
	                oButtonCell = oButtonTable.addCell();
	                oButtonCell.style.width = '100%';
	                oButtonCell.align = 'center';
	                oButtonTable.setCellData(oButton);
	            }
	            else if (this.exportMenuValign == 'top')
	            {
	                oButtonTable.addRow();
	                oButtonCell = oButtonTable.addCell();
	                oButtonCell.style.width = '100%';
	                oButtonCell.align = 'center';
	                oButtonTable.setCellData(oButton);
	                oButtonTable.addRow();
	                oButtonTable.addCell();
	                oButtonTable.setCellData(oTable);
	            }
	            else if (this.exportMenuAlign == 'left')
	            {
	                oButtonTable.addRow();
	                oButtonCell = oButtonTable.addCell();
	                oButtonCell.style.width = '100%';
	                oButtonTable.setCellData(oButton);
	                oButtonTable.addCell();
	                oButtonTable.setCellData(oTable);
	            }
	            else if (this.exportMenuAlign == 'right')
	            {
	                oButtonTable.addRow();
	                oButtonTable.addCell();
	                oButtonTable.setCellData(oTable);
	                oButtonCell = oButtonTable.addCell();
	                oButtonCell.style.width = '100%'; 
	                oButtonTable.setCellData(oButton);
	            }
	            
	            if (this.exportMenuX != null || this.exportMenuY != null)
	            {
	                oButtonCell.style.position = 'relative';
	                if (this.exportMenuX != null)
	                {
	                    oButtonCell.style.left = this.exportMenuX;
	                }    
                    if (this.exportMenuY != null)
	                {
	                    oButtonCell.style.top = this.exportMenuY;
	                }
	            }

	                
    
	            
	            object.appendChild(oButtonTable);
                oTable.style.display = 'none';
                oButtonTable.style.display = 'none';
            }
        }
        
        // esittaa exportControllin
        function show()
        {   
            if (base.finder.visible)
            {
                base.finder.hide();
            } 
            if (base.printControl.visible)
            {
                base.printControl.hide();
            } 
            oTable.style.display = '';
            oButtonTable.style.display = '';
            control.visible = true;
            base.onResize();
        }
        
        // piilottaa exportControllin
        function hide()
        {
            oTable.style.display = 'none';
            oButtonTable.style.display = 'none';
            control.visible = false;
            if (base.finder.serverSearch && !base.webMenu.getMenu('search'))
            {
                base.finder.show();
            }
            base.onResize();
        }
    }



    /// Objekti huolehtii listan Print toiminnoista
    function printControl(base)
    {
        // julkinen interface 
        this.initialize = initialize;
        this.columnsArray = new Array();
        this.show = show;
        this.hide = hide; 
        this.visible = false;
        this.infoText;
        this.buttonLabel = 'Print';
        this.execute = execute; 
        this.inLine = 3;
        this.buttonImage = 'Print.gif';
        this.onEvent = onEvent;
        this.defalutValue = new Array();
        
        // privaatit muuttujat / objektit 
        var control = this;
        var oTable = new table('FinderCss','100%'); 
        var element = new objElement(control);
        var menu; 
        var oButton; 
        
        //disabloi menun jos ei ole mita Printissa
        function onEvent()
        {
            if (control.visible)
            {
                if (oButton)
                {                
                    if (!base.Data | element.getElementValue().length == 0 | base.Data.length == 0 )
                    {
                        oButton.disabled = true; 
                        oButton.style.cursor = 'default'; 
                    }
                    else 
                    {
                        oButton.disabled = false; 
                        oButton.style.cursor = 'pointer'; 
                    }
                }
            } 
        } 
        
        
        // postittaa suodatetun tulosjoukon parametreineen palvelimelle joka luo 
        // tuloksesta tiedoston ja tulostaa popup ikkunaan
        function execute()
        {   
            var value = element.getElementValue();
            if (base.Data)
            {                
                if (base.Data.length > 0 && value)
                {
                    var printCheckBokses = base.columns.getColumnByKey('PrintSelect');
                    if (printCheckBokses)
                    {
                        var Items = new Array(); 
                        for (var i=0;i<base.Data.length;i++)
                        {
                            if (base.Data[i][printCheckBokses.key + 2] == 'selected')
                            {
                                Items[Items.length] = base.Data[i][0];
                            }
                        }
                        if (Items.length > 0)
                        {
                            sendPrint(value , base.getItems(Items.join(','),true,true));
                            return; 
                        } 
                    }                   
                    sendPrint(value , base.getItems(null,true,true));
                }
            } 
        }
        
        // Rakentaa varsinaisen printControllin 
        function initialize(object)
        {
            var oRow;
            var oCell;
    		    
            if (control.columnsArray.length > 0)
            {    		
	            // print toiminnon paa table 
	            oRow = oTable.addRow();
	            oCell = oTable.addCell();
    	        
			    if (control.infoText)
			    {
			        if (control.infoText.length > 0)
			        {
			            var oLabel = document.createElement('label');
			            oLabel.className = 'TextCss';
			            oLabel.innerHTML = control.infoText;
    			        
			            oTable.setCellData(oLabel); 	
			            oRow = oTable.addRow();
	                    oCell = oTable.addCell();
			        }
			    } 
    			
		        oCell.style.textAlign = 'left';
                oCell.style.paddingLeft = 80;
                element.elementType = 'adcheckbox';
                element.key = "PrintValues";
	            if (control.defaultValue && control.defaultValue.length > 0)
	            {
	               element.value = control.defaultValue.join(",");
	            }
	            else 
	            {
	                element.value = control.columnsArray.join(",");
	            }
	            element.labelCss = 'textCss';
	            element.children.inLine = control.inLine;
	            element.width = '300';
	            element.children.labelLocation = 'right';
    	        
	            for (var index=0;index<control.columnsArray.length;index++){ 
                    element.children.add('<nobr>' + base.columns.getColumn(control.columnsArray[index]).header + '</nobr>',control.columnsArray[index].toString() ,'');
	            }			    
		        oTable.setCellData(element.getElement()); 	
		        
	            oButton = new button();
	            oButton.virtualDirectory = base.virtualDirectory ; 
                oButton.image = 'jdm/WebControls/images/' + control.buttonImage;
                oButton.label = control.buttonLabel;
                oButton.onClick = control.execute;
                oButton.key = 'Print';
                oButton = oButton.getButton();
	            oButton.style.paddingTop = 10;
	            oTable.setCellData(oButton); 	
	            object.appendChild(oTable);
                oTable.style.display = 'none';
            }
        }
        
        // esittaa printControllin
        function show()
        {   
            if (base.finder.visible)
            {
                base.finder.hide();
            } 
            if (base.exportControl.visible)
            {
                base.exportControl.hide();
            } 
            oTable.style.display = '';
            control.visible = true;
            base.onResize();
        }
        
        // piilottaa printControllin
        function hide()
        {
            oTable.style.display = 'none';
            control.visible = false;
            if (base.finder.serverSearch && !base.webMenu.getMenu('search'))
            {
                base.finder.show();
            }
            base.onResize();
        }
    }








  // Columnit 
    function columns(base){
		this.add = _add; 
		this.getColumn = _getColumn; 
		this.length = 0; 
		this.sorts = new Array();		//[null,null,'desc',null];
		this.setSort = _setSort;
		this.sortBack = sortBack; 
	    this.getColumnByKey = getColumnByKey;
		this.isSort = false; 
		var sorts = this.sorts; 
		var columns = new collection(); 
		var origColumns = new collection(); 
		var lastSort = new Array();
		var init = false;
		
		function sortBack(){
			return lastSort;
		}
		
		this.getHtmlBeginColumn = getHtmlBeginColumn; 
			
		function getHtmlBeginColumn(column)
		{   
		    var returnValue = new Array();
		    if (column.htmlBegin.indexOf('#') > -1)
		    {
		        var items = columns.items();
		        for (var i = 0;i<items.length;i++)
		        {
				    if (column.htmlBegin.indexOf('#' + items[i].Key + '#') > -1)
				    {
				        column.htmlBeginReplaceField[column.htmlBeginReplaceField.length] = '#' + items[i].Key + '#'; 				        
					    returnValue[returnValue.length] =  items[i].key + 2 * 1;
					    //column.htmlBeginReplaceField = '#' + items[i].Key + '#'; 
					    //return items[i].key + 2 * 1;
				    }
			    } 
		    }		    
		    return returnValue;
		    //return null;
		}
		
		function getColumnByKey(key)
		{
		    var items = columns.items();
			// alusteetaan mahdollinen summa columni 	
			for (var i = 0;i<items.length;i++){
				if (items[i].Key == key){
					return items[i];
				}
			} 
			return null; 
		}
		
		function _add(Key,index,header,width,dataType,sortable,skey,show,htmlBegin,htmlEnd,searchName,spaceLeft,spaceRight,calculateType,element,autoRanking, SortIndex,searchType){
			
			// korjataan avain jos on vain yksi kentta summattavana 
			if ( dataType == 'summ' && Key.indexOf(',') == -1 ) 
				Key = 'identity,' + Key;
			
			var oCol = new column(base); 
			oCol.key = this.length;
			oCol.Key = Key;
			oCol.index = index;					// kertoo datajoukosta indeksin 
			if (header) oCol.header = header;	// header teksti 
			if (width) oCol.width = width;		// columnin leveys px; 
			oCol.sortable = sortable;			// voiko columnin sortata 
			if (!dataType) dataType = 'text';	// 
			if (dataType == 'color') 
			{
				base.colorIndex = this.length + 2;	
			}
			else if (dataType == 'rowclass')
			{
				base.classIndex = this.length + 2;	     
			}
			oCol.sortIndex = SortIndex;
			oCol.calculateType = calculateType; 
			oCol.dataType = dataType; 
			oCol.dataKey = skey.toString().toLowerCase();
			oCol.show = show;
			oCol.htmlBegin = htmlBegin;
			oCol.htmlEnd = htmlEnd;
			if (spaceLeft) oCol.spaceLeft = spaceLeft;
			if (spaceRight) oCol.spaceRight = spaceRight;
			if (searchName != 'Not set')
			{
			    oCol.addInSearch(searchName,searchType);    
			}
			oCol.element = element;
			if (autoRanking){oCol.autoRanking = autoRanking;}
			 
			if (oCol.width.indexOf('%') > -1)
			{
			    oCol.calculatedWidt = oCol.width; 
			}
			else 
			{
			    oCol.calculatedWidt = parseInt(oCol.width) + oCol.spaceLeft + oCol.spaceRight; 
			} 
			
			    
			// lisataan objekti kokoelmaan 
			columns.add(this.length,oCol);
			
			// alustetaan sorttaus tapahtuma
			this.sorts[this.sorts.length] = null;
			if (autoRanking){
			    _setSort('asc',oCol.key );
			    var el = new objElement(base);
                el.key = 'TeamName';
                el.elementType = 'adselect';
                el.width = 45;
                el.labelWith ='0';
                el.elementCss = 'TextCss';
                el.labelCss = 'LabelCss';
                el.height = 21;
                el.children.add('-','9999','');
                oCol.element = el;
			}
			this.length ++;
		}
        
		function _setSort(direction,index ){
			this.isSort = true; 
			for (var i = 0;i<sorts.length;i++){
				if (sorts[i]){
					lastSort[0] = sorts[i];
					lastSort[1] = i;						
				} 
				if (i == index)
					sorts[i]=direction; 
				else 
					sorts[i]=null; 
					
			}
		}
		
		function _getColumn(key){
			
			// suoritetaan toiminnot kun columnit ovat lisatty 
			if (!init){
				
				// alustetaan columnit 
				var items = columns.items();
				
				// alusteetaan mahdollinen summa columni 	
				for (var i = 0;i<items.length;i++){
					if (items[i].dataType == 'summ'){
						var Fields = new Array();
						Fields = items[i].Key.split(','); 
						
						for (var ii = 0;ii<items.length;ii++){
							for (var e=0;e<Fields.length;e++){
								if (items[ii].Key == Fields[e] | items[ii].Key ==  'identity,' + Fields[e] ){
									items[i].sumFields[items[i].sumFields.length] = parseInt(ii).toString();	
								}
							}
						}
					}
				} 
				init = true;
			} 
			return columns.getValue(key);
		}
		
		
		
		// column objekti 
		function column(base){
			this.Key;
			this.key;
			this.index;
			this.header= '&nbsp;';  
			this.width=0;
			this.sortable=true;
			this.dataType='text';
			this.spaceLeft=0; 
			this.spaceRight=0; 
			this.setData = _setData; 
			this.setDefaultSort = setDefaultSort; 
			this.addInSearch = addInSearch; 
			this.show = true; 
			this.dataKey = '';
			this.htmlBegin = '';
			this.htmlEnd = '';
			this.sumFields = new Array();
			this.calculateType = ''; 
			this.element; 
			this.initializeElements = false; 
	        this.elementCount = 0;    
			this.autoRanking = false; 
			this.ranked = 0; 
			this.htmlBeginReplaceField = new Array();
			this.sortIndex;
			this.calculatedWidt;
			
			function addInSearch(label,searchType)
			{
			    if (!label)
			    { 
				    base.finder.searchColumns.addColumn(this.header,this.key + 2,searchType);
			    }
			    else 
				{
				    base.finder.searchColumns.addColumn(label,this.key + 2,searchType);
				}	
			}		
			
			function setDefaultSort(direction){
				if (direction){
			        if (direction.toString() == 'asc'){
			            direction = 'desc';  
			        } else {
			            direction = 'asc';  
			        }
			    } 
				_setSort(direction,this.key );
			}
	
	        // parsii timen oikeaan pituuteen
            function parseDigits(value){
                if (value.toString().length == 1)
                    return '0' + value.toString();
                else return value.toString();
            }
            
	        // asettaa listalle datan 					
			function _setData(oCell,dataValue,color,masterType,dataId,htmlBeginReplaceValue,classValue){ 	
				if (this.show)
				{ 
				    if (!this.element)
				    {
				        if(!dataValue)dataValue = '&nbsp;&nbsp;';
				        if (this.dataType == 'openrow')
				        {
				            oCell.rDataID = dataId;
				            oCell.openrow = true;
				            oCell.dataValue = dataValue;
				            dataValue = '<img src="' + base.virtualDirectory + 'jdm/webcontrols/images/plus.gif" >';
				            //dataValue = '&nbsp;&nbsp;';// '<img style="cursor:pointer" src="' + base.virtualDirectory + 'jdm/webcontrols/images/plus.gif" border=0 >'
				            classValue = 'RowOpenCss';
				            oCell.onclick = rowExpandClick;    
				        }
				    }
				    else if (!this.initializeElements) 
				    {
				        if (this.htmlBegin){this.htmlBegin += '<label>';} else {this.htmlBegin = '<label>';}
				        if (this.htmlEnd){this.htmlEnd = '</label>' + this.htmlEnd;} else {this.htmlEnd = '</label>';}					    
				        if (this.autoRanking) {for (var i = 1;i<base.finder.dataArray.length + 1 ;i++){this.element.children.add(i.toString(),i.toString(),'');} }
				        this.element.getElement('',false);
				        this.initializeElements = true;
				    }
    				  
				    
				    oCell.style.width = this.calculatedWidt;
				    if (this.dataType == 'summ')
				    {
					    oCell.className = "SummCellCss";
					    dataValue = parseInt(dataValue * 100) / 100;
					    if (!dataValue)
					    {
                            dataValue = 0; 
					    }
				    }
				    else 
				    {
					    oCell.className = classValue;
				    }
    				
    				
				    oCell.style.paddingRight = this.spaceRight;
				    oCell.style.paddingLeft = this.spaceLeft;
				    if (color)try{ oCell.style.color = color; }catch(e){}
				    if (!base.canSelect) oCell.style.cursor = 'default'; 
    				
				    if (masterType && masterType == 'text'){
					    // asetetaan sellaisenaan 
				    }else if (this.dataType == 'date'){
					    if (dataValue != '&nbsp;&nbsp;'){ 
						    var d = new Date(dataValue);
						    dataValue = d.getDate() + '.' + (d.getMonth()+1) + '.' + d.getFullYear() +  ' ' + 
						    d.getHours() + ':' + parseDigits(d.getMinutes()); // + ':' + parseDigits(d.getSeconds());
					    }
				    }else if (this.dataType == 'shortdate'){
					    if (dataValue != '&nbsp;&nbsp;'){ 
						    var d = new Date(dataValue);
						    dataValue = d.getDate() + '.' + (d.getMonth()+1) + '.' + d.getFullYear();
					    }
				    }
				    if (this.element){
				        try{
				            var el;
				            if (this.element.elementType == 'adradio' | this.element.elementType == 'adcheckbox' ){
				                var html =  this.element.getElement(dataValue,false).toString();
			        	        var rExp = new RegExp(this.element.key,'g');
	                            html = html.toString().replace(rExp,this.element.key + this.elementCount);
			                    oCell.innerHTML = this.htmlBegin + html + this.htmlEnd; 	
			                    el = oCell;
			                    var els = el.getElementsByTagName('INPUT');
			                    for (var i=0;i<els.length;i++){
			                        els[i].onblur = base.relaseActiveElement;
			                        els[i].onselectstart = base.setActiveElement;
			                        els[i].onclick = base.setActiveElement;
			                        els[i].onactivate = base.setActiveElement;  
			                        els[i].dataId = dataId;
			                        els[i].dataInxex = this.key;
			                        els[i].onchange = base.setChangedLines;
			                        els[i].cell = oCell;    
			                    }
			                }else 
				            {
                                if (this.element.elementType == 'addatecontrol' | this.element.elementType == 'addivdatecontrol'){
                                    var datecEl = new objElement(base);
                                    datecEl.key = this.element.key;
                                    datecEl.elementType = this.element.elementType;
                                    datecEl.required = this.element.required;
                                    datecEl.labelWith =this.element.labelWith;
                                    datecEl.width = this.element.width;
                                    datecEl.value = dataValue;
                                    el = datecEl.getElement(dataValue);
                                }
                                else 
                                {
                                    el = this.element.getElement(dataValue,false);
                                }
				                oCell.innerHTML =  this.htmlBegin + this.htmlEnd;
				                oCell.getElementsByTagName('label')[0].innerHTML = '';
				                oCell.getElementsByTagName('label')[0].appendChild(el);					    
				                if (this.element.elementType == 'addatecontrol' | this.element.elementType ==  'addivdatecontrol'){
                                    el = el.getElementsByTagName('INPUT')[0];
                                }
			                    el.onblur = base.relaseActiveElement;
			                    el.onselectstart = base.setActiveElement;
			                    el.onclick = base.setActiveElement;
			                    el.onactivate = base.setActiveElement;
			                    el.onchange = base.setChangedLines;
				                el.dataId = dataId;
				                el.dataInxex = this.key;
				            }
				            if (this.autoRanking){
				                if (this.ranked == 0){
				                    var count = 0; var Data = new Array(); Data = Data.concat(base.finder.dataArray);
				                    for(var i=0;i<Data.length;i++){if ( parseInt(Data[i][this.key + 2]).toString() == '9999' ){count ++;}}
				                    this.ranked = count;
				                } 
				                for (var i=0;i<parseInt(this.ranked) - 1;i++){el.options[el.options.length-1] = null;}
				            } 
				            this.elementCount ++;
				        }catch(e){}
				    } else {
				        // normaali asetus 
				        if (dataValue != '&nbsp;&nbsp;')
				        {   
				            var elementValue = dataValue;
				            if (this.htmlBegin.length > 0)
				            {
				                
				                if (htmlBeginReplaceValue.length > 0)
				                {
				                    if (this.htmlBeginReplaceField.length > 0)
				                    {
				                        var tempValue = this.htmlBegin;
				                        for(var hbi = 0;hbi<this.htmlBeginReplaceField.length;hbi++)
				                        {
				                            tempValue = tempValue.replace(this.htmlBeginReplaceField[hbi],htmlBeginReplaceValue[hbi]); 
				                        }
				                        elementValue = tempValue + elementValue;
				                        
				                        //elementValue = this.htmlBegin.replace(this.htmlBeginReplaceField,htmlBeginReplaceValue) + elementValue; 
				                    }
				                }
				                else 
				                {
				                    elementValue = this.htmlBegin.replace('#value#',dataValue) + elementValue; 
				                }
				            } 
				            if (this.htmlEnd)
				            {
				                elementValue = elementValue + this.htmlEnd.replace('#value#',dataValue);
				            }
				            oCell.innerHTML = elementValue;
				            
				        } 
				        else 
				        {
				            oCell.innerHTML =  dataValue;
				        }
				    } 		
			    }
			    else
			    {
			        oCell.style.display = 'none';
			    }
			}
		}
		
		function rowExpandClick()
		{
		    var row = this.parentNode;
		    var table = row.parentNode;
		    
		    
		    if (this.className != 'RowCloseCss')
		    {
		        this.innerHTML = '<img src="' + base.virtualDirectory + 'jdm/webcontrols/images/miinus.gif" >';
		        
		        base.openedRows[base.openedRows.length] = this.rDataID;
		        this.className = 'RowCloseCss';
		        var rowIndex = findRowIndex(table,row);
		        var newRow = table.insertRow(rowIndex);
		        newRow.className = row.everyOtherLineClass; 
		        var newCell = newRow.insertCell(0);
		        newCell.className = row.everyOtherLineClass;
		        newCell.colSpan = row.cells.length;
		        newCell.innerHTML = '<div class="OpenRowCss" >' + this.dataValue + '</div>';    
		        
		        this.newRow = newRow;
		        this.newCell = newCell;
		        
		        // lataamisen aikana ei laiteta eventtia
		        if (!base.busy)
		        {
		            try
		            {
		                base.onOpenRow(this.rDataID);
		            }
		            catch(exp){}
		        }
		        
		    }
		    else 
		    {
		        this.innerHTML = '<img src="' + base.virtualDirectory + 'jdm/webcontrols/images/plus.gif" >';
		        for(var i=0; i < base.openedRows.length;i++)
		        {
		            if (base.openedRows[i] == this.rDataID)
		            {
		                base.openedRows[i] = null;
		            }
		        }
		        this.className = 'RowOpenCss'
		        if (this.newRow)
		        {
                    var rowIndex = findRowIndex(table,this.newRow) - 1;
		            table.deleteRow(rowIndex);
		            this.newRow = null;
		        }
		        if (!base.busy)
		        {
		            try
		            {
		                base.onCloseRow(this.rDataID);
		            }
		            catch(exp){}
		        }
		    }
		}
		
		function findRowIndex(table , row)
		{
		    for (var i=0;i<table.rows.length;i++)
		    {
		        if (row == table.rows[i])
		        {
		            return i + 1;
		        }        
		    }
		    return null;
		}
    }
    // Columns osio paattyy 
  
  
  
  
  
  
  
  function basicNavi(base){		
		// public interface 
		this.setPage = setPage;	
		this.firstPageLabel = '';
		this.lastPageLabel = '';
		this.initialize = initialize;
		this.numberOfLinks = 10; 
		
		// private variants 
		var numberOfLinks = 10;
		var oCell;
		
		// alustaa navi objektin uutta kayttoa varten  
		function initialize(){
			oCell = null;
			numberOfLinks = this.numberOfLinks;
		}
		
		// select page in linkis 
		// generate navilinks 		
		function setPage(pageNum){
			
			var oRow;
	        var start;
	        var end;
	        			
			if (!oCell){ 
				// Lisataan Footer Osio 
				oRow = base.Grid.insertRow(base.Grid.rows.length  );
				oRow.onmouseover = base.mouseoutGrid;
	        
				oCell = oRow.insertCell(0);
				try{oCell.colSpan = base.columns.length;}catch(e){}
				oCell.className = 'NaviContentCss';
			}else{
				oCell.innerHTML='';
			}
			
	        if (base.currentPage >= base.numberOfPages){
				base.currentPage = base.numberOfPages;
				pageNum = base.currentPage;
			}
			
			if (pageNum > base.numberOfPages - (numberOfLinks/2)){
				start = base.numberOfPages - numberOfLinks-1;
				end = base.numberOfPages;
			}else if (pageNum >= (numberOfLinks/2)){
				end = pageNum + (numberOfLinks/2);
				start = pageNum - ((numberOfLinks/2)-1);
			} else {
				start = 1;
				end = numberOfLinks;
			}
			if (start < 1) start = 1;
			if (end > base.numberOfPages) end = base.numberOfPages;
			
			if (base.numberOfPages == 1){
				addLink(this.firstPageLabel,1,true);
				addLink(1,1,true);
			}else if (base.numberOfPages > 0){
				// generate all navilinks 
				if (pageNum == 1){ 
					addLink(this.firstPageLabel,1,true);
				}else{
					addLink(this.firstPageLabel,1,false);	
				}
				
				for (var i = start  ; i <= end ; i++){
					if (parseInt(i) == parseInt(pageNum)) 
						addLink(parseInt(i),parseInt(i),true);
					else
						addLink(parseInt(i),parseInt(i),false);
				}  
				if (i > 2){
					if (pageNum == base.numberOfPages) 
						addLink(this.lastPageLabel,base.numberOfPages,true);
					else
						addLink(this.lastPageLabel,base.numberOfPages,false);
				}
			}else{
				oCell.innerHTML = "&nbsp;";
			}
			if (!base.pageNavi)
				if(oRow) 
					oRow.style.display='none';
			
		}
		
		
		function addLink(pageName,page_id,selected){
			var oAnchor;
			var oSeparator;
			
			
			// add link only when label is something text 
			if (pageName.toString().length > 0){
				
				oAnchor = document.createElement('a');
				oAnchor.href='javascript: o' + base.ListName + '.goPage(' + page_id + ');'
				oAnchor.className = 'NaviCss';
				
				oSeparator = document.createElement('label');
				oSeparator.innerHTML='[';
				oSeparator.className = 'NaviSeparatorCss'
				oAnchor.appendChild(oSeparator);
				
				oSeparator = document.createElement('font');
				if (selected)
					oSeparator.className =  'SelectedNaviCss';
				else 
					oSeparator.className =  'NaviSeparatorCss';
					
				oSeparator.innerHTML=pageName;
				oAnchor.appendChild(oSeparator);
								
				oSeparator = document.createElement('label');
				oSeparator.innerHTML=']';
				oSeparator.className = 'NaviSeparatorCss'
				oAnchor.appendChild(oSeparator);
								
				oCell.appendChild(oAnchor);
			}
		}
	}
	
	
	
	
	
	
	// HakuKone 
	function basicSearchMachine(base){
		var searchColumns = new searchColumns();
		var searchResult = new Array(); 
		var searchIsClean = true; 
		var searchElements = new Array(); 	
		var oTable; 
		var dataArray; 
		this.objButton; 
		var initOperation = false;
		var finderForm;
		var init = false;
		var bUpdate = false; 
		var duplicateElement;
		
		this.getElementsByKey = getElementsByKey; // palauttaa elementit 
		this.getData = _getData;
		this.search = search;
		this.update = update;
		this.searchColumns = searchColumns;
		this.initialize = initialize;
		this.show = show;
		this.hide = hide;
		this.visible = false; 
		this.dataArray = new Array();
		this.lockFinderCursor = lockFinderCursor; 
		this.updateData = updateData;
		this.initOperation = _initOperation; 
		this.setData = setData;
		this.serverSearch;  
		this.searchTab;
		this.searchForm; 
		this.searchButtonLabel = 'Hae';
		this.duplicateRowSearchLabel;
        this.clean = clean;    
		this.clientSideForm;
		this.searchButtonLocation; 
		this.searchMenuValign = 'bottom'; // top , bottom 
        this.searchMenuAlign = '';        // left , right 
        this.searchMenuX = null;            
        this.searchMenuY = null;
    
		
		
		var finderbase = this;
		function _initOperation(){
			return initOperation;
		}
		
		function updateData(){
			bUpdate = true;
			dataArray = this.dataArray; 
			if (!finderbase.serverSearch ){
		        if (this.visible)
			        finderbase.objButton.onclick();
		    }
		    bUpdate = false;
		}
		function setData(Data){
		    dataArray = new Array();
		    dataArray = dataArray.concat(Data);
		    this.dataArray = new Array();
		    this.dataArray = this.dataArray.concat(Data);
		    if (!finderbase.serverSearch ){
		        if (this.visible)
			        finderbase.objButton.onclick();
		    }
		}
		
		// privaatit toiminnot		
		function show(){
			oTable.style.display = 'block';
			this.visible = true;
			if (finderbase.serverSearch ){
			    if (!init)
			    {
			        finderForm.initialize();
			        init = true;
			    } 
			} 
			if (base.exportControl.visible)
            {
                base.exportControl.hide();
            } 
            if (base.printControl.visible)
            {
                base.printControl.hide();
            } 
			base.onResize();
		}
		function hide(){			
			oTable.style.display = 'none';
			this.visible = false;
			base.onResize();
		}
		function lockFinderCursor(value){
			var els = oTable.getElementsByTagName('*'); 
			for (var i=0;i<els.length;i++){
				els[i].style.cursor = value;
			}
		}
		function update(){
		    bUpdate = true;
			initOperation = true;
			if (!finderbase.serverSearch ){
		        if (this.visible)
			        finderbase.objButton.onclick();
		    }
		    bUpdate = false;
		}
		
		// palauttaa elementit 
		function getElementsByKey(key)
		{
		    if (oTable)
		    {
		        if (finderbase.clientSideForm)
		        {
    		        var elements = finderbase.clientSideForm.tabs[0].elements; 
		            for (var i=0;i<elements.length;i++)
		            {
		                if (elements[i].key.toLowerCase() == key.toLowerCase())
		                {
		                    var element = elements[i];
		                    if (element.Element)
		                    {
		                        return element.Element;
		                    }
		                    else 
		                    {
		                        return element;
		                    }
		                }   
		            }
    		        return null;
		        }
		        else 
		        {
		            var elements = oTable.getElementsByTagName('input'); 
		            for (var i=0;i<elements.length;i++)
		            {
		                if (elements[i].id.toLowerCase() == key.toLowerCase())
		                {
		                    return elements[i];
		                }
		            }
		        }
		        return  null;
		    }
		    else 
		    {
		        return null; 
		    }
		}
		function clean()
		{
		    
		    if (oTable)
		    {
		        if (finderbase.clientSideForm)
		        {
		            var elements = finderbase.clientSideForm.tabs[0].elements;
		            for (var i=0;i<elements.length;i++)
		            {
		                elements[i].setElementValue('');
		            }
		        }
		        else 
		        {
		            var elements = oTable.getElementsByTagName('input'); 
		            for (var i=0;i<elements.length;i++)
		            {
		                elements[i].value = '';
		            }
		        }
		    }
		}
		
		// rakentaa hakukoneen esitettavaksi
		function initialize(object){
			var oRow;
			var oCell;
			var oInp;
			var oAnchor; 
			var innerTable; 
			var intColsPan = 4; 
			this.dataArray = base.Data;
			dataArray = base.Data; 
			
			if (oTable){ 
				this.hide();
			}
			else
			{	
				if (!finderbase.serverSearch) 
				{ 
				    // hakukoneen paa table 
				    oTable = document.createElement('table');
				    oTable.className = 'FinderCss'; 
				    oRow = oTable.insertRow(oTable.rows.length);
				    oCell = oRow.insertCell(0);
				    innerTable = document.createElement('table');
			        innerTable.className  = 'FinderRowCss'; 
			        oTable.style.width = "100%";
			        oCell.appendChild(innerTable);
    			    
    				if (finderbase.clientSideForm )
    				{
				    	oRow = innerTable.insertRow(innerTable.rows.length);
				    	oRow.id = 'SearchTable';
				    	oCell = oRow.insertCell(0);
				    	oCell.id = 'ClientSideSearch_' + base.ListName;	
				    	intColsPan = 1;
				    	
				    	finderbase.clientSideForm.onLoad = addInSearch;
				    	
				    }
				    else 
				    {
				        var half = parseInt((searchColumns.columns.length + 1.5)/2);	
				        for (var i=0;i<half;i++){ 
					        oRow = innerTable.insertRow(innerTable.rows.length);
					        addElement(oRow,i,0);
				        }
				        for (var i=half;i<searchColumns.columns.length;i++){ 
					        oRow = innerTable.rows[i - half];
					        addElement(oRow,i,2);
				        }				
				    }        				
				    // lisataan tuplien haku 
				    if (finderbase.duplicateRowSearchLabel && finderbase.duplicateRowSearchLabel.length == 0)
				    {
				        finderbase.duplicateRowSearchLabel = null; 
				    }
				    if (finderbase.duplicateRowSearchLabel)
				    {
			            oRow = innerTable.insertRow(innerTable.rows.length);
			            oCell = oRow.insertCell(0);
			            oCell.colSpan = 4; 
			            oCell.innerHTML = '<br>';
    				    
			            oRow = innerTable.insertRow(innerTable.rows.length);
			            oCell = oRow.insertCell(0);
			            var infoLabel = document.createElement('label'); 
			            infoLabel.innerHTML = finderbase.duplicateRowSearchLabel;
			            oCell.className = 'textCss'; 
			            oCell.vAlign = "top";
			            oCell.appendChild (infoLabel);
    				    
    				    
			            oCell = oRow.insertCell(1);
			            duplicateElement = new objElement(oCell)
			            oCell.className = 'FinderCss'; 
			            oCell.colSpan = 3; 
			            oCell.style.borderWidth=0;
			            oCell.style.textAlign = "left";
                        
                        duplicateElement.elementType = 'adcheckbox';
                        duplicateElement.key = "DuplicateValues";
                        duplicateElement.labelCss = 'textCss';
                        duplicateElement.children.inLine = 3;
                        duplicateElement.width = '300';
                        duplicateElement.children.labelLocation = 'right';
                        for (var index=0;index<searchColumns.columns.length;index++){     
                            duplicateElement.children.add(
                                '<nobr>' + searchColumns.columns[index].label + '</nobr>',
                                searchColumns.columns[index].dataArrayIndex,'');
                        }			    
	                    oCell.appendChild(duplicateElement.getElement());
				    }
                    
                    var buttonAlign = 'center';
                    if (finderbase.searchButtonLocation == 'TopRight')
                    {
                        oRow = innerTable.insertRow(0);
                        buttonAlign ='right'; 
                        oCell = oRow.insertCell(0);
                    }
                    else if (finderbase.searchButtonLocation == 'Right') 
                    { 
                        oCell = oRow.insertCell(); 
                        oCell.style.verticalAlign  = 'middle';
                    }
                    else 
                    {
                        oRow = innerTable.insertRow(innerTable.rows.length);
                        oCell = oRow.insertCell(0);
                    }
                    
                    
                    oCell.className = 'FinderCss'; 
                    oCell.colSpan = intColsPan; 
                    oCell.style.borderWidth=0;
                    oCell.style.textAlign = buttonAlign;
                    var oButton = new button();
                    oButton.virtualDirectory = base.virtualDirectory ; 
                    oButton.image = 'jdm/WebControls/images/Find.gif';
                    oButton.label = finderbase.searchButtonLabel;
                    oButton.key = 'Find';
                    oButton = oButton.getButton();
                    finderbase.objButton = oButton;
                    finderbase.objButton.onclick = find;
                    oCell.appendChild(oButton); 
                    object.appendChild(oTable);
			        oTable.style.display = 'none';
				}
				else 
				{
				    oTable = document.createElement('div');
				    object.appendChild(oTable);
                    finderForm = new WebForm(oTable);
				    finderForm.virtualDirectory = base.virtualDirectory;
                    finderForm.submitButtonLabel = 'etsi';
                    finderForm.width = 410;
                    finderForm.labelWidth = 210;
                    finderForm.elementWidth = 200;
                    finderForm.everyOtherRowCss = '';
                    finderForm.labelCss = 'LabelCss';
                    finderForm.requiredText = '*';
                    finderForm.elementCss = 'TextCss';
                    finderForm.language = 'english';
                    finderForm.errorColor = 'red';
                    finderForm.dateType = 'yymmdd';
                    finderForm.pageStyle = 'simpleLayer';
                    finderForm.contentMarginLeft = 10;
                    finderForm.contentMarginTop = 0;
                    finderForm.contentMarginRight = 10;
                    finderForm.contentMarginBottom = 0;
                    finderForm.lineSpace = 5;
                    finderForm.wizard = false;
                    finderForm.className = 'FinderCss'; 
                    finderForm.actionFrame = new actionHandler();
                    object.className = 'FinderCss'; 
                    finderbase.searchForm = finderForm;
                    finderbase.searchTab = finderForm.tabs.add('Search','Machine');				
                    finderForm.height = "10";
                    

                    if (window.addEventListener){ document.addEventListener('keydown', finderFormKeyDown, false);}
                    else{ document.attachEvent('onkeydown',finderFormKeyDown);}
                    function finderFormKeyDown(e){
                        var Key;
                        var shiftMask;
                        if (navigator.appName=='Microsoft Internet Explorer'){
                            e = window.event;
                            Key = e.keyCode; 
                            shiftMask = e.shiftKey;
                        } else if (navigator.appName=='Netscape'){
                            Key = e.which;
                            shiftMask = e.shiftKey;
                        }
                        if (Key == 13 && !shiftMask){
                          finderForm.pages.submitCell.all[2].onclick();
                        try
                        {
                            // lopetetaan event 
                            if (e.preventDefault)
                            {
                                e.preventDefault();
                                return false;
                            }
                            else
                            {
                                e.keyCode = 0;
                                e.returnValue = false;
                            }
                        }
                        catch (ee) { }}
                    }
				}
			}		
			
			function addInSearch()
			{
			    for (var i=0;i<searchColumns.columns.length;i++){ 
			        var indexArray = searchColumns.columns[i].dataArrayIndex;
			        var searchType = searchColumns.columns[i].searchType
			        var id = base.columns.getColumn(indexArray - 2).Key;
			        var element  = finderbase.clientSideForm.getElementByKey(id);//.Element;
			        if (element)
			        {
			            element.indexArray = indexArray;
				        element.searchType  = searchType;
				        element.id = id;
				        element.className = 'FinderElementCss'; 
				        element.onkeypress = keyPress;
				        searchElements[searchElements.length] = element;
				        element.onclick = setFocus;
				        element.Element.selectedIndex = null;
				    }
		        }					
		        finderbase.clean();		    
			}
			
			function addElement(oRow,index,column){
				oRow.className = 'FinderRowCss'; 
				oCell = oRow.insertCell(column);
				oCell.innerHTML = '<nobr>' + searchColumns.columns[index].label + '</nobr>';
				oCell.className = 'FinderRowCss'; 
				oCell.style.width = 120;
				oCell = oRow.insertCell(parseInt(column + 1));
				oCell.className = 'FinderRowCss'; 
				oInp = document.createElement('input');
				oInp.type = 'text';
				oInp.onkeydown = onLock;
				oInp.onpaste = onLock;
				oInp.indexArray = searchColumns.columns[index].dataArrayIndex;
				oInp.id = base.columns.getColumn(oInp.indexArray - 2).Key;
				oInp.className = 'FinderElementCss'; 
				oInp.onkeypress = keyPress;
				searchElements[searchElements.length] = oInp;
				oInp.onclick = setFocus;	
				oCell.appendChild(oInp);
			}
			function setFocus()
			{
			    this.focus();
			}
			function actionHandler(){
			    this.execute = _execute; 
			    this.cleanData = _cleanData;
			    this.addData = _addData;
			    var values;
			    function _addData(tab){
			        var rExp = /,/gi;
				    for (var i = 0 ;i < tab.elements.length; i++)
				    {
				       var element = tab.elements[i];
				       var value; 
				       if (element.Element)
				       {    
				            if (element.trElement.style.display.toString().toLowerCase() != 'none' &&       
				                element.elementType != 'adhidden' && 
				                element.elementType != 'adinfo')
				            {
				                value = element.key + '#key:value#' + tab.elements[i].getElementValue();
				                values[values.length] = value.toString().replace(rExp,'#Comma#');
				            }
				       }
				       else 
				       {
				            value = element.key + '#key:value#' + tab.elements[i].getElementValue();
				            values[values.length] = value.toString().replace(rExp,'#Comma#');
				       }
                    }
			    }
			    function _cleanData(){values = new Array();}
			    function _execute(submitButton){
				        executeServerSearch(values.join(",").toString());
			    }
			} 
			
			function onLock(){
				if (!base.locked){
					return true; 
				}else{
					return false; 
				}
			}
			
			// aloittaa hakuprosessin 
			function find(){
				
				if (!base.locked){
				    if (finderbase.serverSearch) 
				    {
				        var values = new Array();
				        var rExp = /,/gi;
				        for (var i=0;i<searchElements.length;i++){
						    values[values.length] = searchElements[i].value.toString().replace(rExp,'#Comma#');  	
					    }
				        executeServerSearch(values.join(",").toString());
				    }
					else
					{
					    base.oBusy.start();
					    var criteriaArray = new Array();
					    var indexArray = new Array(); 
					    var typeArray = new Array();
					    // luodaan dynaamisesti hakuehdot 
					    for (var i=0;i<searchElements.length;i++)
					    {     
					        
						    if (searchElements[i].Element)
						    {
    						    if (searchElements[i].trElement.style.display != 'none')
    						    {
    						        var value = '';
    						        if (searchElements[i].elementType == 'adselect')
    						        {
    						            value = searchElements[i].getElementValue();
    						        }
    						        else if (searchElements[i].children.length > 0)
    						        {
    						            var valarr = new Array();
    						            for (var c=0;c<searchElements[i].children.length;c++)
    						            {
    						                if (searchElements[i].children[c].Element.checked)
    						                {
    						                    valarr[valarr.length] = searchElements[i].children[c].key;
    						                }
    						                else if (searchElements[i].children[c].Element.selected)
    						                {
    						                    valarr[valarr.length] = searchElements[i].children[c].key;
    						                }
    						            }
    						            value =  valarr.join('#,#');
    						        }
    						        else 
    						        {
    						            value = searchElements[i].getElementValue();
    						        }
    						        indexArray[indexArray.length] = searchElements[i].indexArray.toString();
    						        criteriaArray[criteriaArray.length] = value;  	
    						        typeArray[typeArray.length] = searchElements[i].searchType.toString();
    						    }
						    }
						    else 
						    {
	    					    indexArray[indexArray.length] = searchElements[i].indexArray.toString();
	    					    criteriaArray[criteriaArray.length] = searchElements[i].value.toString();
	    					    typeArray[typeArray.length] = searchColumns.columns[i].searchType;  	
						    }
						    
						    
						    if (base.columns.getColumn(indexArray[indexArray.length -1]-2).dataType.indexOf('date') > -1)
						    {
						        if (criteriaArray[criteriaArray.length-1])
						        {
						            var value = criteriaArray[criteriaArray.length-1];
						            if (value.toString().length > 0)
						            {						            
						                var ddval = new Date(getDateValue(value , base.dateDelimeter,base.dateType , 'm') +  '/' + getDateValue(value , base.dateDelimeter,base.dateType , 'd') + '/' + getDateValue(value , base.dateDelimeter,base.dateType , 'y') )
						                criteriaArray[criteriaArray.length-1] = cFormatDate(ddval,'mmddyy','/');
						            }
						        }
						        
						    }
						    
						    
					    }
					    
				        function doSearchJob()
					    {
					        search(criteriaArray,indexArray,typeArray);
					        base.oBusy.relase();
					    }
					        
					    if (!bUpdate)
					    {
					        window.setTimeout(doSearchJob,0);
					    }
					    else 
					    {
					        doSearchJob();
					    }
					}
				}
			}
			
			function keyPress(e){
				if (!base.locked){
					var Key = base.setKeyMask(e);
					if (Key == 13){
						find();
						try{
							// lopetetaan event 
							if (e.preventDefault){
								e.preventDefault();
								return false;
							}
							else {
								e.keyCode = 0;
								e.returnValue = false;
							}	
						}catch(ee){}	
					}
				}else {
					return false;
				}
			}
		} 
		
		// palauttaa suodatetun tietojoukon 
		function _getData(){
			
			if (!searchIsClean) 
				return searchResult; 
			else 
				return dataArray;
		} 
		
		// suorittaa hako toiminnon 
		function search(criteriaArray,indexArray,typeArray){
			var find = false; 
			searchResult = new Array(); 
			// tarkastetaan tyhjennetaanko haku
			for (var i=0;i<indexArray.length;i++){
				if (!criteriaArray[i]){
					find = true;
				} else if (criteriaArray[i].toString().length == 0){
					find = true;
				} else {
					find = false;
					break;
				}
			}
			
			if (find){
				searchIsClean = true;	
			} else {
				
				// tyhjennetaan pois turhat hakuehdot 
				// nopeuttaa suorittamista huomattavasti kun suureen looppiin ei tule turhia ehtoja 
				var deleteIndex = new Array();
				for (var i=0;i<indexArray.length;i++){
					if (!criteriaArray[i]){
						deleteIndex[deleteIndex.length] = i.toString();	
					} else if (criteriaArray[i].toString().length == 0){
						deleteIndex[deleteIndex.length] = i.toString();
					} 
				}			
				
				for (var i=deleteIndex.length-1;i>-1;i--){	
					indexArray.splice(deleteIndex[i],1);
					criteriaArray.splice(deleteIndex[i],1);
					typeArray.splice(deleteIndex[i],1);
				}
		
				// suoritetaan haku
				searchIsClean = false;
				var testValues = new Array(); 
                								
                
                // loopataan apuobjekteihin jotta vertailu on tehokkaampaa  
                for (var fields=0;fields<indexArray.length;fields++)
                { 				    
				    var searchType = typeArray[fields];
				    testValues[testValues.length] = wildCardFinder(criteriaArray[fields].toString().toLowerCase(), searchType); 
                }
							
				for (var i=0;i<dataArray.length;i++){
					find = false;
				    for (var fields=0;fields<testValues.length;fields++)
				    { 
					    try
					    {
					        var value = dataArray[i][indexArray[fields]].toString().toLowerCase();
					        if( testValues[fields].contains(value)){ 
						        find = true;
					        }else{
						        find = false;
						        break;
					        }
					     }
					     catch(e)
					     {
					        find=false;
					        break;
					     }
				    }	
					if (find)
						searchResult[searchResult.length] = dataArray[i]; 
				}			
				// suodatus on suoritettu 
			}			
			// tarkistus poistetaanko tuplat 
			if (finderbase.duplicateRowSearchLabel)
			{
			    var searchInd = duplicateElement.getElementValue().toString().split(','); 
			    if (searchInd && searchInd.length > 0)
			    {
			        if (searchIsClean) 
			        {
			            searchResult = new Array(); 
			            searchResult = searchResult.concat(_getData());
			            searchIsClean = false; 
			        }
    			    			    
			        var bupldata = duplicateFinder(searchResult,searchInd);
		            searchResult = new Array(); 
		            searchResult = searchResult.concat(bupldata);		    
		        }
			}
			
			
			
			// poistetaan kaikki valinnat 
			base.unSelectAll();
			
			// haetaan listalle data 
			base.Data = _getData();
			
			// sortataan lista uudelleen koska datan sisalto on muuttunut 
			base.sort(null,true);
						
			// siirrytaan ensimmaiselle sivulle 
			base.goPage(1);
			
			
			// laitetaan eventti data on haettu 
			function refreshFinder()
			{
			    base.onSearch(base.Data.length);
			}
			window.setTimeout(refreshFinder,100);
			initOperation = false;
		}
		
		// haku columnien asettaminen 
		function searchColumns(){
			this.addColumn = _addColumn;
			this.columns = new Array(); 
			function _addColumn(label,dataArrayIndex,searchType){
				var col = new column(); 
				col.dataArrayIndex = dataArrayIndex; 
				col.label = label;
				if (searchType) col.searchType = searchType;
				this.columns[this.columns.length] = col; 
			}
			function column(){
				this.dataArrayIndex;
				this.label;
				this.searchType = 'normal';
			}
		}
	} 
	
	


function listCallbackHandler()
{
    this.addItems = addItems;
    this.addEvent = addEvent;
    this.addValues = addValues;
    this.execute = execute;
    
    var postData = '';
    
    function modValue(value)
    {
        var rExp = new RegExp('&','g');
        value = value.toString().replace(rExp,'#Split#');
        rExp = /\n/gi;
		value = value.replace(rExp,'#Linefeed#');
		return URLEncodeValues(value);
    }
    function addItems(value)
    {    
        postData += "&Items=" + modValue(value);
    }
    function addValues(value)
    {    
        postData += "&Values=" + modValue(value);
    }
    function addEvent(value)
    {
        postData += "&Event=" + modValue(value);
    } 
    
    function execute(objectName,waitResponse,callbacFunction,callbacErrorFunction)
    {
        if (waitResponse == null){waitResponse = true;}
        postData = "&objectName=" + objectName + postData;
        postData = "__VIEWSTATE=" + URLencode(document.getElementById("__VIEWSTATE").value) + postData;    
        var url = document.location.href;
        if (url.indexOf('?') > 0)url += '&';
        else url += '?';
        url += 'action=true';
        sendEventToServer(url, postData, true, null, false,callbacFunction,callbacErrorFunction,waitResponse)
     }
     
     function callbacFunction(executeScript)
     {
            // suoritetaan saatu javascripta 
            eval(executeScript);
     }
     
     function callbacErrorFunction(message , errorNumber)
     {    
        alert(message);
        //alert('Server error, please try again.');   
     }
 }

	