function navback()
{
	document.location.href = pagedata.path_back;
}			

var _dlgAlert;			
function initAlertDlg()
{
	_dlgAlert = new YAHOO.widget.Dialog("_dlgAlert", { 
		modal:true, 
		close:true,
		visible:false, 
		draggable:true, 			
		fixedcenter:true, 
		constraintoviewport:true,
		width:300	 
	});
	var _dlgAlertListeners = new YAHOO.util.KeyListener(document, { keys : 27 }, {fn:function(){_dlgAlert.hide();}} );
	_dlgAlert.cfg.queueProperty("keylisteners", _dlgAlertListeners);
	_dlgAlert.cfg.queueProperty("buttons", [ { text:pagedata.text_ok, handler:function(){_dlgAlert.hide();}, isDefault:true} ]);
	_dlgAlert.render();	
	
	//look for a default Search button on the page, attach the Enter key to it;
	var btnDefault = document.getElementById('btnSearch');
	if(!btnDefault) btnDefault = document.getElementById('btnSearch_btn');
	if(btnDefault)
	{
		var enterAction = new YAHOO.util.KeyListener(document, { keys : 13 }, function(){btnDefault.click();});	
		enterAction.enable();
		
		btnDefault.focus();					
	}
	
	if(pagedata.text_pageloaderr != '') alertDlg('<span class="SectionText-Error">'+pagedata.text_pageloaderr+'</span>');

}
						
var _pollProcessId = null;
function setPolling()
{
	if(pagedata.poll_interval > 0)
	{
		_pollProcessId = setTimeout(pollServer, pagedata.poll_nextpoll);
		
		var msgCount = pagedata.msg_count; 
		var ancCount = pagedata.anc_count; 
		
		if(msgCount != "") setLinkCount('lnkNavMesg',msgCount);
		if(ancCount != "") setLinkCount('lnkNavAnnc',ancCount);
	}
}
			
function pollServer()
{			
	var callback =
	{	
		success: pollServerSuccess,
		failure: pollServerFailure,
		argument: []
	};
									
	try
	{
	var request = YAHOO.util.Connect.asyncRequest('GET', pagedata.path_base + 'ws/serverpoll.aspx', callback, null);
	
	if(_pollProcessId) clearTimeout(_pollProcessId);
	_pollProcessId = setTimeout(pollServer, pagedata.poll_interval);				
	}
	catch(e) {}
}

function pollServerSuccess(o)
{
	var err = o.responseXML.documentElement.attributes.getNamedItem("error").value;				
	if(err != "") 
	{
		if(err == "INVALID_SESSION")
		{
			document.location.href = pagedata.path_base + 'error_session.aspx';
		}
		else if(err.indexOf('SYSTEM_MESSAGE:') == 0)
		{
		    alertDlg(err.substr(15));
		}
		else if(err.indexOf('SYSTEM_REDIRECT:') == 0)
		{
		    var redirURL = err.substr(16);
		    
		    //prevent DOM based XSS attack, redirection target should be a plain URL, no scripting characters or querystring args.
		    if (redirURL.match(/^[Hh][Tt][Tt][Pp]:\/\/[\d\w\/\.]+$/))
		    {
		        document.location.href = redirURL;
		    }
		}
		return false;
	}

	var msgCount = 0;
	var ancCount = 0;
	
	//result/UserData/[Data @Name="NewAnnouncements" Value="1"][Data @Name="NewAnnouncements" Value="1"] ;
	var userData = o.responseXML.documentElement.childNodes[0].childNodes[0];
	
	var xndAnc = searchXmlNodeList(userData.childNodes, 'Data', 'Name', 'NewAnnouncements');
	var xndMsg = searchXmlNodeList(userData.childNodes, 'Data', 'Name', 'NewMessages');
	
	if(xndAnc)
	{
		ancCount = xndAnc.attributes.getNamedItem('Value').value;
	}
	
	if(xndMsg)
	{
		msgCount = xndMsg.attributes.getNamedItem('Value').value;
	}
	
	setLinkCount('lnkNavMesg',msgCount);
	setLinkCount('lnkNavAnnc',ancCount);
}

function pollServerFailure(o)
{}

function alertDlg(ttl,msg)
{
	if(!msg)
	{
		msg = ttl;
		ttl = pagedata.text_error; 
		try
		{
			ttl = document.getElementById('objBodyHeader_divBodyTitle').innerHTML;
		}
		catch(err)
		{
		
		}
	}
	
	try
	{
		var ttlDiv = document.getElementById('_dlgAlert_ttl');
		var msgDiv = document.getElementById('_dlgAlert_msg');
		
		ttlDiv.innerHTML = ttl;
		msgDiv.innerHTML = msg;
		_dlgAlert.show();
	}
	catch(err)
	{
		alert(msg);
	}
}			

function transferForm(target)
{
    //prevent window scrolling from the href="#" attribute
    var e = this.event || this || window.event;
    if (e) {
        if (e.preventDefault) {
            e.preventDefault();
        } else {
            e.returnValue = false;
        }    
    }
    
	var tgt = target;
	var win = '';
	
	//if target has a comma in it, then it's targetPage, targetWindow
	if(target.indexOf(',') > 0)
	{
		tgt = target.split(',')[0];
		win = target.split(',')[1];										
	}				
	document.forms[0].action = tgt;
	if(win != '') 
		document.forms[0].target = win;
	else
		document.forms[0].target = "";
	
	//if any arguments are supplied after the target, 
	//they should be name/value pairs to be set into hidden variables, 
	//which will be created if they don't already exist in the document
	for (i=1; i<arguments.length; i+=2)
	{
		if(arguments[i])// && arguments[i+1]) : changed; arg name required, but arg val can be blank
		{
			//does the input element already exist?						
			var els = document.getElementsByTagName('input');
			var arg = null;
			for(var j=0; j<els.length; j++)
			{
				if(els[j].name == arguments[i])
				{
					arg = els[j];
					break;
				} 
			}
			
			if(arg == null) 
			{							
				arg = document.createElement("input");											
				arg.setAttribute("name",arguments[i]);
				arg.setAttribute("type","hidden");								
				arg.style["display"] = "none";
				document.forms[0].appendChild(arg);	
			}
			arg.value = arguments[i+1];
		}
	}
	document.forms[0].submit();
}
			
//usage example, for numeric entry only: <input type="text" onKeyPress="filterKeys(event,'0123456789');">
var lastKeyDownCode;
function filterKeys(e,filter) {
	if(!e) e = window.event;				
	if(e.keyCode) code = e.keyCode;
	else if (e.which) code = e.which;

	if(e.type == 'keydown')
	{
		//save keycode for use in keypress event
		lastKeyDownCode = code;
		return;
	}	
	//always allow control keys (tab, backspace, return, left, right, up, down, del, insert, pgup, pgdn, home, end, esc)				
	//NOTE: Removed keycode 45 (insert) because it's also they hypen character. Always allowing insert means you can't restrict the hyphen key :(
	if(lastKeyDownCode == 8 || lastKeyDownCode == 9 || lastKeyDownCode == 13) return true;
	if(lastKeyDownCode >= 33 && lastKeyDownCode <=40) return true;
	//if(lastKeyDownCode == 45 || lastKeyDownCode == 46) return true;
	if(lastKeyDownCode == 46) return true;
	
	if(code == 8 || code == 9 || code == 13) return true;
	if(code >= 33 && code <=40) return true;
	//if(code == 45 || code == 46) return true;				
	if(code == 46) return true;				
	
	var keychar = String.fromCharCode(code);												
	if (filter.indexOf(keychar) >= 0) {
		return true
	} else {
		//throw the book at it
		e.returnValue = false;
		e.cancel = true;
		if(e.stopPropagation) e.stopPropagation();
		if(e.preventDefault) e.preventDefault();
		return false;
	}
}
	
function filterText(ctl, filter)
{	
	var txt1 = ctl.value;
	var txt2 = '';
	for(i=0;i<txt1.length;i++)
	{			
		if(filter.indexOf(txt1.substr(i,1))>-1) txt2+=txt1.substr(i,1);
	}
	if(txt2 != txt1) 
	{
		ctl.value = txt2;
		return false;
	}
}		
	
function popup(url, name, width, height) {
	//Determine whether Netscape is being used
	var agt = navigator.userAgent.toLowerCase();
	var isNav = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1) &&
								(agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1) &&
								(agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1));
	
	//Get the window position on the monitor
	var x, y, w, h;
	if (isNav) {
		x = window.screenX;
		y = window.screenY;
		w = window.innerWidth;
		h = window.innerHeight;
	} else {
		x = window.screenLeft;
		y = window.screenTop;
		w = document.body.clientWidth;
		h = document.body.clientHeight;
	}
	
	//Calculate the position for the new window in relation to the calling window
	var newX, newY;
	newX = Math.round(x + (w / 2) - (width / 2));
	if (isNav)
		newY = Math.round(y + (h / 2) - (height / 2) + 60);
	else
		newY = Math.round(y + (h / 2) - (height / 2) - 60);
	
	//Set the new window's parameters
	var parameters
	parameters += "fullscreen=no,";
	parameters += "toolbar=no,";
	parameters += "status=no,";
	parameters += "menubar=no,";
	parameters += "scrollbars=yes,";
	parameters += "resizable=yes,";
	parameters += "directories=no,";
	parameters += "location=no,";
	parameters += "width="+width+",";
	parameters += "height="+height+",";
	parameters += "screenx="+newX+",";
	parameters += "screeny="+newY+",";
	parameters += "left="+newX+",";
	parameters += "top="+newY+"";

	if(name=="")
	{
		name = "popup" + Math.round(Math.random()*101);
	}

	//Open the new window
	eval("var objWindow = document."+name+";");
	if ((typeof(objWindow) == 'object') && (!objWindow.closed))
	{
		objWindow.location.href=url;
		objWindow.focus();
	}
	else
		eval("document."+name+" = window.open(url, name, parameters);");
}

function checkComError(xml)
{			
	var err = xml.documentElement.attributes.getNamedItem("error").value;
	if(err == "") return false;
	
	alertDlg(err);
	return true;
}

function extractMarkup(text)
{
	if(text.indexOf("<![CDATA[") == 0)
	{
		text = text.substr(9);
		text = text.substr(0, text.length - 3);
	}
	return text;
}

function setLinkCount(linkid,count)
{
	var lnk = document.getElementById(linkid);
	if(lnk)
	{
		var txt = lnk.innerHTML;
		var p1 = txt.toUpperCase().indexOf(' <B>(');		
		if(p1 > 0)
		{
			txt = txt.substr(0,p1)		
		}				
		if(count > 0)
		{
			txt += ' <b>(' + count + ')</b>';
		}
		lnk.innerHTML = txt;
	}
}

function searchXmlNodeList(nodeList, nodeName, attributeName, attributeValue)
{
	for(var i=0; i<nodeList.length; i++)
	{
		var xnd = nodeList[i];
		if(nodeName == '*' || nodeName == '' || xnd.nodeName == nodeName)
		{
			if(!attributeName) return xnd;
			
			if(attributeName == '*' || attributeName == '' || xnd.attributes.getNamedItem(attributeName))
			{				
				if(!attributeValue || attributeValue == '*' || attributeValue == '' || xnd.attributes.getNamedItem(attributeName).value == attributeValue)
				{
					return xnd;
				}
			}
		}
	}
}

function searchXml(parentNode, nodeName, attributeName, attributeValue)
{
    var match = searchXmlNodeList(parentNode.childNodes, nodeName, attributeName, attributeValue);    
    if(!match)
    {
        for(var child = 0; child < parentNode.childNodes.length; child++)
        {
            var match = searchXml(parentNode.childNodes[child], nodeName, attributeName, attributeValue);
            if(match)
            {
                break;
            }
        }
    }    
    return match;    
}

function docWrite(html)
{
	document.write(html);
}

function toggleSideNav(state)
{
    var bd = document.getElementById('bd');
    
    if(state=='on' || YAHOO.util.Dom.hasClass(bd, 'fullwidth'))
    {  
        YAHOO.util.Dom.removeClass(bd,'fullwidth');
        state = 'on';
    }
    else
    {
        YAHOO.util.Dom.addClass(bd,'fullwidth'); 
        state = 'off';     
    }
    var callback = {};
    var request = YAHOO.util.Connect.asyncRequest('GET', pagedata.path_base + 'user/account/account_view_server.aspx?do=tglnav&sidenav='+state, callback, null);
}

var ValidationObj = function(id, name, req, type, range, format) {

	var _id, _name, _req, _type, _range, _format;
	var _valMessage = [];
	
	_id = id;
	_name = name;
	_req = req;
	_type = type;
	_range = range;
	_format = format;
	
	this.IsValid = function()
	{
		var result = true;
		var element = document.getElementById(_id);
		
		var val = getvalue(element);
		
		//check required
		if(typeof(_req) == 'function') _req = req();
		if(_req && !val)
		{
			result =false;
			_valMessage.push(_name + ' is required.');			
			return result;
		}
		
		//check type
		var typecast = null;
		if(typeof(_type) == 'function') 
		{
			typecast = _type(val);
		}
		else
		{
			typecast = gettype(val, _type);
		}
		
		if(!typecast)
		{
			result = false;
			_valMessage.push(_name + ' does not appear to be a valid ' + _type);
			return result;
		}
		else
		{
			val = typecast;
		}
		
		var inrange = true;
		if(_range)
		{
			if(typeof(_range) == 'function')
			{
				inrange = _range(val);
			}
			else
			{
				inrange = checkrange(val, _range);
			}
		}
		
		if(!inrange)
		{
			result = false;
			_valMessage.push(_name + ' must be between ' + _range.min + ' and ' + _range.max);			
			return result;
		}		
		
		return result;
	}
	
	this.ValidationMessage = function(){return _valMessage.join('<br>');};
}

function checkrange(value, range)
{
	var result = true;
	if(range.min && (range.min > value)) result = false;
	if(range.max && (range.max < value)) result = false;
	return result;
}
	
function gettype(value, type)
{
	var istype = true;
	
	if(typeof(value) == type) return value;
	
	switch(type)
	{
		case "date":
			try
			{
				var	dt = new Date(value);
				
				if(!dt.getFullYear()) dt = null;
				
			}
			catch(e)
			{
				dt = null;
			}
			
			if(dt) 
			{
				return dt;
			}
			break;
		
		case "number":
			try
			{
				var n = new Number(value);
				if(!n >= Number.MIN_VALUE || !n <= Number.MAX_VALUE) n = null;
			}
			catch(e)
			{
				n = null;
			}
			
			if(n)
			{
				return n;
			}
			break;
		
		case "string":
			return value.toString();
			break;
	}
	return istype;
}	

function isdirty(element)
{
	var dirty = false;
	
	switch(element.type)
	{
		case 'text':
			if(element.value != element.defaultValue) dirty = true;
			break;
			
		case 'password':
			if(element.value != element.defaultValue) dirty = true;
			break;
			
		case 'textarea':
			if(element.value != element.defaultValue) dirty = true;
			break;	
							
		case 'checkbox':
			//see if there's more than one checkbox with this element name by checking the form
			//first, make sure we get the right form, in case there's more than one
			var form = null;			
			for(i=0;i<document.forms.length;i++)if(document.forms[i][element.name]){form = document.forms[i];break;}
			if(form && form[element.name].length)
			{
				for(i=0;i<form[element.name].length;i++)
				{
					el = form[element.name][i];
					if(el.checked != el.defaultChecked)
					{
						dirty = true;
						break;
					}
				}					
			}
			else //single checkbox
				if(element.checked != element.defaultChecked) dirty = true;
				
			break;
			
		case 'radio':
			if(element.checked != element.defaultChecked) dirty = true;							
			break;
			
		case 'select-one':
			for(i=0;i<element.options.length;i++)
			{
				if(element[i].defaultSelected != element[i].selected)
				{
					dirty = true;
					break;
				}
			}
			break;
			
		case 'select-multiple':
			for(i=0;i<element.options.length;i++)
			{
				if(element[i].defaultSelected != element[i].selected)
				{
					dirty = true;
					break;
				}
			}
			break;
			
	}
	return dirty;

}

function getvalue(element)
{
	switch(element.type)
	{
		case 'text':
			return element.value;
			break;
			
		case 'password':
			return element.value;
			break;
			
		case 'textarea':
			return element.value;
			break;	
							
		case 'checkbox':
			//see if there's more than one checkbox with this element name by checking the form
			//first, make sure we get the right form, in case there's more than one
			var form = null;
			var val = null;			
			for(i=0;i<document.forms.length;i++)if(document.forms[i][element.name]){form = document.forms[i];break;}
			if(form && form[element.name].length)
			{
				for(i=0;i<form[element.name].length;i++)
				{
					el = form[element.name][i];
					
					if(el.checked)
					{
						val = val == null ? el.value : val + ',' + el.value;						
					}
				}					
			}			
			else //single checkbox
				if(element.checked) val = el.value;
				
			return val;
			break;
			
		case 'radio':
			if(element.checked) return element.value;
			break;
			
		case 'select-one':
			for(i=0;i<element.options.length;i++)
			{
				if(element[i].selected) return element.value;
			}
			break;
			
		case 'select-multiple':
			var val = null;
			for(i=0;i<element.options.length;i++)
			{
				if(element[i].selected)
				{
					val = val == null ? element.value : val + ',' + element.value;					
				}
			}
			return val;
			break;
	}
}