// CommonFunctions - Script Library for functions used multiple places
// in the application

function navigateTo(strURL, strPortletName, strPortletAction) {

    with (document.formNavigation) {
        portletname.value = strPortletName;
        portletaction.value = strPortletAction;
        action = strURL;
        submit();
    }
}

function posSelectFromValue(objSelect, txtValue) {
    for (var i = 0; i < objSelect.length; i++) {
        if (objSelect.options[i].value == txtValue) {
            objSelect.options[i].selected = true;
            return;
        }
    }
}

function cbChange(objCheckBox) {
    if (objCheckBox.checked) {
        objCheckBox.value = 'true';
    } else {
        objCheckBox.value = 'false';
    }
}

/*
 This section are required for retrieving day, month and year from calendar.js

 MPRX: Changed the "NS detection" to also determine if the browser supports window.showModalDialog.
 Otherwise Opera detected as IE will fail.
 */
var NS = (!document.all || !window.showModalDialog) ? true : false;

var dayfield, monthfield, yearfield;
var alldays = false;
var caltype = 4;
var querystr = "";
var strCalendarURI = "/package/sdc/external/calendar/calendar5.jsp?";
/* if bool equals true use fromdata fields :- else use todate field */
function openCalendar(pday, pmonth, pyear, all, type, cmd_uri) {
    alldays = all;
    dayfield = pday;
    monthfield = pmonth;
    yearfield = pyear;
    caltype = type;
    querystr = cmd_uri;
    if (NS)
        openNSCalendar();
    else
        openIECalendar();
}

function openNSCalendar() {
    switch (caltype) {
        case 1 :
            objCalendar = window.open(strCalendarURI + "calendar_type=1&cmd.uri=" + querystr, "Kalender", "location=no, sizeable=no, toolbar=no, menubar=no, scrollbars=no, status=no, height=190, width=190, modal=yes");
            break;
        case 2 :
            objCalendar = window.open(strCalendarURI + "calendar_type=2&cmd.uri=" + querystr, "Kalender", "location=no, sizeable=no, toolbar=no, menubar=no, scrollbars=no, status=no, height=190, width=190, modal=yes");
            break;
        case 3 :
            objCalendar = window.open(strCalendarURI + "calendar_type=3&cmd.uri=" + querystr, "Kalender", "location=no, sizeable=no, toolbar=no, menubar=no, scrollbars=no, status=no, height=190, width=190, modal=yes");
            break;
        case 4 :
            objCalendar = window.open(strCalendarURI + "calendar_type=4&cmd.uri=" + querystr, "Kalender", "location=no, sizeable=no, toolbar=no, menubar=no, scrollbars=no, status=no, height=190, width=190, modal=yes");
            break;
        default :
            objCalendar = window.open(strCalendarURI + "calendar_type=1&cmd.uri=" + querystr, "Kalender", "location=no, sizeable=no, toolbar=no, menubar=no, scrollbars=no, status=no, height=190, width=190, modal=yes");
            break;
    }
}

function openIECalendar() {
    var intHeight = 232;
    var intWidth = 195;
    var intTopPos = 280;
    var intLeftPos = 485;
    var strSelectedDate = "";
    switch (caltype) {
        case 1 :
            strSelectedDate = window.showModalDialog(strCalendarURI + "calendar_type=1&cmd.uri=" + querystr, "", "dialogHeight:" + intHeight + "px;dialogWidth:" + intWidth + "px;dialogTop:" + intTopPos + "px;dialogLeft:" + intLeftPos + "px;status:no;center:yes;help:no");
            break;
        case 2 :
            strSelectedDate = window.showModalDialog(strCalendarURI + "calendar_type=2&cmd.uri=" + querystr, "", "dialogHeight:" + intHeight + "px;dialogWidth:" + intWidth + "px;dialogTop:" + intTopPos + "px;dialogLeft:" + intLeftPos + "px;status:no;center:yes;help:no");
            break;
        case 3 :
            strSelectedDate = window.showModalDialog(strCalendarURI + "calendar_type=3&cmd.uri=" + querystr, "", "dialogHeight:" + intHeight + "px;dialogWidth:" + intWidth + "px;dialogTop:" + intTopPos + "px;dialogLeft:" + intLeftPos + "px;status:no;center:yes;help:no");
            break;
        case 4 :
            strSelectedDate = window.showModalDialog(strCalendarURI + "calendar_type=4&cmd.uri=" + querystr, "", "dialogHeight:" + intHeight + "px;dialogWidth:" + intWidth + "px;dialogTop:" + intTopPos + "px;dialogLeft:" + intLeftPos + "px;status:no;center:yes;help:no");
            break;
        default :
            strSelectedDate = window.showModalDialog(strCalendarURI + "calendar_type=1&cmd.uri=" + querystr, "", "dialogHeight:" + intHeight + "px;dialogWidth:" + intWidth + "px;dialogTop:" + intTopPos + "px;dialogLeft:" + intLeftPos + "px;status:no;center:yes;help:no");
            break;
    }

    if (strSelectedDate != null && strSelectedDate != "") {
        strDateArr = strSelectedDate.split("-");
        strDay = strDateArr[0];
        if (strDay.length == 1)
            strDay = "0" + strDay;
        strMonth = strDateArr[1];
        if (strMonth.length == 1)
            strMonth = "0" + strMonth;
        strYear = strDateArr[2];
        if (strYear.length == 1)
            strYear = "0" + strYear;
        dayfield.value = strDay;
        monthfield.value = strMonth;
        yearfield.value = strYear;
        if (dayfield.name == monthfield.name)
        {
            dayfield.value = strDay + "-" + strMonth + "-" + strYear;
        }
    }
}

function insertSelectedDate(strDay, strMonth, strYear) {
    if (strDay.length == 1)
        strDay = "0" + strDay;
    if (strMonth.length == 1)
        strMonth = "0" + strMonth;
    dayfield.value = strDay;
    monthfield.value = strMonth;
    yearfield.value = strYear;
    if (dayfield.name == monthfield.name)
    {
        dayfield.value = strDay + "-" + strMonth + "-" + strYear;
    }
}
/* calendar section stop */


function errorDisplay(pform) {
    if (txtFieldsWithError == "")
        return;
    if (eval("pform." + txt1stFieldWithError)) {
        eval("pform." + txt1stFieldWithError + ".focus()");
    }
}

function seterrorimage(srcFieldInError, pform) {
    var i = 0;
    if (txtFieldsWithError == "") return(1);

    var arrFields = txtFieldsWithError.split(":");

    for (i = 0; i < arrFields.length; i++) {
        if (eval(pform.name + ".img" + arrFields[i])) {
            eval(pform.name + ".img" + arrFields[i] + ".src=\"" + srcFieldInError + "\"");
        }
    }
}

// copyright 1999-2001 Idocs, Inc. http://www.idocs.com/tags/
// Distribute this script freely, but keep this
// notice with the code.
var resetRolls = new Object();

function resetimage(src) {
    this.src = src;
    this.confirm = true;
    this.alt = "Nulstil";
    this.write = resetimage_write;
}

function resetimage_write()
{
    document.write('<a ');
    if (this.rollover) {
        if (! this.name) {
            alert('to create a rollover you must give the image a name');
            return;
        }

        resetRolls[this.name] = new Object();
        resetRolls[this.name].over = new Image();
        resetRolls[this.name].over.src = this.rollover;
        resetRolls[this.name].out = new Image();
        resetRolls[this.name].out.src = this.src;
        document.write(' onMouseOver="if (document.images)document.images[\'' +
                       this.name + '\'].src=resetRolls[\'' + this.name + '\'].over.src"' +
                       ' onMouseOut="if (document.images)document.images[\'' +
                       this.name + '\'].src=resetRolls[\'' + this.name + '\'].out.src"'
                );
    }
    document.write(' href="javascript:');
    if (this.confirm)
        document.write('if(confirm(\'Vil du nulstille?\'))');
    document.write('document.forms[' + (document.forms.length - 1) + '].reset();void(0);">');
    document.write('<img src="' + this.src + '" alt="' + this.alt + '"');
    document.write(' border=0');
    if (this.name)document.write(' name="' + this.name + '"');
    if (this.height)document.write(' height=' + this.height);
    if (this.width)document.write(' width=' + this.width);
    if (this.otheratts)document.write(' ' + this.otheratts);
    document.write('></a>');
}

var arrayElementsForValidation = new Array();

// Global vars (1-9)
var cntElementName = 1;
var cntElementType = 2;
var cntErrorMissing = 3;
var cntErrorNotValid = 4;
var cntDateSep;

// Constraints vars (10-99)
var cntMaxLength = 10;

// Vars for element types (100-150)
var cntAmountType = 100;
var cntTextType = 101;
var cntNumberType = 102;
var cntDateType = 110;
var cntDayType = 111;
var cntMonthType = 112;
var cntYearType = 113;
var cntEmailType = 120;
var cntAllTextType = 121;

// Internal vars
var cntOK = 0;
var cntNotValid = 1;
var cntMissing = 2;
var cntBadType = 3;

var intElementCounter = 0;

function initValidation()
{
    arrayElementsForValidation = new Array();
    intElementCounter = 0;
}
// work around for 'typeof array' returns 'object'
function typeOf(value) {
    var s = typeof value;
    if (s === 'object') {
        if (value) {
            if (value instanceof Array) {
                s = 'array';
            }
        } else {
            s = 'null';
        }
    }
    return s;
}
// 2007-12-04 firx, fixed bug: 08 or 09 means octal numbers, which is illegal
function ValidDate(strDate) {
    var strWorkDate = strDate.split('-');
    if (typeOf(strWorkDate) === 'array' && strWorkDate.length !== 3) {
        return false;
    }
    var strDay = strWorkDate[0];
    var intDay = parseInt(strDay, 10);
    var strMonth = strWorkDate[1];
    var intMonth = parseInt(strMonth, 10);
    var strYear = strWorkDate[2];
    var intYear = parseInt(strYear, 10);
    if (isNaN(intYear)) {
        return false;
    }
    if (isNaN(intMonth) || intMonth < 1 || intMonth > 12) {
        return false;
    }
    if (isNaN(intDay) || intDay < 0) {
        return false;
    }
    booAnswer = true;
    switch (intMonth) {
        case 2:// February, Check for leap year
            if ((intYear % 4) == 0) {
                if (intDay > 29) {
                    booAnswer = false;
                }
            } else {
                if (intDay > 28) {
                    booAnswer = false;
                }
            }
            break;
        case 1://Jan
        case 3://Mar
        case 5://May
        case 7://Jul
        case 8://Aug
        case 10://Okt
        case 12://Dec
            if (intDay > 31) {
                booAnswer = false;
            }
            break;
        case 4://Apr
        case 6://Jun
        case 9://Sep
        case 11://Nov
            if (intDay > 30) {
                booAnswer = false;
            }
            break;
    }
    return booAnswer;
}

// Set a new array for validation
// Input : ElementName, ElementType, Error message for missing and not valid element.
// Output : Array
// HUJx 20/06/00
function NewElementValidation(strElementName, intElementType, strErrorMissing, strErrorNotValid) {
    var arrayNew = new Array();
    arrayNew[cntElementName] = strElementName;
    arrayNew[cntElementType] = intElementType;
    arrayNew[cntErrorMissing] = strErrorMissing;
    arrayNew[cntErrorNotValid] = strErrorNotValid;
    return(arrayNew);

}

function SubmitElementValidation(objCurElement) {
    arrayElementsForValidation[intElementCounter] = objCurElement;
    intElementCounter++;

}

// Check if a email is of a valid type
// Input : Email as string
// Output : True/False
// HUJx 20/06/00
function isEmailValid(strEmail) {

    intLength = strEmail.length;

    // If empty
    if (intLength == 0) {
        return cntMissing;
    }

    // Check that length is greater than 5
    if (strEmail.length < 6) {
        return cntNotValid;
    } else {

        // Get/check position of @
        intAtPosition = strEmail.indexOf('@', 0);
        if (intAtPosition == -1) {
            return cntNotValid;
        } else {

            // Get/check position of . relative to @
            if (strEmail.indexOf('.', intAtPosition) != -1) {
                return cntOK;
            } else {
                return cntNotValid;
            }
        }
    }
}

// Check if a date is of a valid type
// Input : Date as string
// Output : True/False
// HUJx 12/09/00
function isDateValid(strDate) {

    intLength = strDate.length;

    // If empty
    if (intLength == 0) {
        return cntMissing;
    }

    // If contains only two dateparts or less
    if (OccurenceOfChar(strDate, cntDateSep) < 2) {
        return cntNotValid;
    }

    return cntOK;

}

// Check if a number is valid
// Input : Number as string
// Output : Validation Result
// HUJx 11/08/00
function isNumberValid(strNumber) {

    if (strNumber.length == 0)
    {
        return cntMissing;
    }
    else
    {
        if (isNumber(strNumber, false, false, true)) {
            return cntOK;
        } else {
            return cntNotValid;
        }
    }
}

// Function check if a string is a number.
// Input : String to check, indication of wether the number mus contain
//		   "." and "," and " "
// Output : True / False
// HUJx 20/06/00
function isNumber(strNumber, blnDotsOK, blnCommasOK, blnSpacesOK) {
    intNumberLength = strNumber.length;

    blnNumberValid = true;

    for (intIndex = 0; intIndex < intNumberLength; intIndex++) {
        strCurChar = strNumber.charAt(intIndex);

        switch (strCurChar) {
            case ' ':
                if (!blnSpacesOK) {
                    blnNumberValid = false;
                }
                break;
            case '0':
                break;
            case '1':
                break;
            case '2':
                break;
            case '3':
                break;
            case '4':
                break;
            case '5':
                break;
            case '6':
                break;
            case '7':
                break;
            case '8':
                break;
            case '9':
                break;
            case '.':
                if (!blnDotsOK) {
                    blnNumberValid = false;
                }
                break;
            case ',':
                if (!blnCommasOK) {
                    blnNumberValid = false;
                }
                break;
            default:
                blnNumberValid = false;
        }

    }

    if (blnNumberValid) {
        return true;
    } else {
        return false;
    }


}

// Function can find the number of occurences of a special char in a text
// Input : Text to search and char to searh for
// Output : Occurence of char in text
// HUJx 20/06/00
function OccurenceOfChar(strText, strChar) {
    intTextLength = strText.length;
    intCounter = 0;

    for (intIndex = 0; intIndex < intTextLength; intIndex++) {
        strCurChar = strText.charAt(intIndex);
        if (strCurChar == strChar) {
            intCounter++;
        }
    }

    return(intCounter);

}

// Function checks if an amount is valid
// Input : String containing amount
// Output : Result
// HUJX 20/06/00, 21/06/00
function isAmountValid(strAmount) {

    // Definition of thousands & decimal seperator. Should
    // be moved to commondefines, or maybe Reginal settings
    // should be used.
    var cntThousandSep = '.';
    var cntDecimalSep = ',';
    var tempAmount;

    tempAmount = TrimString(strAmount);

    // Get length of string
    intAmountLength = tempAmount.length;

    // Check if the string is empty
    if (intAmountLength != 0) {

        // Check if the string contains characters not belonging to a number/amount
        if (isNumber(tempAmount, true, true, false)) {

            // Check if amount is 0
            if ((OccurenceOfChar(tempAmount, "0") + OccurenceOfChar(tempAmount, cntThousandSep) + OccurenceOfChar(tempAmount, cntDecimalSep)) == intAmountLength) {
                return(cntNotValid);
            }

            // Check occurences of thousand & decimal seperator
            if ((OccurenceOfChar(tempAmount, cntThousandSep) > 2) || (OccurenceOfChar(tempAmount, cntDecimalSep) > 1)) {
                return(cntNotValid);
            } else {

                // Get the position of decimal & thousand seperator
                intDecimalSepPosition = tempAmount.indexOf(cntDecimalSep);
                intThousandSepPosition = tempAmount.lastIndexOf(cntThousandSep);

                // Check correct position of Decimal Seperator. Either there should be no decimal
                // seperator, or it should be placed before the last 1 or 2 digits.
                blnSepNotBeforeLast2Digits = ((intDecimalSepPosition + 3) != intAmountLength)

                if ((intDecimalSepPosition != -1) && (blnSepNotBeforeLast2Digits)) {
                    return cntNotValid;
                }

                // Check correct position of Thousand Seperator. If no thousand seperator then
                // everything is OK.
                if (intThousandSepPosition == -1) {
                    return cntOK;
                } else {
                    if (intDecimalSepPosition == -1) {
                        intOffSet = 0
                    } else {
                        intOffSet = 3
                    }

                    // Check first thousandseperator (1.000)
                    if (intThousandSepPosition == ((intAmountLength - intOffSet) - 4)) {

                        // If another thousandseperator exist
                        if (intThousandSepPosition != tempAmount.indexOf(cntThousandSep)) {

                            // Check second thousandseperator (1.000.000)
                            intThousandSepPosition = tempAmount.indexOf(cntThousandSep)
                            if (intThousandSepPosition == ((intAmountLength - intOffSet) - 8)) {
                                return cntOK;
                            } else {
                                return cntNotValid;
                            }
                        } else {
                            return cntOK;
                        }
                    } else {
                        return cntNotValid;
                    }
                }
            }
        } else {
            return cntNotValid;
        }
    } else {
        return cntMissing;
    }

}

// Function checks if an year is valid (4 ciffers)
// Input : String containing year (4 ciffers)
// Output : Result
// HUJx 21/06/00
function isYearValid(strYear) {

    // Definition of min. & max. year
    // Should be moved to commondefines
    var cntMinYear = 2000;
    var cntMaxYear = 2100;

    // Get length of string
    intYearLength = strYear.length;

    // Check if the string is empty
    if (intYearLength != 0) {

        // Check that the year got 4 ciffers (f.x. 2001)
        if (intYearLength == 4) {

            // Check if the string does not contain charaters beside numbers.
            if (isNumber(strYear, false, false, true)) {

                // Check that year is within a certain range
                if ((strYear >= cntMinYear) && (strYear <= cntMaxYear)) {
                    return cntOK;
                } else {
                    return cntNotValid;
                }
            } else {
                return cntNotValid;
            }
        } else {
            return cntNotValid;
        }
    } else {
        return cntMissing;
    }
}


// Function checks if a month is valid (1/2 ciffers)
// Input : String containing month (1/2 ciffers)
// Output : Validation result
// HUJx 22/06/00
function isMonthValid(strMonth) {

    // Definition of min. & max. month
    // Should be moved to commondefines
    var cntMinMonth = 1;
    var cntMaxMonth = 12;

    // Get length of string
    intMonthLength = strMonth.length;

    // Check if the string is empty
    if (intMonthLength != 0) {

        // Check that the year got 1/2 ciffers (f.x. 2 or 02)
        if ((intMonthLength == 1) || (intMonthLength == 2)) {

            // Check if the string does not contain charaters beside numbers.
            if (isNumber(strMonth, false, false, true)) {

                // Check that year is within a certain range
                if ((strMonth >= cntMinMonth) && (strMonth <= cntMaxMonth)) {
                    return cntOK;
                } else {
                    return cntNotValid;
                }
            } else {
                return cntNotValid;
            }
        } else {
            return cntNotValid;
        }
    } else {
        return cntMissing;
    }
}

// Function checks if a Day is valid (1/2 ciffers)
// Input : String containing Day (1/2 ciffers)
// Output : Validation result
// HUJx 22/06/00
function isDayValid(strDay) {

    // Definition of min. & max. Day
    // Should be moved to commondefines
    var cntMinDay = 1;
    var cntMaxDay = 31;

    // Get length of string
    intDayLength = strDay.length;

    // Check if the string is empty
    if (intDayLength != 0) {

        // Check that the year got 1/2 ciffers (f.x. 2 or 02)
        if ((intDayLength == 1) || (intDayLength == 2)) {

            // Check if the string does not contain charaters beside numbers.
            if (isNumber(strDay, false, false, true)) {

                // Check that year is within a certain range
                if ((strDay >= cntMinDay) && (strDay <= cntMaxDay)) {
                    return cntOK;
                } else {
                    return cntNotValid;
                }
            } else {
                return cntNotValid;
            }
        } else {
            return cntNotValid;
        }
    } else {
        return cntMissing;
    }
}

function isFreeOfSpecialChars(strText) {

    var arrayValidChars = new Array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Æ', 'Ø', 'Å', 'Ü', 'É', 'È', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ',', '.', '@', '-', '&', '!', '"', '=', '(', ')', '{', '}', ';', '#', '%', '$', '[', ']', '+', '*', '/', ':', '>', '<', '½', '?', ' ', '\n', '\r\n', '\r', '\\');

    // Get length of string
    intTextLength = strText.length;

    for (intIndex = 0; intIndex < intTextLength; intIndex++) {
        strCurChar = strText.charAt(intIndex);

        charOK = false;

        for (intSecIndex = 0; intSecIndex < arrayValidChars.length; intSecIndex++) {
            if (arrayValidChars[intSecIndex] == strCurChar.toUpperCase())
            {
                charOK = true;
            }
        }

        if (!(charOK)) {
            return false;
        }
    }

    return true;
}


// Function checks if a text is valid (Not empty)
// Input : String containing text
// Output : Validation result
// HUJx 22/06/00
function isTextValid(strText) {

    // Get length of string
    intTextLength = strText.length;

    // Check if the string is empty
    if (intTextLength != 0) {

        // Check for special characters
        if (isFreeOfSpecialChars(strText)) {
            return cntOK;
        } else {
            return cntNotValid;
        }

    } else {

        return cntMissing;
    }
}

// Function checks if a text is valid (Not empty)
// Input : String containing text
// Output : Validation result
// plgx 25/10/00
function isAllTextValid(strText) {

    // Get length of string
    intTextLength = strText.length;

    // Check if the string is empty
    if (intTextLength != 0 || strText.value != '') {
        return cntOK;
    }
    else {
        return cntMissing;
    }
}

// Function extracts value from a from
// Input : Object to the form and the element name
// Output : Value for the element
// HUJx 20/06/00
function GetValue(objForm, strElementName) {

    if (!objForm.elements[strElementName])
        return('');

    // Get type of element
    strFormElementType = objForm.elements[strElementName].type;

    // Get value from form depended on type of the element
    if (strFormElementType == 'checkbox') {
        return(objForm.elements[strElementName].checked);
    } else {
        strFormElementValue = objForm.elements[strElementName].value;
        if (strFormElementValue == '') {
            return('');
        } else {
            return(strFormElementValue);
        }
    }
}


// Output any error messages and returms boolean validation result
// Inpurt : Validationn result and error messages for missing and not valid elements
// Output : True / False
// HUJx 22/06/00
function ReportErrors(intValidationResult, strErrorMissing, strErrorNotValid, objElement) {
    switch (intValidationResult) {
        case 2 : //cntMissing
            alert(strErrorMissing);
            if (objElement != null)
                objElement.focus();
            return false;
        case 1 : // cntNotValid
            alert(strErrorNotValid);
            if (objElement != null)
                objElement.focus();
            return false;
        case 0 : // cntOK
            return true;
        case 3 : // cntBadType
            alert('System error : Bad Type');
            if (objElement != null)
                objElement.focus();
            return false;
        default:
            alert('System error : Bad Type');
            if (objElement != null)
                objElement.focus();
            return false;
    }
}

// Function calls the correct validation depended on element type
// Input : Element type and valie
// Output : Validation result
// HUJx 22/06/00
function PeformValidation(strElementType, strElementValue) {
    switch (strElementType) {
        case 100: //cntAmountType
            return isAmountValid(strElementValue);
        case 101: //cntTextType
            return isTextValid(strElementValue);
        case 102: //cntNumberType
            return isNumberValid(strElementValue);
        case 110: //cntDateType
            return isDateValid(strElementValue);
        case 111: //cntDayType
            return isDayValid(strElementValue);
        case 112: //cntMonthType
            return isMonthValid(strElementValue);
        case 113: //cntYearType
            return isYearValid(strElementValue);
        case 120: //cntEmailType
            return isEmailValid(strElementValue);
        case 121: //cntAllTextType
            return isAllTextValid(strElementValue);
        default:
            return cntBadType;
    }
}


// Function validates an element (OnChange)
// Input : object pointing to element that needs validation
// Output : True/False (Alerts with error messages)
// HUJx 16/08/00
function isInputOK(objElement) {

    // Getting value and name
    strElementValue = objElement.value;
    strElementName = objElement.name;

    // Get number of elements to validate
    var intElementLength = arrayElementsForValidation.length;

    // Cycle through all the elements
    for (intIndex = 0; intIndex < intElementLength; intIndex++) {

        // Get object to the current validation array
        var objCurElement = arrayElementsForValidation[intIndex];

        if (strElementName == objCurElement[cntElementName]) {
            var strElementType = objCurElement[cntElementType];

            var intValidationResult = PeformValidation(strElementType, strElementValue);

            // Get error messages and report any errors
            var strErrorMissing = objCurElement[cntErrorMissing];
            var strErrorNotValid = objCurElement[cntErrorNotValid];
            var blnValidationOK = ReportErrors(intValidationResult, strErrorMissing, strErrorNotValid, objElement);

            if (!blnValidationOK) {
                //alert(objElement.focus);
                if (objElement.focus) {
                    objElement.focus();
                }
            }

        }
    }

}

// Function validates a form.
// Input : object pointing to form that needs validation
// Output : True/False (Alerts with error messages)
// HUJx 20/06/00
function isValidationOK(objForm) {

    // Define variables
    var intIndex; // Index used when looping through all elements

    // Get number of elements to validate
    var intElementLength = arrayElementsForValidation.length;

    // Cycle through all the elements
    for (intIndex = 0; intIndex < intElementLength; intIndex++) {

        // Get object to the current validation array
        var objCurElement = arrayElementsForValidation[intIndex];

        // Get Element type and value and peform validation
        var strElementType = objCurElement[cntElementType];
        var strElementValue = GetValue(objForm, objCurElement[cntElementName]);
        var intValidationResult = PeformValidation(strElementType, strElementValue);

        // Get error messages and report any errors
        var strErrorMissing = objCurElement[cntErrorMissing];
        var strErrorNotValid = objCurElement[cntErrorNotValid];
        var blnValidationOK = ReportErrors(intValidationResult, strErrorMissing, strErrorNotValid, objForm.elements[objCurElement[cntElementName]]);

        // If validation was wrong then stop looping (Thereby only reporting one error)
        if (!blnValidationOK) {
            return false;
        }

    }

    // Return true if we looped through all elements whitout
    // failing in validation.
    return true;

}

function WindowClosed(objWindow) {
    if (objWindow) {
        if (objWindow.closed) {
            return true;
        } else {
            if (objWindow.focus) {
                objWindow.focus()
            }
        }
        return false;
    } else {
        return true;
    }
}

function rowdatasort(pform, strOrderby, strSortOrder) {
    with (pform) {
        portletaction.value = "sort";
        action.value = "sort";
        if (strSortOrder == "asc") strSortOrder = "desc";
        else strSortOrder = "asc";
        orderby.value = strOrderby + " " + strSortOrder;
        submit();
    }
}

function printPage() {
    //if ( isMsie4orGreater() || isFirefox() ) {
    window.print();
    window.focus();
    /*} else {
     alert("Print fra menuen");
     }*/
}

function printPageAndCloseWindow(theWindow) {
    printPage();
    theWindow.close();
}

function isMsie4orGreater() {
    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

    if (msie > 0) {
        return (parseInt(ua.substring(msie + 5, ua.indexOf(".", msie)), 10) >= 4);
    }
    else {
        return false;
    }
}

/*
 LFAX: AHD1460373 Print from Firefox. (B11 merge)
 Detect Firefox client
 */
function isFirefox() {
    var ua = window.navigator.userAgent;
    var firefox = ua.indexOf("Firefox");

    return (firefox > 0)
}

/*
 MPRX: The setBlock function is used by the CheckFieldFilled function below to
 control change of focuse between fields properly. More below.
 */
function setBlock(blockValue) {
    fieldBlock = blockValue;
}

var fieldBlock = false;

/*
 MPRX: Checks if a field is "filled", ie. has the defined amount of characters in it.
 There was a problem that a user doesn't release field1:key1 before pressing field1:key2
 which resulted in field1:key1 in onKeyUp sends focus to field2, after which field1:key2
 fires yet another onKeyUp, triggered while field2 has focus, resulting in focus being
 sent to field 3. The fix is to declare the fields like this:

 <input .. onFocus="setBlock(true);" onKeyDown="setBlock(false);" onKeyUp="CheckFieldFilled(event, this, document.pKidForm.year,2);" value=""/>

 Fields that do not declare the onFocus and onKeyDown functions will work as before.
 */
function CheckFieldFilled(event, objCode, objNextField, intMaxLen) {
    var strField = objCode.value;

    if (fieldBlock) {
        setBlock(false);
    }
    else {
        if (strField.length == intMaxLen) {
            if (event && event.keyCode > 47) {
                objNextField.focus();
                if (objNextField.type != "select-one" && objNextField.type != "select-multiple")
                    objNextField.select();
            }
        }
    }
}

function setFocusAndSelectField(fieldName) {
    setFocusOnField(fieldName);
    setSelectedOnField(fieldName);
}
function setFocusOnField(fieldName) {
    if (fieldName == null) return;
    if (fieldName.style.visibility == "hidden" || fieldName.style.visibility == "hide") return;

    switch (fieldName.type) {
        case "password" :
        case "text" :
        case "fileupload" :
        case "textarea" :
        case "button" :
        case "checkbox" :
        case "radio" :
        case "reset" :
        case "select-one" :
        case "select-multiple" :
        case "submit" :
        case "text" :
        case "window" :
            fieldName.focus();
    }
}
function setSelectedOnField(fieldName) {
    if (fieldName == null) return;
    if (fieldName.style.visibility == "hidden" || fieldName.style.visibility == "hide") return;

    switch (fieldName.type) {
        case "password" :
        case "text" :
        case "fileupload" :
        case "textarea" :
            fieldName.select();
    }
}

function replaceEuroChars(objText) {
    var EURO_SIGN = String.fromCharCode(8364);
    var oldValue = objText.value;
    var newValue = "";
    var charPos = oldValue.indexOf(EURO_SIGN);

    while (charPos != -1) {
        newValue = newValue + oldValue.substr(0, charPos) + "&euro;";
        oldValue = oldValue.substr(charPos + 1, oldValue.length);
        charPos = oldValue.indexOf(EURO_SIGN);
    }

    newValue = newValue + oldValue;

    objText.value = newValue;
    return true;
}

function repaintApplet() {
    //MPRX: This is no longer to be used. It breaks the applet rather than fixes anything.
    //The style.visibility trick causes the applet to not repaint properly on some platforms.
    //Instead, a more intelligent hide/show strategy has been implemented in coolmenus.
    //
    //	applet = document.getElementById("mainApplet");
    //	if(applet){
    //		applet.style.visibility="hidden";
    //		setTimeout("applet.style.visibility='visible'",300);
    //	}
}

//This function opens a window for "total engagement" integration. We use this function
//here rather than typing in the full call in CMD as the call is too long to fit in the
//SQL server table..
function totalEngWin(portletType) {
    window.open('/package/sdc/external/totalengagement/totalEngagementLocation.jsp?portletname=totalengagement.totalengagement&portletaction=totalengagementlocation&portletTypeRuntime=' + portletType, portletType + 'Win', 'menubar,location,scrollbars, resizable, toolbar,status', 'width=800,height=600');
}
/************************************************************
Coolmenus Beta 4.04 - Copyright Thomas Brattli - www.dhtmlcentral.com
Last updated: 03.22.02
*************************************************************/
/*Browsercheck object*/
function cm_bwcheck(){
	this.ver=navigator.appVersion
	this.agent=navigator.userAgent.toLowerCase()
	this.dom=document.getElementById?1:0
	this.op5=(this.agent.indexOf("opera 5")>-1 || this.agent.indexOf("opera/5")>-1) && window.opera 
  this.op6=(this.agent.indexOf("opera 6")>-1 || this.agent.indexOf("opera/6")>-1) && window.opera   
  this.ie5 = (this.agent.indexOf("msie 5")>-1 && !this.op5 && !this.op6)
  this.ie55 = (this.ie5 && this.agent.indexOf("msie 5.5")>-1)
  this.ie6 = (this.agent.indexOf("msie 6")>-1 && !this.op5 && !this.op6)
	this.ie4=(this.agent.indexOf("msie")>-1 && document.all &&!this.op5 &&!this.op6 &&!this.ie5&&!this.ie6)
  this.ie = (this.ie4 || this.ie5 || this.ie6)
	this.mac=(this.agent.indexOf("mac")>-1)
	this.ns6=(this.agent.indexOf("gecko")>-1 || window.sidebar)
	this.ns4=(!this.dom && document.layers)?1:0;
	this.bw=(this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.op5 || this.op6)
  this.usedom= this.ns6//Use dom creation
  this.reuse = this.ie||this.usedom //Reuse layers
  this.px=this.dom&&!this.op5?"px":""
	return this
}
var bw=new cm_bwcheck()
/*Variable declaration*/
var cmpage,cm_eventlayer=0,cm_eventlayerE=0
/*Crossbrowser objects functions*/
function cm_message(txt){alert(txt); return false}
function cm_makeObj(obj,nest,o){
  if(bw.usedom&&o) this.evnt=o
  else{nest=(!nest) ? "":'document.layers.'+nest+'.'
    this.evnt=bw.dom? document.getElementById(obj):
    bw.ie4?document.all[obj]:bw.ns4?eval(nest+"document.layers." +obj):0;
  }
  if(!this.evnt) return cm_message('The layer does not exist ('+obj+')' 
    +'- \nIf your using Netscape please check the nesting of your tags (on the entire page)\nNest:'+nest)
  this.css=bw.dom||bw.ie4?this.evnt.style:this.evnt; this.ok=0
  this.ref=bw.dom||bw.ie4?document:this.css.document; 
  this.obj = obj + "Object"; 	eval(this.obj + "=this");
  this.x=0; this.y=0; this.w=0; this.h=0; this.vis=0; return this
}
cm_makeObj.prototype.moveIt = function(x,y){this.x=x;this.y=y; this.css.left=x+bw.px;this.css.top=y+bw.px}
cm_makeObj.prototype.showIt = function(o){this.css.visibility="visible"; this.vis=1; if(bw.op5&&this.arr){ this.arr.showIt(); }}//alert('showing arrow')}} 
cm_makeObj.prototype.hideIt = function(no){this.css.visibility="hidden"; this.vis=0;}
cm_makeObj.prototype.clipTo = function(t,r,b,l,setwidth){ 
this.w=r; this.h=b; if(bw.ns4){this.css.clip.top=t;this.css.clip.right=r; this.css.clip.bottom=b;this.css.clip.left=l
}else{if(t<0)t=0;if(r<0)r=0;if(b<0)b=0;if(b<0)b=0; this.css.clip="rect("+t+bw.px+","+r+bw.px+","+b+bw.px+","+l+bw.px+")";
if(setwidth){if(bw.op5||bw.op6){this.css.pixelWidth=r; this.css.pixelHeight=b;}else{this.css.width=r+bw.px; this.css.height=b+bw.px;}}}}
function cm_active(on,h){
  if(this.o.arr) on?this.o.arr.hideIt():bw.op5?this.o.arr.showIt():this.o.arr.css.visibility="inherit"
  if(bw.reuse||bw.usedom){
    if(!this.img2) this.o.evnt.className=on?this.cl2:this.cl
    else document.images["img"+this.name].src=on?this.img2.src:this.img1.src;
    if(on && bw.ns6){this.o.hideIt(); this.o.css.visibility='inherit' }; //netscape 6 bug fix  
  }else{  
    if(!this.img2){ if(on) this.o.over.showIt(); else this.o.over.hideIt();
    }else this.o.ref.images["img"+this.name].src=on?this.img2.src:this.img1.src;
  }this.isactive=on?1:0
}
/***Pageobject **/
function cm_page(){
  this.x=0; this.x2 =(!bw.ie)?window.innerWidth:document.body.offsetWidth-20;
  this.y=0; this.orgy=this.y2= (!bw.ie)?window.innerHeight:document.body.offsetHeight-6;
  this.x50=this.x2/2; this.y50=this.y2/2; return this
}
/***check positions**/
function cm_cp(num,w,minus){
	if(num){if(num.toString().indexOf("%")!=-1){var t = w?cmpage.x2:cmpage.y2; num=parseInt((t*parseFloat(num)/100))
  if(minus) num-=minus }else num=eval(num);} else num=0; return num
}
/**Level object**/
function cm_makeLevel(){
  var c=this, a=arguments; c.width=a[0]||null; c.height=a[1]||null; 
  c.regClass=a[2]||null; c.overClass=a[3]||null; c.borderX=a[4]||null; 
  c.borderY=a[5]||null; c.borderClass=a[6]||null; c.rows=a[7]>-1?a[7]:null; 
  c.align=a[8]||null; c.offsetX=a[9]||null; c.offsetY=a[10]||null; c.arrow=a[11]||null; 
  c.arrowWidth=a[12]||null; c.arrowHeight=a[13]||null; return c
}
/***Making the main menu object**/
function makeCM(name){
  var c=this; c.mc=0; c.name = name; c.m=new Array(); c.level=new Array(); c.l=new Array(); c.tim=100; c.isresized=0;
  c.isover=0; c.zIndex=100; c.bar=0; c.z=0; c.totw=0; c.toth=0; c.maxw=0; c.maxh=0; cmpage = new cm_page(); 
}//events
makeCM.prototype.onshow=""; makeCM.prototype.onhide=""; makeCM.prototype.onconstruct="";
/***Creating layers**/
function cm_divCreate(id,cl,txt,w,c,app,ex,txt2){
  if(bw.usedom){var div=document.createElement("DIV"); div.className=cl; div.id=id; 
    if(txt) div.innerHTML=txt; if(app){app.appendChild(div); return div}
    if(w) document.body.appendChild(div); return div
  }else{var dstr='<div id="'+id+'" class="'+cl+'"' 
    if(ex&&bw.reuse) dstr+=" "+ex; dstr+=">"+txt; ; if(txt2) dstr+=txt2; 
    if(c) dstr+='</div>'; if(w) document.write(dstr); else return dstr
  }return ""
}
/***Getting layer string for each menu**/
function cm_getLayerStr(m,app,name,fill,clb,arrow,ah,aw,root){
  var no=m.nolink,arrstr='',l=m.lev,str='',txt=m.txt,ev='', id=name + '_' + m.name,d1; if(app) d1=app
  if((!bw.reuse||l==0) && !no){
    ev=' onmouseover="'+name+'.showsub(\''+m.name+'\')"' 
    +' onmouseout="'+name+'.mout(\''+m.name+'\')"' //Added 4.02
    +' onclick="'+name+'.onclck(\''+m.name+'\'); return false" '
  }
  if(bw.reuse&&l!=0) txt=''; if(l==0) str+=d1=cm_divCreate(id+'_0',clb,''); str+=m.d2=cm_divCreate(id,m.cl,txt,0,0,d1,ev)
  if(l==0&&bw.usedom){ 
    m.d2.onclick=new Function(name+'.onclck("'+m.name+'")'); 
    m.d1=d1; 
    m.d2.onmouseover=new Function(name+'.showsub("'+m.name+'")'); 
    m.d2.onmouseout=new Function(name+'.mout("'+m.name+'")') //Added 4.02
  }if(!bw.reuse && !m.img1 && !no){
    str+=cm_divCreate(id+'_1',m.cl2,txt,0,1)
    str+=cm_divCreate(id+'_3',"clCMAbs",'<a href="#" '+ev+'><img alt="" src="'+root+fill+'" width="'+m.w+'" height="'+m.h+'" border="0" /></a>',0,1)
  }str+='</div>'; 
  if(l==0){if(arrow)str+=m.d3=cm_divCreate(id+'_a','clCMAbs','<img alt="" height="'+aw+'" width="'+ah+'" src="'+root+arrow+'" />',0,1,d1); str+="</div>"}
  str+="\n"; if(!bw.reuse){m.txt=null; m.d2=null; m.d3=null;}
  if(bw.usedom){ if(l==0) document.body.appendChild(d1); str=''}
  return str
}
/***get align num from text (better to evaluate numbers later)**/
function cm_checkalign(a){
  switch(a){
    case "right": return 1; break; case "left": return 2; break;
    case "bottom": return 3; break; case "top": return 4; break;
    case "righttop": return 5; break; case "lefttop": return 6; break;
    case "bottomleft": return 7; break; case "topleft": return 8; break;
  }return null
}
/**Making each individual menu **/
makeCM.prototype.makeMenu=function(name,parent,txt,lnk,targ,w,h,img1,img2,cl,cl2,align,rows,nolink,onclick,onmouseover,onmouseout){
  var c = this; if(!name) name = c.name+""+c.mc; var p = parent!=""&&parent&&c.m[parent]?parent:0;
  if(c.mc==0){var tmp=location.href;
    if(tmp.indexOf('file:')>-1||tmp.charAt(1)==':') c.root=c.offlineRoot; else c.root=c.onlineRoot
    if(c.useBar){if(!c.barBorderClass) c.barBorderClass=c.barClass; c.bar1 = cm_divCreate(c.name+'bbar_0',c.barClass,'',0,1);
      c.bar = cm_divCreate(c.name+'bbar',c.barBorderClass,'',1,1,0,0,c.bar1); if(bw.usedom) c.bar.appendChild(c.bar1);    
    }}var create=1,img,arrow; var m = c.m[name] = new Object(); m.name=name; m.subs=new Array(); m.parent=p; m.arnum=0; m.arr=0
  var l = m.lev = p?c.m[p].lev+1:0; c.mc++; m.hide=0;
  if(l>=c.l.length){
    var p1,p2=0; if(l>=c.level.length) p1=c.l[c.level.length-1];
    else p1=c.level[l]; c.l[l]=new Array(); if(!p2) p2=c.l[l-1]
    if(l!=0){ if(isNaN(p1.align)) p1["align"]=cm_checkalign(p1.align)
      for(i in p1){if(i!="str"&&i!="m"){if(p1[i]==null) c.l[l][i]=p2[i]; else c.l[l][i]=p1[i] }}
    }else{c.l[l]=c.level[0]; c.l[l].align=cm_checkalign(c.l[l].align)}
    c.l[l]["str"]=''; c.l[l].m=new Array(); if(!c.l[l].borderClass) c.l[l].borderClass=c.l[l].regClass
    c.l[l].app=0; c.l[l].max=0; c.l[l].arnum=0; c.l[l].o=new Array(); c.l[l].arr=new Array()
    c.level[l]=p1=p2=null
    if(l!=0) c.l[l].str=c.l[l].app=cm_divCreate(c.name+ '_' +l+'_0',c.l[l].borderClass,'')
  }if(p){p = c.m[p]; p.subs[p.subs.length]=name; 
    if(p.subs.length==1&&c.l[l-1].arrow){ p.arr=1; 
      if(p.parent){c.m[p.parent].arnum++
        if(c.m[p.parent].arnum>c.l[l-1].arnum){
          c.l[l-1].str+=c.l[l-1].arr[c.l[l-1].arnum]=cm_divCreate(c.name+ '_a' +(l-1)+'_'+c.l[l-1].arnum,'clCMAbs','<img height="'+c.l[l-1].arrowHeight
            +'" width="'+c.l[l-1].arrowWidth+'" src="'+c.root+c.l[l-1].arrow+'" alt="" />',0,1,c.l[l-1].app); c.l[l-1].arnum++
        }}}if(bw.reuse) if(p.subs.length>c.l[l].max) c.l[l].max = p.subs.length; else create=0
  }m.rows=rows>-1?rows:c.l[l].rows; m.w=cm_cp(w||c.l[l].width,1); m.h=cm_cp(h||c.l[l].height,0); m.txt=txt; m.lnk=lnk; 
  if(align) align=cm_checkalign(align); m.align=align||c.l[l].align; m.cl=cl=cl||c.l[l].regClass; 
  m.targ=targ; m.cl2=cl2||c.l[l].overClass; m.create=create;  m.mover=onmouseover; m.out=onmouseout; 
  m.onclck=onclick; m.active = cm_active; m.isactive=0; m.nolink=nolink
  if(create) c.l[l].m[c.l[l].m.length]=name
  if(img1){m.img1 = new Image(); m.img1.src=c.root+img1; if(!img2) img2=img1; m.img2 = new Image(); m.img2.src=c.root+img2;
    m.cl="clCMAbs"; m.txt=''; if(!bw.reuse&&!nolink) m.txt = '<a href="#" onmouseover="'+c.name+'.showsub(\''+name+'\')" onmouseout="'+c.name+'.mout(\''+name+'\')" onclick="'+c.name+'.onclck(\''+name+'\'); return false">';;
    m.txt+='<img alt="" src="'+c.root+img1+'" width="'+m.w+'" height="'+m.h+'" id="img'+m.name+'" '
    if(bw.dom&&!nolink) m.txt+='style="cursor:pointer; cursor:hand"'; if(!bw.reuse){if(!bw.dom) m.txt+='name="img'+m.name+'"'; m.txt+=' border="0"'}; m.txt+=' />'; if(!bw.reuse&&!nolink) m.txt+='</a>'
  }else{m.img1=0; m.img2=0}; 
  if(l==0||create) c.l[l].str+=cm_getLayerStr(m,c.l[l].app,c.name,c.fillImg,c.l[l].borderClass,c.l[l].arrow,c.l[l].arrowWidth,c.l[l].arrowHeight,c.root)
  if(l==0){if(m.w>c.maxw) c.maxw=m.w; if(m.h>c.maxh) c.maxh=m.h; c.totw+=c.pxBetween+m.w+c.l[0].borderX;c.toth+=c.pxBetween+m.h+c.l[0].borderY}
  if(lnk && !onmouseover) m.mover="self.status='"+c.root+m.lnk+"'"
}
/**Getting x/y coords for subs **/
makeCM.prototype.getcoords=function(m,bx,by,x,y,maxw,maxh,ox,oy){
  var a=m.align; x+=m.o.x; y+=m.o.y
  switch(a){
    case 1:  x+=m.w+bx; break; case 2:  x-=maxw+bx; break;
    case 3:  y+=m.h+by; break; case 4:  y-=maxh+by; break;
    case 5:  x-=maxw+bx; y-=maxh-m.h; break;
    case 6:  x+=m.w+bx; y-=maxh-m.h; break;
    case 7:  y+=m.h+by; x-=maxw-m.w; break;
    case 8:  y-=maxh+by; x-=maxw-m.w+bx; break;
  }m.subx=x + ox; m.suby=y + oy
}
/**Showing sub elements**/
makeCM.prototype.showsub=function(el){
  var c=this,pm=c.m[el];
  if(!pm.b||(c.isresized&&pm.lev>0)) pm.b=c.l[pm.lev].b; c.isover=1
  clearTimeout(c.tim);
  var ln=pm.subs.length,l=pm.lev+1
  if(c.l[pm.lev].a==el&&l!=c.l.length){if(c.l[pm.lev+1].a) c.hidesub(l+1,el); return}
  c.hidesub(l,el); if(pm.mover) eval(pm.mover); if(!pm.isactive) pm.active(1);
  c.l[pm.lev].a = el; if(ln==0) return; 
  var b = c.l[l].b, bx=c.l[l].borderX, by=c.l[l].borderY, rows=pm.rows
  var x=bx,y=by,maxw=0,maxh=0,cn=0; b.hideIt()
  for(var i=0;i<c.l[l].m.length;i++){  
    if(!bw.reuse) m=c.m[c.l[l].m[i]]
    else m=c.m[c.m[el].subs[i]]
    if(m && m.parent==el&&!m.hide){
      if(!bw.reuse) o=m.o; else o=m.o=c.l[l].o[i]
      if(x!=o.x||y!=o.y) o.moveIt(x,y); nl=m.subs.length
      if(bw.reuse){
        if(o.w!=m.w || o.h!=m.h) o.clipTo(0,m.w,m.h,0,1)
        if(o.evnt.className!=m.cl){ 
          m.isactive=0; o.evnt.className=m.cl
          if(bw.ns6){o.hideIt(); o.css.visibility='inherit'} //NS6 bugfix
        }if(bw.ie6) b.showIt()//IE6 bugfix (scrollbars)
        o.evnt.innerHTML=m.txt; if(bw.ie6) b.hideIt() 
        if(!m.nolink){
          o.evnt.onmouseover=new Function(c.name+".showsub('"+m.name+"')")
          o.evnt.onmouseout=new Function(c.name+".mout('"+m.name+"')") //Added 4.02
          o.evnt.onclick=new Function(c.name+".onclck('"+m.name+"')")
          if(o.oldcursor){o.css.cursor=o.oldcursor; o.oldcursor=0;}
        }else{o.evnt.onmouseover=''; o.evnt.onclick='';  if(o.css.cursor=='') o.oldcursor=bw.ns6?"pointer":"hand"; else o.oldcursor=o.css.cursor; o.css.cursor="auto"}        
      }if(m.arr){o.arr=c.l[l].arr[cn]; o.arr.moveIt(x + m.w-c.l[l].arrowWidth-3,y+m.h/2-(c.l[l].arrowHeight/2)); 
      o.arr.css.visibility="inherit"; cn++;} else o.arr=0
      if(!rows){y+=m.h+by; if(m.w>maxw) maxw=m.w; maxh=y}
      else{x+=m.w+bx; if(m.h>maxh) maxh=m.h; maxw=x;}
      o.css.visibility="inherit"; if(bw.op5||bw.op6) o.showIt()
    }else{o = c.m[c.l[l].m[i]].o; o.hideIt();} }
  if(!rows) maxw+=bx*2; else maxh+=by*2; b.clipTo(0,maxw,maxh,0,1)
  if(!pm.subx||!pm.suby||c.srollY>0||c.isresized) c.getcoords(pm,c.l[l-1].borderX,c.l[l-1].borderY,pm.b.x,pm.b.y,maxw,maxh,c.l[l-1].offsetX,c.l[l-1].offsetY)
  x=pm.subx; y=pm.suby; b.moveIt(x,y); if(c.onshow) eval(c.onshow); b.showIt()
}
/**Hide sub elements **/
/**Modified by Michael Olsen
Show applet when the menu is dropped up.
**/
makeCM.prototype.hidesub=function(l,el){

  if(l != 2 && el == undefined){
	var applet = document.getElementById('mainApplet');
	if(applet && applet.style.visibility != 'visible') {
		applet.style.visibility = 'visible';
	}	
  }

  var c = this,tmp,m,i,j
  if(!l){if(!l) l=1;}
  for(i=l-1;i<c.l.length;i++){
    if(i>0&&i>l-1) c.l[i].b.hideIt()
    if(c.l[i].a&&c.l[i].a!=el){
      m=c.m[c.l[i].a]; m.active(0,1); if(m.mout) eval(m.mout); c.l[i].a=0
      if(i>0&&i>l-1) if(bw.op5||bw.op6) for(j=0;j<c.l[i].m.length;j++) c.m[c.l[i].m[j]].o.hideIt()
    }if(i>l){for(j=0;j<c.l[i-1].arnum;j++){c.l[i-1].arr[j].hideIt(); if(bw.op6) c.l[i-1].arr[j].moveIt(-1000,-1000)}} //opera bug
  }if(!l&&c.onhide) eval(c.onhide) //onhide event
}
/***Make all menu div objects**/
makeCM.prototype.makeObjects=function(nowrite){
  var c = this,oc,name,bx,by,w,h,l,no,ar,id,nest
  if(!nowrite){
    for(i=0;i<c.l.length;i++){
      if(i!=0) c.l[i].str+="</div>"
      if(!bw.usedom) document.write(c.l[i].str)
      else if(i>0) document.body.appendChild(c.l[i].app)
      c.l[i].str=null //Probably need this on frames version though
    }}c.z=c.zIndex+2
  for(i=0;i<c.l.length;i++){oc=0
    if(i!=0){bobj=c.l[i].b = new cm_makeObj(c.name + "_"+i+"_0","",c.l[i].app); bobj.css.zIndex=c.z; 
    if(bw.dom) bobj.css.overflow='hidden'}; bx=c.l[i].borderX; by=c.l[i].borderY; c.l[i].max=0;
    for(j=0;j<c.l[i].m.length;j++){
      m = c.m[c.l[i].m[j]]; name=m.name; w=m.w; h=m.h; l=m.lev; no=m.nolink;
      if(i>0){m.b = bobj; nest=i}
      else{m.b = new cm_makeObj(c.name + "_"+name+"_0","",m.d1); m.b.css.zIndex=c.z; m.b.clipTo(0,w+bx*2,h+by*2,0,1); nest=name}
      id = c.name + "_"+name; nest=c.name + "_"+nest;
      if(m.create){
        o=m.o=new cm_makeObj(id,nest+"_0",m.d2); o.z=o.css.zIndex=c.z+1; if(bw.reuse){c.l[l].o[oc]=o; oc++}; 
        if(l==0&&m.img1) o.css.visibility='inherit'; if(bw.op5) o.showIt(); o.arr=0;
      }if(!bw.reuse||l==0) o.clipTo(0,w,h,0,1); o.moveIt(bx,by); o.z=o.css.zIndex=c.z+2
      if(j<c.l[i].arnum){
        c.l[i].arr[j]=new cm_makeObj(c.name+"_a"+i+"_"+j,nest+"_0",nowrite?0:c.l[i].arr[j])
        c.l[i].arr[j].css.zIndex=c.z+30+j;
      }else if(l==0&&m.arr==1){
        o.arr=new cm_makeObj(id+"_a",nest+"_0",m.d3)
        o.arr.moveIt(bx+m.w-c.l[i].arrowWidth-3,by+m.h/2-(c.l[i].arrowHeight/2)); 
        o.arr.css.zIndex=c.z+20;
      }if(!no && !bw.reuse && !m.img1){  
        o.over=new cm_makeObj(c.name + "_"+name+"_1",nest+"_0"+".document.layers."+id)
        o.over.moveIt(0,0); o.over.hideIt(); o.over.clipTo(0,w,h,0,1); o.over.css.zIndex=c.z+3
        img=new cm_makeObj(c.name + "_"+name+"_3",nest+"_0"+".document.layers."+id); img.moveIt(0,0)
        img.css.visibility="inherit"; img.css.zIndex=c.z+4; if(bw.op5) img.showIt()
      }c.z++; 
    }
  }
}
/**Onmouseout**/  //Added 4.02
makeCM.prototype.mout = function(){
	
	var c = this;
		
  clearTimeout(c.tim)
  c.isover = 0
  c.tim = setTimeout("if(!"+c.name+".isover)"+c.name+".hidesub()",c.wait)
}
/**Constructing and initiating top items and bar**/
makeCM.prototype.construct=function(nowrite){
  var c=this; if(!c.l[0]||c.l[0].m.length==0) return cm_message('No menus defined');
  c.makeObjects(nowrite); cmpage = new cm_page(); 
  var mpa,o,maxw=c.maxw,maxh=c.maxh,i,totw=c.totw,toth=c.toth,m,px=c.pxBetween
  var bx=c.l[0].borderX,by=c.l[0].borderY,x=c.fromLeft; y=c.fromTop,mp=c.menuPlacement,rows=c.rows
  if(rows){toth=maxh+by*2; totw=totw-px+bx;}else{totw=maxw+bx*2; toth=toth-px+by;}
  switch(mp){
    case "center": x=cmpage.x2/2-totw/2; if(bw.ns4) x-=9; break;
    case "right": x=cmpage.x2-totw; break;
    case "bottom": case "bottomcenter": y=cmpage.y2-toth; if(mp=="bottomcenter") x=cmpage.x2/2-totw/2; break;
    default: if(mp.toString().indexOf(",")>-1) mpa=1; break;
  }for(i=0;i<c.l[0].m.length;i++){
    m = c.m[c.l[0].m[i]]; o = m.b; if(mpa) rows?x=cm_cp(mp[i]):y=cm_cp(mp[i],0,0,1); 
    o.moveIt(x,y); o.showIt(); if(m.arr) m.o.arr.showIt(); o.oy=y; 
    if(!mpa) rows?x+=m.w+px+bx:y+=m.h+px+by
  }if(c.useBar){ //Background-Bar
    bbx=c.barBorderX; bby=c.barBorderY; 
    bar1=c.bar1= new cm_makeObj(c.name+'bbar_0',c.name+'bbar',nowrite?0:c.bar1)
    bar=c.bar= new cm_makeObj(c.name+'bbar','',nowrite?0:c.bar); bar.css.zIndex=c.zIndex+1
    //bar.evnt.onmouseover=new Function(cm_eventlayerE)
    var barx=c.barX=="menu"?c.m[c.l[0].m[0]].b.x-bbx:cm_cp(c.barx,1);
    var bary=c.barY=="menu"?c.m[c.l[0].m[0]].b.y-bby:cm_cp(c.barY);
    var barw=c.barWidth=="menu"?totw:cm_cp(c.barWidth,1,bbx*2);
    var barh=c.barHeight=="menu"?toth:cm_cp(c.barHeight,0,bby*2);
    bar1.clipTo(0,barw,barh,0,1); bar1.moveIt(bbx,bby); bar1.showIt();
    bar.clipTo(0,barw+bbx*2,barh+bby*2,0,1); bar.moveIt(barx,bary); bar.showIt();
  }if(c.resizeCheck){ //Window resize code.
    setTimeout('window.onresize=new Function("'+c.name+'.resized()")',500)
    c.resized=cm_resized; if(bw.op5||bw.op6) document.onmousemove=new Function(c.name+".resized()")
  }if(c.onconstruct) eval(c.onconstruct) //onconstruct event
  return true
}
/**Capturing resize**/
var cm_inresize=0
function cm_resized(){
  if(cm_inresize) return
	page2=new cm_page(); var off=(bw.op6||bw.op5)?15:5
  if(page2.x2<cmpage.x2-off || page2.y2<cmpage.orgy-off || page2.x2>cmpage.x2+off || page2.y2>cmpage.orgy+off){
		if(bw.ie||bw.ns6){
      cmpage=page2; this.isresized=1; 
      if(this.onresize) eval(this.onresize); this.construct(1);
      if(this.onafterresize) eval(this.onafterresize)
		}else{cm_inresize=1; location.reload()} 
  }
}
/**Onclick of an item**/
makeCM.prototype.onclck=function(m){
  m = this.m[m]
  if(m.onclck) eval(m.onclck); 
  lnk=m.lnk; targ=m.targ
  if(lnk){
    if(lnk.indexOf("mailto")!=0 && lnk.indexOf("http")!=0) lnk=this.root+lnk
		if(String(targ)=="undefined" || targ=="" || targ==0 || targ=="_self") location.href=lnk 
    else if(targ=="_blank") window.open(lnk)
    else if(targ=="_top" || targ=="window") top.location.href=lnk
    else if(top[targ]) top[targ].location.href=lnk
    else if(parent[targ]) parent[targ].location.href=lnk
  }else return false
}

/** Added by Casper Gjerris **/
if(bw.ie || bw.ns6){
  makeCM.prototype.findPos=function(obj) {
    var curleft = curtop = 0;
    if (obj && obj.offsetParent) {
      curleft = obj.offsetLeft
      curtop  = obj.offsetTop
      while (obj = obj.offsetParent) {
        curleft += obj.offsetLeft
        curtop += obj.offsetTop
      }
    }
    return [curleft,curtop];
  }
  //Hide applet implementation by MPRX. Only hides the applet when it collides with
  //a menu (or somewhat close to). Same strategy as for select boxes for a more robust
  //UI on troublesome OS/JVM/Browser combinations (eg. JRE1.4.2_09, IE6, Win2k)
  makeCM.prototype.onshow+=";this.hideSdcApplet(pm,pm.subx,pm.suby,maxw,maxh,pm.lev)"
  makeCM.prototype.hideSdcApplet=function(pm,x,y,w,h,l){
	var sdcApplet = document.getElementById('mainApplet');
	if(sdcApplet) {
	  pos = this.findPos(sdcApplet);
	  selx=pos[0];
	  sely=pos[1];
	  selw=sdcApplet.offsetWidth; 
	  selh=sdcApplet.offsetHeight;
	  if(selx+selw > x && selx < x+w && sely+selh > y && sely < y+h) {
	    if(sdcApplet.style.visibility != 'hidden') {
	  		sdcApplet.style.visibility = 'hidden';
	    }
	  }
	  else {
	    if(sdcApplet.style.visibility != 'visible') {	  
	      sdcApplet.style.visibility = 'visible';
	    }
	  }	  
	}  
  }  
  makeCM.prototype.sel=0
  makeCM.prototype.onshow+=";this.hideselectboxes(pm,pm.subx,pm.suby,maxw,maxh,pm.lev)"
  makeCM.prototype.hideselectboxes=function(pm,x,y,w,h,l){
    var selx,sely,selw,selh,i
    if(!this.sel ||this.sel.length==0){
    	var count = 0;
    	var elements = new Array();

    	//MPRX: If getElementsByTagName is supported (DOM 1), use it - its faster,
    	//safer and prettier.
    	if(document.getElementsByTagName) {
    		elements = document.getElementsByTagName('select');
    	}
    	else {
	   		for (i=0;i<document.forms.length;i++) {
      			for (var z=0;z<document.forms[i].elements.length;z++) {
					e = document.forms[i].elements[z];
      	   			if (e.type=='select-one' ||	e.type=='select-multiple') {
	      	   			elements[count++]=e;
      	   			}
	        	}
	    	}
	    }
	    
		this.sel = elements;
    	this.sel.level=0;	
    }   
     	
    var sel=this.sel
    for(i=0;i<sel.length;i++) {
		pos = this.findPos(sel[i]);
		selx=pos[0];
		sely=pos[1];
		selw=sel[i].offsetWidth; 
		selh=sel[i].offsetHeight;
		if(selx+selw>x && selx<x+w && sely+selh>y && sely<y+h) {
			if(sel[i].style.visibility!="hidden") {
				sel[i].level=l; sel[i].style.visibility="hidden"; 
				if(pm) { 
					if(!pm.mout) 
						pm.mout=""; 
					pm.mout+=this.name+".sel["+i+"].style.visibility='visible';"
				}
			}
        }
        else if(l<=sel[i].level && !(pm&&l==0)) {
        	sel[i].style.visibility="visible";
       	}
    }
  }
}

/**Added by Michael Olsen**/
makeCM.prototype.onshow+=";this.subwait(b,pm,pm.subx,pm.suby,maxw,maxh)"
cm_makeObj.prototype.subwaittim=null;
makeCM.prototype.subwait=function(b,pm,x,y,w,h,n){ 
x=pm.subx; y=pm.suby
clearTimeout(this.subwaittim);
b.moveIt(-1000,-1000) 
//b.moveIt(-x*2,-y*2)
var aaa=""+b.obj+".moveIt("+x+","+y+")"
this.subwaittim=setTimeout(aaa,500) //Time in milliseconds 500
}


// Author  : $Author: U0729 $  
// Version : $Id: template.js,v 1.1 2003/01/14 13:24:41 U0729 Exp $ 	


// *****************************************************************************
//
// Open a new window. Will place window (20,20) pixels from left/top
// of caller Frame (default current window)
//
//    url:           The page to open in the new window
//    w:             Width of new page         (optional. Default: 300)
//    h:             Height of new page        (optional. Default: 200)
//    name:          Name of window            (optional. Default: 'PortalBank')
//    callerFrame:   The calling frame         (optional. Default: current frame)
//
// *****************************************************************************
function openPopup(url, w, h, name, callerFrame) {
  var width = (w || 300);
  var height = (h || 200);
  if (arguments.length < 4)  name = "PortalBank";
  if (arguments.length < 5)  callerFrame = window;

  if (document.all) { x = callerFrame.screenLeft + 20; y = callerFrame.screenTop + 20; }
  else              { x = callerFrame.screenX + 20;    y = callerFrame.screenY + 20; }

  var x, y, style;
  if (name == "Budget") {
    x = 20;
    y = 15;
    var intHeight = screen.height - (x * 3);
    var intWidth = screen.width - (y * 3);
    style = "location=no,resizable=yes,scrollbars=no,toolbar=no,menubar=no,status=no,height=" + intHeight + ",width=" + intWidth;
  }
  else	
    style = "toolbar=no,location=no,directories=no,status=no,menubar=yes,scrollbars=yes,resizable=yes,width=" + width + ",height=" + height;

  var notSeenX = screen.availWidth - (x + width + 20);
  var notSeenY = screen.availHeight - (y + height + 50);
  if (notSeenX < 0) x += (notSeenX - 20); if (x < 0) x = 0;
  if (notSeenY < 0) y += (notSeenY - 50); if (y < 0) y = 0;

  if (document.all) style += ",left=" + x + ",top=" + y;
  else              style += ",screenX=" + x + ",screenY=" + y;

// close print-window if open, before new print 
//  var closeWin = callerFrame.open (url, name, style);
//	if (closeWin == null){}
//	else
//		closeWin.close();

  var openWin = callerFrame.open (url, name, style);
  openWin.focus();
}

var MINUTE        = 1000 * 60;     //In milisecs
var POLL_INTERVAL = 0.5 * MINUTE;  //Frequency of polling
var PROMPT_LIMIT  = 11.5 * MINUTE; //When to prompt the user if he wants to extend his session
var PROMPT_PERIOD = 3 * MINUTE;    //For how long to prompt the user, before doing an auto-logoff

var lastAction   = new Date().getTime();
var promptWindow = null;

var activeCounter = 0;
var initialCounter = 0;

/*
 * Initialize logogff counters
 */
function initializeCounter(counter,promptMinutes) {
  initialCounter = counter;
  activeCounter  = counter;
  if ( promptMinutes )
    PROMPT_LIMIT  = promptMinutes * MINUTE
}

/*
  This function will poll itself every POLL_INTERVAL ms. The function has three stages:

  1. The user has recently performed an action (and thus reset lastAction). When the function
  polls, and the time since last action is less than PROMPT_LIMIT, nothing happens other than
  the function will call itself again with a delay

  2. The user has not been active for a while. The time since last action is larger than PROMPT_LIMIT
  but less than PROMPT_LIMIT + PROMPT_PERIOD. Thus a prompt window will open and inform 
  the user that he is about to time out, and give him an option to "buy more time"
  
  3. The user has been inactive for more than PROMPT_LIMIT + PROMPT_PERIOD. Close the prompt window, 
  and send the user to the logoff URL (which should handle invalidation of his server session and so forth)
*/
function logoffControl(articleUrl, logoffUrl, iframeUrl) {
	var now = new Date().getTime();
	    
	//If the user has timed out, send him to the logoff URL
    if (lastAction + PROMPT_LIMIT + PROMPT_PERIOD < now) {
        if (promptWindow != null) {
        	try {
            	promptWindow.close();
            	promptWindow = null;
            }
            catch(e) {
            	//If the prompt window is already closed
            }
        }
        
        navigateTo(logoffUrl);
        return;
    }
	//If the current time is later than when the page got rendered plus the timeout interval	
    else if (lastAction + PROMPT_LIMIT < now) {

		//If the counter is greater than zero, reset the clock and update the server-side session.
		//The server session is updated by setting the contents of an invisible iframe to an article
		if(activeCounter > 0) {
		    activeCounter--;
		    lastAction = new Date().getTime();
		    frames['outputframe'].location.href = iframeUrl;
		}	    
		else {
		    //If there's no prompt window already
	 	    if(promptWindow == null || promptWindow.closed) {
			    var top   = (screen.availHeight - 130)/2;
			    var left  = (screen.availWidth - 300)/2;
				var style = "top="+top+",left="+left+",width=300,height=130";
				promptWindow = window.open(articleUrl, "Bemærk", style);
			}
			
			promptWindow.focus();
	    }
	}

    //Poll every POLL_INTERVAL seconds 
    setTimeout("logoffControl('"+articleUrl+"','"+logoffUrl+"','"+iframeUrl+"')", POLL_INTERVAL);
}

/*
  Called by the pop-up window when the user wishes to extend his session
*/
function buyTime() {
  lastAction = new Date().getTime();
  activeCounter = initialCounter;
  promptWindow.close();
  promptWindow = null;
}

function silentRefresh(url) {
    try {
        document.getElementById('devnull').innerHTML="<img src='"+url+"'>";
    } catch(e) {
        openPromptWindow(url+"?message=Kunne ikke opdatere automatisk - evt. en template fejl");
    }
}
