/////////////////////////////////////////////////////////////////////////////////
// globaalit functiot  	
/////////////////////////////////////////////////////////////////////////////////
function info(element,msg,e){
    var toolTip = document.createElement("div");
    document.body.appendChild(toolTip);
    toolTip.className = 'InfoTipCss';
    toolTip.id = "toolTip";
    toolTip.innerHTML = "<p>"+msg+"</p>";
    toolTip.style.position = 'absolute';
 
 
    moveInfo(e);
    element.onmouseout = hideInfo;
    element.onmousemove = moveInfo;
    function hideInfo(){if (toolTip){document.body.removeChild(toolTip);toolTip = null;} }
    function moveInfo(e){if (toolTip){var xy = mouseLocation(e);toolTip.style.top = parseInt(xy[1])+20 + "px";toolTip.style.left = parseInt(xy[0])+2 + "px";} }
    function mouseLocation(e)
    {
        // Haetaan paikka jossa hiiri on meua avatessa 
		var x = 0;
		var y = 0;
		if (navigator.appName=='Microsoft Internet Explorer'){
			x = event.clientX + document.body.scrollLeft;
			y = event.clientY + document.body.scrollTop;
		} else {
			x = e.pageX;
			y = e.pageY;
		}
		if (x < 0){x = 0}
		if (y < 0){y = 0}
        return [x,y];
    }
}


function URLencode(sStr)    {
 return escape(sStr).replace(new RegExp('\\+', 'g'), '%2b');
}




function URLEncodeValues(value)
{
    var returnValue = '';
    for( var i = 0;i<value.length;i++)
    {
        returnValue += charEncode(value.charAt(i));
    }
    return returnValue;
}


function charEncode(valueChar)
{
    var value = valueChar.charCodeAt(0);
    
    if (value == 32) return '+';
    else if (value == 34) return '%22';
    else if (value == 35) return '%23';
    else if (value == 36) return '%24';
    else if (value == 37) return '%25';
    else if (value == 38) return '%26';
    else if (value == 43) return '%2b';
    else if (value == 44) return '%2c';
    else if (value == 47) return '%2f';
    else if (value == 58) return '%3a';
    else if (value == 59) return '%3b';
    else if (value == 60) return '%3c';
    else if (value == 61) return '%3d';
    else if (value == 62) return '%3e';
    else if (value == 63) return '%3f';
    else if (value == 64) return '%40';
    else if (value == 91) return '%5b';
    else if (value == 92) return '%5c';
    else if (value == 93) return '%5d';
    else if (value == 94) return '%5e';
    else if (value == 96) return '%60';
    else if (value == 123) return '%7b';
    else if (value == 124) return '%7c';
    else if (value == 125) return '%7d';
    else if (value == 126) return '%7e';
    else if (value == 161) return '%c2%a1'
    else if (value == 162) return '%c2%a2';
    else if (value == 163) return '%c2%a3';
    else if (value == 164) return '%c2%a4';
    else if (value == 165) return '%c2%a5';
    else if (value == 166) return '%c2%a6';
    else if (value == 167) return '%c2%a7';
    else if (value == 168) return '%c2%a8';
    else if (value == 169) return '%c2%a9';
    else if (value == 170) return '%c2%aa';
    else if (value == 171) return '%c2%ab';
    else if (value == 172) return '%c2%ac';
    else if (value == 173) return '%c2%ad';
    else if (value == 174) return '%c2%ae';
    else if (value == 175) return '%c2%af';
    else if (value == 176) return '%c2%b0';
    else if (value == 177) return '%c2%b1';
    else if (value == 178) return '%c2%b2';
    else if (value == 179) return '%c2%b3';
    else if (value == 180) return '%c2%b4';
    else if (value == 181) return '%c2%b5';
    else if (value == 182) return '%c2%b6';
    else if (value == 183) return '%c2%b7';
    else if (value == 184) return '%c2%b8';
    else if (value == 185) return '%c2%b9';
    else if (value == 186) return '%c2%ba';
    else if (value == 187) return '%c2%bb';
    else if (value == 188) return '%c2%bc';
    else if (value == 189) return '%c2%bd';
    else if (value == 190) return '%c2%be';
    else if (value == 191) return '%c2%bf';
    else if (value == 192) return '%c3%80';
    else if (value == 193) return '%c3%81';
    else if (value == 194) return '%c3%82';
    else if (value == 195) return '%c3%83';
    else if (value == 196) return '%c3%84';
    else if (value == 197) return '%c3%85';
    else if (value == 198) return '%c3%86';
    else if (value == 199) return '%c3%87';
    else if (value == 200) return '%c3%88';
    else if (value == 201) return '%c3%89';
    else if (value == 202) return '%c3%8a';
    else if (value == 203) return '%c3%8b';
    else if (value == 204) return '%c3%8c';
    else if (value == 205) return '%c3%8d';
    else if (value == 206) return '%c3%8e';
    else if (value == 207) return '%c3%8f';
    else if (value == 208) return '%c3%90';
    else if (value == 209) return '%c3%91';
    else if (value == 210) return '%c3%92';
    else if (value == 211) return '%c3%93';
    else if (value == 212) return '%c3%94';
    else if (value == 213) return '%c3%95';
    else if (value == 214) return '%c3%96';
    else if (value == 215) return '%c3%97';
    else if (value == 216) return '%c3%98';
    else if (value == 217) return '%c3%99';
    else if (value == 218) return '%c3%9a';
    else if (value == 219) return '%c3%9b';
    else if (value == 220) return '%c3%9c';
    else if (value == 221) return '%c3%9d';
    else if (value == 222) return '%c3%9e';
    else if (value == 223) return '%c3%9f';
    else if (value == 224) return '%c3%a0';
    else if (value == 225) return '%c3%a1';
    else if (value == 226) return '%c3%a2';
    else if (value == 227) return '%c3%a3';
    else if (value == 228) return '%c3%a4';
    else if (value == 229) return '%c3%a5';
    else if (value == 230) return '%c3%a6';
    else if (value == 231) return '%c3%a7';
    else if (value == 232) return '%c3%a8';
    else if (value == 233) return '%c3%a9';
    else if (value == 234) return '%c3%aa';
    else if (value == 235) return '%c3%ab';
    else if (value == 236) return '%c3%ac';
    else if (value == 237) return '%c3%ad';
    else if (value == 238) return '%c3%ae';
    else if (value == 239) return '%c3%af';
    else if (value == 240) return '%c3%b0';
    else if (value == 241) return '%c3%b1';
    else if (value == 242) return '%c3%b2';
    else if (value == 243) return '%c3%b4';
    else if (value == 244) return '%c3%b4';
    else if (value == 245) return '%c3%b5';
    else if (value == 246) return '%c3%b6';
    else if (value == 247) return '%c3%b7';
    else if (value == 248) return '%c3%b8';
    else if (value == 249) return '%c3%b9';
    else if (value == 250) return '%c3%ba';
    else if (value == 251) return '%c3%bb';
    else if (value == 252) return '%c3%bc';
    else if (value == 253) return '%c3%bd';
    else if (value == 254) return '%c3%be';
    else 
        return valueChar;
 }



function CallbackHandler(oForm)
{
    this.addData = addData;
    this.execute = execute;
    this.addEvent = addEvent;
    this.clean = clean;
    
    var postData = '';
    var eventData = '';
    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 clean()
    {
        postData = '';
    }
    function addData(tab)
    {    
        postData += "&tab_tab_tab=" + tab.key;
        for (var i = 0 ;i < tab.elements.length; i++){
            if (tab.elements[i].elementType != 'adinfo')
            {
                var value = tab.elements[i].getElementValue();
                value = modValue(value);
                postData += "&" + tab.elements[i].key + "=" + value;
            }
        }
    }
    
    function addEvent(value)
    {
        value = modValue(value);
        eventData = "&Event=" + value;
    } 
    
    function execute(submit)
    {
        if (submit)
        {
            postData += "&__submit=__submit";
        }
        if (document.getElementById("viewStateID"))
        {
            postData = "&viewStateID=" + document.getElementById("viewStateID").value + postData;
        }
        postData = "__VIEWSTATE=" + URLencode(document.getElementById("__VIEWSTATE").value) + postData;
        if (eventData.length > 0)
        {
            postData += eventData;
        }
          
        var url = document.location.href;
        if (url.indexOf('?') > 0)url += '&';
        else url += '?';
        url += 'process=true';
        
        //oForm.waitResponse(true);
        sendEventToServer(url, postData, true, null, false,callbacFunction,callbacErrorFunction,true);
     }
     
     function callbacFunction(executeScript)
     {
            //oForm.waitResponse(false);
            //alert(executeScript);
            // suoritetaan saatu javascripta 
            eval(executeScript);
     }
     
     function callbacErrorFunction(message , errorNumber)
     {    
        //oForm.waitResponse(false);
        if (callbackServerError.length > 0)
        {
            alert(callbackServerError);
        }
        else
        {
            alert('Server error, please try again.');
        }   
     }
 }

function sendEventToServer(url, postData, silent, afterExecute, noError,callbacFunction,callbacErrorFunction, waitResponse)
{
    var httpRequest;
    var elements;
    if (waitResponse)
    {
        waitResponse = true;
    }
    else 
    {
        waitResponse = false;
    }
    url = url.replace('#',''); 
    if (!silent)
    {
        elements = document.getElementsByTagName('*');
    }
    
    if (window.XMLHttpRequest) 
    { 
        httpRequest = new XMLHttpRequest();
        if (httpRequest.overrideMimeType) 
        {
            httpRequest.overrideMimeType('text/xml');
            // See note below about this line
        }
    } 
    else if (window.ActiveXObject) 
    { 
        try 
        {
                httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
        } 
        catch (e) 
        {
            try 
            {
                httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
            } 
            catch (e) {}
        }
    }
    if (!httpRequest) 
    {
        alert('Cannot create an XMLHTTP instance.');
        return false;
    }
    if (!silent)
    {
        for (var i=0;i<elements.length;i++)
        {
            elements[i].cursor = elements[i].style.cursor;
            elements[i].style.cursor = 'wait';
        }
    }
    //try
    //{
    
        httpRequest.open('POST', url , !waitResponse);
        httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        if (!waitResponse)
        {
            httpRequest.onreadystatechange = function() { loadServerEvent(httpRequest ); };
        }
        httpRequest.send(postData);
        if (waitResponse)
        {
            loadServerEvent(httpRequest );
        }
    //}
    //catch(e)
    //{
    //    // Error 
    //}
    
        
    
    function loadServerEvent(httpRequest)
    {    
        if (httpRequest.readyState == 4) 
        {
            if (!silent)
            {
                for (var i=0;i<elements.length;i++)
                {
                    elements[i].style.cursor = elements[i].cursor;
                }
            }
            
            if (httpRequest.status == 200) 
            {
                if (callbacFunction)
                {
                    callbacFunction(httpRequest.responseText,0);
                }
                else 
                {
                    eval(httpRequest.responseText);
                }
            } 
            else 
            {
                
                if (!noError)
                {   
                    if (callbacErrorFunction)
                    {
                        callbacErrorFunction(httpRequest.responseText , httpRequest.status );
                    }
                    else 
                    {
                        alert('There was a problem with the request.');
                    }
                }   
            }
            if (afterExecute)
            {
                afterExecute();
            }   
        }
    }
}


// hakukoneen villikortti haku 
function wildCardFinder(value, searchType)
{
    value = value.split('#,#');
        
    // Palauttaa kustujalle objektin 
    if (searchType == 'searchright')
    {
        // haetaan alusta 
        return new searchOnlyRight(value);
    }
    if (searchType == 'searchleft')
    {
        // haetaan alusta 
        return new searchOnlyLeft(value);
    }
    else if (searchType == 'vildcard')
    {
        // luodaan haku 
        return create(value);
    }
    else 
    {
         // Normaali haku
        return new searchMiddle(value,true);
    }
    
    
    function create(value)
    {
         // tarkastetaan onko alussa ja lopussa kyseinen arvo 
        if (value[0].charAt(0) == '*')
        {
            if (value[0].charAt(value[0].length-1) == '*')
            {
                // alussa ja lopussa 
                return new searchMiddle(value);
            }
            else 
            {
                // vain alussa 
                return new searchLeft(value);
            }
        } 
        else if (value[0].charAt(value[0].length-1) == '*')
        {
            // vain lopussa 
            return new searchRight(value);
        }
        else if (value[0].charAt(0) == '$' && value[0].charAt(value[0].length-1) == '$')
        {
            return new searchLeft2(value,true);
        }
        else 
        {
            // ei tahtea taytyy timmata kokonaan 
            return new searchFull(value);
        }              
    }
       
   
    // etsii sanan keskelta 
    function searchFull(testValue)
    {
        this.contains = contains;
        
        // Palauttaa boolean arvon loytyyko stringin alusta 
        function contains(value)
        {
            // verrataan alusta ja lopusta 
            for(var i=0;i<value.length;i++)
            {
                if (value == testValue[i])
                {
                    return true; 
                }
            }
            return  false;         
        } 
    }
    
    
    
    // etsii sanan keskelta 
    function searchMiddle(testValue, normal)
    {
        this.contains = contains;
        if (!normal)
        {
            // poistetaan * merkki 
            for(var i=0;i<testValue.length;i++)
            {
                try
                {
                    testValue[i] = testValue[i].substring(0,testValue[i].length - 1);
                    testValue[i] = testValue[i].substring(1);
                }
                catch(e)
                {
                    testValue[i] ='';
                }
            }
        }
        // Palauttaa boolean arvon loytyyko stringin alusta 
        function contains(value)
        {
            // verrataan alusta ja lopusta 
            for (var i=0;i<value.length;i++)
            {
                if (testValue[i].length > 0)
                {
                    if (value.indexOf(testValue[i]) > -1)
                    {
                        return true; 
                    }
                }
            }
            return  false;         
        } 
    }
    
    
    // etsii sanan lopusta 
    function searchRight(testValue)
    {
        this.contains = contains;
        // poistetaan * merkki 
        for(var i=0;i<testValue.length;i++)
        {
            try
            {   
                testValue[i] = testValue[i].substring(0,testValue[i].length - 1);   
            }
            catch(e)
            {
                testValue[i] ='';
            }
        }
        // Palauttaa boolean arvon loytyyko stringin alusta 
        function contains(value)
        {
            // verrataan lopusta 
            for(var i=0;i<testValue.length;i++)
            {
                if (testValue[0].length > 0)
                {
                    if (value.indexOf(testValue[0])  == 0)
                    {
                        return true; 
                    }
                }
                return false; 
            }
        } 
    }
    
    
    // etsii sanan lopusta 
    function searchOnlyRight(testValue)
    {
        this.contains = contains;
        
        // Palauttaa boolean arvon loytyyko stringin alusta 
        function contains(value)
        {
            
            // verrataan lopusta     
            if (testValue[0].length > 0)
            {
                if ((value.lastIndexOf(testValue[0]) + testValue[0].length)  == value.length)
                {
                    return true; 
                }
            }
            return false; 
        
        } 
    }
    
    
    /// Etsii alusta 
    function searchLeft(testValue)
    {
        this.contains = contains;
        // poistetaan * merkki 
         for(var i=0;i<testValue.length;i++)
         {
            try
            {
                testValue[i] = testValue[i].substring(1);
            }
            catch(e)
            {
                testValue[i] ='';
            }
        }
        
        // Palauttaa boolean arvon loytyyko stringin alusta 
        function contains(value)
        {
            // verrataan alusta 
            for(var i=0;i<testValue.length;i++)
            {
                if (testValue[i].length > 0)
                {
                    if ((value.indexOf(testValue[i]) + testValue[i].length)  == value.length)
                    {
                        return true; 
                    }
                }
            }
            return false;
        } 
    }
    
    /// Etsii alusta 
    function searchOnlyLeft(testValue)
    {
        this.contains = contains;
        
        // Palauttaa boolean arvon loytyyko stringin alusta 
        function contains(value)
        {
            // verrataan alusta     
            if (testValue[0].length > 0)
            {
                if ((value.indexOf(testValue[0]))  == 0)
                {
                    return true; 
                }
            }
        
            return false;
        } 
    }
    
    
    /// Etsii alusta 
    function searchLeft2(testValue)
    {
        this.contains = contains;
        
        // poistetaan $ merkit
         for(var i=0;i<testValue.length;i++)
         {
            try
            {
                testValue[i] = testValue[i].substring(1,testValue[i].length-1);
                
            }
            catch(e)
            {
                testValue[i] ='';
            }
        }
        
        // Palauttaa boolean arvon loytyyko stringin alusta 
        function contains(value)
        {
            // verrataan alusta 
            for(var i=0;i<testValue.length;i++)
            {
                if (testValue[i].length > 0)
                {
                    if (value.substring(0,testValue[i].length) == testValue[i])
                    {
                        return true; 
                    }
                }
            }
            return false;
        } 
    }
} 


// tablen kasittelya helpottava objekti
function table(className,width,height,padding,border)
{
    // luodaan objekti ja palautetaan se kutsujalla 
    object = document.createElement('table'); 
    object.cellPadding = 0;
	object.cellSpacing = 0;
	object.border = 0;
	if (className) object.className = className;
	if (padding) object.style.padding = padding;
	if (width) object.style.width = width;
	if (height) object.style.height = height;
	
    
    // julkinen interface 
    object.addRow = addRow;           // Luo ja palauttaa uuden rivin 
    object.addCell = addCell;         // Luo ja palauttaa uuden solun 
    object.fillRow = fillRow;         // Luo uuden rivin ja tayttaa sen palauttaa solut 
    object.fillCell = fillCell;       // luo, tayttaa ja palauttaa solun 
    object.setCellData = setCellData; // asettaa solulle kontentin 
    
    
    // Sisaiset oliot
    var cell; 
    var row; 
    var cellCount = 0;
    var rowCount = 0; 
    var base = this;
    var object;                    // sisaltaa table objektin 
    
    
        
	return object;    
	    
    // luo taulukkoon uuden rivin ja palauttaa sen 
    function addRow(index)
    {
        if (index != null)
        {
            row = object.insertRow(index);
        }
        else 
        {
            row = object.insertRow(rowCount);
        }
        rowCount++; 
        cellCount = 0; 
        return row; 
    }
    
    
    // luo taulukkoon uuden solun ja palauttaa sen 
    function addCell(index)
    {
        if (index != null)
        {
            cell = row.insertCell(index); 
        }
        else 
        {
            cell = row.insertCell(cellCount); 
        }
        cellCount ++; 
        return cell;
    }
    
    
    // asettaa solulle sisallon 
    function fillCell(oData){
		
		// lisataan uusi solu 
		addCell();

        // taytetaan solu 
        setCellData(oData);
        
		// palautetaan cell objekti 
		return cell;
    }
    
    
    // asettaa solulle sisallon 
    function setCellData(oData)
    {
        // taytetaan se saadulla datalla 
		if (typeof oData != 'string') 
		{
			cell.appendChild(oData);  
		}
		else 
		{
			cell.innerHTML = oData;
		}
    }
    
    
    // asettaa riville sisallon 
    function fillRow(cell1,cell2){
        // Lisataan uusi rivi     	
    	addRow();
    	
    	// Palautetaan tulos taulukkona kutsujalle
    	return 	[fillCell(cell1),fillCell(cell2)]		
    } 
}



// rakentaa url merkkijonon annettujen parametrien avulla 
function parseUrl(url,allowKeys,newValues){
    var queryString;
    var returnUrl = url;
    var valuePairs = new Array();
    var valuePair;
    var key;
    var value;
    
    try
    {
        if (!allowKeys){
            allowKeys = ',,';
        } 
        else {
            allowKeys = ',' + allowKeys.toLowerCase() + ','; 
        }
        
        returnUrl = url.toString().split('?')[0];
        queryString = url.toString().split('?')[1];
        if (queryString){
            if (queryString.length > 0 ){
                // kasitellaan arvot yksitellen jaetaan etku merkilla 
                valuePairs = queryString.toString().split('&');
                queryString = ''; 
                for ( var i=0;i<valuePairs.length;i++){
                    
                    // muodostetaan verratava avain / arvo pari 
                    value = '';
                    valuePair = valuePairs[i].toString().split("=");
                    key = valuePair[0].toString().toLowerCase();
                    for (var n=1;n<valuePair.length;n++){
                        if (n > 1) value += '=';
                        value += valuePair[n];
                    }
                    // tarkistetaan onko sallittu 
                    if ( allowKeys.indexOf((',' + key + ',')) > -1 ){
                        if (queryString.length > 0){
                            queryString += '&';
                        } 
                        queryString += key + '=' + value.toString();
                    } 
                }
                if (newValues){
                    if (newValues.length > 0){
                        if (queryString.length > 0){
                            queryString += '&';
                        } 
                        queryString += newValues;
                    }
                }             
                // lisataan ? merkki vain jos on jotakin tulostettavaa 
                if (queryString.length > 0 ){
                    returnUrl += '?';
                }
            } 
        } 
    }
    catch(e){return url;}
    
    // palautetaan tulos kutsujalle 
    return returnUrl + queryString;    
}  


function getFirstPage_Num(tabs){
    for (var i = 0;i<tabs.length;i++){
        if (tabs[i].enabled){
            return i;
        }
    } 
    return null;
}
function getLastPage_Num(tabs){
    for (var i = tabs.length - 1;i >= 0;i--){
        if (tabs[i].enabled){
            return i;
        }
    } 
    return null;
}
function getNextPage_Num(page_Num , tabs ,inside){
    if (page_Num >= tabs.length) page_Num = tabs.length - 1;
    for (var i = page_Num;i<tabs.length;i++){
        if (tabs[i].enabled){
            return i;
        }
    } 
    if (!inside) page_Num = getPreviousPage_Num(page_Num , tabs ,true );
    else page_Num = null;
    return page_Num;
}
function getPreviousPage_Num(page_Num , tabs ,inside ){
    if (page_Num <= 0) page_Num = 0;
    if (page_Num >= tabs.length) page_Num = tabs.length -1;
    for (var i = page_Num;i>=0;i--){
        if (tabs[i].enabled){
            return i;
        }
    } 
    if (!inside) page_Num = getNextPage_Num(page_Num , tabs , true );
    else page_Num = null;
    return page_Num;
}

// suorittaa elementtien tarkistuksen 
function validate(base,pages){
	this.check = check;
	this.server = false; 
	this.serverSubmit = false;
	this.checkFileExtension = checkFileExtension; 
	this.enterSubmit = false;
	this.serverErrorTitle;
	var checkBase = this;
	var firstPage;
	var page;
	var errorPage;
	function checkFileExtension(oEl){
		if (base.locks != 0) return true;
		var value = oEl.getElementValue();
		var message ='';
		var currentPage = base.currentPage;
		var errorColor;
		
		errorColor = base.tabs[currentPage].errorColor;
		if (!errorColor) errorColor = 'red';
		if (oEl.errorImage){elements[i].labelElement.removeChild(elements[i].errorImage); elements[i].errorImage = null;}
		setLabelColor(oEl,'',null,true);
		
		if (oEl.show){					
			if (oEl.elementType == 'adfile'){
				if (value.length > 0  ){ 
					if (oEl.fileTypes != '.*' && oEl.fileTypes.length > 0 ){
						var extension = parseFileExtension(value).toLowerCase();
						var extArr = oEl.fileTypes.split(",");
						var find = false; 
						for (var i=0;i<extArr.length;i++){
							if (extArr[i] == extension){
								find = true;
								break;
							}
						}
						if (!find)
						{
						    var rExp = /,/gi;
						    var errmess = oEl.fileTypes.replace(rExp,", ");
							message = writeErrorMessage(oEl,message, lanFileTypes + ' ' + errmess ,errorColor);	
						} 
					}	
				}
				else return false;
			} 
			else return false;
		}
		else return false;
		
		if (message.length == 0)	
			return true;
		else {
			errorPage = currentPage;
			pages.writeError(message);
			return false; 	
		}
	}
	function parseFileExtension(value){try{return value.substring(value.lastIndexOf('.'));} catch(e){return "";}}  
	function check(){
		if (pages.errorIsOpen()){base.goPage(errorPage);return true;}
		if (base.locks != 0) return true;
		var success = false;
		var value = new Array();
		var elements; 					
		var message ='';
		var currentPage = base.currentPage;
		var lastPage;
		var submitButton;
		var errorColor;
		var hiddenConditionElements = new Array(); 
		var showConditionElements = new Array(); 
		firstPage = -1;	
		try{if (this.key == 'submit' | this.key == 'execute' | this.key == 'close' | checkBase.serverSubmit | checkBase.enterSubmit ) submitButton = true;  else submitButton = false;} catch(e){submitButton = false;}
		checkBase.enterSubmit = false;
		if (!checkBase.server) 
		{
		    if (base.actionFrame)
		        base.actionFrame.cleanData(); 
		    else 
		        callbackHandler.clean();
		}
		if (!base.edit && base.created && base.wizard && !submitButton){lastPage = currentPage;} 
		else lastPage = base.tabs.length;
		if (!checkBase.server){ 
		    try{base.onSubmit();}catch(e){}
			if (base.wizard ) 
			{
				if (!submitButton)
				{ 
					if (base.actionFrame)
					{
					    base.actionFrame.addData(base.tabs[base.lastPage]);	
					}
					else 
					{
					    callbackHandler.addData(base.tabs[base.lastPage])
					}
				} 
				else if (base.pageStyle == 'wizard_tabs')
				{
				    if (base.actionFrame)
				    {
				        // jos tallenna nappain on kokoajan esilla sen pitaa tallentaa vain kyseinen sivu.
				        base.actionFrame.addData(base.tabs[base.currentPage]);	
				    }
				    else 
				    {
				        callbackHandler.addData(base.tabs[base.currentPage]);	
				    }
				}
				else
				{
				    if (base.actionFrame)
				    {
				        base.actionFrame.addData(base.tabs[getLastPage_Num(base.tabs)]);
				    }
				    else 
				    {
				        callbackHandler.addData(base.tabs[getLastPage_Num(base.tabs)]);
				    }
				}
			}
		}
		for (page = 0;page<base.tabs.length;page++){
		    elements = base.tabs[page].elements; 				
		    for (var i = 0;i<elements.length;i++){
                var children = elements[i].children
                for (var c = 0;c<children.length;c++){    			    
			        if (children[c].condition){
			            var elValue = ',' + elements[i].getElementValue() + ','; 
			            if (elValue.indexOf(',' + children[c].value + ',') == -1 ){
			                var cc = children[c].condition.toString().split(',');
			                for (var chc = 0;chc<cc.length;chc++)
			                {
			                    hiddenConditionElements[hiddenConditionElements.length] = cc[chc].toString();
			                }
			            } else{
			                var cc = children[c].condition.toString().split(',');
			                for (var chc = 0;chc<cc.length;chc++)
			                {
			                    showConditionElements[showConditionElements.length] = cc[chc].toString();
			                }
			            }
			        }
			    }
		    }
		} 	
		for (page = 0;page<lastPage;page++){ 	
			if (message.length > 0 && !base.edit && base.created && base.wizard) break;
			if (base.tabs[page].enabled){
			    base.goPage(page);
			    elements = base.tabs[page].elements; 				
			    errorColor = base.tabs[page].errorColor;
			    if (!errorColor) errorColor = 'red';
			    if (!checkBase.server) 
			    {
			        if (!base.wizard)
			        { 
			            if (base.actionFrame) 
			            {
			                base.actionFrame.addData(base.tabs[page]);
			            }
			            else 
			            {
			                callbackHandler.addData(base.tabs[page]);
			            }
			        }
			    }
			    for (var i = 0;i<elements.length;i++){
				    if (elements[i].errorImage){elements[i].labelElement.removeChild(elements[i].errorImage); elements[i].errorImage = null;}
				    setLabelColor(elements[i],'',null,true);
			    }
			    for (var i = 0;i<elements.length;i++){
				    var oEl = elements[i];
				    value = oEl.getElementValue();
				    if (oEl.serverError.length > 0) {message = writeErrorMessage(oEl,message, oEl.serverError,errorColor);} 
				    else if (!checkBase.server && oEl.show && isInCondition(showConditionElements,hiddenConditionElements, oEl.key) && !oEl.readOnly ){					
					    // tarkistetaan onko arvo validi 	
					    // tarkistetaan onko arvo pakollinen 
					    if (oEl.required == true && (oEl.elementType == 'adselect' | oEl.elementType == 'adselectmultiple') ){ 
					        if (value.toString() == oEl.children[0].Element.value.toString()){     
					            message = writeErrorMessage(oEl,message, lanRequiredlabel,errorColor);
					        } 
					    } else if (value.length == 0 && oEl.required == true ){
						    message = writeErrorMessage(oEl,message, lanRequiredlabel,errorColor);
					    
					    } else if (value.length > 0 ){ 
						    // tarkistetaan vastaako arvo tietotyyppia 
						    if (oEl.elementType == 'adfloat' | oEl.elementType == 'adpercent' | oEl.elementType == 'adcurrency'  | oEl.elementType == 'admoney' | oEl.elementType == 'adnumeric'){
							    if (!IsNumeric(value.toString(),true)){
								    message = writeErrorMessage(oEl,message, lanNumberlabel,errorColor);
							    }else {
								    if ((value  < cInt(oEl.minValue) && oEl.minValue ) | (value > cInt(oEl.maxValue) && oEl.maxValue ) ){   
									    message = writeErrorMessage(oEl,message, lanBetweenlabel.replace('#MinMax#' , cString(oEl.minValue) + '-' + cString(oEl.maxValue) ),errorColor);
								    }
							    }
						    }else if (oEl.elementType == 'adinteger' | oEl.elementType == 'adnumeric'){
							    if (!IsNumeric(value.toString(),false)){
								    message = writeErrorMessage(oEl,message, lanNumberlabel,errorColor);
							    }else {
								    if ((value  < cInt(oEl.minValue) && oEl.minValue ) | (value > cInt(oEl.maxValue) && oEl.maxValue ) ){   
									    message = writeErrorMessage(oEl,message, lanBetweenlabel.replace('#MinMax#' , cString(oEl.minValue) + '-' + cString(oEl.maxValue) ),errorColor);
								    }
							    } 	
						    }else if (oEl.elementType == 'ademail'){
							    if (!isEmail(value.toString())){
								    message = writeErrorMessage(oEl,message, lanIncorrectlabel,errorColor);
							    } 
						    }else if (oEl.elementType == 'addatecontrol' |oEl.elementType == 'addivdatecontrol' | oEl.elementType == 'addate' ){
							    if (!isDate(value,getDateFormat(base.dateType,base.dateDelimeter))){
								    message = writeErrorMessage(oEl,message,lanDatelabel,errorColor);		
							    } else {
								    var dat = new Date(getDateValue(value , base.dateDelimeter,base.dateType , 'm') +  '/' + getDateValue(value , base.dateDelimeter,base.dateType , 'd') + '/' + getDateValue(value , base.dateDelimeter,base.dateType , 'y') );
								    var max = new Date(); 
								    var min = new Date(); 
								    var maxMessage;
								    var minMessage;							
								    if (oEl.minValue && oEl.maxValue){
									    if (IsNumeric(oEl.maxValue,false)) max.setDate(max.getDate() + cInt(oEl.maxValue)); else max = new Date(oEl.maxValue);
									    if (IsNumeric(oEl.minValue,false)) min.setDate(min.getDate() + cInt(oEl.minValue)); else min = new Date(oEl.minValue);
									    maxMessage = cFormatDate(max,base.dateType,base.dateDelimeter);
									    max.setDate(max.getDate() - 1);
									    minMessage = cFormatDate(min,base.dateType,base.dateDelimeter);
									    if (dat < min | dat > max){message = writeErrorMessage(oEl,message, lanBetweenlabel.replace('#MinMax#' , minMessage + '-' + maxMessage ),errorColor);} 
								    } else if (oEl.minValue){
									    if (IsNumeric(oEl.minValue,false)) min.setDate(min.getDate() + cInt(oEl.minValue)); else min = new Date(oEl.minValue);
									    minMessage = cFormatDate(min,base.dateType,base.dateDelimeter);		
									    if (dat < min ){message = writeErrorMessage(oEl,message, lanBetweenlabel.replace('#MinMax#' , minMessage + '-'  ),errorColor);}
								    }else if (oEl.maxValue) {
									    if (IsNumeric(oEl.maxValue,false)) max.setDate(max.getDate() + cInt(oEl.maxValue)); else max = new Date(oEl.maxValue);
									    maxMessage = cFormatDate(max,base.dateType,base.dateDelimeter);
									    max.setDate(max.getDate() - 1);
									    if ( dat > max){message = writeErrorMessage(oEl,message, lanBetweenlabel.replace('#MinMax#' ,  '-' + maxMessage ),errorColor);}
								    }
							    }
						    }else if (oEl.elementType == 'adpassword' | oEl.elementType == 'adpassword2' ){
							    if (oEl.minValue && oEl.maxValue){
								    if (value.length < cInt(oEl.minValue) ){ message = writeErrorMessage(oEl,message, lanPasssortlabel);} 
								    else if ( value.length > cInt(oEl.maxValue) ){ message = writeErrorMessage(oEl,message, lanPasslonglabel,errorColor);}
							    } else if (oEl.maxValue){
								    if ( value.length > cInt(oEl.maxValue) ){ message = writeErrorMessage(oEl,message, lanPasslonglabel,errorColor);}
							    } else if (oEl.minValue){
								    if (value.length < cInt(oEl.minValue) ){	message = writeErrorMessage(oEl,message, lanPasssortlabel,errorColor);	}
							    }	
						    } else  if (oEl.Element.tagName.toLowerCase() == 'input' | oEl.elementType == 'adtextarea' ){	
							    if (oEl.minValue && oEl.maxValue){
								    if (value.length < cInt(oEl.minValue) ){ message = writeErrorMessage(oEl,message, lanSortlabel,errorColor);} 
								    else if ( value.length > cInt(oEl.maxValue) ){ message = writeErrorMessage(oEl,message, lanLonglabel);}
							    } else if (oEl.maxValue){
								    if ( value.length > cInt(oEl.maxValue) ){ message = writeErrorMessage(oEl,message, lanLonglabel,errorColor);}
							    } else if (oEl.minValue){
								    if (value.length < cInt(oEl.minValue) ){	message = writeErrorMessage(oEl,message, lanSortlabel,errorColor);	}
							    }	
						    }
					    }
				    }
			    } 
		    }
		}
		if (firstPage == -1){
			base.goPage(currentPage); 
			errorPage = currentPage;
		} else { 
			base.goPage(firstPage);
			errorPage = firstPage;	
		}
		if (!checkBase.server && message.length == 0)
		{
			if (base.actionFrame)
			{
			    base.actionFrame.execute(submitButton);
			}
			else 
			{
			    callbackHandler.execute(submitButton);
			}
		} 
		else 
		{
		    if(!base.getErrorMessage)
		    {
		        writeMessage(message);
		    }
		    else 
		    {
		        base.getErrorMessage(errorElements,errors,writeMessage,callbackError);
		    }
		}
		base.cleanServerError();
		if (message.length == 0) return true;
		else return false; 	
	}
	function writeMessage(errorMessage)
	{
	    pages.writeError(errorMessage,null,checkBase.serverErrorTitle);
	    errorElements = new Array(); 
	    errors = new Array(); 
	}
	function callbackError()
	{
	    try
	    {
	        if (callbackServerError.length > 0)
            {
                alert(callbackServerError);
            }
            else
            {
                alert('Server error, please try again.');
            } 
        }
        catch(e)
        {
                alert('Server error, please try again.');
        }
	}
	var errorElements = new Array(); 
	var errors = new Array(); 
	function writeErrorMessage(oEl , message , error , color){
		var oElement; 
		errorElements[errorElements.length] = oEl;
		if (oEl.masterElement)oElement = oEl.masterElement; else oElement = oEl;
		error = error.replace('#Label#',oElement.getLabel());
		errors[errors.length] = error;
		setLabelColor(oElement,color,error);
		if (message.indexOf(oElement.label) == -1){	message += '<LI><SPAN Class="TextCss">' + error + '</SPAN></LI>';}
		if (firstPage == -1) firstPage = page;
		return message;	
	}
	function setLabelColor(oElement,color,message,rollback){
		var Els;
		var label = oElement.labelElement.getElementsByTagName('*')[0];
		if (!label) label = oElement.labelElement;
		Els = oElement.labelElement.getElementsByTagName('*');
		if (!oElement.labelElement.initColor){
			oElement.labelElement.initColor = true;
			oElement.labelElement.origColor = oElement.labelElement.style.color;
			for (var i=0;i<Els.length;i++){
				Els[i].origColor = Els[i].style.color;
			}
		}
		if (rollback) {
			color = oElement.labelElement.origColor;
			label.style.cursor = '';
			if (base.underLineError) label.style.textDecoration = '';
			try{label.onmousemove = '';label.onmouseover = '';label.onmouseout = '';}catch(e){}
		}else {
			if (base.errorImages && !oElement.errorImage){
				var oLab = document.createElement('label');
				oLab.style.position = 'absolute'
				var oImage = document.createElement('img');
				oImage.style.cursor = 'pointer';
				oImage.src= base.virtualDirectory + 'jdm/webcontrols/images/warning.gif';
				oImage.style.position='relative';
				oImage.style.left = -16;
				oLab.appendChild(oImage)
				oImage.style.height='16'; 
				oImage.style.width='16';
				oImage.border = 0;	
				oElement.errorImage = oLab;
				oElement.labelElement.insertBefore(oLab,label);
				base.errorToolTip.initialize(message,oImage, true);
			}
			label.style.cursor = 'pointer';
			base.errorToolTip.initialize(message,label, true);
			if (base.underLineError)label.style.textDecoration = 'underline';
			if (!color ) rollback = true; 
			else if (color.length == 0) rollback = true; 
		} 
		
		oElement.labelElement.style.color = color;
		for (var i=0;i<Els.length;i++){
			if (rollback) color = Els[i].origColor;
			Els[i].style.color = color;
		}
	}
}
function isInCondition(showConditionElements,hiddenConditionElements, key){
	for (var i=0;i<hiddenConditionElements.length;i++){
		if (hiddenConditionElements[i].toString() == key.toString()){
            if (showConditionElements.length  > 0){
                for (var c=0;c<showConditionElements.length;c++){
                    if (showConditionElements[c].toString() == key.toString()){
                        return true;
                    }
                }
            }
            return false;
        }
	}
	return true;
}
function cFormatDate(value,dateType,dateDelimeter){
	if (dateType == 'ddmmyy'){
		return value.getDate() + dateDelimeter + (value.getMonth()+1) + dateDelimeter + value.getFullYear(); 
	} else if (dateType == 'mmddyy'){
		return (value.getMonth()+1) + dateDelimeter + value.getDate() + dateDelimeter + value.getFullYear();
	} else {
		return  value.getFullYear() + dateDelimeter + (value.getMonth()+1) + dateDelimeter + value.getDate();
	}
} 
function getDateFormat(dateType,dateDelimeter){
	if(dateType=='mmddyy'){
		return 'M' + dateDelimeter + 'd' + dateDelimeter + 'yyyy'; 	
	} else if(dateType=='ddmmyy'){
		return 'd' + dateDelimeter + 'M' + dateDelimeter + 'yyyy';
	} else {
		return 'yyyy' + dateDelimeter + 'M' + dateDelimeter + 'd';
	}
} 	
function getDateValue(value , dateDelimeter,dateType , type){
	var index; 
	if (!value) return;
	if(dateType=='mmddyy'){
		if (type == 'm'){
			index = 0;
		} else if (type == 'y') {
			index = 2;
		}else {
			index = 1;
		}
	} else if(dateType=='ddmmyy'){
		if (type == 'm'){
			index = 1;
		} else if (type == 'y') {
			index = 2;
		}else {
			index = 0;
		}
	} else {
		if (type == 'm'){
			index = 1;
		} else if (type == 'y') {
			index = 0;
		}else {
			index = 2;
		}
	} 
	var result = new String(value);
	return result.split(dateDelimeter)[index];
}

function cString(value,defaultValue){
	if (!defaultValue) defaultValue = '';
	if (!value) return defaultValue; else return value;
} 
function cInt(value){
	try{return parseInt(value);}catch(e){return 0;}
} 

	
	
	
function getButtons(base, key , page  ){
	var but1 = new button();
	but1.virtualDirectory = base.virtualDirectory + 'jdm/webcontrols/images/';
	but1.key = key;
	if (key == 'previous'){ 
		but1.label = base.previousButtonLabel;
		but1.image = 'previous.gif';
		if (page < 1){	but1.disabled = true;}
		else {but1.onClick = base.goPreviousPage;}
	}else if (key == 'print'){	
		but1.label = base.printButtonLabel;
		but1.image = 'print.gif';
		but1.onClick = base.print;
	}else if (key == 'next'){	
		but1.label = base.nextButtonLabel;
		but1.image = 'next.gif';
		but1.labelLocation = 'right';
		if (page == base.tabs.length - 1){but1.disabled = true;}
		else {but1.onClick = base.goNextPage;}
	}else if (key == 'submit'){
		but1.label = base.submitButtonLabel;
		but1.image = 'save.gif';
		but1.onClick = base.check.check;
	}else if (key == 'search'){
		but1.label = base.submitButtonLabel;
		but1.image = 'find.gif';
		but1.onClick = base.check.check;
	}else if (key == 'close'){
		but1.label = base.submitButtonLabel;
		but1.image = 'close.gif';
		but1.onClick = base.check.check;
	}else if (key == 'execute'){
		but1.label = base.submitButtonLabel;
		but1.image = 'execute.gif';
		but1.onClick = base.check.check;
	}else if (key == 'closeforms'){	    
		but1.label = base.printButtonLabel;
		but1.image = 'close.gif';
		but1.onClick = base.closeForm;		
    }
    else if (key == 'closepopup'){	    
		but1.label = base.printButtonLabel;
		but1.image = 'close.gif';
		but1.onClick = base.closePopup;		
    }
	var oButtonObject = but1.getButton();
	base.lockedElements[base.lockedElements.length] = oButtonObject;
	return oButtonObject;
}
	


function DropDownElement(){	
	// add all properties 
	var label = document.createElement("label");	
	this.key = 'newControl';
	this.value = '';
	this.url = ''; 
	this.width = 200;
	this.height = 300;
	this.getElement = getElement; 
	this.header = '';
	this.className = 'TextCss';
	this.setHeader = setHeader;
	this.virtualDirectory = '/';
	this.initControl = initControl;
    this.closeControl = closeControl;
	this.parentElement; 
	this.label = label;
	this.textLenght = 30;
	
	// initialize object 
	var Element = document.createElement("div");
	var dropDownElement = this;
	var img;
	var Content = document.createElement("iframe");
	
	
	function getElement(){		
		img = new imgButtom();
		return Element;
	}
	function initControl(){
	    selectedControl = dropDownElement;  
        Content.frameBorder = 'no';
	    Element.style.borderColor = '#7F9DB9';
	    Element.style.borderStyle = 'solid';
	    Element.style.borderWidth = 1;
	    Element.style.height = 22;
	    Element.onmousedown = handleIframeDisplay;
	    Element.style.width = dropDownElement.width;
	    Element.headerObject = true;
	    Element.style.backgroundColor = '#FFFFFF';	
	    label.className = dropDownElement.className;
	    label.style.paddingLeft = 2;
	    dropDownElement.setHeader(dropDownElement.header);	
	    Element.appendChild(label);
	    Element.appendChild(Content);
	    Element.appendChild(img);
	    Content.style.position = 'absolute'; 
	    Content.style.width = Element.offsetWidth  - 3;
	    Content.style.height = dropDownElement.height;
	    Content.style.borderColor = '#000000';
	    Content.style.borderStyle = 'solid';
	    Content.style.borderWidth = 1;
	    Content.src = dropDownElement.url;	
	    Content.Element =  dropDownElement.parentElement;
	    Content.id = 'Control_' + dropDownElement.key;
	    Content.style.zIndex = 10000;
	    img.style.position = 'absolute';	 
	    if (document.attachEvent){ 
	        img.style.marginTop = -2;       
	        Element.style.padding = 2;
	    } else {
	        img.style.marginTop = 1;       
	    }
	    if (!window.attachEvent){
		    document.addEventListener("click",closeIframe,false);
		    if (navigator.userAgent.indexOf('Netscape6') > -1 ){
			    handleIframeDisplay();
		    } else {
			    Content.onload = handleIframeDisplay;
		    }
	    } else {
		    Content.attachEvent("onblur",closeIframe);
		    handleIframeDisplay();
	    }
	}	
	
	function setLocation(){
		window.setTimeout(dojob,0);
		function dojob(){
		    Content.style.top = getAbsoluteTop(Element) + Element.offsetHeight;
		    Content.style.left = getAbsoluteLeft(Element) + 1;  
		    img.style.left = getAbsoluteLeft(Element) + Element.offsetWidth - img.offsetWidth - 1;
        }
	} 
	function setHeader(value){
		dropDownElement.header = value; 	
		label.style.position = 'absolute';
		
		if (value.length > dropDownElement.textLenght)
		{
		    value = value.substring(0,dropDownElement.textLenght) + '...';
		} 
		label.innerHTML = value; 
		
	}
	
	function handleIframeDisplay(){		
	    setLocation();
		if (Content.style.display == 'none'){ 
			Content.style.display = '';
			selectedControl = dropDownElement;  
			//try{window.frames['Control_' + dropDownElement.key].focus();}catch(exp){}
            dropDownElement.getElement().focus();
		} else {
			Content.style.display = 'none';
		}
	}	
	function closeIframe(e){
	    setLocation();
		if (document.addEventListener){
			if (!e.target.headerObject){
				Content.style.display = 'none';
			}
		} else {
			Content.style.display = 'none';
		}
	}
	function closeControl(){
	    Content.style.display = 'none';
	}
	function imgButtom(){
		var srcUp = dropDownElement.virtualDirectory + 'jdm/webcontrols/images/dropElement1.jpg';
		var srcDown = dropDownElement.virtualDirectory + 'jdm/webcontrols/images/dropElement2.jpg';
		var img = getImage(srcUp);
		var base = this;
		img.style.width  = 20; 
		img.style.height  = 20;
		img.onmousedown = mousedown;
		img.onmouseup = mouseup;
		img.headerObject = true; 
		function mousedown(){
			this.src = srcDown;	 	
		}
		function mouseup(){	
			this.src = srcUp;
		}
		return img; 
	}
}


function button(parentobj){
	this.virtualDirectory = '/'; 
	this.image = '';
	this.label = 'New Button';
	this.onClick = new Function('return false;');
	this.key = 'new button';
	this.getButton = getButton;
	this.disabled = false; 
	this.labelLocation = 'left';
	var base = this;
	
	function getButton(){
		var table = getTable(1,parentobj);
		var img = getImage(base.virtualDirectory + base.image,16,16,parentobj);
		if (base.labelLocation == 'right') fillTable(table,base.label,img);		
		else fillTable(table,img , base.label);		
		table.rows[0].onclick = base.onClick;
		table.key = base.key;
		table.rows[0].key = base.key;
		table.rows[0].cells[0].key = base.key;
		table.rows[0].cells[1].key = base.key;
		table.rows[0].cells[1].style.paddingLeft = 2;
		table.className = 'FormButtonCss'; 
		table.disabled = base.disabled;
		return table;	
	}  
}


function getImage(url, width , height,parentobj )
{
	var img;
	if (parentobj)
	{
	    img = parentobj.createElement("img");
	}
	else 
	{
	    img = document.createElement("img")
	}
	
	img.style.border = 0; 
	if (width) img.style.width = width;
	if (height) img.style.height = height;
	img.src = url;
	return img;
}

function getTable(padding,parentobj){
	var oTable;
	if (parentobj)
	{
	    oTable = parentobj.createElement('table');
	}
	else 
	{
	    oTable = document.createElement('table');
	}
	oTable.cellPadding = 0;
	oTable.cellSpacing = 0;
	oTable.border = 0;
	if (padding) oTable.style.padding = padding;
	return oTable;
}  
function fillTable(oTable,cell1,cell2){
	var oRow = oTable.insertRow(0);
	var oCell1 = insertCell(cell1); 
	var oCell2 = insertCell(cell2); 
	return 	[oCell1,oCell2]		
	function insertCell(cell){
		var oCell = oRow.insertCell(oRow.cells.length); 
		if (typeof cell != 'string') 
			oCell.appendChild(cell);  
		else 
			oCell.innerHTML = cell;
		return oCell;
	}
} 


// palauttaa absoluuttisen top location valitulle nodelle 
function getAbsoluteTop(oObject) {
	try
	{
	    var TopPosition;
	    TopPosition = oObject.offsetTop;
	    //alert(TopPosition) 
	    while(oObject.offsetParent) {	
		    oParent = oObject.offsetParent;
		    TopPosition += oParent.offsetTop;
		    oObject = oParent;
	    }
	    return TopPosition; 
	}
	catch(e){return 0;}    
}
function getAbsoluteLeft(oObject) {
	try
	{
        var LeftPosition = oObject.offsetLeft
	    while(oObject.offsetParent) {		
		    oParent = oObject.offsetParent	
		    LeftPosition += oParent.offsetLeft
		    oObject = oParent
	    }   
	    return LeftPosition;
	}
	catch(e){return 0;}
}	

// palauttaa absoluuttisen top location Annetulle objektille
//function getAbsoluteTop(oObject) {
//	if (!oObject)return 0; 
//	var TopPosition;
//	TopPosition = oObject.offsetTop;
//	while(oObject.offsetParent) {	
//		oParent = oObject.offsetParent;
//		TopPosition += oParent.offsetTop;
//		oObject = oParent;
//	}
//	var windobj = window;
//	if (windobj){ 
//	    while(windobj.frameElement) {	
//	        TopPosition += windobj.frameElement.offsetTop;
//	        oObject = windobj.frameElement;
//	        while(oObject.offsetParent) {	
//		        oParent = oObject.offsetParent;
//		        TopPosition += oParent.offsetTop;
//		        oObject = oParent;
//	        }
//	        windobj = windobj.parent;
//	    }
//	}
//	return TopPosition;
//}
//// palauttaa absoluuttisen Left location Annetulle objektille
//function getAbsoluteLeft(oObject) {
//	try
//	{
//        if (!oObject)return 0; 
//	    var LeftPosition;
//	    LeftPosition = oObject.offsetLeft;
//	    while(oObject.offsetParent) {	
//		    oParent = oObject.offsetParent;
//		    LeftPosition += oParent.offsetLeft;
//		    oObject = oParent;
//	    }
//	    var windobj = window;
//	    if (windobj){ 
//	        while(windobj.frameElement) {	
//	            LeftPosition += windobj.frameElement.offsetLeft;
//	            oObject = windobj.frameElement;
//	            while(oObject.offsetParent) {	
//		            oParent = oObject.offsetParent;
//		            LeftPosition += oParent.offsetLeft;
//		            oObject = oParent;
//	            }
//	            windobj = windobj.parent;
//	        }
//	    }
//	    return LeftPosition;
//	}
//	catch(e){return 0;}
//}		

function IsNumeric(sText,decimals){
	var ValidChars;
	var IsNumber=true;
	var Char;	 

	if (decimals) 
		ValidChars = "0123456789.,";
	else 
		ValidChars = "0123456789";
	
	for (i = 0; i < sText.length && IsNumber == true; i++){ 
		Char = sText.charAt(i); 
		if (ValidChars.indexOf(Char) == -1){
			IsNumber = false;
		}
	}
	return IsNumber;
}
function isEmail(sText){
	if (sText.length < 8)
		 return false; 
	else if (sText.indexOf('@',0) == -1 | sText.indexOf ('.',0) == -1 ) 
		return false;
	else 
		return true;
}
	
// ===================================================================
// Author: Matt Kruse <matt@mattkruse.com>
// WWW: http://www.mattkruse.com/
//
// NOTICE: You may use this code for any purpose, commercial or
// private, without any further permission from the author. You may
// remove this notice from your final code if you wish, however it is
// appreciated by the author if at least my web site address is kept.
//
// You may *NOT* re-distribute this code in any way except through its
// use. That means, you can include it in your product, or your web
// site, or any other form where the code is actually being used. You
// may not put the plain javascript up on your site for download or
// include it in your javascript libraries for download. 
// If you wish to share this code with others, please just point them
// to the URL instead.
// Please DO NOT link directly to my .js files from your site. Copy
// the files to your server and use them there. Thank you.
// ===================================================================

// HISTORY
// ------------------------------------------------------------------
// May 17, 2003: Fixed bug in parseDate() for dates <1970
// March 11, 2003: Added parseDate() function
// March 11, 2003: Added "NNN" formatting option. Doesn't match up
//                 perfectly with SimpleDateFormat formats, but 
//                 backwards-compatability was required.

// ------------------------------------------------------------------
// These functions use the same 'format' strings as the 
// java.text.SimpleDateFormat class, with minor exceptions.
// The format string consists of the following abbreviations:
// 
// Field        | Full Form          | Short Form
// -------------+--------------------+-----------------------
// Year         | yyyy (4 digits)    | yy (2 digits), y (2 or 4 digits)
// Month        | MMM (name or abbr.)| MM (2 digits), M (1 or 2 digits)
//              | NNN (abbr.)        |
// Day of Month | dd (2 digits)      | d (1 or 2 digits)
// Day of Week  | EE (name)          | E (abbr)
// Hour (1-12)  | hh (2 digits)      | h (1 or 2 digits)
// Hour (0-23)  | HH (2 digits)      | H (1 or 2 digits)
// Hour (0-11)  | KK (2 digits)      | K (1 or 2 digits)
// Hour (1-24)  | kk (2 digits)      | k (1 or 2 digits)
// Minute       | mm (2 digits)      | m (1 or 2 digits)
// Second       | ss (2 digits)      | s (1 or 2 digits)
// AM/PM        | a                  |
//
// NOTE THE DIFFERENCE BETWEEN MM and mm! Month=MM, not mm!
// Examples:
//  "MMM d, y" matches: January 01, 2000
//                      Dec 1, 1900
//                      Nov 20, 00
//  "M/d/yy"   matches: 01/20/00
//                      9/2/00
//  "MMM dd, yyyy hh:mm:ssa" matches: "January 01, 2000 12:30:45AM"
// ------------------------------------------------------------------

var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');
function LZ(x) {return(x<0||x>9?"":"0")+x}

// ------------------------------------------------------------------
// isDate ( date_string, format_string )
// Returns true if date string matches format of format string and
// is a valid date. Else returns false.
// It is recommended that you trim whitespace around the value before
// passing it to this function, as whitespace is NOT ignored!
// ------------------------------------------------------------------
function isDate(val,format) {
	var date=getDateFromFormat(val,format);
	if (date==0) { return false; }
	return true;
	}

// -------------------------------------------------------------------
// compareDates(date1,date1format,date2,date2format)
//   Compare two date strings to see which is greater.
//   Returns:
//   1 if date1 is greater than date2
//   0 if date2 is greater than date1 of if they are the same
//  -1 if either of the dates is in an invalid format
// -------------------------------------------------------------------
function compareDates(date1,dateformat1,date2,dateformat2) {
	var d1=getDateFromFormat(date1,dateformat1);
	var d2=getDateFromFormat(date2,dateformat2);
	if (d1==0 || d2==0) {
		return -1;
		}
	else if (d1 > d2) {
		return 1;
		}
	return 0;
	}

// ------------------------------------------------------------------
// formatDate (date_object, format)
// Returns a date in the output format specified.
// The format string uses the same abbreviations as in getDateFromFormat()
// ------------------------------------------------------------------
function formatDate(date,format) {
	format=format+"";
	var result="";
	var i_format=0;
	var c="";
	var token="";
	var y=date.getYear()+"";
	var M=date.getMonth()+1;
	var d=date.getDate();
	var E=date.getDay();
	var H=date.getHours();
	var m=date.getMinutes();
	var s=date.getSeconds();
	var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
	// Convert real date parts into formatted versions
	var value=new Object();
	if (y.length < 4) {y=""+(y-0+1900);}
	value["y"]=""+y;
	value["yyyy"]=y;
	value["yy"]=y.substring(2,4);
	value["M"]=M;
	value["MM"]=LZ(M);
	value["MMM"]=MONTH_NAMES[M-1];
	value["NNN"]=MONTH_NAMES[M+11];
	value["d"]=d;
	value["dd"]=LZ(d);
	value["E"]=DAY_NAMES[E+7];
	value["EE"]=DAY_NAMES[E];
	value["H"]=H;
	value["HH"]=LZ(H);
	if (H==0){value["h"]=12;}
	else if (H>12){value["h"]=H-12;}
	else {value["h"]=H;}
	value["hh"]=LZ(value["h"]);
	if (H>11){value["K"]=H-12;} else {value["K"]=H;}
	value["k"]=H+1;
	value["KK"]=LZ(value["K"]);
	value["kk"]=LZ(value["k"]);
	if (H > 11) { value["a"]="PM"; }
	else { value["a"]="AM"; }
	value["m"]=m;
	value["mm"]=LZ(m);
	value["s"]=s;
	value["ss"]=LZ(s);
	while (i_format < format.length) {
		c=format.charAt(i_format);
		token="";
		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
			token += format.charAt(i_format++);
			}
		if (value[token] != null) { result=result + value[token]; }
		else { result=result + token; }
		}
	return result;
	}
	
// ------------------------------------------------------------------
// Utility functions for parsing in getDateFromFormat()
// ------------------------------------------------------------------
function _isInteger(val) {
	var digits="1234567890";
	for (var i=0; i < val.length; i++) {
		if (digits.indexOf(val.charAt(i))==-1) { return false; }
		}
	return true;
	}
function _getInt(str,i,minlength,maxlength) {
	for (var x=maxlength; x>=minlength; x--) {
		var token=str.substring(i,i+x);
		if (token.length < minlength) { return null; }
		if (_isInteger(token)) { return token; }
		}
	return null;
	}
	
// ------------------------------------------------------------------
// getDateFromFormat( date_string , format_string )
//
// This function takes a date string and a format string. It matches
// If the date string matches the format string, it returns the 
// getTime() of the date. If it does not match, it returns 0.
// ------------------------------------------------------------------
function getDateFromFormat(val,format) {
	val=val+"";
	format=format+"";
	var i_val=0;
	var i_format=0;
	var c="";
	var token="";
	var token2="";
	var x,y;
	var now=new Date();
	var year=now.getYear();
	var month=now.getMonth()+1;
	var date=1;
	var hh=now.getHours();
	var mm=now.getMinutes();
	var ss=now.getSeconds();
	var ampm="";
	
	while (i_format < format.length) {
		// Get next token from format string
		c=format.charAt(i_format);
		token="";
		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
			token += format.charAt(i_format++);
			}
		// Extract contents of value based on format token
		if (token=="yyyy" || token=="yy" || token=="y") {
			if (token=="yyyy") { x=4;y=4; }
			if (token=="yy")   { x=2;y=2; }
			if (token=="y")    { x=2;y=4; }
			year=_getInt(val,i_val,x,y);
			if (year==null) { return 0; }
			i_val += year.length;
			if (year.length==2) {
				if (year > 70) { year=1900+(year-0); }
				else { year=2000+(year-0); }
				}
			}
		else if (token=="MMM"||token=="NNN"){
			month=0;
			for (var i=0; i<MONTH_NAMES.length; i++) {
				var month_name=MONTH_NAMES[i];
				if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()) {
					if (token=="MMM"||(token=="NNN"&&i>11)) {
						month=i+1;
						if (month>12) { month -= 12; }
						i_val += month_name.length;
						break;
						}
					}
				}
			if ((month < 1)||(month>12)){return 0;}
			}
		else if (token=="EE"||token=="E"){
			for (var i=0; i<DAY_NAMES.length; i++) {
				var day_name=DAY_NAMES[i];
				if (val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()) {
					i_val += day_name.length;
					break;
					}
				}
			}
		else if (token=="MM"||token=="M") {
			month=_getInt(val,i_val,token.length,2);
			if(month==null||(month<1)||(month>12)){return 0;}
			i_val+=month.length;}
		else if (token=="dd"||token=="d") {
			date=_getInt(val,i_val,token.length,2);
			if(date==null||(date<1)||(date>31)){return 0;}
			i_val+=date.length;}
		else if (token=="hh"||token=="h") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<1)||(hh>12)){return 0;}
			i_val+=hh.length;}
		else if (token=="HH"||token=="H") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<0)||(hh>23)){return 0;}
			i_val+=hh.length;}
		else if (token=="KK"||token=="K") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<0)||(hh>11)){return 0;}
			i_val+=hh.length;}
		else if (token=="kk"||token=="k") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<1)||(hh>24)){return 0;}
			i_val+=hh.length;hh--;}
		else if (token=="mm"||token=="m") {
			mm=_getInt(val,i_val,token.length,2);
			if(mm==null||(mm<0)||(mm>59)){return 0;}
			i_val+=mm.length;}
		else if (token=="ss"||token=="s") {
			ss=_getInt(val,i_val,token.length,2);
			if(ss==null||(ss<0)||(ss>59)){return 0;}
			i_val+=ss.length;}
		else if (token=="a") {
			if (val.substring(i_val,i_val+2).toLowerCase()=="am") {ampm="AM";}
			else if (val.substring(i_val,i_val+2).toLowerCase()=="pm") {ampm="PM";}
			else {return 0;}
			i_val+=2;}
		else {
			if (val.substring(i_val,i_val+token.length)!=token) {return 0;}
			else {i_val+=token.length;}
			}
		}
	// If there are any trailing characters left in the value, it doesn't match
	if (i_val != val.length) { return 0; }
	// Is date valid for month?
	if (month==2) {
		// Check for leap year
		if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ) { // leap year
			if (date > 29){ return 0; }
			}
		else { if (date > 28) { return 0; } }
		}
	if ((month==4)||(month==6)||(month==9)||(month==11)) {
		if (date > 30) { return 0; }
		}
	// Correct hours value
	if (hh<12 && ampm=="PM") { hh=hh-0+12; }
	else if (hh>11 && ampm=="AM") { hh-=12; }
	var newdate=new Date(year,month-1,date,hh,mm,ss);
	return newdate.getTime();
	}

// ------------------------------------------------------------------
// parseDate( date_string [, prefer_euro_format] )
//
// This function takes a date string and tries to match it to a
// number of possible date formats to get the value. It will try to
// match against the following international formats, in this order:
// y-M-d   MMM d, y   MMM d,y   y-MMM-d   d-MMM-y  MMM d
// M/d/y   M-d-y      M.d.y     MMM-d     M/d      M-d
// d/M/y   d-M-y      d.M.y     d-MMM     d/M      d-M
// A second argument may be passed to instruct the method to search
// for formats like d/M/y (european format) before M/d/y (American).
// Returns a Date object or null if no patterns match.
// ------------------------------------------------------------------
function parseDate(val) {
	var preferEuro=(arguments.length==2)?arguments[1]:false;
	generalFormats=new Array('y-M-d','MMM d, y','MMM d,y','y-MMM-d','d-MMM-y','MMM d');
	monthFirst=new Array('M/d/y','M-d-y','M.d.y','MMM-d','M/d','M-d');
	dateFirst =new Array('d/M/y','d-M-y','d.M.y','d-MMM','d/M','d-M');
	var checkList=new Array('generalFormats',preferEuro?'dateFirst':'monthFirst',preferEuro?'monthFirst':'dateFirst');
	var d=null;
	for (var i=0; i<checkList.length; i++) {
		var l=window[checkList[i]];
		for (var j=0; j<l.length; j++) {
			d=getDateFromFormat(val,l[j]);
			if (d!=0) { return new Date(d); }
			}
		}
	return null;
	}

// Etsii duplikaatit rivit 2 ulotteisesta array objektista 
    function duplicateFinder(arr,findColumns)
    {
        var checkObj = new Object(); 
        var returnValue = new Array();
        for (var i=0;i<arr.length;i++)
        {
            var key = '';
            
            for (var c =0;c< findColumns.length;c++)
            {
                try
                {
                    key += arr[i][findColumns[c]].toString().toLowerCase() + ',';
                }
                catch(e)
                {
                    key += 'null,'
                }
            }
            
            if (checkObj[key])
            {
                if (parseInt(checkObj[key].i) > -1)
                {
                    returnValue[returnValue.length] = arr[checkObj[key].i];
                    checkObj[key].i = -1;  
                }
                returnValue[returnValue.length] = arr[i];
            }
            else 
            {
                checkObj[key] = new Object();
                checkObj[key].i = i;
            } 
        }
        checkObj = null;
        try{CollectGarbage();}catch(e){}
        return returnValue;
    }
    function getPageSize()
    {
        var xScroll, yScroll;
        if (window.innerHeight && window.scrollMaxY)
        { 
            xScroll = document.body.scrollWidth;
            yScroll = window.innerHeight + window.scrollMaxY;
        } 
        else if (document.body.scrollHeight)
        { 
            xScroll = document.body.scrollWidth;
            yScroll = document.body.scrollHeight;
        } 
        else if (document.documentElement.scrollHeight)
        { 
            xScroll = document.documentElement.scrollWidth;
            yScroll = document.documentElement.scrollHeight;
        } 
        else 
        { 
            xScroll = document.body.offsetWidth;
            yScroll = document.body.offsetHeight;
        }

        var windowWidth, windowHeight;
        if (self.innerHeight) 
        { 
            windowWidth = self.innerWidth;
            windowHeight = self.innerHeight;
        } 
        else if (document.documentElement && document.documentElement.clientHeight) 
        {
            windowWidth = document.documentElement.clientWidth;
            windowHeight = document.documentElement.clientHeight;
        } 
        else if (document.body) 
        {
            windowWidth = document.body.clientWidth;
            windowHeight = document.body.clientHeight;
        } 
        
        pageHeight = yScroll;
        pageWidth = xScroll;
        
        return new Array(pageWidth,pageHeight,windowWidth,windowHeight);
    }
function setFrameElementSize(endDocument)
{
    try
    {   
        if (window.frameElement){setValues(window.frameElement,endDocument);} 
        else {
            // selain ei tue window.frameElement objektia joten haetaan se parent windown kautta 
            if (window.parent)
            {
                var parent = window.parent; 
                for( var i =0;i<parent.frames.length;i++)
                {
                    if (parent.frames[i] == window)
                    {
                        setValues(parent.document.getElementsByTagName("iframe")[i],endDocument);
                        break;                            
                    }                    
                } 
            }     
        }   
    }
    catch(e){}
    try{
        if (window.parent)
        {
            if (window.parent != top)
            {
                if(window.parent.setFrameElementSize)
                {
                    window.parent.setFrameElementSize();        
                }
            }
        }
    }catch(e){}
    // poistutaan 
    return; 
    
    /////////////////////////////////////////////////////////////////////
    // privaattit functiot 
    /////////////////////////////////////////////////////////////////////
    // asettaa koon 
    function setValues(frameElement,endDocument)
    {
        try
        {    
            var details = getPageSize();
            if (endDocument)
            {
                frameElement.height = 500;
            }
            else 
            {
                frameElement.height = details[1];     
            }
            
            frameElement.width = details[0]; 
        }
        catch (e)
        {
        }
    }
} 
