var win=null;

function ShowHelp(mypage,myname,w,h,scroll,pos){
    if(pos=="random"){LeftPosition=(screen.width)?Math.floor(Math.random()*(screen.width-w)):100;TopPosition=(screen.height)?Math.floor(Math.random()*((screen.height-h)-75)):100;}
    if(pos=="center"){LeftPosition=(screen.width)?(screen.width-w)/2:100;TopPosition=(screen.height)?(screen.height-h)/2:100;}
    else if((pos!="center" && pos!="random") || pos==null){LeftPosition=0;TopPosition=20}
    settings='width='+w+',height='+h+',top='+TopPosition+',left='+LeftPosition+',scrollbars='+scroll+',location=no,directories=no,status=no,menubar=no,toolbar=no,resizable=yes';
    win=window.open(mypage,myname,settings);
}


function openNewmail(systemUserId)
{
    var action = "NewMail.do?mailRecipient=" + systemUserId;
    var mailWin = window.open(action, '','toolbar=no,location=no,directories=no,menubar=no,status=no,scrollbars=no,width=400,height=590');
    mailWin.moveTo(self.screen.width/2-200,self.screen.height/2-275);
}

function Get_Cookie(name) {
    var start = document.cookie.indexOf(name+"=");
    var len = start+name.length+1;
    if ((!start) && (name != document.cookie.substring(0,name.length))) return null;
    if (start == -1) return null;
    var end = document.cookie.indexOf(";",len);
    if (end == -1) end = document.cookie.length;
    return unescape(document.cookie.substring(len,end));
}

function Set_Cookie(name,value,expires,path,domain,secure) {
    expires = expires * 60*60*24*1000;
    var today = new Date();
    var expires_date = new Date( today.getTime() + (expires) );
    var cookieString = name + "=" +escape(value) +
                       ( (expires) ? ";expires=" + expires_date.toGMTString() : "") +
                       ( (path) ? ";path=" + path : "") +
                       ( (domain) ? ";domain=" + domain : "") +
                       ( (secure) ? ";secure" : "");
    document.cookie = cookieString;
}

/* Sub cookie format is "name1:value1/name2:value2" */

function setSubCookie( uName, name, value, expires )
{
    var uValue = Get_Cookie( uName );
    if( uValue ) {
        // '/' is breaker for sub cookie each
        var uCookies = uValue.split( '/' );
        var found = -1; // whether sub-cookie for the name is present
        for( var c = 0; c < uCookies.length; c++ )
        {
            // ':' is identifier between name and value for sub cookie.
            var t = uCookies[c].split( ':' );
            var tName = t[0];
            var tValue = t[1];
            if( tName == name ) {
                found = 1;
                tValue = value;
                t[1] = tValue;
                uCookies[c] = t.join( ':' );
            }
        }
        if( found == -1 ) {
            uCookies[uCookies.length] = name + ':' + value;
        }
        uValue = uCookies.join( '/' );
    } else {
        uValue = name + ':' + value;
    }
    // update real cookie
    Set_Cookie( uName, uValue, expires );
}

function getSubCookie( uName, name )
{
    var uValue = Get_Cookie( uName );

    if (uValue) {
        var flag = uValue.indexOf( name + ':' )
        if( flag != -1 ) {
            flag += name.length + 1;
            var end = uValue.indexOf( '/', flag );
            if( end == -1 ) {
                end = uValue.length;
            }
            return uValue.substring( flag, end );
        }
    }
    return "";
}

function hideShowElement(elementId)
{
    var count = elementId.substring(elementId.indexOf("_")+1,elementId.length);
    var div = document.getElementById(elementId);
    if (div) {
        if (div.style.display=='block' || div.style.display=='') {
            div.style.display='none';
            theIcon=document.getElementById(elementId + "_imageDiv");
            if(theIcon!=null){
                theIcon.innerHTML='<img src="images/icons/16x16/blue_show.gif" alt="" border=0 onclick="hideShowElement(\'' + elementId + '\'); hideShowElement(\'paddingDiv_' + count +'\')">';
            }
            Set_Cookie("collapse" + elementId, "true", 365);
        } else {
            div.style.display='';
            theIcon=document.getElementById(elementId + "_imageDiv");
            if(theIcon!=null){
                theIcon.innerHTML='<img src="images/icons/16x16/blue_hide.gif" alt="" border=0 onclick="hideShowElement(\'' + elementId + '\'); hideShowElement(\'paddingDiv_' + count +'\')">';
            }
            Set_Cookie("collapse" + elementId, "false", 365);
        }
    }
}

function hideShowDiv(divName) {
    var div = document.getElementById(divName);
    if (div.style.display=='block') {
        div.style.display='none';
    } else {
        div.style.display='block';
    }
}


function showUserInformation(systemUserId)
{
    if (systemUserId != "0") {
        jsrsExecute('RemoteUtilServlet', displayUserInformation, 'getUserInformation', systemUserId, false);
    }
}

function displayUserInformation(htmlToShow)
{
    var myText3='<div class="xxfl">' + htmlToShow + '</div>';
    var title='User information';

    return overlib(myText3, BGCLASS,'xxbg', CGCLASS,'xxcg', FGCLASS,'xxfg',
            CAPTIONFONTCLASS,'xxcap', CLOSEFONTCLASS,'xxclo',
            TEXTFONTCLASS,'xxtxt', WRAP, TEXTPADDING,0, BORDER,2, STICKY, CLOSECLICK, CAPTIONPADDING,4, CAPTION, title,
            BELOW, OFFSETX, 10 , OFFSETY,20, LEFT, STATUS,'', SHADOW,SHADOWX,5,
            SHADOWY,5,SHADOWIMAGE,'js/semitrans.gif',SHADOWOPACITY,0);
}



/************************************************************************************************************
 (C) www.dhtmlgoodies.com, October 2005

 This is a script from www.dhtmlgoodies.com. You will find this and a lot of other scripts at our website.

 Terms of use:
 You are free to use this script as long as the copyright message is kept intact. However, you may not
 redistribute, sell or repost it without our permission.

 Thank you!

 www.dhtmlgoodies.com
 Alf Magne Kalleland

 ************************************************************************************************************/


var fromBoxArray = new Array();
var toBoxArray = new Array();
var selectBoxIndex = 0;
var arrayOfItemsToSelect = new Array();


function moveSingleElement()
{
    var selectBoxIndex = this.parentNode.parentNode.id.replace(/[^\d]/g,'');
    var tmpFromBox;
    var tmpToBox;
    if(this.tagName.toLowerCase()=='select'){
        tmpFromBox = this;
        if(tmpFromBox==fromBoxArray[selectBoxIndex])tmpToBox = toBoxArray[selectBoxIndex]; else tmpToBox = fromBoxArray[selectBoxIndex];
    }else{

        if(this.value.indexOf('>')>=0){
            tmpFromBox = fromBoxArray[selectBoxIndex];
            tmpToBox = toBoxArray[selectBoxIndex];
        }else{
            tmpFromBox = toBoxArray[selectBoxIndex];
            tmpToBox = fromBoxArray[selectBoxIndex];
        }
    }

    for(var no=0;no<tmpFromBox.options.length;no++){
        if(tmpFromBox.options[no].selected){
            tmpFromBox.options[no].selected = false;
            tmpToBox.options[tmpToBox.options.length] = new Option(tmpFromBox.options[no].text,tmpFromBox.options[no].value);

            for(var no2=no;no2<(tmpFromBox.options.length-1);no2++){
                tmpFromBox.options[no2].value = tmpFromBox.options[no2+1].value;
                tmpFromBox.options[no2].text = tmpFromBox.options[no2+1].text;
                tmpFromBox.options[no2].selected = tmpFromBox.options[no2+1].selected;
            }
            no = no -1;
            tmpFromBox.options.length = tmpFromBox.options.length-1;

        }
    }


    var tmpTextArray = new Array();
    for(var no=0;no<tmpFromBox.options.length;no++){
        tmpTextArray.push(tmpFromBox.options[no].text + '___' + tmpFromBox.options[no].value);
    }
    tmpTextArray.sort();
    var tmpTextArray2 = new Array();
    for(var no=0;no<tmpToBox.options.length;no++){
        tmpTextArray2.push(tmpToBox.options[no].text + '___' + tmpToBox.options[no].value);
    }
    tmpTextArray2.sort();

    for(var no=0;no<tmpTextArray.length;no++){
        var items = tmpTextArray[no].split('___');
        tmpFromBox.options[no] = new Option(items[0],items[1]);

    }

    for(var no=0;no<tmpTextArray2.length;no++){
        var items = tmpTextArray2[no].split('___');
        tmpToBox.options[no] = new Option(items[0],items[1]);
    }
}

function sortAllElement(boxRef)
{
    var tmpTextArray2 = new Array();
    for(var no=0;no<boxRef.options.length;no++){
        tmpTextArray2.push(boxRef.options[no].text + '___' + boxRef.options[no].value);
    }
    tmpTextArray2.sort();
    for(var no=0;no<tmpTextArray2.length;no++){
        var items = tmpTextArray2[no].split('___');
        boxRef.options[no] = new Option(items[0],items[1]);
    }

}
function moveAllElements()
{
    var selectBoxIndex = this.parentNode.parentNode.id.replace(/[^\d]/g,'');
    var tmpFromBox;
    var tmpToBox;
    if(this.value.indexOf('>')>=0){
        tmpFromBox = fromBoxArray[selectBoxIndex];
        tmpToBox = toBoxArray[selectBoxIndex];
    }else{
        tmpFromBox = toBoxArray[selectBoxIndex];
        tmpToBox = fromBoxArray[selectBoxIndex];
    }

    for(var no=0;no<tmpFromBox.options.length;no++){
        tmpToBox.options[tmpToBox.options.length] = new Option(tmpFromBox.options[no].text,tmpFromBox.options[no].value);
    }

    tmpFromBox.options.length=0;
    sortAllElement(tmpToBox);

}


/* This function highlights options in the "to-boxes". It is needed if the values should be remembered after submit. Call this function onsubmit for your form */
function multipleSelectOnSubmit()
{
    for(var no=0;no<arrayOfItemsToSelect.length;no++){
        var obj = arrayOfItemsToSelect[no];
        for(var no2=0;no2<obj.options.length;no2++){
            obj.options[no2].selected = true;
        }
    }

}

function createMovableOptions(fromBox,toBox,totalWidth,totalHeight,labelLeft,labelRight)
{
    fromObj = document.getElementById(fromBox);
    toObj = document.getElementById(toBox);

    arrayOfItemsToSelect[arrayOfItemsToSelect.length] = toObj;


    fromObj.ondblclick = moveSingleElement;
    toObj.ondblclick = moveSingleElement;


    fromBoxArray.push(fromObj);
    toBoxArray.push(toObj);

    var parentEl = fromObj.parentNode;

    var parentDiv = document.createElement('DIV');
    parentDiv.className='multipleSelectBoxControl';
    parentDiv.id = 'selectBoxGroup' + selectBoxIndex;
    parentDiv.style.width = totalWidth + 'px';
    parentDiv.style.height = totalHeight + 'px';
    parentEl.insertBefore(parentDiv,fromObj);


    var subDiv = document.createElement('DIV');
    subDiv.style.width = (Math.floor(totalWidth/2) - 15) + 'px';
    fromObj.style.width = (Math.floor(totalWidth/2) - 15) + 'px';

    var label = document.createElement('SPAN');
    label.innerHTML = labelLeft;
    subDiv.appendChild(label);

    subDiv.appendChild(fromObj);
    subDiv.className = 'multipleSelectBoxDiv';
    parentDiv.appendChild(subDiv);


    var buttonDiv = document.createElement('DIV');
    buttonDiv.style.verticalAlign = 'middle';
    buttonDiv.style.paddingTop = (totalHeight/2) - 50 + 'px';
    buttonDiv.style.width = '30px';
    buttonDiv.style.textAlign = 'center';
    parentDiv.appendChild(buttonDiv);

    var buttonRight = document.createElement('INPUT');
    buttonRight.type='button';
    buttonRight.value = '>';
    buttonDiv.appendChild(buttonRight);
    buttonRight.onclick = moveSingleElement;

    var buttonAllRight = document.createElement('INPUT');
    buttonAllRight.type='button';
    buttonAllRight.value = '>>';
    buttonAllRight.onclick = moveAllElements;
    buttonDiv.appendChild(buttonAllRight);

    var buttonLeft = document.createElement('INPUT');
    buttonLeft.style.marginTop='10px';
    buttonLeft.type='button';
    buttonLeft.value = '<';
    buttonLeft.onclick = moveSingleElement;
    buttonDiv.appendChild(buttonLeft);

    var buttonAllLeft = document.createElement('INPUT');
    buttonAllLeft.type='button';
    buttonAllLeft.value = '<<';
    buttonAllLeft.onclick = moveAllElements;
    buttonDiv.appendChild(buttonAllLeft);

    var subDiv = document.createElement('DIV');
    subDiv.style.width = (Math.floor(totalWidth/2) - 15) + 'px';
    toObj.style.width = (Math.floor(totalWidth/2) - 15) + 'px';

    var label = document.createElement('SPAN');
    label.innerHTML = labelRight;
    subDiv.appendChild(label);

    subDiv.appendChild(toObj);
    parentDiv.appendChild(subDiv);

    toObj.style.height = (totalHeight - label.offsetHeight) + 'px';
    fromObj.style.height = (totalHeight - label.offsetHeight) + 'px';


    selectBoxIndex++;

}



function validateRequired(form) {
    var isValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oRequired = new required();
    for (x in oRequired) {
        var field = form[oRequired[x][0]];

        if (field.type == 'text' ||
            field.type == 'textarea' ||
            field.type == 'file' ||
            field.type == 'select-one' ||
            field.type == 'radio' ||
            field.type == 'password') {

            var value = '';
            // get field's value
            if (field.type == "select-one") {
                var si = field.selectedIndex;
                if (si >= 0) {
                    value = field.options[si].value;
                }
            } else {
                value = field.value;
            }

            if (trim(value).length == 0) {

                if (i == 0) {
                    focusField = field;
                }
                fields[i++] = oRequired[x][1];
                isValid = false;
                field.style.background="lightyellow";
            } else {
                field.style.background="white";
            }
        }
    }
    if (fields.length > 0) {
        focusField.focus();
        alert(fields.join('\n'));
    }
    return isValid;
}

// Trim whitespace from left and right sides of s.
function trim(s) {
    return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
}

function validateInteger(form) {
    var bValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oInteger = new IntegerValidations();
    for (x in oInteger) {
        var field = form[oInteger[x][0]];

        if (field.type == 'text' ||
            field.type == 'textarea' ||
            field.type == 'select-one' ||
            field.type == 'radio') {

            var value = '';
            // get field's value
            if (field.type == "select-one") {
                var si = field.selectedIndex;
                if (si >= 0) {
                    value = field.options[si].value;
                }
            } else {
                value = field.value;
            }

            if (value.length > 0) {

                if (!isAllDigits(value)) {
                    bValid = false;
                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oInteger[x][1];

                } else {
                    var iValue = parseInt(value);
                    if (isNaN(iValue) || !(iValue >= -2147483648 && iValue <= 2147483647)) {
                        if (i == 0) {
                            focusField = field;
                        }
                        fields[i++] = oInteger[x][1];
                        bValid = false;
                    }
                }
            }
        }
    }
    if (fields.length > 0) {
        focusField.focus();
        alert(fields.join('\n'));
    }
    return bValid;
}

function isAllDigits(argvalue) {
    argvalue = argvalue.toString();
    var validChars = "0123456789";
    var startFrom = 0;
    if (argvalue.substring(0, 2) == "0x") {
        validChars = "0123456789abcdefABCDEF";
        startFrom = 2;
    } else if (argvalue.charAt(0) == "0") {        
        startFrom = 1;
    } else if (argvalue.charAt(0) == "-") {
        startFrom = 1;
    }

    for (var n = startFrom; n < argvalue.length; n++) {
        if (validChars.indexOf(argvalue.substring(n, n+1)) == -1) return false;
    }
    return true;
}

function validateRange(form) {
    return validateIntRange(form);
}

function validateShort(form) {
    var bValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oShort = new ShortValidations();
    for (x in oShort) {
        var field = form[oShort[x][0]];

        if (field.type == 'text' ||
            field.type == 'textarea' ||
            field.type == 'select-one' ||
            field.type == 'radio') {

            var value = '';
            // get field's value
            if (field.type == "select-one") {
                var si = field.selectedIndex;
                if (si >= 0) {
                    value = field.options[si].value;
                }
            } else {
                value = field.value;
            }

            if (value.length > 0) {
                if (!isAllDigits(value)) {
                    bValid = false;
                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oShort[x][1];

                } else {

                    var iValue = parseInt(value);
                    if (isNaN(iValue) || !(iValue >= -32768 && iValue <= 32767)) {
                        if (i == 0) {
                            focusField = field;
                        }
                        fields[i++] = oShort[x][1];
                        bValid = false;
                    }
                }
            }
        }
    }
    if (fields.length > 0) {
        focusField.focus();
        alert(fields.join('\n'));
    }
    return bValid;
}
function validateFloat(form) {
    var bValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oFloat = new FloatValidations();
    for (x in oFloat) {
        var field = form[oFloat[x][0]];

        if (field.type == 'text' ||
            field.type == 'textarea' ||
            field.type == 'select-one' ||
            field.type == 'radio') {

            var value = '';
            // get field's value
            if (field.type == "select-one") {
                var si = field.selectedIndex;
                if (si >= 0) {
                    value = field.options[si].value;
                }
            } else {
                value = field.value;
            }

            if (value.length > 0) {
                // remove '.' before checking digits
                var tempArray = value.split('.');
                var joinedString= tempArray.join('');

                if (!isAllDigits(joinedString)) {
                    bValid = false;
                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oFloat[x][1];

                } else {
                    var iValue = parseFloat(value);
                    if (isNaN(iValue)) {
                        if (i == 0) {
                            focusField = field;
                        }
                        fields[i++] = oFloat[x][1];
                        bValid = false;
                    }
                }
            }
        }
    }
    if (fields.length > 0) {
        focusField.focus();
        alert(fields.join('\n'));
    }
    return bValid;
}
function validateEmail(form) {
    var bValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oEmail = new email();
    for (x in oEmail) {
        if ((form[oEmail[x][0]].type == 'text' ||
             form[oEmail[x][0]].type == 'textarea') &&
            (form[oEmail[x][0]].value.length > 0)) {
            if (!checkEmail(form[oEmail[x][0]].value)) {
                if (i == 0) {
                    focusField = form[oEmail[x][0]];
                }
                fields[i++] = oEmail[x][1];
                bValid = false;
            }
        }
    }
    if (fields.length > 0) {
        focusField.focus();
        alert(fields.join('\n'));
    }
    return bValid;
}

/**
 * Reference: Sandeep V. Tamhankar (stamhankar@hotmail.com),
 * http://javascript.internet.com
 */
function checkEmail(emailStr) {
    if (emailStr.length == 0) {
        return true;
    }
    var emailPat=/^(.+)@(.+)$/;
    var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
    var validChars="\[^\\s" + specialChars + "\]";
    var quotedUser="(\"[^\"]*\")";
    var ipDomainPat=/^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;
    var atom=validChars + '+';
    var word="(" + atom + "|" + quotedUser + ")";
    var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
    var domainPat=new RegExp("^" + atom + "(\\." + atom + ")*$");
    var matchArray=emailStr.match(emailPat);
    if (matchArray == null) {
        return false;
    }
    var user=matchArray[1];
    var domain=matchArray[2];
    if (user.match(userPat) == null) {
        return false;
    }
    var IPArray = domain.match(ipDomainPat);
    if (IPArray != null) {
        for (var i = 1; i <= 4; i++) {
            if (IPArray[i] > 255) {
                return false;
            }
        }
        return true;
    }
    var domainArray=domain.match(domainPat);
    if (domainArray == null) {
        return false;
    }
    var atomPat=new RegExp(atom,"g");
    var domArr=domain.match(atomPat);
    var len=domArr.length;
    if ((domArr[domArr.length-1].length < 2) ||
        (domArr[domArr.length-1].length > 3)) {
        return false;
    }
    if (len < 2) {
        return false;
    }
    return true;
}
function validateMinLength(form) {
    var isValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oMinLength = new minlength();
    for (x in oMinLength) {
        var field = form[oMinLength[x][0]];

        if (field.type == 'text' ||
            field.type == 'textarea') {

            var iMin = parseInt(oMinLength[x][2]("minlength"));
            if ((trim(field.value).length > 0) && (field.value.length < iMin)) {
                if (i == 0) {
                    focusField = field;
                }
                fields[i++] = oMinLength[x][1];
                isValid = false;
            }
        }
    }
    if (fields.length > 0) {
        focusField.focus();
        alert(fields.join('\n'));
    }
    return isValid;
}
function validateDate(form) {
    var bValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oDate = new DateValidations();
    for (x in oDate) {
        var value = form[oDate[x][0]].value;
        var datePattern = oDate[x][2]("datePatternStrict");
        if ((form[oDate[x][0]].type == 'text' ||
             form[oDate[x][0]].type == 'textarea') &&
            (value.length > 0) &&
            (datePattern.length > 0)) {
            var MONTH = "MM";
            var DAY = "dd";
            var YEAR = "yyyy";
            var orderMonth = datePattern.indexOf(MONTH);
            var orderDay = datePattern.indexOf(DAY);
            var orderYear = datePattern.indexOf(YEAR);
            if ((orderDay < orderYear && orderDay > orderMonth)) {
                var iDelim1 = orderMonth + MONTH.length;
                var iDelim2 = orderDay + DAY.length;
                var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
                if (iDelim1 == orderDay && iDelim2 == orderYear) {
                    dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
                } else if (iDelim1 == orderDay) {
                    dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
                } else if (iDelim2 == orderYear) {
                    dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
                } else {
                    dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
                }
                var matched = dateRegexp.exec(value);
                if(matched != null) {
                    if (!isValidDate(matched[2], matched[1], matched[3])) {
                        if (i == 0) {
                            focusField = form[oDate[x][0]];
                        }
                        fields[i++] = oDate[x][1];
                        bValid =  false;
                    }
                } else {
                    if (i == 0) {
                        focusField = form[oDate[x][0]];
                    }
                    fields[i++] = oDate[x][1];
                    bValid =  false;
                }
            } else if ((orderMonth < orderYear && orderMonth > orderDay)) {
                var iDelim1 = orderDay + DAY.length;
                var iDelim2 = orderMonth + MONTH.length;
                var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
                if (iDelim1 == orderMonth && iDelim2 == orderYear) {
                    dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
                } else if (iDelim1 == orderMonth) {
                    dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
                } else if (iDelim2 == orderYear) {
                    dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
                } else {
                    dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
                }
                var matched = dateRegexp.exec(value);
                if(matched != null) {
                    if (!isValidDate(matched[1], matched[2], matched[3])) {
                        if (i == 0) {
                            focusField = form[oDate[x][0]];
                        }
                        fields[i++] = oDate[x][1];
                        bValid =  false;
                    }
                } else {
                    if (i == 0) {
                        focusField = form[oDate[x][0]];
                    }
                    fields[i++] = oDate[x][1];
                    bValid =  false;
                }
            } else if ((orderMonth > orderYear && orderMonth < orderDay)) {
                var iDelim1 = orderYear + YEAR.length;
                var iDelim2 = orderMonth + MONTH.length;
                var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
                if (iDelim1 == orderMonth && iDelim2 == orderDay) {
                    dateRegexp = new RegExp("^(\\d{4})(\\d{2})(\\d{2})$");
                } else if (iDelim1 == orderMonth) {
                    dateRegexp = new RegExp("^(\\d{4})(\\d{2})[" + delim2 + "](\\d{2})$");
                } else if (iDelim2 == orderDay) {
                    dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})(\\d{2})$");
                } else {
                    dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{2})$");
                }
                var matched = dateRegexp.exec(value);
                if(matched != null) {
                    if (!isValidDate(matched[3], matched[2], matched[1])) {
                        if (i == 0) {
                            focusField = form[oDate[x][0]];
                        }
                        fields[i++] = oDate[x][1];
                        bValid =  false;
                    }
                } else {
                    if (i == 0) {
                        focusField = form[oDate[x][0]];
                    }
                    fields[i++] = oDate[x][1];
                    bValid =  false;
                }
            } else {
                if (i == 0) {
                    focusField = form[oDate[x][0]];
                }
                fields[i++] = oDate[x][1];
                bValid =  false;
            }
        }
    }
    if (fields.length > 0) {
        focusField.focus();
        alert(fields.join('\n'));
    }
    return bValid;
}

function isValidDate(day, month, year) {
    if (month < 1 || month > 12) {
        return false;
    }
    if (day < 1 || day > 31) {
        return false;
    }
    if ((month == 4 || month == 6 || month == 9 || month == 11) &&
        (day == 31)) {
        return false;
    }
    if (month == 2) {
        var leap = (year % 4 == 0 &&
                    (year % 100 != 0 || year % 400 == 0));
        if (day>29 || (day == 29 && !leap)) {
            return false;
        }
    }
    return true;
}
function validateIntRange(form) {
    var isValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oRange = new intRange();
    for (x in oRange) {
        var field = form[oRange[x][0]];

        if ((field.type == 'text' ||
             field.type == 'textarea') &&
            (field.value.length > 0)) {

            var iMin = parseInt(oRange[x][2]("min"));
            var iMax = parseInt(oRange[x][2]("max"));
            var iValue = parseInt(field.value);
            if (!(iValue >= iMin && iValue <= iMax)) {
                if (i == 0) {
                    focusField = field;
                }
                fields[i++] = oRange[x][1];
                isValid = false;
            }
        }
    }
    if (fields.length > 0) {
        focusField.focus();
        alert(fields.join('\n'));
    }
    return isValid;
}
function validateMask(form) {
    var isValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oMasked = new mask();
    for (x in oMasked) {
        var field = form[oMasked[x][0]];

        if ((field.type == 'text' ||
             field.type == 'textarea') &&
            (field.value.length > 0)) {

            if (!matchPattern(field.value, oMasked[x][2]("mask"))) {
                if (i == 0) {
                    focusField = field;
                }
                fields[i++] = oMasked[x][1];
                isValid = false;
            }
        }
    }

    if (fields.length > 0) {
        focusField.focus();
        alert(fields.join('\n'));
    }
    return isValid;
}

function matchPattern(value, mask) {
    return mask.exec(value);
}
function validateMaxLength(form) {
    var isValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oMaxLength = new maxlength();
    for (x in oMaxLength) {
        var field = form[oMaxLength[x][0]];

        if (field.type == 'text' ||
            field.type == 'textarea') {

            var iMax = parseInt(oMaxLength[x][2]("maxlength"));
            if (field.value.length > iMax) {
                if (i == 0) {
                    focusField = field;
                }
                fields[i++] = oMaxLength[x][1];
                isValid = false;
            }
        }
    }
    if (fields.length > 0) {
        focusField.focus();
        alert(fields.join('\n'));
    }
    return isValid;
}
function validateCreditCard(form) {
    var bValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oCreditCard = new creditCard();
    for (x in oCreditCard) {
        if ((form[oCreditCard[x][0]].type == 'text' ||
             form[oCreditCard[x][0]].type == 'textarea') &&
            (form[oCreditCard[x][0]].value.length > 0)) {
            if (!luhnCheck(form[oCreditCard[x][0]].value)) {
                if (i == 0) {
                    focusField = form[oCreditCard[x][0]];
                }
                fields[i++] = oCreditCard[x][1];
                bValid = false;
            }
        }
    }
    if (fields.length > 0) {
        focusField.focus();
        alert(fields.join('\n'));
    }
    return bValid;
}

/**
 * Reference: http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl
 */
function luhnCheck(cardNumber) {
    if (isLuhnNum(cardNumber)) {
        var no_digit = cardNumber.length;
        var oddoeven = no_digit & 1;
        var sum = 0;
        for (var count = 0; count < no_digit; count++) {
            var digit = parseInt(cardNumber.charAt(count));
            if (!((count & 1) ^ oddoeven)) {
                digit *= 2;
                if (digit > 9) digit -= 9;
            };
            sum += digit;
        };
        if (sum == 0) return false;
        if (sum % 10 == 0) return true;
    };
    return false;
}

function isLuhnNum(argvalue) {
    argvalue = argvalue.toString();
    if (argvalue.length == 0) {
        return false;
    }
    for (var n = 0; n < argvalue.length; n++) {
        if ((argvalue.substring(n, n+1) < "0") ||
            (argvalue.substring(n,n+1) > "9")) {
            return false;
        }
    }
    return true;
}
function validateByte(form) {
    var bValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oByte = new ByteValidations();
    for (x in oByte) {
        var field = form[oByte[x][0]];

        if (field.type == 'text' ||
            field.type == 'textarea' ||
            field.type == 'select-one' ||
            field.type == 'radio') {

            var value = '';
            // get field's value
            if (field.type == "select-one") {
                var si = field.selectedIndex;
                if (si >= 0) {
                    value = field.options[si].value;
                }
            } else {
                value = field.value;
            }

            if (value.length > 0) {
                if (!isAllDigits(value)) {
                    bValid = false;
                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oByte[x][1];

                } else {

                    var iValue = parseInt(value);
                    if (isNaN(iValue) || !(iValue >= -128 && iValue <= 127)) {
                        if (i == 0) {
                            focusField = field;
                        }
                        fields[i++] = oByte[x][1];
                        bValid = false;
                    }
                }
            }

        }
    }
    if (fields.length > 0) {
        focusField.focus();
        alert(fields.join('\n'));
    }
    return bValid;
}
function validateFloatRange(form) {
    var isValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oRange = new floatRange();
    for (x in oRange) {
        var field = form[oRange[x][0]];

        if ((field.type == 'text' ||
             field.type == 'textarea') &&
            (field.value.length > 0)) {

            var fMin = parseFloat(oRange[x][2]("min"));
            var fMax = parseFloat(oRange[x][2]("max"));
            var fValue = parseFloat(field.value);
            if (!(fValue >= fMin && fValue <= fMax)) {
                if (i == 0) {
                    focusField = field;
                }
                fields[i++] = oRange[x][1];
                isValid = false;
            }
        }
    }
    if (fields.length > 0) {
        focusField.focus();
        alert(fields.join('\n'));
    }
    return isValid;
}

function getElementsByAttribute(parentDiv, attribute, attributeValue)
{
    var elementArray = new Array();
    var matchedArray = new Array();

    elementArray = parentDiv.getElementsByTagName("*");

    for (var i = 0; i < elementArray.length; i++) {
        if (attribute == "class") {
            var pattern = new RegExp("(^| )" + attributeValue + "( |$)");

            if (pattern.test(elementArray[i].className)) {
                matchedArray[matchedArray.length] = elementArray[i];
            }
        }
        else if (attribute == "for") {
            if (elementArray[i].getAttribute("htmlFor") || elementArray[i].getAttribute("for")) {
                if (elementArray[i].htmlFor == attributeValue) {
                    matchedArray[matchedArray.length] = elementArray[i];
                }
            }
        }
        else if (elementArray[i].getAttribute(attribute) == attributeValue) {
            matchedArray[matchedArray.length] = elementArray[i];
        }
    }
    return matchedArray;
}


function addOptionToSelect(selectElement, value, text) {
    var elOptNew = document.createElement('option');
    elOptNew.text = text;
    elOptNew.value = value;    
    try {
        selectElement.add(elOptNew, null); // standards compliant; doesn't work in IE
    }
    catch(ex) {
        selectElement.add(elOptNew); // IE only
    }
}


function elementExists(element) {
    if (typeof(element)=='undefined' || element == null) {
        return false;
    }
    return true;
}

function getWindowWidth() {
    var myWidth = 0;
    if( typeof( window.innerWidth ) == 'number' ) {
        //Non-IE
        myWidth = window.innerWidth;
    } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
        //IE 6+ in 'standards compliant mode'
        myWidth = document.documentElement.clientWidth;
    } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
        //IE 4 compatible
        myWidth = document.body.clientWidth;        
    }
    return myWidth;
}

function getWindowHeight() {
    var myHeight = 0;
    if( typeof( window.innerWidth ) == 'number' ) {
        //Non-IE
        myHeight = window.innerHeight;
    } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
        //IE 6+ in 'standards compliant mode'
        myHeight = document.documentElement.clientHeight;
    } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
        //IE 4 compatible
        myHeight = document.body.clientHeight;
    }
    return myHeight;
}


