

/** UTIL METHODS **/

/* shorthand getElementById, takes one ID or a list of IDs */
function $() {
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (typeof element == 'string')
			element = document.getElementById(element);
		if (arguments.length == 1)
			return element;
		elements.push(element);
	}
	return elements;
}
/***/

/* add leading zeros */
function pad(input,padchar,size) {
	var length = ("" + input).length;
	var prefix = "";
	for (var i=0; i < (size - length); i++) {
		prefix += padchar;
	}
	return prefix + input;
}
/***/


/* trim functions */
function leftTrim(input) {
	while (input.substring(0,1) == ' ') {
		input = input.substring(1);
	}
	return input;
}

function rightTrim(input) {
	while (input.substring(input.length-1) == ' ') {
		input = input.substring(0,input.length-1);
	}
	return input;
}

function trim(input) {
	return leftTrim(rightTrim(input));
}
/***/

/* substrings input string */
function truncate(input,length) {
	if (input.length < length) {
		return input;
	} else {
		return input.substring(0,length) + "...";
	}
}

function truncateToFullWords(input,length) {
	if (input.length < length) {
		return input;
	} else {
		// go 1 beyond the required length
		var temp = input.substring(0, length + 1);
		// chop off from the last space
		temp = temp.substring(0, temp.lastIndexOf(" "));
		return temp + "...";
	}
}
/***/

/* clears childNodes for given element */
function clear(ele) {
	if (ele && ele.childNodes) {
		while (ele.childNodes.length > 0) {
			ele.removeChild(ele.firstChild);
		}
	}
}
/***/

/* adds commas to numeric project stats */
function addCommas(nStr) {
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}
/***/

/* converts input string to URI-safe version */
function stringToURI(input) {
	if (! input) { return; }
	return input.replace(/[^a-zA-Z]/g, " ").replace(/ +/, " ").replace(/ /, "_");
}
/***/

/* standard show/hide */
var toggler = {
	show : function() {
//	alert('toggler.show'+arguments.length)
		for (var i=0; i < arguments.length; i++) {
			$(arguments[i]).style.display = 'block';
		}
	},
	hide : function() {
		for (var i=0; i < arguments.length; i++) {
			$(arguments[i]).style.display = 'none';
		}
	},
	toggle : function(e, els, index) {
		for ( var i=0; i < els.length; i++ ) {
				var element = $( els[i] );
				if(element.style.display == "undefined")
					element.style.display = YAHOO.util.Dom.getStyle(element.id, "display");
				if(index == i || this.number == i) {
					element.style.display = 'block';
				} else {
					element.style.display = 'none';
				}
		}
	},
	makeVisible : function() {
	//alert('makeVisible'); 
	
	
//alert(	$(arguments[i]).id);
		for (var i=0; i < arguments.length; i++) {
			$(arguments[i]).style.visibility = 'visible';
		}
	},
	hideVisible : function() {
		for (var i=0; i < arguments.length; i++) {
			$(arguments[i]).style.visibility = 'hidden';
		}
	}
};
/***/

// this function is needed to work around a bug in IE related to element attributes
function hasClass(obj) {
	var result = false;
	if (obj.getAttributeNode("class") != null) { result = obj.getAttributeNode("class").value; }
	return result;
}

/***/

/* assign mouseovers to all buttons following the _off and _on convention */
var imageHighLighter = {
	imgCache : new Array(),
	preCache : function(imgSrc){
		imageHighLighter.imgCache[imageHighLighter.imgCache.length] = new Image(); 
		imageHighLighter.imgCache[imageHighLighter.imgCache.length-1].src = imgSrc;
	},
	initialize : function(){
		var imgs = document.getElementsByTagName("img");
		for (var i=0; i < imgs.length; i++) {
			imageHighLighter.processImg(imgs[i]);
		}
		imgs = document.getElementsByTagName("input");
		for (var i=0; i < imgs.length; i++) {
			imageHighLighter.processInput(imgs[i]);
		}
		imgs = null;
		imageHighLighter.releaseReferences;
	},
	processImg : function(img){
		if (!img) return;
		if ( /_off/.test(img.src) ) {
			img.outSRC = img.src;
			img.overSRC = img.src.replace("_off","_on");
			imageHighLighter.preCache(img.overSRC);
			YAHOO.util.Event.addListener(img, "mouseover", imageHighLighter.basicOver);
			YAHOO.util.Event.addListener(img, "mouseout", imageHighLighter.basicOff);
		}
		if ( /blank.gif/.test(img.src) && /_off/.test(img.runtimeStyle.filter)) {
			img.outFilter = img.runtimeStyle.filter;
			img.overFilter = img.runtimeStyle.filter.replace("_off","_on");
			YAHOO.util.Event.addListener(img, "mouseover", imageHighLighter.filterOver);
			YAHOO.util.Event.addListener(img, "mouseout", imageHighLighter.filterOff);
		}
	},
	processInput : function(input){
		if (!input) return;
		if ( /_off/.test(input.src) ) {
			input.outSRC = input.src;
			input.overSRC = input.src.replace("_off","_on");
			imageHighLighter.preCache(input.overSRC);
			YAHOO.util.Event.addListener(input, "mouseover", imageHighLighter.basicOver);
			YAHOO.util.Event.addListener(input, "mouseout", imageHighLighter.basicOff);
		}
	},
	joinNodeLists: function(){
		var allItems = new Array();
		for(var i=0; list = arguments[i]; i++) {
			for(var j=0; j < list.length; j++){
				if(list[j].getAttribute("src") != null){
					allItems[j] = list[j];
				}
			}
		}
		return allItems;
	},
	releaseReferences : function(){
		imageHighLighter.imgCache = null;
	},
	basicOff : function(){
		this.src = this.outSRC;
	},
	basicOver : function(){
		this.src = this.overSRC;
	},
	basicOn : function(){
		this.src = this.onSRC;
	},
	filterOff : function(){
		this.runtimeStyle.filter = this.outFilter;
	},
	filterOver : function(){
		this.runtimeStyle.filter = this.overFilter;
	},
	filterOn : function(){
		this.runtimeStyle.filter = this.onFilter;
	},
	addOn : function(img){
		if (!img.src) { return; }
		var ext = img.src.substring(img.src.lastIndexOf("."));
		if (img.src.indexOf("_on" + ext) == -1) {
			img.src = img.src.replace(ext, "_on" + ext);
		}
	},
	removeOn : function(img){
		if (!img.src) { return; }
		var ext = img.src.substring(img.src.lastIndexOf("."));
		if (img.src.indexOf("_on" + ext) != -1) {
			img.src = img.src.replace("_on" + ext, ext);
		}
	}
};
/***/


/* control for message popups */
var popupMsgMgr = {
	timeoutValue : 500, // in ms
	layers : {},
	timeouts : {},
	show : function(e, layerID, anchor, elementCorner, contextCorner, timeoutOverride, diableMouseOver) {
		// clear all timeouts
		for (i in popupMsgMgr.timeouts) {
			clearTimeout(popupMsgMgr.timeouts[i]);
		}
		var currentLayer;
		// loop over all layers to hide sibling layers and find current layer
		for (i in popupMsgMgr.layers) {
			if (i == layerID) {
				currentLayer = popupMsgMgr.layers[i];
			} else {
				popupMsgMgr.layers[i].hide();
			}
		};
		if (currentLayer) {
			if (!currentLayer.visible) {
				currentLayer.show();
			}
		} else {
			// initalize this new overlay
			currentLayer = new YAHOO.widget.Overlay(layerID, {visible:true, zIndex:1000} );
			if (anchor) {
				if (typeof anchor == "object") {
					// assume we were passed an array for [x,y]
					currentLayer.cfg.setProperty("xy", anchor);
				} else if (typeof anchor == "string") {
					if (!elementCorner) { elementCorner = "bl"; }
					if (!contextCorner) { contextCorner = "tl"; }
					currentLayer.cfg.setProperty("context", [anchor, elementCorner, contextCorner]);
				}
			}
			currentLayer.render();
			popupMsgMgr.layers[layerID] = currentLayer;
			if (!diableMouseOver) {
				YAHOO.util.Event.addListener(layerID, "mouseover", function() { popupMsgMgr.show(null, layerID, anchor, elementCorner, contextCorner, timeoutOverride); });
				YAHOO.util.Event.addListener(layerID, "mouseout", function() { popupMsgMgr.hide(null, layerID, timeoutOverride); });
			}
		}
	},
	hide : function(e, layerID, timeoutOverride) {
		if (popupMsgMgr.layers[layerID]) {
			popupMsgMgr.timeouts[layerID] = setTimeout("popupMsgMgr.layers['"+layerID+"'].hide();", ((timeoutOverride != undefined) ? timeoutOverride : popupMsgMgr.timeoutValue));
		}
	}
};


/* This utility function resolves the string movieName to a Flash object reference based on browser type. */
function getFlashMovie(movieName) {
	var isIE = navigator.appName.indexOf("Microsoft") != -1;
	return (isIE) ? window[movieName] : document[movieName];
}


/* GENERIC STRING CHECKING */

// This function checks if the given character is a digit.
function isDigit(c) {
	return ((c >= "0") && (c <= "9"))
}
// This function checks if the given character is an alphabet
function isLetter(c) {
	return (((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")))
}
// This function checks if the given string is an integer
function isInteger(s) {
	//alert("isInteger("+s+")");
	if (!s) { return false; }
	for (var i = 0; i < s.length; i++) {
		var c = s.charAt(i);
		if (!isDigit(c)) return false;
	}
	return true;
}
// This function checks if the given string contains any whitespace
function isWhitespace(s) {
	if (isEmpty(s)) return true;
	for (var i = 0; i < s.length; i++) {
		var c = s.charAt(i);
		if (whitespace.indexOf(c) == -1) {
			return false;
		}
	}
	return true;
}
// This function checks if the given string contains only aphanumeric
// characters.
function isAlphanumeric(s) {
	for (var i = 0; i < s.length; i++) {
		var c = s.charAt(i);
		if (! (isLetter(c) || isDigit(c) ) )
			return false;
		}
	return true;
}


/* Client-side access to querystring name=value pairs
	Version 1.2.3
	22 Jun 2005
	Adam Vandenberg
*/
function Querystring(qs) { // optionally pass a querystring to parse
	this.params = new Object()
	this.get=Querystring_get
	
	if (qs == null)
		qs=location.search.substring(1,location.search.length)

	if (qs.length == 0) return

// Turn <plus> back to <space>
// See: http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4.1
	qs = qs.replace(/\+/g, ' ')
	var args = qs.split('&') // parse out name/value pairs separated via &
	
// split out each name=value pair
	for (var i=0;i<args.length;i++) {
		var value;
		var pair = args[i].split('=')
		var name = unescape(pair[0])

		if (pair.length == 2)
			value = unescape(pair[1])
		else
			value = name
		
		this.params[name] = value
	}
}

function Querystring_get(key, default_) {
	// This silly looking line changes UNDEFINED to NULL
	if (default_ == null) default_ = null;
	
	/*var value=this.params[key]
	if (value==null) value=default_;*/

	var value = null

	return value
}




/** DIGITAS CORE METHODS **/

if (typeof DIGITAS == "undefined") {
	var DIGITAS = {};
}

DIGITAS.namespace = function() {
	var a=arguments, o=null, i, j, d;
	for (i=0; i<a.length; i=i+1) {
		d=a[i].split(".");
		o=DIGITAS;

		// DIGITAS is implied, so it is ignored if it is included
		for (j=(d[0] == "DIGITAS") ? 1 : 0; j<d.length; j=j+1) {
			o[d[j]]=o[d[j]] || {};
			o=o[d[j]];
		}
	}

	return o;
};


/** DIGITAS DIALOG METHODS **/


DIGITAS.namespace("dialog");


// BEGIN POPOVERBOX SUBCLASS //
DIGITAS.dialog.PopoverBox = function(el, userConfig) {
	if (arguments.length > 0) {
		DIGITAS.dialog.PopoverBox.superclass.constructor.call(this, el, userConfig);
	}
}

// Inherit from YAHOO.widget.Panel
YAHOO.extend(DIGITAS.dialog.PopoverBox, YAHOO.widget.Panel);

// Define the CSS class for the POPOVERBOX
DIGITAS.dialog.PopoverBox.CSS_POPOVERBOX = "popoverbox";


// Initialize the PhotoBox by setting up the footer navigation
DIGITAS.dialog.PopoverBox.prototype.init = function(el, userConfig) {
	DIGITAS.dialog.PopoverBox.superclass.init.call(this, el);

	this.beforeInitEvent.fire(DIGITAS.dialog.PopoverBox);

	YAHOO.util.Dom.addClass(this.innerElement, DIGITAS.dialog.PopoverBox.CSS_POPOVERBOX);

	if (userConfig) {
		this.cfg.applyConfig(userConfig, true);
	}

	this.initEvent.fire(DIGITAS.dialog.PopoverBox);
};

// Set up the Popover's "target" property for attaching to specific elements
DIGITAS.dialog.PopoverBox.prototype.initDefaultConfig = function() {
	DIGITAS.dialog.PopoverBox.superclass.initDefaultConfig.call(this);

	this.cfg.addProperty("target", { suppressEvent:true });
};

// Overrides the handler for the "modal" property with special animation-related functionality
DIGITAS.dialog.PopoverBox.prototype.configModal = function(type, args, obj) {
	var modal = args[0];

	if (modal) {
		this.buildMask();

		if (typeof this.maskOpacity == 'undefined') {
			this.mask.style.visibility = "hidden";
			this.mask.style.display = "block";
			this.maskOpacity = .8 ; //YAHOO.util.Dom.getStyle(this.mask,"opacity");
			this.mask.style.display = "none";
			this.mask.style.visibility = "visible";
		}

		if (! YAHOO.util.Config.alreadySubscribed( this.beforeShowEvent, this.showMask, this ) ) {
			this.beforeShowEvent.subscribe(this.showMask, this, true);
		}
		if (! YAHOO.util.Config.alreadySubscribed( this.hideEvent, this.hideMask, this) ) {
			this.hideEvent.subscribe(this.hideMask, this, true);
		}
		if (! YAHOO.util.Config.alreadySubscribed( YAHOO.widget.Overlay.windowResizeEvent, this.sizeMask, this ) ) {
			YAHOO.widget.Overlay.windowResizeEvent.subscribe(this.sizeMask, this, true);
		}
		if (! YAHOO.util.Config.alreadySubscribed( this.destroyEvent, this.removeMask, this) ) {
			this.destroyEvent.subscribe(this.removeMask, this, true);
		}
		this.cfg.refireEvent("zIndex");
	} else {
		this.beforeShowEvent.unsubscribe(this.showMask, this);
		this.beforeHideEvent.unsubscribe(this.hideMask, this);
		YAHOO.widget.Overlay.windowResizeEvent.unsubscribe(this.sizeMask);
	}
};

// Overrides the showMask function to allow for fade-in animation
DIGITAS.dialog.PopoverBox.prototype.showMask = function() {
	if (this.cfg.getProperty("modal") && this.mask) {
		YAHOO.util.Dom.addClass(YAHOO.util.Dom.get(this.cfg.getProperty("target")), "masked");
		this.sizeMask();

		var o = this.maskOpacity;

		if (! this.maskAnimIn) {
			this.maskAnimIn = new YAHOO.util.Anim(this.mask, {opacity: {to:o}}, .8)
			YAHOO.util.Dom.setStyle(this.mask, "opacity", 0);
			if (this.onAnimationComplete) {
				this.maskAnimIn.onComplete.subscribe(this.onAnimationComplete, this, true);
			}
		}

		if (! this.maskAnimOut) {
			this.maskAnimOut = new YAHOO.util.Anim(this.mask, {opacity: {to:0}}, 0.25)
			this.maskAnimOut.onComplete.subscribe(
				function() {
					this.mask.tabIndex = -1;
					this.mask.style.display = "none";
					this.hideMaskEvent.fire();
					YAHOO.util.Dom.removeClass(YAHOO.util.Dom.get(this.cfg.getProperty("target")), "masked");
				}, this, true);
		}

		this.mask.style.display = "block";
		this.maskAnimIn.animate();
		this.mask.tabIndex = 0;
		this.showMaskEvent.fire();
	}
};

// Overrides the showMask function to allow for fade-out animation
DIGITAS.dialog.PopoverBox.prototype.hideMask = function() {
	if (this.cfg.getProperty("modal") && this.mask) {
		this.maskAnimOut.animate();
	}
};
// END POPOVERBOX SUBCLASS //
/** CHARACTER COUNTER CODE **/

/* character count check functions for create/update project fields */

//Updates counter text for a field that is passed in
function updateCharCount(fieldObj, maxlength, fieldID){
	var charRemain = maxlength - fieldObj.value.length;
	var charCount = fieldObj.value.length;
	var spanID = fieldID + "_counter";
	
	// trim the value if someone copy and pasted text in
	if ((fieldObj.value.length) > maxlength) {
		fieldObj.value = fieldObj.value.substring(0,maxlength);
	}
	
      charCount = fieldObj.value.length
	document.getElementById(spanID).innerHTML = charCount;
	if (charRemain < 0) { return false; }
}

//Prevents text from being entered in if max characters has been reached
function checkCharCount(e, fieldObj, maxlength) {
	var keyCode = (window.event) ? event.keyCode : e.keyCode;
	// always allow DEL, BACKSPACE, and ARROW keys
	if (keyCode == 8 || keyCode == 37 || keyCode == 38 || keyCode == 39 || keyCode == 40 || keyCode == 46) { return true; }
	if ((fieldObj.value.length) >= maxlength) {
		// trim the value if someone copy and pasted text in
		if ((fieldObj.value.length) > maxlength) {
			fieldObj.value = fieldObj.value.substring(0,1000);
		}
		return false;
	}
}

/**********  THIS ALL CAME FROM utils.js **********************/
// until we can track down redundant stuff, keep this here


function replace(s, t, u) {
  /*
  **  Replace a token in a string
  **    s  string to be processed
  **    t  token to be found and removed
  **    u  token to be inserted
  **  returns new String
  */
  i = s.indexOf(t);
  r = "";
  if (i == -1) return s;
  r += s.substring(0,i) + u;
  if ( i + t.length < s.length)
    r += replace(s.substring(i + t.length, s.length), t, u);
  return r;
  }
function  toggleDisplay(id){
if(id==null) return;
var ele=document.getElementById(id);

if(ele==null) return;
if(ele.style.display=='block')
	ele.style.display='none';
else
	ele.style.display='block';
	
}

function handleToggleShow(e,ele) {
//alert('handleToggleShow');
		if (!ele) {
			return false;
		}
			toggler.show(ele);
	}
function handleToggleHide(e,ele) {
		if (!ele) {
			return false;
		}
			toggler.hide(ele);
	}
function handleMakeVisible(e,ele) {
		if (!ele) {
			return false;
		}
			toggler.makeVisible(ele);
	}
function handleHideVisible(e,ele) {
		if (!ele) {
			return false;
		}
			toggler.hideVisible(ele);
	}		

function getOffSet(elem){
	var x = elem.offsetLeft;
    var y = elem.offsetTop + elem.offsetHeight;
    var parent = elem;
    while (parent.offsetParent) {
      parent = parent.offsetParent;
      x += parent.offsetLeft;
      y += parent.offsetTop;
    }
   
return x+','+y;
}
function closeLayer(layerId){

var layer=ocument.getElementById(layerId);
if(layer!=null) layer.style.display='none';
}

function statusSubmit(status){
 document.forms[0].status.value=status;
 document.forms[0].submit();
}
function show(id){
var elem=document.getElementById(id);
if(elem!=null)elem.style.display = 'block';
}
function hide(id){
var elem=document.getElementById(id);
if(elem!=null)elem.style.display = 'none';
}

function toggleVisivility(id){
var elem=document.getElementById(id);
if(elem!=null){
	if(elem.style.display == 'none')
		elem.style.display = 'block';
	else if(elem.style.display=='block')
		elem.style.display = 'none';
	}
}

function fireEvent(obj,evt){
	
	var fireOnThis = obj;
	if( document.createEvent ) {
	  var evObj = document.createEvent('MouseEvents');
	  evObj.initEvent( evt, true, false );
	  fireOnThis.dispatchEvent(evObj);
	} else if( document.createEventObject ) {
	  fireOnThis.fireEvent('on'+evt);
	}
}	
	function divideIntRoundUp ( numerator, denominator ) {
		 // In JavaScript, dividing integer values yields a floating point result (unlike in Java, C++, C)
		 // To find the integer quotient, reduce the numerator by the remainder first, then divide.
		 var remainder = numerator % denominator;
		 var quotient = ( numerator + remainder ) / denominator;
		 return quotient;
		 // Another possible solution: Convert quotient to an integer by truncating toward 0.
		 // Thanks to Frans Janssens for pointing out that the floor function is not correct for negative quotients.
		 /****************************************************
		 if ( quotient >= 0 )
		 quotient = Math.floor( quotient );
		 else // negative
		 quotient = Math.ceil( quotient );
		 *****************************************************/
		}


   function lastDayOfMonth(Year, Month) {

           return(new Date((new Date(Year, Month+1,1))-1)).getDate();

      }
 function getDateStringsForAMonth(   year, month){
   try{
	 	var lastDate=lastDayOfMonth( year, month);
	 	var monthDates=[];
	 	var d
	 	var m;
	 	var y;
	 	for(var i=1; i<lastDate;i++) {
	 		d=i;
	 		if(i<10)
	 		d = '0'+d;
	 		m=month;
	 		if(month.length<2)
	 		m='0'+m;
	 		y=year;
	 		monthDates.push(m+"/"+d+"/"+y);	
	     
	 	}
 	}   catch(e){
     	// alert('error in getDateStringsForAMonth----'+e.message);
     }
  //   alert(' monthDates>> '+ monthDates.join(',') );
     return monthDates;
 }
      
 function arrayDifference( setA, setB ) {  
   try{
    var setA_seen = {};  
    var setB_seen = {};  
    var difference = []; 
    
    for ( var i = 0; i < setB.length; i++ ) {  
       setB_seen[ setB[i] ] = true;  
    }  
    /*
    for ( var i = 0; i < setA.length; i++ ) {  
       setA_seen[ setA[i] ] = true;  
    }  
    */
   
 
    for ( var i = 0; i < setA.length; i++ ) {  
       if ( !setB_seen[ setA[i] ] ) {  
          difference.push( setA[i] );  
       }  
    }  
    /*
    for ( var i = 0; i < setB.length; i++ ) {  
       if ( !setA_seen[ setB[i] ] ) {  
          difference.push( setB[i] );  
       }  
    }  
    */
    }   catch(e){
     	// alert('error in arrayDifference----'+e.message);
     }
    // alert(' array Diff>>'+difference.join(',') ) ;
    return difference;  
 }
 
 function readCookie(cookieName) {
	 var theCookie=""+document.cookie;
	 var ind=theCookie.indexOf(cookieName);
	 if (ind==-1 || cookieName=="") return ""; 
	 var ind1=theCookie.indexOf(';',ind);
	 if (ind1==-1) ind1=theCookie.length; 
	 return unescape(theCookie.substring(ind+cookieName.length+1,ind1));
	}
 function isArray(obj) {
	   if (obj.constructor.toString().indexOf("Array") == -1)
	      return false;
	   else
	      return true;
	}
	
	/*
		gets the checked value of field value(radio button)
	*/
	
	function getCheckedValue(radioObj) {
	if(!radioObj)
		return null;
	var radioLength = radioObj.length;
	if(radioLength == undefined)
		if(radioObj.checked)
			return radioObj.value;
		else
			return null;
	for(var i = 0; i < radioLength; i++) {
		if(radioObj[i].checked) {
			return radioObj[i].value;
		}
	}
	return null;
}

function addLitoUl( ulObj, liText){
	var liElem=document.createElement("LI");
	liElem.innerHTML=liText;
	ulObj.appendChild(liElem);
}

function isEmailValid(emailId) {
     var emailReg = "^[\\w-_\.+]*[\\w-_\.]\@([\\w]+\\.)+[\\w]+[\\w]$";
     var regex = new RegExp(emailReg);
     return regex.test(emailId);
  }	
