var f=new FormFunctions();
var e=new Effects();

function FormFunctions() {

	this.GetObject=function(sID) {
		return document.getElementById(sID);
	}
	
	this.GetObjectsByIDPrefix=function(sPrefix,sTagName, oContainer) {

	    if (oContainer == undefined) {
	        oContainer = document;
	    } else {
	        oContainer = f.GetObject(oContainer);
	    }
	
		var aObjects=new Array();		
		
		if (sTagName==undefined) {
			sTagName='input';
		}
		
		var aElements=oContainer.getElementsByTagName(sTagName);		
		for (var i=0;i<aElements.length;i++) {
			if (s.StartsWith(aElements[i].id,sPrefix)) {
				aObjects.length=aObjects.length+1;
				aObjects[aObjects.length-1]=aElements[i];
			}
		}
		
		return aObjects;		
	}
	
	
	this.GetValue=function(o) {
		var oControl=this.SafeObject(o);
		if (oControl!=null) {
			return oControl.value;
		} else {
			return '';
		}
	}
	
	this.GetIntValue=function(o) {
	    var oControl=this.SafeObject(o);
		if (oControl!=null) {
			return n.SafeInt(oControl.value);
		} else {
			return 0;
		}
	}
	
	this.GetNumericValue=function(o) {
	    var oControl=this.SafeObject(o);
		if (oControl!=null) {
			return n.SafeNumeric(oControl.value);
		} else {
			return 0;
		}
	}
	
	this.SetValue=function(o, sValue) {
		var oControl=this.SafeObject(o);
		if (oControl!=null) {
			oControl.value=sValue;
		}
	}

	this.GetHTML = function(o) {
	    var oControl = this.SafeObject(o);
	    if (oControl != null) {
	        return oControl.innerHTML;
	    }
	    return '';
	}

	this.SetHTML = function(o, sValue) {
	    var oControl = this.SafeObject(o);
	    if (oControl != null) {
	        oControl.innerHTML = sValue;
	    }
	}
		
	this.SafeObject=function(o) {
		if (typeof(o)=='object') {
			return o;
		} else if (typeof(o)=='string') {
			return this.GetObject(o);
		} else {
			return null;
		}
	}
	
	this.Toggle=function(o) {
		var oControl=this.SafeObject(o);
		oControl.style.display=oControl.style.display=='none' ? 'block' : 'none';
	}
	
	this.Show=function(o) {
		var oControl=this.SafeObject(o);
		if (oControl!=null) {
			oControl.style.display=oControl.style.display='';
		}
	}
	
	this.Hide=function(o) {
		var oControl=this.SafeObject(o);
		if (oControl!=null) {
			oControl.style.display=oControl.style.display='none';
		}
	}
	
	this.Visible = function(o) {
		var oControl=this.SafeObject(o);
		if (oControl!=null) {
			return oControl.style.display!='none';
		} else {
			return false;
		}
	}
	
	this.SetClass = function(o,s) {
		var oControl=this.SafeObject(o);
		oControl.className=s;
	}
	
	this.GetClass = function(o) {
		var oControl=this.SafeObject(o);
		return oControl.className;
	}


	this.SetClassIf = function(o, ClassName, bCondition) {

	    if (bCondition) {
	        f.AddClass(o, ClassName);
	    } else {
	        f.RemoveClass(o, ClassName);
	    }
	}


	this.SetHTML = function(o, sValue) {
	    var oControl = this.SafeObject(o);
	    if (oControl != null) {
	        oControl.innerHTML = sValue;
	    }
	}


	
	this.AddClass=function(o,s) {
	
		var aClassNames = f.GetClass(o).split(' ');
		var bExist = false;
		
		// check whether the class already exist
		for (var i=0;i<aClassNames.length;i++) {
			if (aClassNames[i]==s) {
				bExist=true;
				break;
			}
		}
		
		// add class if the class not exists
		if (!bExist) {
			f.SetClass(o, f.GetClass(o)+' '+s)
		}						
	}
	
	
	this.RemoveClass=function(o,s) {
	
		var sClassName='';
		var aClassNames = f.GetClass(o).split(' ');
		
		// 
		for (var i=0;i<aClassNames.length;i++) {
			if (aClassNames[i]!=s) {
				sClassName=sClassName+aClassNames[i]+' ';
			}
		}
		
		f.SetClass(o,sClassName);				
	}


	this.GetElementsByClassName = function(sElement, sClassName, oContainer) {

	    if (oContainer == undefined) {
	        oContainer = document;
	    } else {
	        oContainer = f.SafeObject(oContainer);
	    }

	    var aElements = oContainer.getElementsByTagName(sElement);
	    var aReturn = new Array();

	    for (var i = 0; i < aElements.length; i++) {

	        if (aElements[i].className.indexOf(sClassName) > -1) {
	            aReturn[aReturn.length] = aElements[i];
	        }
	    }

	    return aReturn;
	}

	this.ShowIf = function(o, bCondition) {

	    if (o.constructor != Array) {
	        var oControl = this.SafeObject(o);
	        if (bCondition) {
	            this.Show(o);
	        } else {
	            this.Hide(o);
	        }
	    } else {
	        for (var i = 0; i < o.length; i++) {
	            f.ShowIf(o[i], bCondition);
	        }
	    }
	}

	this.BuildList = function(aListItems) {

	    var sList = '<ul>';
	    for (var i = 0; i < aListItems.length; i++) {
	        if (!aListItems[i] == '') {
	            sList += '<li>' + aListItems[i] + '</li>';
	        }
	    }
	    sList += '</ul>';
	    return sList;
	}
	
	this.Disable=function(o) {
		
		var oControl=this.SafeObject(o);
		if (oControl!=null) {
			oControl.readOnly=true;
		}
	}
	
	this.Enable=function(o) {
		
		var oControl=this.SafeObject(o);
		if (oControl!=null) {
			oControl.readOnly=false;
		}
	}
	
	this.ClearFileUpload=function(o) {
	    
	    var oControl=this.SafeObject(o);
	    if (oControl!=null) {
			oControl.outerHTML=oControl.outerHTML;
		}   
	}
	
	
	/* event handling */
	this.AttachEvent=function(oObject, sEventName, oFunction) {
	
		oObject=this.SafeObject(oObject);
		
		var oListenerFunction = oFunction;
		
		if (oObject.addEventListener) {
			oObject.addEventListener(sEventName, oListenerFunction, false);
		} else if (oObject.attachEvent) {
			oListenerFunction = function() {
				oFunction(window.event);
			}
			oObject.attachEvent("on" + sEventName, oListenerFunction);
		} else {
			throw new Error("Event registration not supported");
		}
		
		
		var oEvent = {Instance: oObject, EventName: sEventName, Listener: oListenerFunction};
		return oEvent;
	}

	
	this.DetachEvent=function(oEvent) {
	
		var oObject=oEvent.Instance;
		
		if (oObject.removeEventListener) {
			oObject.removeEventListener(oEvent.EventName, oEvent.Listener, false);
		} else if (oObject.detachEvent) {
			oObject.detachEvent("on" + oEvent.EventName, oEvent.Listener);
		}
	}

	this.GetObjectFromEvent=function(oEvent) {
		return oEvent.srcElement ? oEvent.srcElement : oEvent.target;
	}
	
	this.GetKeyCodeFromEvent=function(oEvent) {
		return oEvent.keyCode ? oEvent.keyCode : oEvent.which;
	}

	this.ShowPopup = function(oObject, sClassName, sHTML, sSourceObjectID, bRightAlign, iYOffset, iXOffset) {

	    if (iYOffset == undefined) { iYOffset = 0; }
	    if (iXOffset == undefined) { iXOffset = 0; }

	    if (sSourceObjectID != undefined && f.GetObject(sSourceObjectID)) {
	        sHTML = f.GetObject(sSourceObjectID).innerHTML;
	    }
	    

	    //create container			
	    var oHelp = document.createElement('div');
	    oHelp.setAttribute('id', 'divPopup');
	    f.SetClass(oHelp, sClassName);
	    oHelp.style.position = 'absolute';
	    oHelp.innerHTML = sHTML;

	    //set position
	    var oDimensions = new e.BrowserDimensions();
	    var oLinkPosition;
	    if (!oObject.Left) {
	        oLinkPosition = e.GetPosition(oObject);
	    } else {
	        oLinkPosition = new e.Position();
	        oLinkPosition.Left = oObject.Left;
	        oLinkPosition.Top = oObject.Top;
	    }
        
	    oHelp.style.top = n.SafeInt(oLinkPosition.Top + 20 + iYOffset) + 'px';
	    oHelp.style.left = n.SafeInt(oLinkPosition.Left + iXOffset) + 'px';

	    //create mask
	    if (navigator.appVersion.indexOf('MSIE 6') > 0) {
	        var oMask = document.createElement('iframe');
	        oMask.setAttribute('id', 'iMask');
	        oMask.src = '';
	        e.SetPosition(oMask, e.GetPosition(oHelp));
	        f.GetObject('frm').appendChild(oMask);
	    }

	    f.GetObject('frm').appendChild(oHelp);

	    //move it if it's too low
	    oHelpPosition = e.GetPosition(oHelp);
	    if (oHelpPosition.Top + oHelpPosition.Height > oDimensions.ViewportHeight + f.ScrollPosition()) {
	        oHelp.style.top = oDimensions.ViewportHeight + f.ScrollPosition() - oHelp.offsetHeight - 10 + 'px';
	    }


	    //if we're right aligning then shift over now
	    if (bRightAlign != undefined) {
	        oHelp.style.left = oLinkPosition.Left - oHelp.clientWidth + iXOffset + 'px';
	    }
	}
	

	this.HidePopup=function() {
		if (navigator.appVersion.indexOf('MSIE 6')>0 && f.GetObject('iMask')) {
			f.GetObject('frm').removeChild(f.GetObject('iMask'));
		} 
		
		if (f.GetObject('divPopup')) {
			f.GetObject('frm').removeChild(f.GetObject('divPopup'));
		}
	}	
	
	this.ScrollPosition=function() {
		return (window.pageYOffset) ? 
					window.pageYOffset
					:(document.documentElement && document.documentElement.scrollTop)
						? document.documentElement.scrollTop : document.body.scrollTop;
	}



	this.GetContainerQueryString = function(oContainer) {

	    var aElements = f.SafeObject(oContainer).getElementsByTagName('*');

	    var sQueryString = '';
	    for (var i = 0; i < aElements.length; i++) {
	        if (aElements[i].name) {
                if (!s.StartsWith(aElements[i].id, 'rad')) {
	                sQueryString += (sQueryString == '' ? '' : '&') + aElements[i].name + '='
	            }

	            if (aElements[i].nodeName == 'INPUT' && s.StartsWith(aElements[i].id, 'chk')) {
	                sQueryString += aElements[i].checked;
	            } else if (aElements[i].nodeName == 'INPUT' && s.StartsWith(aElements[i].id, 'rad')) {
	                if (aElements[i].checked) {
	                    sQueryString += aElements[i].name + '=' + f.GetValue(aElements[i]);
	                }
	            } else if (aElements[i].nodeName == 'INPUT') {
	                sQueryString += encodeURI(f.GetValue(aElements[i]));
	            } else if (aElements[i].nodeName == 'SELECT') {
	                sQueryString += encodeURI(f.GetValue(aElements[i]) != '' ? dd.GetValue(aElements[i]) : dd.GetText(aElements[i]));
	            }
	        }
	    }

	    return sQueryString;

	}
	

}


/* effects */
function Effects() {
		
	this.SetOpacity=function(o,iOpacity) {
		var oControl=f.SafeObject(o);
		oControl.style.opacity = iOpacity/100;		
		oControl.style.filter = 'alpha(opacity=' + iOpacity + ')';
	}



	this.SlideOpen=function(oObject, SlideTime, FinalHeight, EndTime) {
		
		oObject=f.SafeObject(oObject);
		SlideTime=SlideTime==undefined ? 0.75 : SlideTime;
		
		if (EndTime==undefined) {
			oObject.style.overflow='hidden';
			oObject.style.display='block';
			oObject.style.height='1px';
			oObject.style.height='auto';
			FinalHeight=oObject.scrollHeight;
			var dStart=new Date();
			EndTime=new Date(dStart.getTime()+(SlideTime*1000));
		} else {
			EndTime=new Date(EndTime);
		}
		

		if (new Date()<EndTime) {
			oObject.style.height=Math.round(Math.sin(Math.PI/2*(1-(EndTime-new Date())/1000/SlideTime))*FinalHeight)+'px'
			setTimeout('e.SlideOpen(\''+oObject.id+'\','+SlideTime+','+FinalHeight+',\''+EndTime+'\')',10);
		} else {
			oObject.style.height=FinalHeight+'px';
		}
	}
	
	this.SlideClose=function(oObject, SlideTime, FinalHeight, EndTime) {
		
		oObject=f.SafeObject(oObject);
		SlideTime=SlideTime==undefined ? 0.75 : SlideTime;
		
		if (EndTime==undefined) {
			FinalHeight=oObject.scrollHeight;
			var dStart=new Date();
			EndTime=new Date(dStart.getTime()+(SlideTime*1000));
		} else {
			EndTime=new Date(EndTime);
		}
		
		if (new Date()<EndTime) {
			oObject.style.height=Math.round(Math.sin(Math.PI/2*((EndTime-new Date())/1000/SlideTime))*FinalHeight)+'px'
			setTimeout('e.SlideClose(\''+oObject.id+'\','+SlideTime+','+FinalHeight+',\''+EndTime+'\')',10);
		} else {
			oObject.style.height=0;
			oObject.style.display='none';
		}
	}


	this.FadeOut=function(oObject, FadeTime, Opacity) {
		this.FadeOutObject=f.SafeObject(oObject);
		FadeTime=FadeTime==undefined ? 1 : FadeTime;
		this.FadeInterval=FadeTime/20*800;
		this.Opacity=Opacity==undefined ? 100 : Opacity;

		this.Opacity-=5;
			
		if (this.Opacity<0) {
			e.SetOpacity(this.FadeOutObject,0);
		} else {
			e.SetOpacity(this.FadeOutObject,this.Opacity);
			setTimeout('e.FadeOut(\''+this.FadeOutObject.id +'\','+FadeTime+','+this.Opacity+')',
				this.FadeInterval);
		}
	}
	
	this.FadeIn=function(oObject, FadeTime, Opacity) {
		this.FadeInObject=f.SafeObject(oObject);
		FadeTime=FadeTime==undefined ? 1 : FadeTime;
		this.FadeInterval=FadeTime/20*800;
		this.Opacity=Opacity==undefined ? 0 : Opacity;

		this.Opacity+=5;
			
		if (this.Opacity>100) {
			e.SetOpacity(this.FadeInObject,100);
		} else {
			e.SetOpacity(this.FadeInObject,this.Opacity);
			setTimeout('e.FadeIn(\''+this.FadeInObject.id +'\','+FadeTime+','+this.Opacity+')',
				this.FadeInterval);
		}
	}
	
	
	this.ImageRotator=function(IDBase, ItemCount, RotateTime, CurrentIndex) {

		if (ItemCount>1) {
			RotateTime = RotateTime == undefined ? 2 : parseInt(RotateTime);
			CurrentIndex = CurrentIndex == undefined ? 0 : CurrentIndex;

			if (CurrentIndex==0) {
			
				CurrentIndex=1;
				
			} else { 
				
				var oFadeOut=f.GetObject(IDBase+CurrentIndex);
				if (oFadeOut==null) {
					return false;
				}

				CurrentIndex+=1;
				CurrentIndex= CurrentIndex>ItemCount ? 1 : CurrentIndex;
			
				var oFadeIn=f.GetObject(IDBase+CurrentIndex);
			
				e.FadeOut(oFadeOut);
				e.FadeIn(oFadeIn);
			
			}

			setTimeout('e.ImageRotator(\''+IDBase+'\','+ItemCount+','+RotateTime+','+CurrentIndex+')', RotateTime*1000);
		}
		
	}	


	this.GetPosition=function(o) {
		var oControl=f.SafeObject(o);
		
		var s=oControl.id;
		
		var iLeft=0, iTop=0, iWidth, iHeight;
		iWidth=oControl.offsetWidth;
		iHeight=oControl.offsetHeight;
		
		if (oControl.offsetParent) {
			iLeft = oControl.offsetLeft;
			iTop = oControl.offsetTop;
			while (oControl = oControl.offsetParent) {
				iLeft += oControl.offsetLeft;
				iTop += oControl.offsetTop;
			}
		}

		return new this.Position(iLeft, iTop, iWidth, iHeight);
	}

	this.SetPosition=function(o,oPosition) {
		oControl=f.SafeObject(o);
		oControl.style.top=oPosition.Top+'px';
		oControl.style.left=oPosition.Left+'px';
		oControl.style.width=oPosition.Width+'px';
		if (oPosition.Height > 0) {
			oControl.style.height=oPosition.Height+'px';
		}
	}

	this.SetTopLeft = function(o, iTop, iLeft) {
	    oControl = f.SafeObject(o);
	    oControl.style.top = iTop + 'px';
	    oControl.style.left = iLeft + 'px';
	}
	
	this.Position=function(iLeft,iTop,iWidth,iHeight) {
		this.Left=iLeft;
		this.Top=iTop;
		this.Width=iWidth;
		this.Height=iHeight;
	}	


	this.BrowserDimensions=function() {
			

		var iXScroll, iYScroll, iXScrollPos, iYScrollPos;
		
		if (window.innerHeight && window.scrollMaxY) {	
			iXScroll = window.innerWidth + window.scrollMaxX;
			iYScroll = window.innerHeight + window.scrollMaxY;
		} else if (document.body.scrollHeight > document.body.offsetHeight) { 
			iXScroll = document.body.scrollWidth;
			iYScroll = document.body.scrollHeight;
		} else { 
			iXScroll = document.body.offsetWidth;
			iYScroll = document.body.offsetHeight;
		}
       
		var iWindowWidth, iWindowHeight;
		
		if (self.innerHeight) {	
			if(document.documentElement.clientWidth){
				iWindowWidth = document.documentElement.clientWidth; 
			} else {
				iWindowWidth = self.innerWidth;
			}
			iWindowHeight = self.innerHeight;
		} else if (document.documentElement && document.documentElement.clientHeight) {
			iWindowWidth = document.documentElement.clientWidth;
			iWindowHeight = document.documentElement.clientHeight;
		} else if (document.body) {
			iWindowWidth = document.body.clientWidth;
			iWindowHeight = document.body.clientHeight;
		}	
		
		if (window.pageYOffset && window.pageXOffset){
		    iXScrollPos = window.pageXOffset
		    iYScrollPos = window.pageYOffset
		} else if(document.documentElement){
		    iXScrollPos = document.documentElement.scrollLeft;
		    iYScrollPos = document.documentElement.scrollTop;
		}else {
		    iXScrollPos=document.body.scrollLeft;
		    iYScrollPos=document.body.scrollTop;
		}

		if (window.pageYOffset){
		    iYScrollPos = window.pageYOffset
		} else if(document.documentElement){
		    iYScrollPos = document.documentElement.scrollTop;
		}else {
		    iYScrollPos=document.body.scrollTop;
		}
						
		var iPageHeight, iPageWidth
		var iPageHeight= iYScroll < iWindowHeight ? iWindowHeight : iYScroll;
		var iPageWidth= iXScroll < iWindowWidth ? iXScroll : iWindowWidth;
		
		this.ViewportWidth=iWindowWidth;
		this.ViewportHeight=iWindowHeight;
		this.PageWidth=iPageWidth;
		this.PageHeight=iPageHeight;
		this.PageScrollTop=iYScroll;
	    this.ScrollYPos=iYScrollPos;
	    this.ScrollXPos=iXScrollPos;
	}



	this.CreateOverlay=function() {
		
		var oOverlay = document.createElement('div');
		oOverlay.setAttribute('id','divOverlay');			
		document.body.appendChild(oOverlay);			
	
		var oDimensions=new e.BrowserDimensions();
		oOverlay.style.height=oDimensions.PageHeight+'px';
		oOverlay.style.left=oDimensions.ScrollXPos+'px';
		oOverlay.style.width='100%';
		e.SetOpacity(oOverlay,60);
	}



	/* modal popup */
	this.ModalPopup=new function() {
		
		this.PopupDiv;
		this.EscapeEvent;	
	
		this.Show=function(oDiv) {
		
			this.PopupDiv = f.SafeObject(oDiv);
			
			e.CreateOverlay();
			f.Show(this.PopupDiv);
			
			var iControlWidth = this.PopupDiv.offsetWidth;
			var iControlHeight = this.PopupDiv.offsetHeight;
			
			var oDimensions=new e.BrowserDimensions();
			var iLeft=(oDimensions.ViewportWidth-iControlWidth)/2+oDimensions.ScrollXPos;
			var iTop=((oDimensions.ViewportHeight)/3)-(iControlHeight/2);
		
			//set min top
			iTop=iTop < 50 ? 50 : iTop;
			iTop+=oDimensions.ScrollYPos;
				
			this.PopupDiv.style.left=iLeft+'px';
			this.PopupDiv.style.top=iTop+'px';
			
			e.ModalPopup.EscapeEvent=f.AttachEvent(document, 'keypress', 
				function(oEvent) {
					if (f.GetKeyCodeFromEvent(oEvent)==27) {
						e.ModalPopup.Close();
					}
				});
		}
		
		
		this.Close=function() {
			if (f.Visible(e.ModalPopup.PopupDiv)) {				
				f.Hide(e.ModalPopup.PopupDiv);
				f.DetachEvent(e.ModalPopup.EscapeEvent);
				document.body.removeChild(f.GetObject('divOverlay'));	
			}
		}
	}	
}



//wait message
function ShowWaitMessage(sDivID) {
    if (!sDivID)
        {sDivID='divWaitMessage'}
    if (f.GetObject(sDivID)) {
        document.body.appendChild(f.GetObject(sDivID));
        e.ModalPopup.Show(sDivID)
    }
}



//modal popup - sets which objects to display inside a popup - hand in an array of ['tag', 'id', show_flag]
//e.g:
//	PopupDisplayObjects(new Array(['label', 'lblInfo', 1], ['input', 'btnClose', 0]));
//	ShowWaitMessage();
function PopupDisplayObjects(aObjects) {
    if (aObjects) {
        var aPopupDivs = f.GetElementsByClassName('div', 'modalpopup')
        for (var iPopup = 0; iPopup < aPopupDivs.length; iPopup++) {
        
            for (var iClass = 0; iClass < aObjects.length; iClass++) {
                var aPopupObjects = f.GetElementsByClassName(aObjects[iClass][0], aObjects[iClass][1], aPopupDivs[iPopup]);
                
                for (var iObject = 0; iObject < aPopupObjects.length; iObject++) {
                    if (aObjects[iClass][2]) {
                        f.Show(aPopupObjects[iObject])
                    } else {
                        f.Hide(aPopupObjects[iObject])
                    }
                }
                
            }
            
        }
    }
}


function HideWaitMessage(sDivID) {
    if (!sDivID)
        {sDivID = 'divWaitMessage'}
    if (f.GetObject(sDivID)) {
        e.ModalPopup.Close()
    }
}