// General functions BEGIN

function ShowDiv(sDiv) {
    var objDiv = document.getElementById(sDiv);
    if (objDiv != undefined) {
        // objDiv.style.visibility = 'visible';
        objDiv.style.display = '';
    }
    return true;
}

function HideDiv(sDiv) {
    var objDiv = document.getElementById(sDiv);
    if (objDiv != undefined) {
        // objDiv.style.visibility = 'hidden';
        objDiv.style.display = 'none';
    }
    return true;
}

// Hides and showes a div block depening on the div icon
function ToggleDiv(sDivBlock, sDivIcon, sOpenClass, sClosedClass) {
    // Block exists?
    var objDivBlock = document.getElementById(sDivBlock);
    if (objDivBlock != undefined) {
        // Open or close?
        var objDivIcon = document.getElementById(sDivIcon);
        if (objDivIcon != undefined) {
            var sClassName = objDivIcon.className;
            if (sClassName == sOpenClass) {
                objDivIcon.className = sClosedClass;
                // objDivBlock.style.visibility = 'hidden';
                objDivBlock.style.display = 'none';
            } else {
                objDivIcon.className = sOpenClass;
                // objDivBlock.style.visibility = 'visible';
                objDivBlock.style.display = '';
            }
        }
    }
    return true;
}

// Check or uncheck all checkboxes on the page or in a group (sControlNameBeginsWith)
// <input type=""checkbox"" onclick=""CheckUncheckAllCheckBoxes(this,'');"" /> Check/uncheck all
function CheckUncheckAllCheckBoxes(objMasterCheckBox, sControlNameBeginsWith) {
    var objForm = objMasterCheckBox.form;
    for (i = 0; i < objForm.length; i++) {
        if (objForm[i].type == 'checkbox' && objForm[i].name.substring(0, sControlNameBeginsWith.length) == sControlNameBeginsWith) {
            objForm[i].checked = objMasterCheckBox.checked;
        }
    }
}

// Redirect with existing target
// sUrl - web page to redirect to
// sTarget - '', '_parent', '_self', '_top', '_blank', 'NAME'
function RedirectWithTarget(sUrl, sTarget) {
    if (sTarget == '') {
        document.location = sUrl;
    } else if (sTarget == '_parent' || sTarget == 'parent') {
        parent.location = sUrl;
    } else if (sTarget == '_self' || sTarget == 'self') {
        self.location = sUrl;
    } else if (sTarget == '_top' || sTarget == 'top') {
        top.location = sUrl;
    } else if (sTarget == '_blank' || sTarget == 'blank') {
        popupWin = window.open(sUrl, 'open_window', 'menubar, toolbar, location, directories, status, scrollbars, resizable, dependent, width=1000, height=700, left=100, top=0');
    } else {
        objFrame = top.frames[sTarget];
        if (objFrame != undefined) {
            objFrame.location = sUrl;
        }
    }
}

// General functions END

// HtmlEditor BEGIN

function HtmlEditor_GetHtmlText(sControl) {
    // alert('HtmlEditor_GetHtmlText sControl = "' + sControl + '"');
    var sHtmlText = '';
    var divHtmlText = document.getElementById(sControl + '_div_Content');
    if (divHtmlText != undefined) {
    	// alert('found');
      sHtmlText = divHtmlText.innerHTML;
    }
    return sHtmlText;
}

function HtmlEditor_BackWithData(sControl, sPostBack, sValues) {
	var objHidden = document.getElementById(sControl + '_objHidden');
	if (objHidden != undefined) {
	    objHidden.value = sValues;
        javascript:__doPostBack(sPostBack, '');
    }
}

// HtmlEditor END


// Printpage function BEGIN

// Flag for whether or not to automatically call the print function
var m_bAutoPrint = true;

function ShowPrinterFriendlyPopup(sProviderPath) {
	// Javascript enabled?
	if (document.getElementById != null) {
		// Add style sheet, white body background, header image, start table width 600px
		// var sHtml = '<link href="printpage/printfriendly.css" rel="stylesheet" type="text/css"/><body bgcolor="#ffffff">\n<img src="/printpage/printfriendly_header.png" width="600" height="48">\n<table width="600" border="0" cellspacing="1" cellpadding="1"><tr><td>\n';
	    var sHtml = '<HT' + 'ML>\n';
	    sHtml += '<HEAD>\n';
	    sHtml += '<link href="../../Look_Base/Base.css" rel="stylesheet" type="text/css"/>\n';
	    sHtml += '<link href="../../Look_' + sProviderPath + '/' + sProviderPath + '_Alterations.css" rel="stylesheet" type="text/css"/>\n';
	    sHtml += '</HEAD>\n';
	    sHtml += '<body>\n<div id="divPrint"><table width="600" border="0" cellspacing="0" cellpadding="0"><tr><td>\n';
		
		// Get page html within divPrintContent
		var divPrintContent = document.getElementById("divPrintContent");
		if (divPrintContent != null) {
			// Get print content
			sHtml += divPrintContent.innerHTML;
		} else {
			alert("Could not find the Print Content section in the HTML");
			return;
		}

		// End table, body and html tags
		sHtml += '\n</td></tr></table>\n</div>\n</BO' + 'DY>\n</HT' + 'ML>';

		// Add footer image
		// sHtml += '\n<img src="printpage/printfriendly_footer.png" width="600" height="24">';
		
		var winPrint = window.open("printpage/print.html","ShowPrinterFriendlyPopup", "menubar=0,width=650,scrollbars=1"); 
		winPrint.document.open();
		winPrint.document.write(sHtml);
		winPrint.document.close();
		if (m_bAutoPrint) winPrint.print();
	} else {
		alert("Sorry, the printer friendly feature works\nonly in javascript enabled browsers.");
	}
}

// Printpage function END

// Internet Explorer browser
function IsIE() {
	var sUserAgent = window.navigator.userAgent;
	var nIndex = sUserAgent.indexOf("MSIE ");
	var bReturn = false;

	// IE?
	if (nIndex > 0) {
		bReturn = true;
	}
	return bReturn;
}

// Get Internet Explorer version number (0 for non IE browsers)
function GetIEVersion() {
	var sUserAgent = window.navigator.userAgent;
	var nIndex = sUserAgent.indexOf("MSIE ");
	var nReturn = 0;

	// IE?
	if (nIndex > 0) {
		// If Internet Explorer, return version number
		nReturn = parseInt(sUserAgent.substring(nIndex + 5, sUserAgent.indexOf(".", nIndex)));
	}
	return nReturn;
}

// Wait messages BEGIN

function ShowWaitMessage(sControl, sMessage) {
    var objDivWaitMessage = document.getElementById('divWaitMessage');
	if (objDivWaitMessage != undefined) {
		// Add image
		// sMessage = '<img src="../../Images_Neutral/ajax-loader.gif" />&nbsp;' + sMessage
	  objDivWaitMessage.innerHTML = sMessage;
		objDivWaitMessage.style.display = 'block';
	}

	if (sControl != '') {
		__doPostBack(sControl, '');
	}
	return true;
}

// Wait messages END

// Download file
function DownLoadAttachment(nZatID) {
	var sUniqueUrlExt = popUniqueUrlExt();
	window.open('../../App_spzBase/Attachment/frmZAttachment.aspx?nZatID=' + nZatID,'windowX' + sUniqueUrlExt,'toolbar=0,status=0,scrollbars=no,resizable=no,width=1,height=1,top=0,left=0');							
}

// Show help
function ShowHelp(sForm) {
	// sForm e.g. frmproblemreport
	var sUniqueUrlExt = popUniqueUrlExt();
	window.open('../../App/Help/frmHelpViewer.aspx?sPageID=' + sForm,'HelpWin' + sUniqueUrlExt,'scrollbars=auto,width=400,height=500,resizable=yes,');
}

// spzCalendarDayViewContainer BEGIN
function dnavDayItemClick(sControl, nID, sObjectType, nLocationItem) {
	// Stop event bubbling to outer DIV tags. We will get events on both booked events and calendar clicked otherwise
	if (window.event)
	{
		// IE does not support W3C event model so we needhave special handling.
		event.cancelBubble = true;
	} else {
		// W3C standard
		event.stopPropagation = true;
	}
	
	if(nLocationItem == 0) {
		__doPostBack(sControl, 'DayItemClick:' + nID + ":" + sObjectType);
	}
	else {
		__doPostBack(sControl, 'LocationItemClick:' + nID + ":" + sObjectType);
	}
}

function dnavTimeClick(e, sControl, nColumnID) {
	var X = '';
	var Y = '';
	var browsername = navigator.userAgent.toLowerCase();
	if (browsername.indexOf("firefox") != -1)
	{
		X = e.layerX; // e.pageX 
		Y = e.layerY; // e.pageY
	} else {
		if (document.layers) {
				// NS (Mozilla)
				X = e.layerX;
				Y = e.layerY;
			} else {
				// IE
				X = event.x;
				Y = event.y;
			}
	}
	__doPostBack(sControl, 'TimeClicked:' + nColumnID + ":" + X + ":" + Y);
}
// spzCalendarDayViewContainer END


// spzMonthNavigator BEGIN
// Javascript function for clicking on a day.
function mnavDayClick(sControl, nDay) {
	__doPostBack(sControl, 'DayClicked:' + nDay);
}

// Javascript function for clicking on a month.
function mnavMonthChange(sControl, nYear, nMonth) {
	__doPostBack(sControl, 'MonthChange:' + nYear + ':' + nMonth);
}
// spzMonthNavigator END

// spzHirarchicalTreeBlock BEGIN
	var nPopupMenuActiveID = new Number(0);

  function calHierarchyPopup(sUrl, sTablePrefix, nNodeToOpenID, nRootID, nSubMenues, nTop, nLeft, nWidth, nHeight, sPopupFkUrl, sFkPopupColumnName, nPopupTop, nPopupLeft, nPopupHeight, nPopupWidth) {
   // Get popup level
   var nPopupLevel = popGetPopupLevel();

   // Top not specified?
   if (nTop == 0) {
    // Set default top
    nTop = (Number(nPopupLevel) + 1) * 25;
   }

   // Left not specified?
   if (nLeft == 0) {
    // Set default left
    nLeft = (Number(nPopupLevel) + 1) * 25;
   }

   // Width not specified?
   if (nWidth == 0) {
    // Set default width
    nWidth = 800;
   }

   // Height not specified?
   if (nHeight == 0) {
    // Set default height
    nHeight = 400;
   }

   var sUniqueUrlExt = popUniqueUrlExt();
   var sReturnValues;
   // Support for modal dialogs? (IE yes, FireFox no)
   if (window.showModalDialog) {
		sUrl =  sUrl + '?sTablePrefix=' + sTablePrefix + '&nNodeToOpenID=' + nNodeToOpenID + "&nRootID=" + nRootID + "&nSubMenues=" + nSubMenues + "&d=" + sUniqueUrlExt;
		sUrl =  sUrl + '&sPopupFkUrl=' + sPopupFkUrl + '&sFkPopupColumnName=' + sFkPopupColumnName + '&nPopupTop=' + nPopupTop + '&nPopupLeft=' + nPopupLeft + '&nPopupHeight=' + nPopupHeight + '&nPopupWidth=' + nPopupWidth;
		
    // OpenModalDialog sFeatures: dialogHeight (x px), dialogLeft (x px), dialogTop (x px), dialogWidth (x px), center (YES/no), dialogHide (yes/NO), edge (sunken/RAISED), help (YES/no), resizable (yes/NO), scroll (YES/no), status (yes/no), unadorned (yes/NO)
    sReturnValues = window.showModalDialog(sUrl, objMasterWindow, 'dialogTop:' + nTop + ';dialogLeft:' + nLeft + ';dialogWidth:' + nWidth + 'px;dialogHeight:' + nHeight + 'px;status:no;resizable:yes;help:no;center:no;'); // 
   }
  }

	function htreePopupMenuClickSendEvent(sControl, SelectedMenu, nOptions) {
		var sCommandArgument;
		sCommandArgument = '';
		var sActivationDate;
		
		// nOptions is bitwise value. It will have flags set in the hierarchy control that will require extra actions in
		// this javascript.
		// 1 = Prompt for activation date during copy of branch
		// 2 = Not implemented yet.
		// 4 = Not implemented yet.
		var PROMPT_ACTIVATION_DATE = 1;
		
	switch(SelectedMenu) {
			case 1:
				//alert('Case 1: ' + nPopupMenuActiveID);
				sCommandArgument = 'htreePopupMenuShowDetails';
				break
			case 2:
				sCommandArgument = 'htreePopupMenuEdit';
				break
			case 3:
				sCommandArgument = 'htreePopupMenuDelete';
				break
			case 4:
				sCommandArgument = 'htreePopupMenuAddSubNode';
				break
			case 5:
				sCommandArgument = 'htreePopupMenuStartMove';
				break
			case 6:
				sCommandArgument = 'htreePopupMenuStartMerge';
				break
			case 7:
				sCommandArgument = 'htreeSelectAndClose';
				CloseDialog(0, nPopupMenuActiveID);
				return;
				break
			case 8:
				sCommandArgument = 'htreePopupStartCopyBranch';
				if((nOptions & PROMPT_ACTIVATION_DATE) == PROMPT_ACTIVATION_DATE)
				{
					var dCurrDate = new Date();
					var sMonth = '';
					var sDay = '';
					
					if((dCurrDate.getMonth() + 1) < 10)
						sMonth = '0' + dCurrDate.getMonth() + 1;
					else
						sMonth = dCurrDate.getMonth() + 1;

					if((dCurrDate.getDate()) < 10)
						sDay = '0' + dCurrDate.getDate();
					else
						sDay = dCurrDate.getDate();
						
					var bDone = 0;
					// unescape codes: Å-%C5, Ä-%C4, Ö-%D6, å-%E5, ä-%E4, ö-%F6
					while(bDone != 1)
					{
						// Ange aktiveringsdatum för ny organisationsstruktur
						sActivationDate = prompt(unescape('Ange aktiveringsdatum f%F6r ny organisationsstruktur:'), dCurrDate.getFullYear() + '-' + sMonth + '-' + sDay);
					
						// null if user hit cancel
						if(sActivationDate == null)
							return;
					else {
							var nYear = parseInt(sActivationDate.substr(0, 4));
							var nMonth = parseInt(sActivationDate.substr(5, 2));
							var nDay = parseInt(sActivationDate.substr(8, 2));
							
							bDone = 1;
							if((nMonth < 1) || (nMonth > 12))
								bDone = 0;
							if((nDay < 1) || (nDay > 31))
								bDone = 0;

						if(bDone == 0) {
								alert('Ogiltigt datum');
							}
							
							var dTmp = new Date();
							dTmp.setFullYear(nYear, nMonth-1, nDay);
							dTmp.setHours(0);
							dTmp.setMinutes(0, 0, 0);
							
							var dCurrDate = new Date();
							dCurrDate.setHours(0);
							dCurrDate.setMinutes(0, 0, 0);

							//alert(dTmp.getTime() + ' ## ' + dCurrDate.getTime());
							
						if(dTmp.getTime() <= dCurrDate.getTime()) {
								// unescape codes: Å-%C5, Ä-%C4, Ö-%D6, å-%E5, ä-%E4, ö-%F6
								alert(unescape('Aktiveringsdatum m%E5ste vara efter dagens datum'));
								bDone = 0;
							}
						}
					}
					
					//alert(sActivationDate);
					__doPostBack(sControl, sCommandArgument + ':' + nPopupMenuActiveID + ':' + sActivationDate);
					return;
				}
				break
		case 9:
		  sCommandArgument = 'htreePopupMenuAddUser';
		  break
		default:
				__doPostBack(sControl, 'htreeCustomPopupMenuCommand:' + nPopupMenuActiveID + ':' + SelectedMenu);
				return;
				break
		}
		
		__doPostBack(sControl, sCommandArgument + ':' + nPopupMenuActiveID);
	}
	
function htreePopupMenuClickAddNew(sControl, sPopupURL, sFormCaption, sFkMasterColumn, bLockMasterField, nTop, nLeft, nWidth, nHeight) {
		// alert(sPopupURL + ' : ' + sFormCaption + ' : ' + sFkMasterColumn + ' : ' + nPopupMenuActiveID + ' : ' + bLockMasterField + ' : ' + nTop + ' : ' + nLeft + ' : ' + nWidth + ' : ' + nHeight);
		
		// nPopupMenuActiveID is a global varibale and is set each time user opens a menu
		popFkAddNew(sPopupURL, sFormCaption, sFkMasterColumn, nPopupMenuActiveID, bLockMasterField, nTop, nLeft, nWidth, nHeight);
		
		// This will create a raise postback but there is nothing saynig anything was ever added
		__doPostBack(sControl, 'BackFromAddNew:' + nPopupMenuActiveID);
	}

function htreePopupMenuClickShowDetail(sControl, sPopupURL, sFormCaption, nTop, nLeft, nWidth, nHeight) {
		//alert(sPopupURL + ' : ' + nPopupMenuActiveID + ' : ' + sFormCaption + ' : ' + nTop + ' : ' + nLeft + ' : ' + nWidth + ' : ' + nHeight);
		
		// nPopupMenuActiveID is a global varibale and is set each time user opens a menu
		popViewDetailsPopup(sPopupURL, nPopupMenuActiveID, sFormCaption, nTop, nLeft, nWidth, nHeight)

		// This will create a raise postback but there is nothing saynig anything was ever added
		__doPostBack(sControl, 'BackFromShowDetail:' + nPopupMenuActiveID);
	}

function htreePopupMenuClickEditDetail(sControl, sPopupURL, sFormCaption, nTop, nLeft, nWidth, nHeight) {
		//alert(sPopupURL + ' : ' + nPopupMenuActiveID + ' : ' + sFormCaption + ' : ' + nTop + ' : ' + nLeft + ' : ' + nWidth + ' : ' + nHeight);
		
		// nPopupMenuActiveID is a global varibale and is set each time user opens a menu
		popEditDetailsPopup(sPopupURL, nPopupMenuActiveID, sFormCaption, nTop, nLeft, nWidth, nHeight)

		// This will create a raise postback but there is nothing saynig anything was ever added
		__doPostBack(sControl, 'BackFromEditDetail:' + nPopupMenuActiveID);
	}

	function htreeCommand(sControl, sCommandArgument, nNodeID) {
		 // alert(sControl);
		__doPostBack(sControl, sCommandArgument + ':' + nNodeID);
	}

	function htreeMenuItem_MouseOut(sNodeID) {
		objNode = document.getElementById(sNodeID);
			
		if (objNode.className == 'xqh_MenuItemSelected_hover') {
			objNode.className = 'xqh_MenuItemSelected';
		} else {
			if (objNode.className == 'xqh_MenuItemMarked_hover') {
				objNode.className = 'xqh_MenuItemMarked';
			} else {
				if (objNode.className == 'xqh_MenuItemDisabled_hover') {
					objNode.className = 'xqh_MenuItemDisabled';
			} else {
				objNode.className = 'xqh_MenuItemNormal';
				}
			}
		}
	}
	
	function htreeMenuSubItem_MouseOut(sNodeID) {
		objNode = document.getElementById(sNodeID);
			
		if (objNode.className == 'xqh_SubItemSelected_hover') {
			objNode.className = 'xqh_SubItemSelected';
		} else {
			objNode.className = 'xqh_SubItemNormal';
		}
	}
 
	function getMouseX(e) {
			if (document.all) {
					//return window.event.x + document.body.scrollLeft; //By the name of God, WHY isn't this row working???
					return e.clientX;
				} else {
					return e.pageX;
				}
		}
		
	function getMouseY(e) {
			if (document.all) {
					return window.event.y + document.body.scrollTop;
				} else {
					return e.pageY;
				}
		}
				
	function htreeShow(object, e, nNodeID) {
		// nPopupMenuActiveID is global varible declared above. It's used in other Javascript function to send
		// the correct ID in popups and other.
		nPopupMenuActiveID = nNodeID;
		
		if (e != '') {
				if (document.all) {
						//x = e.clientX;
						//y = e.clientY + 10;
						x = getMouseX(e) + 5;
						y = getMouseY(e) + 90;
				}
				if (document.layers) {
						x = e.pageX;
						y = e.pageY - 90;
				}
		}
		
		if (document.layers && document.layers[object] != null) {
				document.layers[object].left = x;
				document.layers[object].top = y;
	} else if (document.all) {
				document.all[object].style.posLeft = x;
				document.all[object].style.posTop = y;
		}

		if (document.layers && document.layers[object] != null)
			document.layers[object].visibility = 'visible'; 
		else if (document.all)
			document.all[object].style.visibility = 'visible';
	}
			
	function htreeHide(object) {
		nPopupMenuActiveID = 0;
		
		if (document.layers && document.layers[object] != null)
			document.layers[object].visibility = 'hidden';
		else if (document.all)
			document.all[object].style.visibility = 'hidden';
	}
			
	function htreeAcceptDropTarget(sControl, nActionType, nTargetID, sTargetName) {
		switch(nActionType)
		{
			case 1:	// Move
				// unescape codes: Å-%C5, Ä-%C4, Ö-%D6, å-%E5, ä-%E4, ö-%F6
				// Är du säker på att du vill flytta den valda noden till noden
				if (confirm(unescape('%C4r du s%E4ker p%E5 att du vill flytta den valda noden till "' + sTargetName + '"?'))) {
					//alert('Yepp: ' + sControl + ' ' + nTargetID);
					htreeCommand(sControl, 'MoveNode', nTargetID);
				} else {
					//alert('Nope: ' + sControl);
					return;
				}
				break
			case 2:	// Merge
				// unescape codes: Å-%C5, Ä-%C4, Ö-%D6, å-%E5, ä-%E4, ö-%F6
				// Är du säker på att du vill sammanfoga den valda noden med noden
				if (confirm(unescape('%C4r du s%E4ker p%E5 att du vill sammanfoga den valda noden med noden "' + sTargetName + '"?')))
					htreeCommand(sControl, 'MergeNode', nTargetID);
				else
					return;
				break
			case 3: // Copy branch
				if (confirm(unescape('%C4r du s%E4ker p%E5 att du vill kopiera den valda noden till "' + sTargetName + '"?')))
					htreeCommand(sControl, 'CopyBranch', nTargetID);
				else
					return;
			
				break
		}
	}
// spzHirarchicalTreeBlock END

// Tab Sub Menu (spzTabSumMenu) BEGIN

function TabSubMenu_MouseOver(sMenuID){
	var objTabSubMenu = document.getElementById(sMenuID);
	if (objTabSubMenu != null) {objTabSubMenu.className = 'tsmSubMenu_hover';}
}

function TabSubMenu_MouseOut(sMenuID){
	var objTabSubMenu = document.getElementById(sMenuID);
	if (objTabSubMenu != null) {objTabSubMenu.className = 'tsmSubMenu';}
}

// Tab Sub Menu (spzTabSumMenu) END

/// Navigation menu (main drop down menu) BEGIN
function dropShowMenu(sMenuID) {
    var objMenu = document.getElementById(sMenuID);
    if (objMenu != undefined) {
        objMenu.className = 'dropMenu_hover';
        var objMenuContent = document.getElementById(sMenuID + 'Content');
        if (objMenuContent != undefined) {
            objMenuContent.style.visibility = 'visible';
        }
    }
}

function dropShowMenuImg(sMenuID) {
    var objMenu = document.getElementById(sMenuID);
    if (objMenu != undefined) {
        // objMenu.className = 'dropMenu_hover';
        var objMenuContent = document.getElementById(sMenuID + 'Content');
        if (objMenuContent != undefined) {
            objMenuContent.style.visibility = 'visible';
        }
    }
}

function dropHideMenu(sMenuID) {
    var objMenu = document.getElementById(sMenuID);
    if (objMenu != undefined) {
        objMenu.className = 'dropMenu';
        var objMenuContent = document.getElementById(sMenuID + 'Content');
        if (objMenuContent != undefined) {
            objMenuContent.style.visibility = 'hidden';
        }
    }
}

function dropHideMenuImg(sMenuID) {
    var objMenu = document.getElementById(sMenuID);
    if (objMenu != undefined) {
        // objMenu.className = 'dropMenu';
        var objMenuContent = document.getElementById(sMenuID + 'Content');
        if (objMenuContent != undefined) {
            objMenuContent.style.visibility = 'hidden';
        }
    }
}

function dropMenuItem_MouseOver(sNodeID) {
	objNode = document.getElementById(sNodeID);
	if (objNode != undefined) {
		objNode.className = objNode.className + '_hover';
	}
}

function dropMenuItem_MouseOut(sNodeID) {
    objNode = document.getElementById(sNodeID);
    if (objNode.className == 'dropMenuItem_hover') {
	    objNode.className = 'dropMenuItem';
    }
  }
  
function MenuItem_MouseOver(sNodeID) {
  objNode = document.getElementById(sNodeID);
  objNode.className = objNode.className + '_hover';
}

function MenuSubItem_MouseOver(sNodeID) {
  objNode = document.getElementById(sNodeID);
  objNode.className = objNode.className + '_hover';
}

function MenuItem_MouseOut(sNodeID) {
  objNode = document.getElementById(sNodeID);
  	
  if (objNode.className == 'mnuItemSelected_hover') {
    objNode.className = 'mnuItemSelected';
  } else {
    objNode.className = 'mnuItemNormal';
  }
}

function MenuSubItem_MouseOut(sNodeID) {
  objNode = document.getElementById(sNodeID);
	
  if (objNode.className == 'mnuSubItemSelected_hover') {
    objNode.className = 'mnuSubItemSelected';
  } else {
    objNode.className = 'mnuSubItemNormal';
  }
}
/// Navigation menu END

/// Popup Round Trip BEGIN
		var objMasterWindow;
		// Global variables used for Firefox to capture return data
		var m_sPopFunction = '';
		var m_sPopControlName = '';
		var m_bPopSubmit = false;				

		function popSetMasterWindow() {
			var nPopupLevel = popGetPopupLevel();

			// Master window?
			if (nPopupLevel == 0) {
				objMasterWindow = window;
			} else {
				objMasterWindow = dialogArguments;

				// Set popup title
				document.title = "My Popup Title";
			}
		}

		// Show popup as FK and show search result based on FK key
		function popFkView(sUrl, sFormCaption, sFkMasterColumn, nFkMasterID, bLockMasterField, nTop, nLeft, nWidth, nHeight, bForceNonShowModal) {
			// Append parameters
			if(sUrl.indexOf("?") == -1) {
				sUrl += '?';
			} else {
				sUrl += '&';
			}
			sUrl += 'nFkMasterID=' + nFkMasterID + '&sFkMasterColumn=' + sFkMasterColumn + '&bLockMasterField=' + bLockMasterField;

			if(bForceNonShowModal == null) bForceNonShowModal = 0;
			
			var sGotoTab = 'SearchResult';
			var bEditMode = false;
			var bExpectReturnData = false;
			var nObjectID = 0;
			var bShowNewButton = true;
			var bShowDeleteButton = true;

			// Ignore return values
			popShowModalPopup(sUrl, nObjectID, sFormCaption, sGotoTab, bEditMode, bExpectReturnData, bShowNewButton, bShowDeleteButton, nTop, nLeft, nWidth, nHeight, bForceNonShowModal);

			// No submit
			return false;
		}

		// Call popup as FK popup, go to detail to add new record
		function popFkAddNew(sUrl, sFormCaption, sFkMasterColumn, nFkMasterID, bLockMasterField, nTop, nLeft, nWidth, nHeight, bForceNonShowModal) {
			// Add parameters
			if(sUrl.indexOf("?") == -1)
				sUrl += '?'
			else
				sUrl += '&'
			sUrl += 'nFkMasterID=' + nFkMasterID + '&sFkMasterColumn=' + sFkMasterColumn + '&bLockMasterField=' + bLockMasterField;

			if(bForceNonShowModal == null) bForceNonShowModal = 0;
			
			var sGotoTab = 'Detail';
			var bEditMode = true;
			var bExpectReturnData = false;
			var nObjectID = 0;
			var bShowNewButton = true;
			var bShowDeleteButton = true;
			// Ignore return values
			popShowModalPopup(sUrl, nObjectID, sFormCaption, sGotoTab, bEditMode, bExpectReturnData, bShowNewButton, bShowDeleteButton, nTop, nLeft, nWidth, nHeight, bForceNonShowModal);

			// No submit
			return false;
		}

		// Show detail page in view mode
		function popViewDetailsPopup(sUrl, nObjectID, sFormCaption, nTop, nLeft, nWidth, nHeight, bForceNonShowModal) {
		    // alert('popViewDetailsPopup sUrl = "' + sUrl + '" nObjectID = ' + nObjectID);
		    if (bForceNonShowModal == null) bForceNonShowModal = 0;

			if (nObjectID > 0) {
				var sGotoTab = 'Detail';
				var bEditMode = false;
				var bExpectReturnData = false;
				var bShowNewButton = false;
				var bShowDeleteButton = false;
				// Ignore return values
				popShowModalPopup(sUrl, nObjectID, sFormCaption, sGotoTab, bEditMode, bExpectReturnData, bShowNewButton, bShowDeleteButton, nTop, nLeft, nWidth, nHeight, bForceNonShowModal);
			} else {
				/// Language alert('Ingen post att visa!');
				alert('No record to show!');
			}
			// No submit
			return false;
		}

		// Show detailed page in edit mode
		function popEditDetailsPopup(sUrl, nObjectID, sFormCaption, nTop, nLeft, nWidth, nHeight, bForceNonShowModal) {
			if(bForceNonShowModal == null) bForceNonShowModal = 0;

			if (nObjectID > 0) {
				var sGotoTab = 'Detail';
				var bEditMode = true;
				var bExpectReturnData = false;
				var bShowNewButton = true;
				var bShowDeleteButton = true;
				// Ignore return values
				popShowModalPopup(sUrl, nObjectID, sFormCaption, sGotoTab, bEditMode, bExpectReturnData, bShowNewButton, bShowDeleteButton, nTop, nLeft, nWidth, nHeight, bForceNonShowModal);
			} else {
				/// Language alert('Ingen post att visa!');
				alert('No record to show!');
			}
			// No submit
			return false;
		}

		// Show popup search page to search for and bring back a record
		function popFindAndBringPopup(sUrl, sFormCaption, nTop, nLeft, nWidth, nHeight, bForceNonShowModal) {
			if(bForceNonShowModal == null) bForceNonShowModal = 0;

			var sGotoTab = 'Search';
			var bEditMode = false;
			var nObjectID = 0;
			var bExpectReturnData = true;
			var bShowNewButton = true;
			var bShowDeleteButton = true;
			var sReturnValues = popShowModalPopup(sUrl, nObjectID, sFormCaption, sGotoTab, bEditMode, bExpectReturnData, bShowNewButton, bShowDeleteButton, nTop, nLeft, nWidth, nHeight, bForceNonShowModal);

			return sReturnValues;
		}

		// Show popup detail page to enter new record
		function popEnterNewPopup(sUrl, sFormCaption, nTop, nLeft, nWidth, nHeight, bForceNonShowModal) {
			if(bForceNonShowModal == null) bForceNonShowModal = 0;

			var sGotoTab = 'Detail';
			var bEditMode = true;
			var nObjectID = 0;
			var bExpectReturnData = true;
			var bShowNewButton = true;
			var bShowDeleteButton = true;
			var sReturnValues = popShowModalPopup(sUrl, nObjectID, sFormCaption, sGotoTab, bEditMode, bExpectReturnData, bShowNewButton, bShowDeleteButton, nTop, nLeft, nWidth, nHeight, bForceNonShowModal);
			return sReturnValues;
		}

		// Generic popup
		function popShowModalPopup(sUrl, nObjectID, sFormCaption, sGotoTab, bEditMode, bExpectReturnData, bShowNewButton, bShowDeleteButton, nTop, nLeft, nWidth, nHeight, bForceNonShowModal) {
		    // alert('popShowModalPopup sUrl = "' + sUrl + '" nObjectID = ' + nObjectID + ' sFormCaption = "' + sFormCaption + '" sGotoTab = "' + sGotoTab + '"');
			// Get popup level
			var nPopupLevel = popGetPopupLevel();

			if(bForceNonShowModal == null) bForceNonShowModal = 0;
				
			// Top not specified?
			if (nTop == 0) {
				// Set default top
				nTop = (Number(nPopupLevel) + 1) * 25;
			}

			// Left not specified?
			if (nLeft == 0) {
				// Set default left
				nLeft = (Number(nPopupLevel) + 1) * 25;
			}

			// Width not specified?
			if (nWidth == 0) {
				// Set default width
				nWidth = 800;
			}

			// Height not specified?
			if (nHeight == 0) {
				// Set default height
				nHeight = 400;
			}

			var sUniqueUrlExt = popUniqueUrlExt();
			var sReturnValues = '';

			// Add parameters
			if(sUrl.indexOf("?") == -1)
				sUrl += '?'
			else
				sUrl += '&'

			sUrl += 'hid_nPopupLevel=' + (nPopupLevel + 1) + '&sFormCaption=' + sFormCaption + '&nObjectID=' + nObjectID + '&sGotoTab=' + sGotoTab;
			sUrl += '&bEditMode=' + bEditMode + "&d=" + sUniqueUrlExt + "&bExpectReturnData=" + bExpectReturnData + "&bShowNewButton=" + bShowNewButton;
			sUrl += "&bShowDeleteButton=" + bShowDeleteButton;

			// Support for modal dialogs? (IE yes, FireFox no)
			if ((window.showModalDialog) && (bForceNonShowModal==0)) {
				// OpenModalDialog sFeatures: dialogHeight (x px), dialogLeft (x px), dialogTop (x px), dialogWidth (x px), center (YES/no), dialogHide (yes/NO), edge (sunken/RAISED), help (YES/no), resizable (yes/NO), scroll (YES/no), status (yes/no), unadorned (yes/NO)
				sReturnValues = window.showModalDialog(sUrl, objMasterWindow, 'dialogTop:' + nTop + ';dialogLeft:' + nLeft + ';dialogWidth:' + nWidth + 'px;dialogHeight:' + nHeight + 'px;status:no;resizable:yes;help:no;center:no;');
				// Any return values?
				if (sReturnValues != '' && sReturnValues != null && sReturnValues != undefined) {
					// Check commands
	                saReturnValues = sReturnValues.split('[#]');
					for (var j = 0; j < saReturnValues.length; j++) {
						if (saReturnValues[j] == '[#popCloseAllPopups#]') {
							// Close this popup and pass return values 
							popClosePopup(sReturnValues);
							return '';
						}
					}
					// Return string values separated with [#]
					return sReturnValues;
				} else {
					// No return values
					return '';
				}
			} else {
				// FireFox support without modal dialog
				// Open sFeatures: channelmode (yes/NO), directories (YES/no), fullscreen (yes/NO), height (x px), left (x px), location (YES/no), menubar (YES/no), resizable (YES/no), scrollbars (YES/no), titlebar (YES/no), top (x px), width (x px)
				var objPopupWindow = window.open(sUrl, '_blank', 'top=' + nTop + ',left=' + nLeft + ',width=' + nWidth + 'px,height=' + nHeight + 'px,toolbar=0,status=0,scrollbars=yes,resizable=yes,fullscreen=no');
				// Get return values by calling the parent window function BackFromRoundTripWithData
				// window.opener.parent.popBackFromRoundTripWithData(nID, sObjectCaption);
				// Can not return any values here
				return 'use popBackFromRoundTripWithData';
			}
		}

		function popCloseAllPopups(sReturnValues) {
			var nPopupLevel = popGetPopupLevel();

			// Popup window?
			if (nPopupLevel != 0) {
				if (sReturnValues != '') {sReturnValues += '[#]';}
				window.returnValue = sReturnValues + '[#popCloseAllPopups#]';
				window.close();
			}
		}

		function popClosePopup(sReturnValues, bForceCallBack) {
			if (bForceCallBack == null) bForceCallBack = 0;
			
			var nPopupLevel = popGetPopupLevel();
			// Popup window?
			if (nPopupLevel != 0) {
				// IE?
				if (IsIE() && (bForceCallBack == 0)) {
					window.returnValue = sReturnValues;
				} else {
					// Firefox
					window.opener.parent.popBackFromRoundTripWithData(sReturnValues);
				}
				window.close();
			}
			// No submit
			return false;
		}

		function popRedirectMasterWindow(sUrl) {
			// Master window exists?
			if (objMasterWindow != null && objMasterWindow != undefined && objMasterWindow != '') {
				if (sUrl != '') {objMasterWindow.location.href = sUrl;}
				popCloseAllPopups('');
			}
		}

		function popSetCboValue(sCboID, sValues, bSubmit) {
			var objCbo = document.getElementById(sCboID);
			// Any values specified?
			if (sValues != '' && sValues != null && sValues != undefined) {
				// Get separate values
	      saValues = sValues.split('[#]');
				// Both nObjectID and sObjectCaption exists?
				if (saValues.length >= 2) {
					var nObjectID = saValues[0];
					var sObjectCaption = saValues[1];				
					// Select existing option (if any)
					if (dropSelectOptionByValue(objCbo, nObjectID, true) == 0) {
						// Add and select missing option
						dropAddOption(objCbo, nObjectID, sObjectCaption, true);
					}
					if (bSubmit == true) {
						// Reload form
						document.forms[0].submit;
						return true;
					} else {
						// No submit
						return false;
					}
				}
	    }
	    return false;
		}

		// Select option by value (returns list index)
		function dropSelectOptionByValue(objCbo, sValue, bSelect) {
			var i;
			for(i=objCbo.options.length-1;i>=0;i--) {
				if(objCbo.options[i].value == sValue) {
					// Found
					if (bSelect == true) objCbo.options[i].selected = true;
					return i + 1;
				}
			}
			// Not found
			return 0;
		}

		function dropAddOption(objCbo, sValue, sText, bSelect) {
			var objOption = document.createElement("OPTION");
			objOption.text = sText;
			objOption.value = sValue;
			objCbo.options.add(objOption);
			if (bSelect == true) {
				var nOptions = objCbo.options.length;
				objCbo.options[nOptions - 1].selected = true;
			}
		}

		// Set LookUpTextBox return values after roundtrip
		function popSetLookUpTextBox(sLookUpTextBoxID, sValues, bSubmit) {
			// Any values specified?
			if (sValues != '' && sValues != null && sValues != undefined) {
				// Get separate values
				saValues = sValues.split('[#]');
				// Both nObjectID and sObjectCaption exists?
				if (saValues.length >= 2) {
					var nObjectID = saValues[0];
					var sObjectCaption = saValues[1];				

					// Set numeric value
					var objHidden = document.getElementById(sLookUpTextBoxID + '_objHidden');
					if (objHidden != undefined) {
						objHidden.value = nObjectID;

						if (nObjectID > 0) {
							// show Details button
							var objViewDetails = document.getElementById(sLookUpTextBoxID + '_spanViewDetails');
							if (objViewDetails != undefined) {
								objViewDetails.style.display = 'inline';
							}
						}
					}

					// Set text value
					var objTextBox = document.getElementById(sLookUpTextBoxID + '_objTextBox');
					if (objTextBox != undefined) {
						objTextBox.value = sObjectCaption;
						objTextBox.className = 'xqh_LookUpTextBox_Edit';
						objTextBox.focus();
					}

					if (bSubmit == true) {
						// Reload form
						document.forms[0].submit;
						return true;
					} else {
						// No submit
						return false;
					}
				}
	    }
	    return false;
		}

		// Show popup search result page and bring back a record
		function popSearch(sUrl, sFormCaption, nTop, nLeft, nWidth, nHeight, bForceNonShowModal) {
			if(bForceNonShowModal == null) bForceNonShowModal = 0;

			var sGotoTab = 'SearchResult';
			var bEditMode = false;
			var nObjectID = 0;
			var bExpectReturnData = true;
			var bShowNewButton = true;
			var bShowDeleteButton = true;
			var sReturnValues = popShowModalPopup(sUrl, nObjectID, sFormCaption, sGotoTab, bEditMode, bExpectReturnData, bShowNewButton, bShowDeleteButton, nTop, nLeft, nWidth, nHeight, bForceNonShowModal);
			return sReturnValues;
		}

		function popGetPopupLevel() {
			// Get popup level
			var nPopupLevel = 0;
			var obj_nPopupLevel = document.getElementById('hid_nPopupLevel');
			if (obj_nPopupLevel) {nPopupLevel = Number(obj_nPopupLevel.value);}
			return nPopupLevel;
		}

		function popUniqueUrlExt() {
			// Creates a unique url value to prevent caching problems
			var d = new Date();
			var sReturn = String(d.getHours()) + String(d.getMinutes()) + String(d.getSeconds()) + String(d.getMilliseconds());
			return sReturn;
		}

		// Capture return data (Firefox)
		function popBackFromRoundTripWithData(sReturnValues) {
			// Any return values?
			if (sReturnValues != '' && sReturnValues != null && sReturnValues != undefined) {
				if (m_sPopFunction == 'popSetLookUpTextBox') {
					// Set selected record (Firefox)
					popSetLookUpTextBox(m_sPopControlName, sReturnValues, m_bPopSubmit);
				} else if (m_sPopFunction == 'popSetCboValue') {
					popSetCboValue(m_sPopControlName, sReturnValues, m_bPopSubmit)				}
			}
		}
/// Popup Round Trip END

/// spzQuickList_DropDown control BEGIN

		// Click on Favorites search button
		function QuickList_Search(sQuickListID, sUrl, sFormCaption, nTop, nLeft, nWidth, nHeight, bSubmit, bForceNonShowModal) {
			if(bForceNonShowModal == null) bForceNonShowModal = 0;

			var sGotoTab = 'Search';
			var bEditMode = false;
			var nObjectID = 0;
			var bExpectReturnData = true;
			var bShowNewButton = true;
			var bShowDeleteButton = true;
			var sReturnValues = popShowModalPopup(sUrl, nObjectID, sFormCaption, sGotoTab, bEditMode, bExpectReturnData, bShowNewButton, bShowDeleteButton, nTop, nLeft, nWidth, nHeight, bForceNonShowModal);

			if (sReturnValues == 'use popBackFromRoundTripWithData') {
				// Firefox does not support modal dialogs or return data
				// Get return values from the popBackFromRoundTripWithData function when pop closes
				// Set global return variables
				m_sPopFunction = 'popSetCboValue';
				m_sPopControlName = sQuickListID;
				m_bPopSubmit = bSubmit;
			} else {
				// Set selected record (IE)
				popSetCboValue(sQuickListID, sReturnValues, bSubmit)
			}
		}
/// spzQuickList_DropDown control END

/// spzLookUpTextBox control BEGIN

		// Keypress within the LookUpTextBox
		function LookUpTextBox_onKeyPress(sLookUpTextBoxID, e){
			// Not Enter(13), Tab(9), Home(36), End(35), Up(38), Right(39), Down(40), Left(37) pressed? (Firefox and IE)
			if (!{ 13:1, 9:1, 36:1, 35:1, 38:1, 39:1, 40:1, 37:1 }[e.which || e.keyCode]) {
				// Set pending look on text box
				LookUpTextBox_SetPending(sLookUpTextBoxID)
			}
			
			// Enter pressed? (Firefox and IE)
			if ({ 13:1 }[e.which || e.keyCode]) {
				// Ignore keystroke
				return false;
			} else {
				// Accept keystroke
				return true;
			}
		}

		// Cut or Paste within the LookUpTextBox
		function LookUpTextBox_onCutOrPaste(sLookUpTextBoxID){
			LookUpTextBox_SetPending(sLookUpTextBoxID)
			return true;
		}

		// Leaving the textarea
		function LookUpTextBox_onBlur(sLookUpTextBoxID) {
			// Change look on TextBox
			var objTextBox = document.getElementById(sLookUpTextBoxID + '_objTextBox');
			if (objTextBox == undefined) {
				return; 
			}

			// Clear numeric value
			var objHidden = document.getElementById(sLookUpTextBoxID + '_objHidden');
			if (objHidden == undefined) {
				return; 
			}

			if (objTextBox.value.length == 0) {
				objHidden.value = 0;
			}
		}

		// LookUpTextBox in pending mode (no ID set yet)
		function LookUpTextBox_SetPending(sLookUpTextBoxID) {
			// Change look on TextBox
			var objTextBox = document.getElementById(sLookUpTextBoxID + '_objTextBox');
			if (objTextBox != undefined) {
				objTextBox.className = 'xqh_LookUpTextBox_Pending';
			}

			// Hide Details button
			var objViewDetails = document.getElementById(sLookUpTextBoxID + '_spanViewDetails');
			if (objViewDetails != undefined) {
				objViewDetails.style.display = 'none';
			}

			// Clear numeric value
			var objHidden = document.getElementById(sLookUpTextBoxID + '_objHidden');
			if (objHidden != undefined) {
				objHidden.value = 0;
			}
		}

		// Click on LookUpTextBox View Detail button
		function LookUpTextBox_ViewDetail(sLookUpTextBoxID, sUrl, sFormCaption, nTop, nLeft, nWidth, nHeight) {
			var nSearchValue = 0;

			// Get search field nID content
			var objHidden = document.getElementById(sLookUpTextBoxID + '_objHidden');
			if (objHidden != undefined) {
				nSearchValue = objHidden.value;
			}

			// Show popup
			popViewDetailsPopup(sUrl,nSearchValue,sFormCaption,nTop,nLeft,nWidth,nHeight);
			return false;
		}
		
		// Click on LookUpTextBox search button
		function LookUpTextBox_Search(sLookUpTextBoxID, sDbColumns, sUrl, sFormCaption, nTop, nLeft, nWidth, nHeight, bSubmit) {
			var sSearchValues = '';
			var sReturnValues = '';

			// Get search field content
			var objTextBox = document.getElementById(sLookUpTextBoxID + '_objTextBox');
			if (objTextBox != undefined) {
				sSearchValues = objTextBox.value;
			}

			// Search value specified?
			if (sSearchValues != '') {
				// -- Goto search result page --
				// Append search parameter
				if(sUrl.indexOf("?") == -1) {
					sUrl += '?';
				} else {
					sUrl += '&';
				}

				// Setting globalization to ISO-8859-1 in web.config took care of the ÅÄÖ search problem

				// -- Set search criteria --
				var sSearchCriteria = '';
				// Split sDbColumns and sSearchValues in case of more than one column
				// sDbColumns = "sZusFirstName,sZusLastName"
				// sSearchValues = "and son"
				// sSearchCriteria (Result) = "sZusFirstName=%and[#]sZusLastName=%son" -> "sZusFirstName%3d%25and[%23]sZusLastName%3d%25son"
				saDbColumns = sDbColumns.split(',');
				var nCount = saDbColumns.length;
				// One search field only?
				if (nCount == 1) {
					sSearchCriteria = sDbColumns + '%3d%25' + sSearchValues;
				} else {
					// Remove trailing spaces (rtrim) but keep eventual leading spaces to enable the search for last name only
					sSearchValues = sSearchValues.replace(/\s+$/,'');
					saSearchValues = sSearchValues.split(' ');
					// Less search items than number of search fields?
					if (nCount > saSearchValues.length) {nCount = saSearchValues.length;}
					// More search items than number of search fields?
					if (nCount < saSearchValues.length) {
						// Append all remaining search items in the last item
						for (var i = nCount; i < saSearchValues.length; i++) {
							saSearchValues[nCount - 1] += ' ' + saSearchValues[i];
						}
					}
					for (var i = 0; i < nCount; i++) {
						if (i > 0) {sSearchCriteria += '[%23]';}
						sSearchCriteria += saDbColumns[i] + '%3d%25' + saSearchValues[i];
					}
				}
				sUrl += 'sSearchFormParameters=' + sSearchCriteria;

				// Show search result page and return selected record
				sReturnValues = popSearch(sUrl, sFormCaption, nTop, nLeft, nWidth, nHeight);

			} else {
				// -- Goto search page --
				sReturnValues = popFindAndBringPopup(sUrl, sFormCaption, nTop, nLeft, nWidth, nHeight);
			}

			if (sReturnValues == 'use popBackFromRoundTripWithData') {
				// Firefox does not support modal dialogs or return data
				// Get return values from the popBackFromRoundTripWithData function when pop closes
				// Set global return variables
				m_sPopFunction = 'popSetLookUpTextBox';
				m_sPopControlName = sLookUpTextBoxID;
				m_bPopSubmit = bSubmit;				
			} else {
				// Set selected record (IE)
				popSetLookUpTextBox(sLookUpTextBoxID, sReturnValues, bSubmit);
			}
			return false;
		}
/// spzLookUpTextBox control END

/// Search Result scripts BEGIN

	// Capture the enter key when focus on a radio button in popup search result
	function SearchResult_KeyPress(objRdo, e) {
		// Enter pressed? (Firefox and IE)
		if ({ 13:1 }[e.which || e.keyCode]) {
			// Abort keypress (Firefox and IE)
			e.preventDefault? e.preventDefault() : e.returnValue = false; 
			if (objRdo != undefined) {
				var sValue = objRdo.value;			
				popClosePopup(sValue);
			}
		}
	}

	// Get value from selected radio button in popup search result
	function SearchResult_GetSelectedValue() {
		var sReturn = '';
		var bDone = false;
		var i = 0;
		
		// Loop until selected found
		while (bDone == false) {
			// Next radio button
			++i
			var objRdo = document.getElementById('rdo' + i);
			if (objRdo != undefined) {
				if (objRdo.checked == true) {
					sReturn = objRdo.value;
					// Found
					bDone = true;
				}
			} else {
				// End of list
				bDone = true;
			}
		}

		return sReturn;
	}
/// Search Result scripts END

// Compiled script file for Spize Base Package
// Olof Rydergren Spize IT 2006-04-18

// -----------------------< TextBoxDefaultButton BEGIN >-------------------------
// Copied from TextBoxDefaultButton.js
// Trap default button on enter
// Spize IT 2005-05-17

function TrapDefaultButton(sButton, e) {
	// Enter pressed? (Firefox and IE)
	if ({ 13:1 }[e.which || e.keyCode]) {
		// Abort keypress (Firefox and IE)
		e.preventDefault? e.preventDefault() : e.returnValue = false; 
    if (sButton != 'null') {
			__doPostBack(sButton,'');
		}
	}
}

// -----------------------< TextBoxDefaultButton END >-------------------------

// -----------------------< spzTime BEGIN >-------------------------
//
// SpzTimer
// Olof Rydergren Spize IT 2006
// 

var m_objTimer = null;

function StartTimer(nSeconds, sExecuteFunction) {
	StopTimer();
	// Execute function sExecute after nSecounds
	m_objTimer = self.setTimeout(sExecuteFunction, nSeconds * 1000);
}

function StopTimer() {
	// Clear old timer (if any)
	if (m_objTimer != null) clearTimeout(m_objTimer);
}

// -----------------------< spzTime END >-------------------------

// -----------------------< spzAjax BEGIN >-------------------------
//
// SpzAjax - page must have function ProcessAjaxData(sAjaxData)
// Olof Rydergren Spize IT 2006
//

var m_objAjaxRequest = null;

function InitAjax() {
	try {
		m_objAjaxRequest = new XMLHttpRequest();
	} catch (trymicrosoft) {
		try {
			m_objAjaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (othermicrosoft) {
			try {
				m_objAjaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (failed) {
				m_objAjaxRequest = null;
			}
		}
	}

	if (m_objAjaxRequest == null) alert("Error initializing Ajax XMLHttpRequest!");
}

function GetAjaxServerData(sUrl) {
	// Pass parameters in the url (can pass data in the send as well)
  m_objAjaxRequest.open("GET", sUrl, true);
  // Method to call when data from the server is ready
  m_objAjaxRequest.onreadystatechange = AjaxRequestCompleted;
  // Send the request
  m_objAjaxRequest.send(null);
}

function AjaxRequestCompleted() {
	// Response complete?
	if (m_objAjaxRequest && m_objAjaxRequest.readyState == 4) {
		// Data loaded OK?
    if (m_objAjaxRequest.status == 200) {
      self.status = "Server is done!";
			// Process the return data
      var sAjaxData = m_objAjaxRequest.responseText;
      ProcessAjaxData(sAjaxData)
    } else if (m_objAjaxRequest.status == 404) {
      alert("Error: XMLHttpRequest URL does not exist");
    } else if (m_objAjaxRequest.status == 403) {
      alert("Error: XMLHttpRequest Access denied");
    } else if (m_objAjaxRequest.status == 500) {
      alert("Error: XMLHttpRequest Internal Server Error");
      alert(m_objAjaxRequest.responseText);
    } else {
      alert("Error: XMLHttpRequest status code is " + m_objAjaxRequest.status);
    }
	}
}
// -----------------------< spzAjax END >-------------------------

// -----------------------< ToolTipStay BEGIN >-------------------------
function ShowToolTipStay(sMessage, nOffsetX, nOffsetY) {
  if (nOffsetX == null) nOffsetX = 0;
  if (nOffsetY == null) nOffsetY = 0;
  var nPosX = event.clientX + document.body.scrollLeft + nOffsetX;
  var nPosY = event.clientY + document.body.scrollTop + nOffsetY;

  var objDivToolTipStayMsg = document.getElementById('objToolTipStayMsg');
	if (objDivToolTipStayMsg != undefined) {
	  objDivToolTipStayMsg.innerHTML = sMessage;
	}

	 var objDiv = document.getElementById('objToolTipStay');
	if (objDiv != undefined) {
		objDiv.style.top = (nPosY + 20).toString() + "px";
		objDiv.style.left = nPosX.toString() + "px" ;
		objDiv.style.visibility = 'visible';
	}
}

function HideToolTipStay() {
	var objDiv = document.getElementById('objToolTipStay');
	if (objDiv != undefined) {
		objDiv.style.visibility = 'hidden';
	}
}

// -----------------------< ToolTipStay END >-------------------------

// -----------------------< QuickMessage BEGIN >-------------------------
//
// ZQuickMessage - Animated popup window - page must have div popup
// Olof Rydergren Spize IT 2006-03-30
//

// Popup size
var m_nPopupWindowHeight = 0;
var m_nPopupActualHeight = 0;
var m_nPopupHeaderHeight = 0;
var m_nPopupContentHeight = 0;
var m_nPopupWindowBottom = 0;
// Title
var m_sPopupTitle = '';
// Message
var m_sPopupMessage = '';
// Timers
var m_objPopupAnimationTimer = -1;
var m_objPopupHideTimer = -1;
// First time popup
var m_bFirstTimePopup = true;

// Max time to show the popup message (ms) - 5 minutes (300 000 ms)
var m_nPopupShowTime = 300000;

// ---< Page Methods BEGIN >---

// Set New Message polling interval
var m_nTimerSeconds = 60;
// Set function to execute
var m_sTimerExecuteFunction = 'GetNewPopupMessage()';

function InitQuickMessage() {
	InitAjax();
	// Start first time New Message polling timer
	StartTimer(3, m_sTimerExecuteFunction);	
}

function GetNewPopupMessage() {
	StopTimer();

	// Create unique url parameter
	var d = new Date();
  var sUrl = "../../App_spzBase/ZQuickMessage/frmZQuickMessageServer.aspx?d=" + String(d.getHours()) + String(d.getMinutes()) + String(d.getSeconds()) + String(d.getMilliseconds());

	// Call Ajax function
	GetAjaxServerData(sUrl)
}

// Mandatory page function for SpzAjax
function ProcessAjaxData(sAjaxData) {
	// Debug
	self.status = 'QuickMessage size: ' + sAjaxData.length;
	// alert('sAjaxData: ' + sAjaxData);

	// Show popup message?
	if (sAjaxData.length > 0) {
		// Show popup and recheck new messages when popup disappears
		ShowPopupMessage("Meddelande",sAjaxData);
	} else {
		// No more messages - Restart New Message polling timer
		StartTimer(m_nTimerSeconds, m_sTimerExecuteFunction);	
	}
}

// ---< Page Methods END >---

function ShowPopupMessage(sTitle, sMessage) {
	m_sPopupTitle = sTitle;
	m_sPopupMessage = sMessage;
	
	InitPopupWindow();
	ShowPopupWindow();
}

function InitPopupWindow() {
	var divQuickMessageWindow = document.getElementById('divQuickMessageWindow');
	var divQuickMessageHeader = document.getElementById('divQuickMessageHeader');
	var divQuickMessageContent = document.getElementById('divQuickMessageContent');

	// Get popup window bottom position
	m_nPopupWindowBottom = divQuickMessageWindow.style.bottom.substr(0, divQuickMessageWindow.style.bottom.length - 2);
	// Get header height
	m_nPopupHeaderHeight = divQuickMessageHeader.style.height.substr(0, divQuickMessageHeader.style.height.length - 2);
	// Get popup window full height
	m_nPopupWindowHeight = divQuickMessageWindow.style.height;
	m_nPopupWindowHeight = m_nPopupWindowHeight.substr(0, m_nPopupWindowHeight.length - 2); 
	// Reset animation height
	m_nPopupActualHeight = 0;
	// Calculate content height
	m_nPopupContentHeight = m_nPopupWindowHeight - (divQuickMessageContent.style.height.substr(0, divQuickMessageContent.style.height.length - 2));

	// Set reset flag
	m_bFirstTimePopup = true;
}

function ShowPopupWindow() {
	if (m_objPopupAnimationTimer != -1) return;

	var divQuickMessageWindow = document.getElementById('divQuickMessageWindow');
	divQuickMessageWindow.style.left = '';
	divQuickMessageWindow.style.top = '';
	divQuickMessageWindow.style.filter = '';

	// Sound alert (error: causes the screen to load twice)
	// document.all.objSound.src='../../App_spzBase/ZQuickMessage/NewQuickMessage.wav';

	// Stop timer?
	if (m_objPopupHideTimer != -1) clearInterval(m_objPopupHideTimer); m_objPopupHideTimer = -1;

	// Hide header
	document.getElementById('divQuickMessageHeader').style.display = 'none';
	// Hide content
	document.getElementById('divQuickMessageContent').style.display = 'none';

	// Set title
	document.getElementById('spnPopupTitle').innerHTML = m_sPopupTitle;
	// Set message
	document.getElementById('spnPopupMessage').innerHTML = m_sPopupMessage;

	// Reset actual height
	m_nPopupActualHeight = 0; 
	divQuickMessageWindow.style.height = m_nPopupActualHeight + 'px';
	divQuickMessageWindow.style.visibility = '';

	// Show popup window?
	if (!m_bFirstTimePopup) divQuickMessageWindow.style.display = '';

	// Start animation timer
	m_objPopupAnimationTimer = setInterval(PopupAnimationTimerEvent, (m_bFirstTimePopup?1000:20));
}

function PopupAnimationTimerEvent() {
	var divQuickMessageWindow = document.getElementById('divQuickMessageWindow');

	// First time popup?
	if (m_bFirstTimePopup) {
		// Show popup window
		divQuickMessageWindow.style.display = '';
		// Stop timer
		clearInterval(m_objPopupAnimationTimer);
		// Clear reset flag
		m_bFirstTimePopup = false;
		// Set animation timer to 20 ms
		m_objPopupAnimationTimer = setInterval(PopupAnimationTimerEvent, 20);
	}

	// Increase popup size (animation)
	m_nPopupActualHeight += 5;
	// Popup fully displayed?
	if (m_nPopupActualHeight >= m_nPopupWindowHeight) {
		// Adjust actual size
		m_nPopupActualHeight = m_nPopupWindowHeight;
		// Stop timer
		clearInterval(m_objPopupAnimationTimer);
		m_objPopupAnimationTimer = -1;
		// Show content div
		var divQuickMessageContent = document.getElementById('divQuickMessageContent');
		divQuickMessageContent.style.display = '';
		divQuickMessageContent.style.overflow = 'auto';
		// Set timer for hiding the popup after specified time?
		if (m_nPopupShowTime != -1) m_objPopupHideTimer = setInterval(PopupHideTimerEvent, m_nPopupShowTime);
	}

	// Show header div?
	if (m_nPopupHeaderHeight < m_nPopupActualHeight - 6) document.getElementById('divQuickMessageHeader').style.display = '';

	if ((m_nPopupActualHeight - m_nPopupContentHeight) > 0) {
		var divQuickMessageContent = document.getElementById('divQuickMessageContent')
		// Show content div
		divQuickMessageContent.style.display = '';
		divQuickMessageContent.style.height = (m_nPopupActualHeight - m_nPopupContentHeight) + 'px';
	}

	// Set new popup height (animation)
	divQuickMessageWindow.style.height = m_nPopupActualHeight + 'px';
}

function PopupHideTimerEvent() {
	// Stop timer
	clearInterval(m_objPopupHideTimer); 
	m_objPopupHideTimer = -1;
	
	// Hide popup
	var divQuickMessageWindow = document.getElementById('divQuickMessageWindow');
	divQuickMessageWindow.style.visibility = 'hidden';

	// Recheck new messages
	GetNewPopupMessage();
}

function ClosePopup() {
	if (m_objPopupAnimationTimer == -1) {
		// Hide popup
		var divQuickMessageWindow = document.getElementById('divQuickMessageWindow');
		divQuickMessageWindow.style.filter = '';
		divQuickMessageWindow.style.display = 'none';
		// Stop hide timer?
		if (m_objPopupHideTimer != -1) clearInterval(m_objPopupHideTimer); 
		m_objPopupHideTimer = -1;
	}

	// Recheck new messages
	GetNewPopupMessage();
}

// -----------------------< QuickMessage END >-------------------------

// -----------------------< BlockExpandCollapse BEGIN >-------------------------

// Copied from BlockExpandCollapse.js
// Spize IT 2005-08-28

function ExpandCollapseBlock(object) {
	if (document.all['hid_' + object + '_Expanded'].value != '1') {
		ExpandBlock(object);
	} else {
		CollapseBlock(object);
	}
}

function ExpandBlock(object) {
	var objContent = document.all[object + '_Container'];
	var objOpenBlockButtons = document.all[object + '_OpenBlockButtons'];
	var objExpandButton = document.all[object + '_ButtonExpandCollapse'];
	var objHiddenField = document.all['hid_' + object + '_Expanded'];

	objContent.style.display = 'block';
	if (objOpenBlockButtons != null) {
		objOpenBlockButtons.style.display = 'inline';
	}
	objExpandButton.className = 'ButtonExpandCollapse_close';
	objHiddenField.value = '1';
}

function CollapseBlock(object) {
	var objContent = document.all[object + '_Container'];
	var objOpenBlockButtons = document.all[object + '_OpenBlockButtons'];
	var objExpandButton = document.all[object + '_ButtonExpandCollapse'];
	var objHiddenField = document.all['hid_' + object + '_Expanded'];

	objContent.style.display = 'none';
	if (objOpenBlockButtons != null) {
		objOpenBlockButtons.style.display = 'none';
	}
	objExpandButton.className = 'ButtonExpandCollapse_open';
	objHiddenField.value = '0';
}

/* Edit Block */

function ShowHideEditBlock(object) {
	if (document.all['hid_' + object + '_Expanded'].value == '1') {
		if (document.all['hid_' + object + '_EditBlockVisible'].value != '1') {
			ShowEditBlock(object);
		} else {
			HideEditBlock(object);
		}
	}
}

function ShowEditBlock(object) {
	var objEditBlock = document.all[object + '_EditBlock'];
	var objButtonEdit = document.all[object + '_ButtonEdit'];
	var objHiddenField = document.all['hid_' + object + '_EditBlockVisible'];

	objEditBlock.style.display = 'block';
	objButtonEdit.className = 'ButtonEdit_close';
	objHiddenField.value = '1';
}

function HideEditBlock(object) {
	var objEditBlock = document.all[object + '_EditBlock'];
	var objButtonEdit = document.all[object + '_ButtonEdit'];
	var objHiddenField = document.all['hid_' + object + '_EditBlockVisible'];

	objEditBlock.style.display = 'none';
	objButtonEdit.className = 'ButtonEdit_open';
	objHiddenField.value = '0';
}

/* Search Block */

function ShowHideSearchBlock(object) {
	if (document.all['hid_' + object + '_Expanded'].value == '1') {
		if (document.all['hid_' + object + '_SearchBlockVisible'].value != '1') {
			ShowSearchBlock(object);
		} else {
			HideSearchBlock(object);
		}
	}
}

function ShowSearchBlock(object) {
	var objSearchBlock = document.all[object + '_SearchBlock'];
	var objButtonSearch = document.all[object + '_ButtonSearch'];
	var objHiddenField = document.all['hid_' + object + '_SearchBlockVisible'];

	objSearchBlock.style.display = 'block';
	objButtonSearch.className = 'ButtonSearch_close';
	objHiddenField.value = '1';
}

function HideSearchBlock(object) {
	var objSearchBlock = document.all[object + '_SearchBlock'];
	var objButtonSearch = document.all[object + '_ButtonSearch'];
	var objHiddenField = document.all['hid_' + object + '_SearchBlockVisible'];

	objSearchBlock.style.display = 'none';
	objButtonSearch.className = 'ButtonSearch_open';
	objHiddenField.value = '0';
}

// -----------------------< BlockExpandCollapse END >-------------------------

// -----------------------< DatePick BEGIN >-------------------------
// Copied from DatePick.js
// Swedish DatePick JavaScript include file
// Spize IT 2005-04-11

// - Date field -
// <input type="text" name="dDate2" value="2001-01-01" ID="dDate2" class="xqh_TextBox_Edit" size="10">
// <img src="Images_Neutral/icon_Calendar.gif" border="0" onClick="ShowDatePick('dDate2');return false;" alt="Visa kalender" style="cursor:pointer">

var m_objDatePick;
var m_objDatePickReturnField;

function InitDatePick(){
    // Current date
    var dtToday = new Date();

    // --- Properties ---
    this.isIE	= (document.all)?true:false;
    this.isDOM = (document.getElementById)?true:false;
    this.isIE4 = (document.all && !document.getElementById)?true:false;
    this.isNS4 = (document.layers)?true:false;
    this.sLanguage = 'Eng';

    // Object referens to div tag
    this.layer = null;
    this.arrDaySwe = ['M&aring;', 'Ti', 'On', 'To', 'Fr', 'L&ouml;', 'S&ouml'];
    this.arrDayEng = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];
    this.arrMonthSwe = ['Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'];
    this.arrMonthEng = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];

    // Days per month - normal year
    this.arrMonthLen = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
    // Days per month - leap year	
    this.arrMonthLeap = new Array(31,29,31,30,31,30,31,31,30,31,30,31);
    // Current year
    this.year = (dtToday.getYear() > 1900)?dtToday.getYear():dtToday.getYear() + 1900;
    // Current month
    this.month = dtToday.getMonth();	
    // Current day in month
    this.day = dtToday.getDate();
    // Calender position X
    this.posX = 1;
    // Calender position Y
    this.posY = 1;
    // Div tag created
    this.divCreated = false;

    // Methods
    this.creatediv = dtCreateEmptyDiv;
    this.show = dtPopShow;
    this.hide = dtPopHide;
    this.set = dtSetDateToField;
    this.isleapyear = dtCheckLeapYear;
    this.isWeekend = dtCheckWeekend;
}
// Show the date pick popup
// - sDateField - id of the date textbox
// - nOffsetX, nOffsetY - optional offsets of the popup
// - e - event (Firefox requires it)
// - sLanguage - Swe or Eng
function ShowDatePick(sDateField, nOffsetX, nOffsetY, e, sLanguage){
    // m_objDatePick must exist and be initialized
    m_objDatePick.sLanguage = sLanguage;
    // optional parameters: nOffsetX, nOffsetY
    var nYear = 0;
    var nMonth = 0;
    var objDateField = document.getElementById(sDateField);
    var sDateFieldData = objDateField.value;
    // Assuming date format yyyy-MM-dd
	if (sDateFieldData != '') {
		if (!validateSwedishDate(sDateFieldData)){
		    if (m_objDatePick.sLanguage == "Swe") {
		        // unescape codes: Å-%C5, Ä-%C4, Ö-%D6, å-%E5, ä-%E4, ö-%F6
		        alert(unescape('Fel datum format. Skall vara %E5%E5%E5%E5-mm-dd, anv%E4nder innevarande m%E5nad!'));
		    } else {
		        alert(unescape('Unknown date format. Date format needs to be yyyy-mm-dd. Will show current month!'));
		    }
			nYear = m_objDatePick.year;
			nMonth = m_objDatePick.month + 1;
		} else {
			var strSeparator = sDateFieldData.substring(4,5); //find date separator
			var arrayDate = sDateFieldData.split(strSeparator); //split date into month, day, year
			var nDay = parseInt(arrayDate[2],10); 
			nMonth = parseInt(arrayDate[1],10);
			nYear = parseInt(arrayDate[0], 10);
		}
    } else {
		nYear = m_objDatePick.year;
		nMonth = m_objDatePick.month + 1;
    }
	
    //-------------------------------
    if (nOffsetX == null) nOffsetX = 0;
    if (nOffsetY == null) nOffsetY = 0;
    if (m_objDatePick.isIE) {
        m_objDatePick.posX = event.clientX + document.body.scrollLeft + nOffsetX;
        m_objDatePick.posY = event.clientY + document.body.scrollTop + nOffsetY;
    } else {
        // Firefox
        if (e.pageX > 0) {
            m_objDatePick.posX = e.pageX;
        } else {
            m_objDatePick.posX = 0;
        }

        if (e.pageY > 0) {
            m_objDatePick.posY = e.pageY;
        } else {
            m_objDatePick.posY = 0;
        }
    }
    // Date return field
    m_objDatePickReturnField = document.getElementById(sDateField);
    // Create div tag if not already created?
    if (m_objDatePick.divCreated == false){ m_objDatePick.creatediv(); }
    // Show calendar popup
    m_objDatePick.show(nYear, nMonth - 1);
    return false;
}

function dtCreateEmptyDiv(){
  // Div already created?
  if (this.divCreated == true) return;

  // Create div
  var sHtml = '<div class="calpCalendar" name="divDatePick" ID="divDatePick" style="position:absolute"></div>';
  if (this.isIE){
	  document.body.insertAdjacentHTML('BeforeEnd', sHtml);
	  this.layer = document.all.tags('div')('divDatePick');
  }else if (this.isDOM){
	  var range= document.body.ownerDocument.createRange();
	  range.setStartBefore(document.body);
	  var parsedHTML = range.createContextualFragment(sHtml);
	  document.body.appendChild(parsedHTML);
	  this.layer = document.getElementById('divDatePick');
  }
  this.divCreated = true;
}

// Weekend?
function dtCheckWeekend(nDay){
    var bReturn = false;
    switch (nDay){
      case 6:case 7:case 13:case 14:case 20:case 21:case 27:case 28:case 34:case 35:case 41:case 42:
	      bReturn = true;
	      break;
    }
    return bReturn;
}

// Leap year?
function dtCheckLeapYear(nYear){
    return (((nYear % 4) == 0) && ((nYear % 100) != 0) || ((nYear % 400) == 0))?true:false;
}

// Show calendar with specified year and month
function dtPopShow(nYear, nMonth){
    // Temp vars to handle different alternativs
    var sHtml, sHtmlMonth, sHtmlYear, sHtmlDay;
    var nArrayMonth = nMonth -1
    // The first day in the month to show
    var dtFirstDayOfMonth = new Date(this.arrMonthEng[nMonth] + ' 1, ' + nYear);
    //var dtFirstDayOfMonth = new Date(this.arrMonthEng[nArrayMonth] + ' 1, ' + nYear);
    // Position in week (weekday) for first day in month to show. If Sunday 0 set to 7
    var nPosWeekFirstDate = (dtFirstDayOfMonth.getDay() == 0)?7:dtFirstDayOfMonth.getDay();
    // Flag
    var bDayIsThisMonth = false;
    // Previous month
    var nMonthPrev	= (nMonth == 0)?11:nMonth - 1;
    // Previous year
    var nYearPrev	= (nMonthPrev == 11)?(nYear - 1):nYear;
    // Next month
    var nMonthNext	= (nMonth == 11)?0:nMonth + 1;
    // Next year
    var nYearNext	= (nMonthNext == 0)?(nYear + 1):nYear;
    // Temp variable to use right style class for layout
    var sClass;
    // Check if leap year
    var arrMonthLen	= (this.isleapyear(nYear))?this.arrMonthLeap:this.arrMonthLen;

    // Create header
    sHtml = '<table class="calpHeader">';
    sHtml += '  <tr>';
    // Previous month
    sHtml += '    <td class="calpNavArrow" colspan="2"><a style="cursor:pointer" href="#" onClick="m_objDatePick.show(' + nYearPrev + ',' + nMonthPrev + ');return false;">&lt;&lt;</a></td>';
    // Name of month and year as header
    if (m_objDatePick.sLanguage == "Swe") {
        sHtml += '    <td class="calpHeaderTitle" colspan="3">' + this.arrMonthSwe[nMonth] + ' ' + nYear + '</td>';
    } else {
        sHtml += '    <td class="calpHeaderTitle" colspan="3">' + this.arrMonthEng[nMonth] + ' ' + nYear + '</td>';
    }
    // Next month
    sHtml += '    <td class="calpNavArrow"><a style="cursor:pointer" href="#" onclick="m_objDatePick.show(' + nYearNext + ',' + nMonthNext + ');return false;">&gt;&gt;</a></td>';
    sHtml += '    <td align="right"><a href="#" onClick="m_objDatePick.hide();return false;">X</a></td>';
    sHtml += '  </tr>';
    sHtml += '</table>';
	
    sHtml += '<table class="calpData">';
    sHtml += '  <tr class="calpWeekDayNameRow">';
    // Add number of days (Mo-Su) to calender header
    for (var z = 0; z < 7; z++){
        if (m_objDatePick.sLanguage == "Swe") {
            if (z == 5 || z == 6) {
                // Saturday or Sunday
                sHtml += '<td>' + this.arrDaySwe[z] + '</td>';
            } else {
                // Monday to Friday
                sHtml += '<td>' + this.arrDaySwe[z] + '</td>';
            }
        } else {
            if (z == 5 || z == 6) {
                // Saturday or Sunday
                sHtml += '<td>' + this.arrDayEng[z] + '</td>';
            } else {
                // Monday to Friday
                sHtml += '<td>' + this.arrDayEng[z] + '</td>';
            }
        }
    }
  
    sHtml += '</tr>';
    // Add days in table
    for(var i = 1; i < 43; i++){
	  // Check if row break in table
	  if (i == 1 || i == 8 || i == 15 || i == 22 || i == 29 || i == 36) sHtml += '<tr class="calpWeekRow">';
	  // Check if month is before current month
	  if (i < nPosWeekFirstDate){
		  // Set year and month to current
		  sHtmlMonth = nMonthPrev;
		  sHtmlYear	= nYearPrev;
		  sHtmlDay = arrMonthLen[nMonthPrev] - nPosWeekFirstDate + i + 1;
		  sClass = (this.isWeekend(i))?'calpDisabled':'calpDisabled';
		  bDayIsThisMonth = false;
	  } else if((i - nPosWeekFirstDate) >= arrMonthLen[nMonth]){
		  // Check if month is after current month
		  sHtmlMonth = nMonthNext;
		  sHtmlYear = nYearNext;
		  sHtmlDay = i - arrMonthLen[nMonth] - nPosWeekFirstDate + 1;
		  sClass = (this.isWeekend(i))?'calpDisabled':'calpDisabled';
		  bDayIsThisMonth = false;
	  } else {
		  // Current month, set year, month and day
		  sHtmlMonth = nMonth;
		  sHtmlYear = nYear;
		  sHtmlDay = i - nPosWeekFirstDate + 1;
		  // Today?
		  sClass = ((this.year == sHtmlYear) && (this.month == sHtmlMonth) && (this.day == sHtmlDay))?'calpToday':(this.isWeekend(i))?'calpWeekend':'calpStd';
		  bDayIsThisMonth = true;
	  }

	  // Add 1 since Jan is 0 in array
	  sHtmlMonth += 1;

	  // Create HTML
	  if (bDayIsThisMonth){
	      sHtml += '<td style="cursor:pointer" class="' + sClass + '" onClick="m_objDatePick.set(' + sHtmlYear + ', ' + sHtmlMonth + ', ' + sHtmlDay + ');">' + sHtmlDay + '</td>';
	  } else {
		  sHtml += '<td style="cursor:default" class="' + sClass + '">&nbsp;</td>';
	  }
	  // Check if change of row in table
	  if (i == 7 || i == 14 || i == 21 || i == 28 || i == 35 || i == 42) sHtml += '</tr>';
	}

    // Goto today link
    sHtml += '<tr class="calpHeader">';
    if (m_objDatePick.sLanguage == "Swe") {
        sHtml += '  <td colspan="7" class="calpHeader"><a style="cursor:pointer" href="#" onClick="m_objDatePick.show(' + this.year + ',' + this.month + ');return false;">G&aring; till idag</a>'
    } else {
    sHtml += '  <td colspan="7" class="calpHeader"><a style="cursor:pointer" href="#" onClick="m_objDatePick.show(' + this.year + ',' + this.month + ');return false;">Goto Today</a>'
    }
    sHtml += '</tr>';

    // End table
    sHtml += "</table>\n";

    // Write calender
	if (this.isDOM || this.isIE4){
		this.layer.innerHTML = sHtml;
		this.layer.style.top = this.posY + 'px';
		this.layer.style.left = this.posX + 'px';
		this.layer.style.visibility = 'visible';
	}
}

function dtSetDateToField(nYear, nMonth, nDay){
    // Format date
    nMonth = (nMonth < 10)?'0' + nMonth.toString():nMonth.toString();
    nDay = (nDay < 10)?'0' + nDay.toString():nDay.toString();
    nYear = nYear.toString();
    var sDate = nYear + '-' + nMonth + '-' + nDay;

    // Set field
    m_objDatePickReturnField.value = sDate;

    // Hide date object
    this.hide();
}

function dtPopHide(){
    this.layer.style.visibility = "hidden";
}

// Init date pick
m_objDatePick = new InitDatePick();

// -----------------------< DatePick END >-------------------------

// -----------------------< ManyToMany BEGIN >-------------------------

// Many to many dialog
// Spize IT 2005-06-17

function ShowManyToManyDialog(sEventTarget, sDialogParameters) {
	// Support for modal dialogs? (IE yes, FireFox no)
	if (window.showModalDialog) {
		var sUniqueUrlExt = popUniqueUrlExt();
		var sResult = window.showModalDialog('../../App_spzBase/ZManyToMany/' + sDialogParameters + "&d=" + sUniqueUrlExt, window, 'scroll:no;dialogHeight:600px;dialogWidth:485px;help:yes;status:no;');
		// TODO remove this when you checked that it is not needed for the popup in popup methods OR 2008-08-27
		// var sResult = window.showModalDialog('../../App_spzBase/ZManyToMany/frmZModalLoader.aspx', sDialogParameters, 'scroll:no;dialogHeight:400px;dialogWidth:685px;help:yes;status:no;');
		if ((sResult != null) && (sResult.length > 0)){
			__doPostBack(sEventTarget, sResult);
		}
	} else {
		// Not modal window
		var objPopupWindow = window.open('../../App_spzBase/ZManyToMany/' + sDialogParameters + "&d=" + sUniqueUrlExt, '_blank', 'top=100,left=100,width=510px,height=435px,toolbar=0,status=0,scrollbars=yes,resizable=yes,fullscreen=no');
		// TODO handle return values!
	}
}

// -----------------------< ManyToMany END >-------------------------


// -----------------------< TextArea BEGIN >-------------------------

/*****************************************************************
 Limit TextArea
 Sample:	<textarea name='name' class='TextBox' cols='20' rows='2' onKeyPress="return LimitTextArea_onKeyPress(this, event, 40);" onBlur="LimitTextArea_onBlur(this, 40);"></textarea>
'*****************************************************************/
// Leaving the textarea
function LimitTextArea_onBlur(object, lenlimit) {
  if (object.value.length > lenlimit) {
    alert('Max antal tecken \u00E4r ' + lenlimit + '. Texten kommer nu att begr\u00E4nsas till maxl\u00E4ngden.');
    object.value = object.value.substring(0,lenlimit);
    object.focus();
  }
}
// Keypress within the textarea
function LimitTextArea_onKeyPress(object, evnt, lenlimit){
	// IE?
  if (typeof(evnt.keyCode) != undefined) {
		// Get ascii code
    var asciicode = evnt.keyCode;
  } else {
		// Netscape?
    if (typeof(evnt.which) != undefined) {
			// Get ascii code
			var asciicode = evnt.which;
    } else {
			// Can not perform length checking - return True to accept keystroke
			return true;
    }
  }

	// Control keys < 31, 13 - CR, 8 - backspace
  if ((asciicode <= 31) && (asciicode != 13) ||  (asciicode == 8)) {
		// Accept the control key -it won't add any text to the box
    return true ;
  }

  // Now we check the length of the user enter text. Because when KeyPress is executed the character that the user has just
  // pressed is not in the text box yet, we test for Less Than instead of Equal To
  if (object.value.length < lenlimit) {
		// Limit not reached, accept keystroke
    return true;
  } else {
    // Ignore the keystroke
    return false;
  }
}
// -----------------------< TextArea END >-------------------------

// ---
// Move popup windows (div)
var checkZIndex = true;
var dragobject = null;
var tx;
var ty;
var ie5 = document.all != null && document.getElementsByTagName != null;

function getReal(el) {
	temp = el;
	while ((temp != null) && (temp.tagName != "BODY")) {
		if ((temp.className == "moveme") || (temp.className == "handle")){
			el = temp;
			return el;
		}
		temp = temp.parentElement;
	}
	return el;
}

function moveme_onmousedown() {
	el = getReal(window.event.srcElement)
	
	if (el.className == "moveme" || el.className == "handle") {
		if (el.className == "handle") {
			tmp = el.getAttribute("handlefor");
			if (tmp == null) {
				dragobject = null;
				return;
			} else {
				dragobject = eval(tmp);
			}
		} else { 
			dragobject = el;
		}
		
		if (checkZIndex) makeOnTop(dragobject);
		ty = window.event.clientY - getTopPos(dragobject);
		tx = window.event.clientX - getLeftPos(dragobject);
		
		window.event.returnValue = false;
		window.event.cancelBubble = true;
	}	else {
		dragobject = null;
	}
}

function moveme_onmouseup() {
	if(dragobject) {
		dragobject = null;
	}
}

function moveme_onmousemove() {
	if (dragobject) {
		if (window.event.clientX >= 0 && window.event.clientY >= 0) {
			dragobject.style.left = window.event.clientX - tx;
			dragobject.style.top = window.event.clientY - ty;
		}
		window.event.returnValue = false;
		window.event.cancelBubble = true;
	}
}

function getLeftPos(el) {
	if (ie5) {
		if (el.currentStyle.left == "auto") {
			return 0;
		} else {
			return parseInt(el.currentStyle.left);
		}
	} else {
		return el.style.pixelLeft;
	}
}

function getTopPos(el) {
	if (ie5) {
		if (el.currentStyle.top == "auto") {
			return 0;
		} else {
			return parseInt(el.currentStyle.top);
		}
	} else {
		return el.style.pixelTop;
	}
}

function makeOnTop(el) {
	var daiz;
	var max = 0;
	var da = document.all;
	
	for (var i=0; i<da.length; i++) {
		daiz = da[i].style.zIndex;
		if (daiz != "" && daiz > max)
			max = daiz;
	}
	el.style.zIndex = max + 1;
}

if (document.all) { //This only works in IE4 or better
	document.onmousedown = moveme_onmousedown;
	document.onmouseup = moveme_onmouseup;
	document.onmousemove = moveme_onmousemove;
}


function validateSwedishDate( strValue ) {
/************************************************
DESCRIPTION: Validates that a string contains only
    valid dates with 2 digit month, 2 digit day,
    4 digit year. Date separator can be ., -, or /.
    Uses combination of regular expressions and
    string parsing to validate date.
    Ex. mm/dd/yyyy or mm-dd-yyyy or mm.dd.yyyy

PARAMETERS:
   strValue - String to be tested for validity

RETURNS:
   True if valid, otherwise false.

REMARKS:
   Avoids some of the limitations of the Date.parse()
   method such as the date separator character.
*************************************************/
  //var objRegExp = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/
  
	var objRegExp = /^\d{4}(\-|\/|\.|\s)\d{1,2}\1\d{1,2}$/
  //check to see if in correct format
  if(!objRegExp.test(strValue))
    return false; //doesn't match pattern, bad date
  else{
    var strSeparator = strValue.substring(4,5) //find date separator
    var arrayDate = strValue.split(strSeparator); //split date into year, month, day 
    //create a lookup for months not equal to Feb.
		var arrayLookup = { '01' : 31,'03' : 31, '04' : 30,'05' : 31,'06' : 30,'07' : 31,'08' : 31,'09' : 30,'10' : 31,'11' : 30,'12' : 31}
    var intDay = parseInt(arrayDate[2],10); 

    //check if month value and day value agree
    if(arrayLookup[arrayDate[1]] != null) {
      if(intDay <= arrayLookup[arrayDate[1]] && intDay != 0) {
        return true; //found in lookup table, good date
      }
    }
    
    //check for February 
    var intMonth = parseInt(arrayDate[1],10);
    if (intMonth == 2) { 
       var intYear = parseInt(arrayDate[0]);
       if (intDay > 0 && intDay < 29) {
           return true;
       } else if (intDay == 29) {
         if ((intYear % 4 == 0) && (intYear % 100 != 0) || 
             (intYear % 400 == 0)) {
              // year div by 4 and ((not div by 100) or div by 400) ->ok
             return true;
         }   
       }
    }
  }  
  return false; //any other values, bad date
}


