window.$ = function(id_name) {
	var e = document.getElementById(id_name);
	if ( e ) return e;
	e = document.getElementsByName(id_name);
	return e.length > 0 ? e[0] : null;
}

window.$$ = function(name) {
	return document.getElementsByName(name);
}

var MSys = {
	vertion: '1.2.1',
	list_separator: ' ',
	def: {	url:	'',
			method: 'POST',
			async: 	true,
			clearComment:	true,
			cache:	false,
			timeout: 60000,
			before:	'',
			after:	'',
			oncomplete: function() {return;},
			onfailure: function() {return;},
			parameters: {}
		},
		
	browser: {
		version: (navigator.userAgent.toLowerCase().match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
		safari: /webkit/.test(navigator.userAgent.toLowerCase()),
		opera: /opera/.test(navigator.userAgent.toLowerCase()),
		msie: /msie/.test(navigator.userAgent.toLowerCase()) && !/opera/.test(navigator.userAgent.toLowerCase()),
		mozilla: /mozilla/.test(navigator.userAgent.toLowerCase()) && !/(compatible|webkit)/.test(navigator.userAgent.toLowerCase())
	},
	
	clearForm: function(form, name_pattern) {
		var all = $(form).elements;
		for(var i = 0; i < all.length; i++) {
			var e = all.item(i);
			if ( e.name && e.name.search(name_pattern) > -1 && !e.disabled && (e.checked || /select|textarea/i.test(e.nodeName) || /text|password|file/i.test(e.type))) {
				if ( e.nodeName.toLowerCase() == "select" ) {
					e.selectedIndex = "";
				} else if (e.type != undefined) {
					if (e.checked) e.checked = false;
					else e.value = "";
				}
			}
		}
	},

	serialize: function(form) {
		var all = $(form).elements;
		var retArray = {};
		for(var i = 0; i < all.length; i++) {
			var e = all.item(i);
			if ( e.name && !e.disabled && (e.checked || /select|textarea/i.test(e.nodeName) || /text|hidden|password|file/i.test(e.type))) {
				var value = this.val(e);
				if (value != "") {
					retArray[e.name] = retArray[e.name] ? retArray[e.name] + this.list_separator + value : value;
				} else {
					retArray[e.name] = retArray[e.name] ? retArray[e.name] : "";
				}
			}
		}
		return retArray;
	},
	
	serializeArray: function(arr) {
		var retVal = '';
		for( var _element in arr ) {
			retVal += _element + '=' + encodeURIComponent(arr[_element]) + '&';
		}
		return retVal;
	},
	
	create: function() {
		try {
			var xml = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
		} catch(e) {return null;}
		return xml;
	},
	
	evalScript: function(str) {
		var scriptTagPattern = new RegExp("(<script(.|\s|\r|\n)*?\/script>)","gi");
		var scriptSrcPattern =  new RegExp("<script[^>]+src=['\"](.*)['\"][^>]*>", "i");

		while (arrMatch = scriptTagPattern.exec( str )){
			try {
				if ( srcMatch = scriptSrcPattern.exec(arrMatch[1]) ) {
					var head = document.getElementsByTagName("head")[0];
					var script = document.createElement("script");
					script.src = srcMatch[1];
					head.appendChild(script);
				} else {
					this.globalEval(arrMatch[1]);
				}
			} catch(e) {}
		}
	},
	
	globalEval: function( data ) {
		var scriptContentPattern = new RegExp("<script[^>]*>((.|\s|\r|\n)*)<\/script>", "i");

		data = scriptContentPattern.exec(data)[1];
		if ( data ) {
			if ( window.execScript )
				window.execScript( data );
			else if ( this.browser.safari )
				// safari doesn't provide a synchronous global eval
				window.setTimeout( data, 0 );
			else
				eval.call( window, data );
		}
	},
	
	response: "",
	session_stack: new Array(),
	
	update: function(container, data) {
		var curData = new Array();
		for( var _element in this.def ) curData[_element] = this.def[_element];

		for( var _element in data ) curData[_element] = data[_element];

		var session = this.create();
		
		if (session != null) {
			if (container != null) {
				var unique_session_id = new Date().getTime();
				var temp = new Array(3); temp[0] = unique_session_id;	temp[1] = container; temp[2] = true;
				this.session_stack.push(temp);
				for (var i=0; i < this.session_stack.length ; i++) {
					if (this.session_stack[i][1] == container && this.session_stack[i][0] != unique_session_id) {
						this.session_stack[i][2] = false;
					}
				}
			}
			var sessionTimer = setTimeout(function() { session.abort(); curData.onfailure.call(); }, curData.timeout);
			session.onreadystatechange=function(){
				for (var i=0; container != null && i < MSys.session_stack.length; i++) {
					if (MSys.session_stack[i][0] == unique_session_id && !MSys.session_stack[i][2]) {
						MSys.session_stack.splice(i, 1);
						session.abort();
						return;
					}
				}
				if (session.readyState == 4 && (window.location.href.indexOf("http")==-1 || session.status==200)) {
					clearTimeout(sessionTimer);
					for (var i=0; container != null && i < MSys.session_stack.length ; i++) {
						if (MSys.session_stack[i][0] == unique_session_id) {
							MSys.session_stack.splice(i, 1);
							break;
						}
					}
					if (container != null) $(container).innerHTML = curData.before + session.responseText.replace(/<script(.|\s)*?\/script>/g, "") + curData.after;
					MSys.response = session.responseText;
					MSys.evalScript(MSys.response);
					if (curData.clearComment == true) MSys.response = MSys.response.replace(/<!--((.|\n|\r)*?-->(\n|\r)*)/g,"");
					curData.oncomplete.call();
				} else if (session.readyState == 4) {
					clearTimeout(sessionTimer);
					curData.onfailure.call();
				}
			}
			if (curData.method.toUpperCase() == 'GET') {
				curData.url += (curData.url.search(/\?/)>-1 ? (curData.url.search(/&$/)>-1 ? '':'&'):'?')
					+ this.serializeArray(curData.parameters)
					+ ( curData.cache ? 'timeStampCache='+(new Date()).getTime() : '');
			}
			session.open(curData.method, curData.url, curData.async);
			session.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			session.setRequestHeader("X-Requested-With", "XMLHttpRequest");
			if ( curData.method.toUpperCase() == 'GET' ) session.send(null);
			else session.send(this.serializeArray(curData.parameters));
			
		}
	},

	getResponse: function(data) {
		this.update(null, data);
	},

	val: function( elem ) {
		if ( !elem.nodeName && elem.length )	{	
			for (var i = 0; i < elem.length ; i++ ) {
				if ( elem[i].checked )
					return elem[i].value.replace(/\r/g, "");
			}
			return "";
		} else if ( elem.nodeName.toLowerCase() == "select" ) {
			var index = elem.selectedIndex,
				a = [],
				options = elem.options,
				one = elem.type.toLowerCase() == "select-one";
			
			// Nothing was selected
			if ( index < 0 )
				return "";

			// Loop through all the selected options
			for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
				var option = options[i];
				if ( option.selected ) {
					// Get the specifc value for the option
					var val = this.browser.msie && !option.attributes["value"].specified ? option.text : option.value;
					
					// We don't need an array for one selects
					if ( one )
						return val;
					
					// Multi-Selects return an array
					a.push(val);
				}
			}
			
			return a;
			
		// Everything else, we just grab the value
		} else if (elem.type != undefined) {
			return elem.value.replace(/\r/g, "");
		} else return "";
	}

}

	// Some common format strings
	var masks = {
		"default":       "ddd mmm d yyyy HH:MM:ss",
		shortDate:       "m/d/yy",
		mediumDate:      "mmm d, yyyy",
		longDate:        "mmmm d, yyyy",
		fullDate:        "dddd, mmmm d, yyyy",
		shortTime:       "h:MM TT",
		mediumTime:      "h:MM:ss TT",
		longTime:        "h:MM:ss TT Z",
		isoDate:         "yyyy-mm-dd",
		isoTime:         "HH:MM:ss",
		isoDateTime:     "yyyy-mm-dd'T'HH:MM:ss",
		isoFullDateTime: "yyyy-mm-dd'T'HH:MM:ss.lo"
	};
	
	var serverClientTimeDiff;
	var dayNames;
	var monthNames; 
	var timeZoneDisplayName;
	var rawOffset;
	var requiredMask;
	var requiredTimeMask;
	
	function initDateTime(dNames, mNames, tzDisplayName, serverTime, rOffset, rMask, tMask ){
		var clientTime = new Date().getTime();
		serverClientTimeDiff = serverTime - clientTime;
		
		dayNames = dNames;
		monthNames = mNames;
		timeZoneDisplayName = tzDisplayName;
		rawOffset = rOffset;
		requiredMask = rMask;
		requiredTimeMask = tMask;
		fillCurrentDateTime();
	}
	
	
	/*
		Date Format 1.1
		(c) 2007 Steven Levithan <stevenlevithan.com>
		MIT license
		With code by Scott Trenda (Z and o flags, and enhanced brevity)
	*/
	
	/*** dateFormat
		Accepts a date, a mask, or a date and a mask.
		Returns a formatted version of the given date.
		The date defaults to the current date/time.
		The mask defaults ``"ddd mmm d yyyy HH:MM:ss"``.
	*/
	
	function pad() {
		var value = String(arguments[0]);
		var length = 2;
		 if(typeof(arguments[1])!="undefined"){ 
			length=arguments[1]; 
		 }
		length = parseInt(length) || 2;
		while (value.length < length)
			value = "0" + value;
		return value;
	}
			
	function result(date, mask) {
		var	token        = /x|d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloZ]|"[^"]*"|'[^']*'/g;
		var	timezone     = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g;
		var	timezoneClip = /[^-+\dA-Z]/g;
		
		
		// Treat the first argument as a mask if it doesn't contain any numbers
		
		if ((result.arguments.length == 1) && ((typeof date == "string")) && (!/\d/.test(date))) {
			mask = date;
			date = undefined;
		}
 
		date = date ? new Date(date) : new Date();
		if (isNaN(date))
			throw "invalid date";

		var dF = dateFormat;
		mask   = String(masks[mask] || mask || masks["default"]);

		var	d = date.getDate(),
			D = date.getDay(),
			m = date.getMonth(),
			y = date.getFullYear(),
			H = date.getHours(),
			M = date.getMinutes(),
			s = date.getSeconds(),
			L = date.getMilliseconds(),
			o = date.getTimezoneOffset(),
			flags = {
				d:    d,
				dd:   pad(d),
				ddd:  dayNames[D],
				dddd: dayNames[D + 7],
				m:    m + 1,
				mm:   pad(m + 1),
				mmm:  monthNames[m],
				mmmm: monthNames[m + 12],
				yy:   String(y).slice(2),
				yyyy: y,
				h:    H % 12 || 12,
				hh:   pad(H % 12 || 12),
				H:    H,
				HH:   pad(H),
				M:    M,
				MM:   pad(M),
				s:    s,
				ss:   pad(s),
				l:    pad(L, 3),
				L:    pad(L > 99 ? Math.round(L / 10) : L),
				t:    H < 12 ? "a"  : "p",
				tt:   H < 12 ? "am" : "pm",
				T:    H < 12 ? "A"  : "P",
				TT:   H < 12 ? "AM" : "PM",
				Z:    timeZoneDisplayName,
				// o:    (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4)
				o:    (o > 0 ? "-" : "+") + Math.floor(Math.abs(o) / 60) + "." + pad(Math.abs(o) % 60, 2),
				x:   "&nbsp;&nbsp;&nbsp;"
			};

		return mask.replace(token, function ($0) {
			return ($0 in flags) ? flags[$0] : $0.slice(1, $0.length - 1);
		});
	};
	
	function dateFormat(){
	// var dateFormat = function () {
		var a=dateFormat.arguments;
		
		xpad = pad('1');
		
		// Regexes and supporting functions are cached through closure
		return result(a[0], a[1]);
	};
	
	
	
	// For convenience...
	Date.prototype.format = function (mask) {
		return dateFormat(this, mask);
	}

	function ChangeTimezone(localTime, TimezoneOffset){		
		var ms = localTime.getTime() 
			+ (localTime.getTimezoneOffset() * 60000)
			+ TimezoneOffset
		var time =  new Date(ms) 
		
		return time;
		
	}

	function fillCurrentDateTime(){
		
		var currentClientTime = new Date().getTime();
		var currentTime = currentClientTime + serverClientTimeDiff;
		var currentDate = ChangeTimezone(new Date(currentTime), rawOffset);
		
		if (document.getElementById('dateTime') != null){
			 document.getElementById('dateTime').innerHTML=dateFormat(currentDate, requiredMask);			 		
			//document.getElementById('dateTime').innerHTML=currentDate;			 		
		}
		if (document.getElementById('date') != null){
			 document.getElementById('date').innerHTML=dateFormat(currentDate, requiredMask);			 		
			//document.getElementById('dateTime').innerHTML=currentDate;			 		
		}
		if (document.getElementById('time') != null){
			 document.getElementById('time').innerHTML=dateFormat(currentDate, requiredTimeMask);			 		
			//document.getElementById('dateTime').innerHTML=currentDate;			 		
		}
		setTimeout('fillCurrentDateTime()' ,1000);
	}
	
/************************/	
/* rc_cookies functions */
/************************/
	function createCookie(name,value,days) {
		if (days) {
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
		}
		else var expires = "";
		document.cookie = name+"="+value+expires+"; path=/";
	}

	function readCookie(name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return null;
	}
	function eraseCookie(name) {
		createCookie(name,"",-1);
	}

/***************************/
/* Accessibility functions */	
/***************************/
// uses funcions from rc_cookies.js !!

	var accessibilityCheckCssClasses = new Array("MainTitleMenuCell","MainTitleMenuCellSelected", "SecondaryTitleMenuCell", "SecondaryTitleMenuCellSelected",
												 "UpperSecondaryMenuSubItemSingleSelected", "UpperMainMenuSubItemSingleSelected", "UpperSecondaryMenuSubItemLastSelected", "UpperMainMenuSubItemLastSelected",
												 "UpperSecondaryMenuSubItemFirstSelected", "UpperMainMenuSubItemFirstSelected", "UpperSecondaryMenuSubItemSelected", "UpperMainMenuSubItemSelected",
												 "UpperSecondaryMenuSubItemSingle", "UpperMainMenuSubItemSingle", "UpperSecondaryMenuSubItemLast", "UpperMainMenuSubItemLast",
												 "UpperSecondaryMenuSubItemFirst", "UpperMainMenuSubItemFirst", "UpperSecondaryMenuSubItem", "UpperMainMenuSubItem");

	// set the menu colors, regular color or special colors for accessibility.
	function getMenuColorsClass(originalClass){
		//var isAccesability = isAccessibilityRequired();
		var isAccesability = isAccessibilityRequired();
		// if there is no need for an accesability class, return the basic css class.
		if (!isAccesability){
			return originalClass;
		}
		
		// if the css class is a class that requires a change, 
		// change to accesability option by adding the postfix.
		for (var i=0;i<accessibilityCheckCssClasses.length;i++){
			if (originalClass==accessibilityCheckCssClasses[i]){
				return originalClass+"_accessibilityColors";
			}
		}
				
		return originalClass;
			
	}
	
	function gridAccessibilityInit(){
		// if required to change to accessibility colors
		if (isAccessibilityRequired()){
			var all = document.getElementsByTagName('div');
			for (var i=0; i<all.length; i++)
			{
				// for each div in the document, check if it is a CI title
				if (all[i].id == "CItitle"){
					titleClass = all[i].className;
					
					// set or add the accessibility colors CSS class to the title tag
					if (titleClass != undefined){
						all[i].className = titleClass+" accessibilityTitleColor";
					} else {
						all[i].className = "accessibilityTitleColor";
					}
				}
			}
		}
	}
	
	function isAccessibilityRequired(){
		return false;
		//var accesabilityValue = readCookie("accessibility");
		//if (accesabilityValue == null || accesabilityValue == "false")
		//	return false;
		//return true;
	}
	
	function setAccessibilityCookie(value){
		createCookie("accessibility", value, "1");
	}
	
	// get the current size
	function getProperty(el, cssproperty, csspropertyNS){
		if (el.currentStyle){ //explorer
			return el.currentStyle[cssproperty];
		}
		else if (window.getComputedStyle){//firefox
			var elstyle=window.getComputedStyle(el, "");
		}
		return elstyle.getPropertyValue(csspropertyNS);
	}
	
	// change font size by num (positive or negative integer)
	function changefontsize(num){
	    var e=document.getElementById('contentArea');
	    var children =e.getElementsByTagName('*');
	    for(var i=0;i<children.length;i++){
		    if( children[i].getAttribute("resize") != "false" ) {
				if (children[i].style.fontSize == ''){
					size = getProperty(children[i],"fontSize","font-size");
					lineSize = getProperty(children[i],"lineHeight","line-height");
			 		if (size=="xx-small")
						size="10px";
					else if (size=="x-small")
						size="13px";
					else if (size=="small")
						size="16px";
					else if (size=="medium")
						size="18px";
					else if (size=="large")
						size="24px";
					else if (size=="x-large")
						size="32px";
					else if (size=="xx-large")
						size="47px";
			 		if (lineSize=="xx-small")
						lineSize="10px";
					else if (lineSize=="x-small")
						lineSize="13px";
					else if (lineSize=="small")
						lineSize="16px";
					else if (lineSize=="medium")
						lineSize="18px";
					else if (lineSize=="large")
						lineSize="24px";
					else if (lineSize=="x-large")
						lineSize="32px";
					else if (lineSize=="xx-large")
						lineSize="47px";
					else if (lineSize=="normal"){
						lineSize=parseInt(size.replace("px",""))+5+"px"; 
					}
			  		children[i].style.fontSize = parseInt(size.replace("px","").replace("pt",""), 10)+"px";
			  		children[i].style.lineHeight = parseInt(lineSize.replace("px","").replace("pt",""), 10)+"px";
				}
				if (children[i].getAttribute("orgSize") == null){
					children[i].setAttribute("orgSize", children[i].style.fontSize);
					if (checkStaticTagList(children[i])) children[i].style.position = "static";
					else children[i].style.position = "relative";
					if (children[i].tagName.toLowerCase() == "div" 
						&& MSys.browser.msie && children[i].innerHTML.length > 0) children[i].style.zoom = "1";
				}
				children[i].setAttribute("currSize", children[i].style.fontSize);
				children[i].setAttribute("currLineHeight", children[i].style.lineHeight);
			}
		}
		for(var i=0;i<children.length;i++){
			if( children[i].getAttribute("resize") != "false" ) {
				changefontsize2(children[i],num);
			}
		}
		var currSizeEnlarge = parseInt(readCookie("font_size_enlarge"), 10);
		if (isNaN(currSizeEnlarge)){
			currSizeEnlarge=0;
		}
		currSizeEnlarge = currSizeEnlarge + num;
		createCookie("font_size_enlarge", currSizeEnlarge, 1 );
	}
	function checkStaticTagList(elm) {
		var staticTagList = "-strong-span-br-font-caption-img-";
		
		if ( staticTagList.indexOf( "-"+elm.tagName.toLowerCase()+"-" )>-1 ) {
			return true;
		} else if (elm.tagName.toLowerCase() == "a" || elm.tagName.toLowerCase() == "b") {
			var inner = elm.getElementsByTagName('*');
			for (var i=0; i<inner.length; i++) {
				if (!checkStaticTagList(inner[i])) return false;
			}
			return true;
		} else if (elm.tagName.toLowerCase() == "div" || elm.tagName.toLowerCase() == "p" || elm.tagName.toLowerCase() == "li") {
			var inner = elm.getElementsByTagName('*');
			for (var i=0; i<inner.length; i++) {
				if (checkStaticTagList(inner[i])) return true;
			}
			return false;
		} else{
			return false;
		}
	}
	
	// change font size by num, of a specific element 
	function changefontsize2(elementId,num) {

		function calculateFSize(obj,defsize,change,minsize,maxsize) {
			var fontsize = parseInt(obj.getAttribute("currSize").replace("px",""), 10);
			fontsize = change + (isNaN(fontsize) ? defsize : fontsize);
			var linesize = parseInt(obj.getAttribute("currLineHeight").replace("px",""), 10);
			linesize = change + (isNaN(linesize) ? defsize : linesize);
			if (change<0){// && fontsize>minsize){
				var orgSize = parseInt(obj.getAttribute("orgSize").replace("px",""), 10);
				if (linesize>0 && fontsize>0 && fontsize>=orgSize-2){ //let the size also to be reduced from the original size 
					obj.style.fontSize = fontsize + 'px';
					obj.style.lineHeight = linesize + 'px';
				}
			}
			if (change>0 && fontsize<maxsize){
				obj.style.fontSize = fontsize + 'px';
				obj.style.lineHeight = linesize + 'px';
			}
		}
		
		calculateFSize(elementId,15,num,10,30);
	}
	