//Code to allow document.getElementById() on browsers that use document.all[] instead
if(!document.getElementById) {
	document.getElementById=function(element)
			{
				return document.all[element];
			};
}


//buttons array
var buttons=new Array();

function ButtonInfo(source,target)
{
	this.source=source;
	this.target=target;
}

function addButton(sourcectl,targetbutton)
{
	buttons[buttons.length]=new ButtonInfo(sourcectl,targetbutton);
}


//integerBoxes array
function isNumberKey(e)
{
	if(window.event)
	{
		target=event.srcElement;
		keycode=event.keyCode;
	}
	else
	{
		target=e.target;
		keycode=e.keyCode;
	}
	if(!target.targetButton) {return;}
	if(keycode<=57||(keycode>=96&&keycode<=105)) {return;}
	return false;
}

var integerBoxes=new Array();

function addIntegerBox(sourcectl)
{
	integerBoxes[integerBoxes.length]=sourcectl;
}


//Event listener
function pressButton(e)
{
	if(window.event)
	{
		target=event.srcElement;
		keycode=event.keyCode;
	}
	else
	{
		target=e.target;
		keycode=e.keyCode;
	}
	if(!target.targetButton) {return;}
	if(keycode==13) {target.targetButton.focus();}
	return;
}

//The following incorporates code from http://therealcrisp.xs4all.nl/upload/addEvent_dean.html
//Function to add a listener funtion to an event
function addEvent(element,eventType,listenerFunction,useCapture)
{
	if(!document.getElementById) {return;}
	if(!element) {return;}
	if(element.addEventListener)
	{
		element.addEventListener(eventType,listenerFunction,useCapture);
		return true;
	}
	else if(element.attachEvent)
	{
		return element.attachEvent('on'+eventType,listenerFunction);
	}
	else
	{
		if (!listenerFunction.$$guid) listenerFunction.$$guid = addEvent.guid++;
		if (!element.events) element.events = {};
		var handlers = element.events[eventType];
		if (!handlers)
		{
			handlers = element.events[eventType] = {};
			if (element['on' + eventType]) handlers[0] = element['on' + eventType];
			element['on' + eventType] = handleEvent;
		}
		handlers[listenerFunction.$$guid] = listenerFunction;
	}
}
addEvent.guid=1;

//Function to remove a listener funtion from an event
function removeEvent(element,eventType,listenerFunction,useCapture)
{
	if(!document.getElementById) {return;}
	if(!element) {return;}
	if(element.removeEventListener)
	{
		element.removeEventListener(eventType,listenerFunction,useCapture);
		return true;
	}
	else if(element.detachEvent)
	{
		return element.detachEvent('on'+eventType,listenerFunction);
	}
	else
	{
		if (element.events && element.events[eventType] && listenerFunction.$$guid)
			delete element.events[eventType][listenerFunction.$$guid];
	}
}

function handleEvent(event)
{
	event = event || fixEvent(window.event);
	var returnValue = true;
	var handlers = this.events[event.type];
	
	for (var i in handlers)
	{
		if (!Object.prototype[i])
		{
			this.$$handler = handlers[i];
			if (this.$$handler(event) === false) returnValue = false;
		}
	}

	if (this.$$handler) this.$$handler = null;

	return returnValue;
}

function fixEvent(event)
{
	event.preventDefault = fixEvent.preventDefault;
	event.stopPropagation = fixEvent.stopPropagation;
	return event;
}

fixEvent.preventDefault = function()
{
	this.returnValue = false;
}

fixEvent.stopPropagation = function()
{
	this.cancelBubble = true;
}

if(!window.addEventListener&&!window.detachEvent)
{
	document.onreadystatechange = function()
	{
		alert(window.onload);
		if (window.onload && window.onload != handleEvent)
		{
			addEvent(window, 'load', window.onload);
			window.onload = handleEvent;
		}
	}
}

function stopDocumentClick()
{
	return false;
}
addEvent(document,'click',stopDocumentClick,true);
addEvent(window,'load',function(){removeEvent(document,'click',stopDocumentClick,true);});

var newEvents=new Array();

function EventToAdd(source,type,fn)
{
	this.source=source;
	this.type=type;
	this.fn=fn;
}

function newEvent(source,type,fn)
{
	if(newEvent.windowLoaded) addEvent(document.getElementById(source),type,fn);
	else newEvents[newEvents.length]=new EventToAdd(source,type,fn);
}
newEvent.windowLoaded=false;

//Add all submit listener function to keydown events of all <input> tags except buttons
// Also sets up 'buttons' and 'integerBoxes'
function addEventListeners()
{
    var watermark;
    var source;
    
	for(var n=0;n<buttons.length;n++)
	{
		source=document.getElementById(buttons[n].source);
		var target=document.getElementById(buttons[n].target);
		source.targetButton=target;
		addEvent(source,"keydown",pressButton,false);
	}
	for(var n=0;n<integerBoxes.length;n++)
	{
		addEvent(document.getElementById(integerBoxes[n]),"keydown",isNumberKey,false);
	}
	for(var n=0;n<newEvents.length;n++)
	{
		source=document.getElementById(newEvents[n].source);
		if(source)
		{
			var type=newEvents[n].type;
			var fn=newEvents[n].fn;
			addEvent(source,type,fn,false);
		}
	}
	newEvent.windowLoaded=true;
}

addEvent(window,'load',addEventListeners,false);

//Event firing, based on code from Mark Wilton-Jones
//http://www.howtocreate.co.uk/tutorials/javascript/domevents
function fireEvent(element,eventName,eventType)
{
	if(!eventType) {eventType='Events';}
	if(document.createEvent)
	{
		var evt=document.createEvent(eventType);
		evt.initEvent(eventName,true,true);
		element.dispatchEvent(evt);
	}
	else if(document.createEventObject)
	{
		element.fireEvent('on'+eventName);
	}
}

/*
 * Cookie functions based on code by Mattias Sjoberg 
 * http://javascript.internet.com/cookies/n-browser.html
 */
function getCookieVal(offset)
{
	var endstr = document.cookie.indexOf (";", offset);
	if (endstr == -1) {endstr = document.cookie.length;}
	return unescape(document.cookie.substring(offset, endstr));
}

function GetCookie (name)
{
	var arg = name + "=";
	var alen = arg.length;
	var clen = document.cookie.length;
	var i = 0;
	while (i < clen)
	{
		var j = i + alen;
		if (document.cookie.substring(i, j) == arg) {return getCookieVal (j);}
		i = document.cookie.indexOf(" ", i) + 1;
		if (i == 0) {break;}
	}
	return null;
}

function SetCookie (name, value)
{
	var argv = SetCookie.arguments;
	var argc = SetCookie.arguments.length;
	var expires = (argc > 2) ? argv[2] : new Date(2999,12); // RF Set to never expire be default.
	var path = (argc > 3) ? argv[3] : null;
	var domain = (argc > 4) ? argv[4] : null;
	var secure = (argc > 5) ? argv[5] : false;
	document.cookie = name + "=" + escape (value) + ((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
		((path == null) ? "" : ("; path=" + path)) + ((domain == null) ? "" : ("; domain=" + domain)) +
		((secure == true) ? "; secure" : "");
}

function DeleteCookie(name)
{
    SetCookie(name,'',new Date(2000,1,1));
}



function MatchHeights(listid,containerid,matchid)
{
	var list=document.getElementById(listid);
	var container=document.getElementById(containerid);
	var match=document.getElementById(matchid);
	if(!list||!container||!match) {return;}
	for(list.size=0;container.offsetHeight<match.offsetHeight;list.size++){;}
	if (list.size > 0) {list.size--;}
	container.style.height=match.offsetHeight+'px';
}

function URLEncode(url)
{
	var chars=[[/\+/g,'%2B'],[/\"/g,'%22'],[/\'/g, '%27'],[/\//g,'%2F']];
	for(n=0;n<chars.length;n++) {url=url.replace(chars[n][0],chars[n][1]);}
	return escape(url).replace(/\+/g,'%20');
}

function HtmlEncode(text)
{
    var chars=[[/&/g,'&amp;'],[/</g,'&lt;'],[/>/g,'&gt;'],[/"/g,'&quot;']];
	for(n=0;n<chars.length;n++) {
		text=text.replace(chars[n][0],chars[n][1]);
	}
	return text;
}

function HtmlDecode(text)
{
    var chars=[[/&lt;/g,'<'],[/&gt;/g,'>'],[/&quot;/g,'"'],[/&amp;/g,'&']];
	for(n=0;n<chars.length;n++) {
		text=text.replace(chars[n][0],chars[n][1]);
	}
	return text;
}

//Cache <select> <option> values and texts in a tab-separated list in an <input type="hidden"> 
function CacheSelect(selectid,hiddenid,changefxn)
{
	var select=document.getElementById(selectid);
	var hidden=document.getElementById(hiddenid);
	if(!select||!hidden) {return;}

	if(select.options.length==0)
	{
		hidden.value="";
	}
    else
    {
	    var listitemvalues="";
	    var listitemtexts="";
	    var selected=-1;
	    for(var n=0;n<select.options.length;n++)
	    {
		    listitemvalues+=(n==0?'':'\t')+select.options[n].value;
		    listitemtexts+=(n==0?'':'\t')+select.options[n].text;
		    if(select.options[n].selected) {selected=n;}
	    }
	    hidden.value=listitemvalues+"\n"+selected+"\n"+listitemtexts+"\n"+selectid;
	}
	if(changefxn&&typeof changefxn=='function') {changefxn();}
}

//Restores <select> <option> values to a tab-separated list from an <input type="hidden"> 
function RestoreSelect(hiddenid)
{
	var hidden=document.getElementById(hiddenid);
	//window.alert(hidden.value.replace(/\n/g,"\\n\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t").replace(/ /g,"_"));
	if(!hidden||hidden.value=="") return;

	var data=hidden.value.replace(/\r/g,"").split("\n");
	
	var select=document.getElementById(data[3]);
	if(!select) return;

	var listitemvalues=data[0].split("\t");
	var listitemtexts=data[2].split("\t");
	var selected=data[1];
	var opt;
	for(var n=0;n<listitemvalues.length;n++)
	{
		if(listitemvalues[n]==''&&listitemtexts[n]=='') {continue;}
		opt=new Option(listitemtexts[n],listitemvalues[n],false,selected==n?true:false);
		select.options[n]=opt;
	}
}

function SetUpHiddenSelectSystem(hiddenid,outboxid,inboxid,addbtnid,removebtnid,clearbtnid,changefxn)
{
	addEvent(window,'load',function(){
		var hidden=document.getElementById(hiddenid)
		var outbox=document.getElementById(outboxid)
		var inbox=document.getElementById(inboxid)
		var addbtn=document.getElementById(addbtnid)
		var removebtn=document.getElementById(removebtnid)
		var clearbtn=document.getElementById(clearbtnid)
		if(!hidden||!outbox||!inbox) {return;}
		
		//Don't need to run changefxn() when the focus in the output box is changed
		/*addEvent(outbox,'change',function(){
			CacheSelect(outbox.id,hidden.id,changefxn);
		});*/
		
		var addfn=function(){
			switch(inbox.tagName.toLowerCase())
			{
				case 'select':
					if(inbox.selectedIndex==-1) {return;}
					
					var inopt=inbox.options[inbox.selectedIndex];
					for(var n=0;n<outbox.options.length;n++)
					{
						if(outbox.options[n].value==inbox.options[inbox.selectedIndex].value&&
							outbox.options[n].text==inbox.options[inbox.selectedIndex].text)
						{
							return;
						}
					}
					var outopt=new Option(inopt.text,inopt.value,false,true);
					outbox.options[outbox.options.length]=outopt;
					CacheSelect(outbox.id,hidden.id,changefxn);
				break;
				case 'input':
					if(inbox.value=='') {return;}
					
					for(var n=0;n<outbox.options.length;n++)
					{
						if(outbox.options[n].text==inbox.value)	{return;}
					}
					var outopt=new Option(inbox.value,'',false,true);
					outbox.options[outbox.options.length]=outopt;
					CacheSelect(outbox.id,hidden.id,changefxn);
				break;
			}
		};
		switch(inbox.tagName.toLowerCase())
		{
			case 'select':
				addEvent(inbox,'dblclick',addfn);
			break;
			case 'input':
				if(addbtn) addButton(inbox.id,addbtn.id);
			break;
		}
		if(addbtn) addEvent(addbtn,'click',addfn);
				
		if(removebtn)
		{
			addEvent(removebtn,'click',function(){
				if(outbox.selectedIndex==-1) {return;}
				
				outbox.options[outbox.selectedIndex++]=null;
				if(outbox.selectedIndex==-1) outbox.selectedIndex=outbox.options.length-1;
				CacheSelect(outbox.id,hidden.id,changefxn);
			});
		}
			
		if(clearbtn)
		{
			addEvent(clearbtn,'click',function(){
				outbox.options.length=0;
				CacheSelect(outbox.id,hidden.id,changefxn);
			});
		}

		RestoreSelect(hidden.id);
	});
}

function ShowObject(obj,numdisp,title)
{
	var display,count;

	if(!numdisp) {numdisp=20;}
	count=0;
	display=(title?title:obj)+"\n";
	for(n in obj)
	{
		display+="\n"+n+": "+obj[n];
		count++;
		if(count==numdisp)
		{
			alert(display);
			display=(title?title:obj)+"\n"
			count=0;
		}
	}
	alert(display);
}

window.QueryString=[];
urlParts=location.href.split('?')
if(urlParts.length>1)
{
	qs=urlParts[1].split('&');
	for(n in qs)
	{
		pair=qs[n].split('=');
		QueryString[pair[0].toLowerCase()]=pair[1];
	}
}

//Generic function to display an error when a Callback raises an exception
function callbackError(error,context)
{
    var report;
    
    report='Error: '+error;
    if(context) {report+='\n\nContext: '+context;}
    if(report.length>1000) {
		for(n=0;n<report.length;n+=1000) {alert(report.substring(n,n+1000));}
	}
    else alert(report);
}

//Classes for making it easier to modify OptGroup-based <select>s
function OptGroupSelect()
{
    this.options=new Array()
    
    this.writeToSelect=function(select,clear)
    {
        if(clear) {
			while(select.hasChildNodes()) {select.removeChild(select.firstChild);}
		}
        for(n=0;n<this.options.length;n++)
        {
            if(this.options[n].isGroup) {
				addOptGroup(select,this.options[n]);
			}
            else
            {
				addOption(select,this.options[n]);
			}
        }
    }
    
    function addOption(parent,option)
    {
        var opt=document.createElement('option');
        
        opt.setAttribute('value',option.value);
        opt.appendChild(document.createTextNode(option.text));
        if(option.selected) {opt.setAttribute('selected','true');}
        parent.appendChild(opt);
    }
    
    function addOptGroup(parent,optGroup)
    {
        var grp=document.createElement('optgroup');
        
        grp.setAttribute('label',optGroup.label);
        for(var n=0;n<optGroup.options.length;n++) {addOption(grp,optGroup.options[n]);}
        parent.appendChild(grp);
    }
}

function OptGroup(label)
{
    this.label=label;
    this.isGroup=true;
    this.options=new Array();
}

//Needs to have dom-drag included in the page for it to work
function DivWindow(mytitle,mycontent)
{
	var div = document.createElement("div");
	var iframe = document.createElement("iframe");
	var close = document.createElement("span");
	var title = document.createElement("h1");
	var text = document.createElement("div");

	close.innerHTML="X";
	text.className="Body";
	div.className="ShowHelp";
	div.scrollX=document.body.scrollLeft;
	div.scrollY=document.body.scrollTop;
	div.posX=200;
	div.posY=100;
	div.style.zIndex=1000;
	div.style.left=div.posX+div.scrollX+"px";
	div.style.top=div.posY+div.scrollY+"px";
	div.iframe=iframe;
	div.appendChild(close);
	div.appendChild(title);
	div.appendChild(text);
	div.style.display='none';
	document.body.appendChild(div);
	iframe.style.position="absolute";
	iframe.setAttribute("scrolling", "no");
	iframe.setAttribute("frameborder", "0");
	iframe.src="javascript:false;";
	iframe.style.display='none';
	document.body.appendChild(iframe);
	Drag.init(title, div);
	addEvent(title,'mousedown',function(){title.className="Drag";},false);
	addEvent(title,'mouseup',function(){title.className="";},false);
	div.onDrag=function(x,y)
	{
		div.posX=x-div.scrollX;
		div.posY=y-div.scrollY;
		iframe.style.left=div.offsetLeft+'px';
		iframe.style.top=div.offsetTop+'px';
	};
	if((navigator.userAgent.indexOf("MSIE")!=-1)||!window.XMLHttpRequest) addEvent(window,'scroll',function(){
		div.style.left=div.posX+document.body.scrollLeft;
		iframe.style.left=div.offsetLeft+'px';
		div.style.top=div.posY+document.body.scrollTop;
		iframe.style.top=div.offsetTop+'px';
		div.scrollX=document.body.scrollLeft;
		div.scrollY=document.body.scrollTop;
	},false);
	else
	{
		div.style.position="fixed";
		iframe.style.position="fixed";
	}
	addEvent(close,'click',function()
	{
		div.style.display='none';
        iframe.style.display='none';
	});
	
    this.title=mytitle;
    this.content=mycontent;
    this.show=function()
    {
		title.innerHTML=this.title;
		text.innerHTML=this.content;
        div.style.display='';
		iframe.style.zIndex=div.style.zIndex-1;
		iframe.style.left=div.offsetLeft+'px';
		iframe.style.top=div.offsetTop+'px';
		iframe.style.width=div.offsetWidth+'px';
		iframe.style.height=div.offsetHeight+'px';
        iframe.style.display='';
	};
}

function getEventTarget(e)
{
	if(window.event)
	{
		return event.srcElement;
	}
	else
	{
		return e.target;
	}
}

function getEventKeyCode(e)
{
    return (window.event?event:e).keyCode;
}

//Get value of selected item in a <SELECT>
function getSelectedValue(sel)
{
    return sel.options[sel.selectedIndex].value;
}

Array.prototype.indexOf=function(item)
{
    for(n=0;n<this.length;n++) {
		if(this[n]===item) {return n;}
	}
    return -1;
}

/*
addPrintLink function by Roger Johansson, www.456bereastreet.com
*/
function addPrintLink(ParentElementId,sLinkText)
{
	if (!document.getElementById(ParentElementId)) {return;} // Check that the target element actually exists
	if (!window.print) {return;} // Check that the browser supports window.print
	var ParentElement = document.getElementById(ParentElementId);
	var oLink = document.createElement('a');
	oLink.className = 'PrintLink'; // Give the link an id to allow styling
	oLink.href = '#'; // Make the link focusable for keyboard users
	oLink.appendChild(document.createTextNode(sLinkText));
	oLink.onclick = function() {window.print(); return false;} // Return false prevents the browser from following the link and jumping to the top of the page after printing
	ParentElement.appendChild(oLink);
}







//This needs to be the last line of JS in the file
if (typeof(PostLoadWebControlsJsFunctions) == Array) {
	for(var n = 0; n < PostLoadWebControlsJsFunctions.length; n++) {
		PostLoadWebControlsJsFunctions[n]();
	}
}