var DATE_CONSTANTS = new function () {
	return {
		MONTHS_SHORT : ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
	MONTHS_LONG: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
	WEEKDAYS_1CHAR: ["S", "M", "T", "W", "T", "F", "S"],
	WEEKDAYS_SHORT: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
	WEEKDAYS_MEDIUM: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
	WEEKDAYS_LONG: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
	};
}
var DAYS_IN_MONTH = new Array();
DAYS_IN_MONTH[1] = 31;
DAYS_IN_MONTH[2] = 29;
DAYS_IN_MONTH[3] = 31;
DAYS_IN_MONTH[4] = 30;
DAYS_IN_MONTH[5] = 31;
DAYS_IN_MONTH[6] = 30;
DAYS_IN_MONTH[7] = 31;
DAYS_IN_MONTH[8] = 31;
DAYS_IN_MONTH[9] = 30;
DAYS_IN_MONTH[10] = 31;
DAYS_IN_MONTH[11] = 30;
DAYS_IN_MONTH[12] = 31;
var SERVER_VARS = new Object ();

var JS_UTIL = new function () {
	this.dateSeparator = '/';
	this.escapeString = function(str) {
		str = str.replace("\\","\\\\");
		str = str.replace("'","\\'");
		str = str.replace("\"","\\\"");
		return str;
	}
	this.escapeStringForDisplay = function(str) {
		str = str.replace(/\'/g,"&#39;");
		str = str.replace(/\"/g,"&#34;");
		return str;
	}
	this.escapeHTML = function(s) {
		if (!s) return s;
		return s.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\"/g,"&quot;");
	}
	this.getHHmmFormm = function(duration) {
		return Math.floor(duration /60) + " Hrs " + duration % 60 + " Mins";
	}
	this.leadingZeros = function(nr,num) {
		if((parseInt(nr,10) == nr) && (parseInt(num,10) != NaN)){
			while((""+nr).length < num) {
				nr = "0"+nr;	
			}
			return nr;
		}
		return null;
	};
	this.stripZeros = function(inputStr) {
		var result = inputStr
		while (result.substring(0,1) == "0") {
			result = result.substring(1,result.length)
		}
		return result
	};
	
	this.parseDate = function(str) {
		var dt;
		if(typeof(str) == 'string') {
			var el = str.split(this.dateSeparator);
			if(el.length ==3) {
				el[0] = this.stripZeros(el[0]); el[1] = this.stripZeros(el[1]); el[2] = this.stripZeros(el[2]);
				dt = new Date();
				dt.setFullYear(parseInt(el[2]),parseInt(el[1])-1,parseInt(el[0]));
				if(isNaN(dt.getTime()) || el[0] != dt.getDate() || el[1] != dt.getMonth()+1 || dt.getFullYear() != el[2])
					return;
				return dt;
			}
		}
	};
	this.getDisplayTime =function(tm) {
		return this.leadingZeros(tm.getHours(),2) +':'+ this.leadingZeros(tm.getMinutes(),2) ;
	}
	this.getLongDisplayTime =function(tm) {
		var hour = tm.getHours();
		if (hour == 0) hour = 12;
		var time = this.leadingZeros((hour > 12 ? hour - 12: hour), 2) + ":" +
			this.leadingZeros(tm.getMinutes(),2) + " " + (hour > 12 ? "PM": "AM");
		return time;
	}
	this.getDisplayDateLong = function(dt) {
	return DATE_CONSTANTS.WEEKDAYS_LONG[dt.getDay()]+', '+ dt.getDate()+ ' ' +DATE_CONSTANTS.MONTHS_LONG[dt.getMonth()] + ' ' + dt.getFullYear();
	};
	this.getDisplayDate = function(dt) {
	return DATE_CONSTANTS.WEEKDAYS_MEDIUM[dt.getDay()]+', '+ this.getDisplayDateShort(dt);
	};
	this.getDayShort = function(dt) {
	return DATE_CONSTANTS.WEEKDAYS_MEDIUM[dt.getDay()];
	}
	this.getDisplayDateShort = function(dt) {
		return this.leadingZeros(dt.getDate(),2) + ' ' +DATE_CONSTANTS.MONTHS_SHORT[dt.getMonth()] + ' ' + dt.getFullYear();
	}
	this.getDisplayDateShort2 = function(dt) {
		return this.leadingZeros(dt.getDate(),2) + ' ' +DATE_CONSTANTS.MONTHS_SHORT[dt.getMonth()];
	}
	this.getPrettyDate = function(dt) {
		var diff = (SERVER_VARS.currentDateTime.getTime() - dt.getTime())/1000;
		var dayDiff = Math.floor(diff / 86400);
		if ( isNaN(dayDiff) || dayDiff < 0) {
			return this.getDisplayDate(dt);
		}
		
		return dayDiff == 0 && (
			diff < 60 && "Just now" ||
			diff < 120 && "1 minute ago" ||
			diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" ||
			diff < 7200 && "1 hour ago" ||
			diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") ||
		dayDiff == 1 && "Yesterday" ||
		dayDiff < 365 && dayDiff + " days ago" ||
		dayDiff >= 365 && Math.floor( dayDiff / 365 ) + " year(s) ago";
	}
	this.clearTime = function(dt) {
		dt.setHours(0); dt.setMinutes(0);
		dt.setSeconds(0); dt.setMilliseconds(0);
	}
	this.addValueToSelectBox = function(formElement, value, desc) {
		var len = formElement.length;
		formElement.length = len + 1;
		formElement[len].text = desc;
		formElement[len].value = value;
	}
	this.getSelectBoxValue = function (formElement) {
		var selIdx = formElement.selectedIndex;
		if (selIdx < 0 || selIdx >= formElement.length) { return ''; }
			return formElement[selIdx].value;
	}
	this.setSelectBoxByValue = function (formElement, value) {
		for (var i = 0; i < formElement.length; i++) {
			if (formElement[i].value == value) {
			formElement.value=value;
			formElement.selectedIndex = i;
			return i;
			}
		}
		return -1;
	}
	this.setRadioButtonByValue = function(formElement, value) {
	  for (var i = 0; i < formElement.length; i++) {
	    if (formElement[i].value == value) {
	      formElement[i].checked = true;
	      return i;
	    }
	  }
	  return -1;
	}
	this.setCheckBoxByValue = function (formElement, value) {
  		for (var i = 0; i < formElement.length; i++) {
    		if (formElement[i].value == value) {
      			formElement[i].checked = true;
      			return i;
    		}
  		}
  		return -1;
	}
	this.setSelectBoxByText = function (formElement, text) {
		for (var i = 0; i < formElement.length; i++) {
			if (formElement[i].text == text) {
			formElement.value=formElement[i].value;
			formElement.selectedIndex = i;
			return i;
			}
		}
		return -1;
	}
	this.setSelectBoxByValueOrText = function (formElement, value,text) {
		for (var i = 0; i < formElement.length; i++) {
			if (formElement[i].value == value) {
				formElement.value=value;
				formElement.selectedIndex = i;
				return i;
			} else if(formElement[i].text  ==text) {
				formElement.value=formElement[i].value;
				formElement.selectedIndex = i;
				return i;
			}
		}
		return -1;
	}
	this.setRadioButtonByValue = function (formElement, value) {
		for (var i = 0; i < formElement.length; i++) {
			if (formElement[i].value == value) {
			formElement[i].checked = true;
			return i;
			}
		}
		return -1;
	}
	this.getAbsoluteElementTop = function(el) {
		var u_offsetTop = el.offsetTop;
		var par = el;
		while(par !== document.body) {
			par = par.offsetParent;
			if(par==null || typeof(par.offsetTop) == 'undefined'){
				break;
			}
			u_offsetTop += par.offsetTop;
		}
		return u_offsetTop;
	} 
	this.getAbsoluteElementBottom = function(el) {
		return aaaa = YAHOO.util.Dom.getDocumentHeight()-el.offsetHeight - this.getAbsoluteElementTop(el);
	}

	this.isInteger = function(s) {
    	var i;
    	for (i = 0; i < s.length; i++) {
        	var c = s.charAt(i);
        	if (((c < "0") || (c > "9"))) {
          	return false;
        	}
    	}
    	return true;
	}
	this.stripChars = function(str, stripStr) {
		var i;
	    var returnString = "";
	    for (i = 0; i < str.length; i++){   
	        var c = str.charAt(i);
	        if (stripStr.indexOf(c) == -1) {
	          returnString += c;
	        }
	    }
	    return returnString;
	}
	this.numDaysInFebForYear = function(year) {
		return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
	}
	this.isValidDate = function(dtStr) {
		var pos1 = dtStr.indexOf("/");
		var pos2 = dtStr.indexOf("/",pos1+1);
		var strDay = dtStr.substring(0,pos1);
		var strMonth = dtStr.substring(pos1+1,pos2);
		var strYear = dtStr.substring(pos2+1);
		strYr = strYear;
		if (dtStr.indexOf("/",pos2+1) != -1 || this.isInteger(this.stripChars(dtStr, "/"))==false){
			return false;
		}
		if (strDay.charAt(0) == "0" && strDay.length > 1) {
		  strDay = strDay.substring(1);
		}
		if (strMonth.charAt(0) == "0" && strMonth.length > 1) {
		  strMonth = strMonth.substring(1);
		}
		for (var i = 1; i <= 3; i++) {
			if (strYr.charAt(0) == "0" && strYr.length > 1) {
			  strYr = strYr.substring(1);
			}
		}
		month = parseInt(strMonth);
		day = parseInt(strDay);
		year = parseInt(strYr);
		if (pos1 == -1 || pos2 == -1){
			return false;
		}
		if (strMonth.length < 1 || month < 1 || month > 12){
			return false;
		}
		if (strDay.length < 1 || day < 1 || day > 31 || (month == 2 && day > this.numDaysInFebForYear(year)) || day > DAYS_IN_MONTH[month]){
			return false;
		}
		if (strYear.length != 4 || year == 0){
			return false;
		}
	    return true;
	}
	this.validateDateFormat = function (checkStr) {
		if(!checkStr && checkStr.length != 10) {
			alert("Please enter a valid date in the form dd/mm/yyyy");
			return false;
		}
		var checkOK = "0123456789/";
		for (var i = 0;	i < checkStr.length;	i++) {
			ch = checkStr.charAt(i);
			for (var j = 0;	j < checkOK.length;	j++) {
				if (ch == checkOK.charAt(j) ) {	break; } 
			}
			if (j == checkOK.length) {
				alert("Please enter a valid date in the form dd/mm/yyyy");
			return false;
			}
		}
		return true;
	}
	this.padNumber2Digit = function(num) {
	  var ret = '' + num;
	  if (num < 10) {
	    ret = '0' + ret;
	  }
	  return ret;
	}
	this.addDays = function(dt, n) {
	  var dateArray1 = dt.split("/");
	  var givenDate = Date.parse(dateArray1[1] + "/" + dateArray1[0] + "/" + dateArray1[2]);
	  var time = new Date(givenDate + n*1000*60*60*24);
	  return this.padNumber2Digit(time.getDate()) + "/" + this.padNumber2Digit(time.getMonth()+1) + "/" + this.fixYear(time.getYear());
	}
	this.compareDates = function(dt1, dt2) {
		var dateArray1 = dt1.split("/");
		var givenDate1 = Date.parse(dateArray1[1] + "/" + dateArray1[0] + "/" + dateArray1[2]);
	
		dateArray1 = dt2.split("/");
		var givenDate2 = Date.parse(dateArray1[1] + "/" + dateArray1[0] + "/" + dateArray1[2]);
	
		if (givenDate1 < givenDate2) {
			return -1;
		} else if (givenDate1 == givenDate2) {
			return 0;
		} else {
			return 1;
		}
	}
	this.getCurrentDate = function () {
		var time = SERVER_VARS.currentDate;
		return this.leadingZeros(time.getDate(),2) + "/" + this.leadingZeros(time.getMonth()+1,2) + "/" + this.fixYear(time.getYear());
	}
	this.getStdDisplayDate = function (dt) {
		return this.leadingZeros(dt.getDate(),2) + "/" + this.leadingZeros(dt.getMonth()+1,2) + "/" + this.fixYear(dt.getYear());
	}
	this.getYUICalDate = function (dt) {
		return this.leadingZeros(dt.getMonth()+1,2) + "/" + this.leadingZeros(dt.getDate(),2) + "/" + this.fixYear(dt.getYear());
	}
	this.fixYear = function (num) {
		var ret = '' + num;
		if (num < 1900) {ret = num + 1900; }
		return ret;
	}
	this.addDaysToDate = function(dt, days) {
		dt.setDate(dt.getDate() + days);
		return dt;
	}
	this.setDateElements =function(dt, dayElement, monthElement, yearElement) {
		var dateObj = this.parseDate(dt);
		dayElement.value = dateObj.getDate();
		monthElement.value = dateObj.getMonth() +1;
		yearElement.value = dateObj.getFullYear();
	}
	this.openPopupWindow = function(windowName, url, width, height) {
		var soptions;
		if (width == -1 && height == -1) {
		  soptions = "menubar=yes,toolbar=yes,location=yes,directories=no,status=yes,scrollbars=yes,resizable=yes,screenX=0,screenY=0";
		} else {
		  soptions = "menubar=no,toolbar=no,location=no,directories=no,status=no,scrollbars=yes,resizable=yes,screenX=50,screenY=50,width=" + width + ",height=" + height;
		}
		
		var newwindow = window.open(url,windowName, soptions);
		newwindow.focus();
	}
	this.removeExtraSpaces = function(str) {
		var st = YAHOO.lang.trim(str);
		return st.replace(/[\s]+/g, " ");
	}
	this.roundNumber = function(num, dec) {
		var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
		return result;
	}
	this.oddEvenTable = function(selector, oddClassName, evenClassName) {
		$jQ(selector + ":odd").addClass(oddClassName);
		$jQ(selector + ":even").addClass(evenClassName);
	}
	this.getTimeFromElements =function(hrElement, minElement, todElement) {
		return this.leadingZeros(hrElement.value, 2) + ":" + this.leadingZeros(minElement.value, 2) + " " + todElement.value
	}
	this.getDateFromElements =function(dElement, mElement, yElement) {
		return this.leadingZeros(dElement.value, 2) + "/" + this.leadingZeros(mElement.value, 2) + "/" + yElement.value
	}
	this.populateDateFields = function(dField, mField, yField) {
		dField.length = 31;
		mField.length = 12;
		yField.length = 100;
		for (var i=0; i<=30; i++) {
			dField[i].value = i + 1;
			dField[i].text = i + 1;
		}
		for (var i=0; i<12; i++) {
			mField[i].value = i + 1;
			mField[i].text = DATE_CONSTANTS.MONTHS_LONG[i];
		}
		for (var i=0; i<100;i++) {
			yField[i].value = this.fixYear(SERVER_VARS.currentDate.getYear()) - i;
			yField[i].text = this.fixYear(SERVER_VARS.currentDate.getYear()) - i;
		}
	}
	this.setDateFields = function(dt, dField, mField, yField) {
		dField.value = dt.getDate();
		mField.value = dt.getMonth()+1;
		yField.value = this.fixYear(dt.getYear());
	}
	this.setTimeInDateFromField = function(dt, hField, mField, tField) {
		var hours = parseInt(hField.value, 10);
		if (tField.value == 'AM') {
			hours = (hours == 12) ? 0: hours;
			dt.setHours(hours);
		} else {
			hours += 12;
			hours = (hours == 24) ? 12: hours;
			dt.setHours(hours);
		}
		dt.setMinutes(parseInt(mField.value, 10));
		return dt;
	}
	this.populateTimeFields = function(hField, mField, tField) {
		hField.length = 12;
		mField.length = 4;
		tField.length = 2;
		for (var i=0; i<12; i++) {
			hField[i].value = this.leadingZeros(i + 1, 2);
			hField[i].text = i + 1;
		}
		for (var i=0; i<4; i++) {
			mField[i].value = this.leadingZeros(i * 15, 2);
			mField[i].text = this.leadingZeros(i * 15, 2);
		}
		tField[0].value = 'AM';
		tField[0].text = 'AM';
		tField[1].value = 'PM';
		tField[1].text = 'PM';
		
		this.setTimeFieldsFromDate(SERVER_VARS.currentDateTime, hField, mField, tField);
	}
	this.setTimeFieldsFromDate = function(time, hField, mField, tField) {
		var hour = time.getHours();
		if (hour == 0) hour = 12;
		hField.value = this.leadingZeros((hour > 12) ? hour - 12: hour, 2);
		mField.value = this.leadingZeros(15 * Math.floor(time.getMinutes()/15), 2);
		tField.value = (hour >= 12) && (time.getHours()!=0) ? "PM": "AM";
	}
	this.setTimeFields = function(time, hField, mField, tField) {
		var strArr = time.split(":");
		if (YAHOO.lang.isValue(strArr) && strArr!='') {
			hField.value = strArr[0];
			var strArr2 = strArr[1].split(" ");
			mField.value = strArr2[0];
			tField.value = strArr2[1];
		}
	}
	this.showInfoMessage = function(divId, msg, isError) {
		$jQ("#" + divId).removeClass("dErrorOpenBox").removeClass("dSuccessOpenBox");
		if (isError) {
			$jQ("#" + divId).addClass("dErrorOpenBox");
		} else {
			$jQ("#" + divId).addClass("dSuccessOpenBox");
		}
		$jQ("#" + divId).html(msg);
		$jQ("#" + divId).show();
	}
	this.scrollFloatMenu = function(name) {
		var menuYloc = parseInt($jQ(name).css("top").substring(0,$jQ(name).css("top").indexOf("px")));
		var menuOTop = $jQ(name).offset().top - 20;
		$jQ(window).scroll(function() {
			var tOffset = $jQ(document).scrollTop();
			var offset = 0;
			if (tOffset < menuOTop) {
				offset = menuYloc;
			} else {
				offset = tOffset - menuOTop;
			}
			var offsetStr = offset + "px";
			$jQ(name).css("top", offsetStr);
		});
	}
	this.delayHide = function(divEl, timeout) {
		timeout = timeout || 3000;
		setTimeout(function() {
				$jQ(divEl).hide('slow');
			}, timeout);
	}
	this.handleIEError = function() {
		window.onerror = function(sErr) {
			if (sErr.toLowerCase().indexOf('unspecified error') >= 0) {
				window.event.returnValue = true;
			} else {
				window.event.returnValue = false;
			}
		};
	}
	this.YUI_SKIN = {defaultSkin: 'flab_yui_skin', base: '../../../css/',rollup: 1, path:'skin.css'};
};

var AJAX_UTIL = new function() {
	this.showWait = function(divEl, msg, opts) {
		var defaults = {waitEl: 'span', waitClass: 'waiting2', clazz: ''};
		opts = $jQ.extend({}, defaults, opts || {});
		var wHTML = '<' + opts.waitEl + ' class="' + opts.waitClass + ' ' + opts.clazz + '">' + msg + '</' + opts.waitEl + '>';
		$jQ(divEl).hide();
		$jQ(divEl).after(wHTML);
	}
	this.hideWait = function(divEl, opts) {
		var defaults = {highlight: true, fadeColor: 'yellow', fadeEl: divEl};
		opts = $jQ.extend({}, defaults, opts || {});
		$jQ(divEl).next(".waiting2").hide();
		$jQ(divEl).show();
		if (opts.highlight) {
			$jQ(opts.fadeEl).highlightFade(opts.fadeColor);
		}
	}
	this.hideWaitError = function(divEl, errMsg, opts) {
		var defaults = {timeout: 4000, highlight: false, fadeColor: 'red', fadeEl: divEl};
		opts = $jQ.extend({}, defaults, opts || {});
		$jQ(divEl).next(".waiting2").hide();
		var eHTML = '<div class="error">' + errMsg + '</div>';
		$jQ(divEl).next(".error").remove();
		$jQ(divEl).after(eHTML);
		if (opts.highlight) {
			$jQ(opts.fadeEl).highlightFade(opts.fadeColor);
		}
		if (opts.timeout) {
			setTimeout(function() {
				$jQ(divEl).next(".error").remove();
				$jQ(divEl).show();
			}, opts.timeout);
		}
	}
	this.isWaitShown = function(divEl, opts) {
		var defaults = {waitClass: 'waiting2'};
		opts = $jQ.extend({}, defaults, opts || {});
		var waitEl = $jQ(divEl).next("." + opts.waitClass);
		return (waitEl.length > 0 && waitEl.is(":visible"));
	}
	this.parseXMLMsg = function(xml, tag, defaultMsg) {
		var xml = $jQ(tag, xml);
		if (xml.length > 0) {
			var msg = $jQ(xml).text();
			if (msg) {
				return msg;
			}
		}
		return defaultMsg;
	}
	this.asyncCall = function(url, opts) {
		var defaults = {method: 'POST', params: '', argument: [], timeout: 10000, form: null, scope: this,
			error: {handler: null, parseMsg: true, msg: 'Error while processing your request. Please try again later.', inDialog: true, title: 'Error', divElOps: null},
			success: {handler: null, parseMsg: false, msg: '', inDialog: false, title: 'Success', divElOps: null},
			wait: {handler: null, show: true, inDialog: true, blkEl: null, msg: 'Please wait ...', timeout: null, divEl: null, divElOps: null}};
		opts = $jQ.extend({}, defaults, opts || {});
		opts.wait = $jQ.extend(true, {}, defaults.wait, opts.wait || {});
		opts.error = $jQ.extend(true, {}, defaults.error, opts.error || {});
		opts.success = $jQ.extend(true, {}, defaults.success, opts.success || {});

		opts.params += '&__xreq__=true';
		opts.argument.push(opts);
		var callback = {success: this.handleAsyncSuccess, failure: this.handleAsyncError,
			timeout: opts.timeout, cache: false, scope: this, argument: [opts] };
		if (opts.form) {
			YAHOO.util.Connect.setForm(document.getElementById(opts.form));
		}
		YAHOO.util.Connect.asyncRequest(opts.method, url, callback, opts.params);
		if (opts.wait.show) {
			if (opts.wait.inDialog) {
				MODAL_PANEL.showWait(opts.wait.msg, opts.wait.blkEl, opts.wait.timeout);
			} else if (opts.wait.divEl) {
				AJAX_UTIL.showWait(opts.wait.divEl, opts.wait.msg, opts.wait.divElOps);
			}
		}
		if (opts.wait.handler) {
			opts.wait.handler.call(opts.scope, opts.argument);
		}
	}
	this.handleAsyncSuccess = function(o) {
		var opts = o.argument[0];
		var successXML = $jQ("Success", o.responseXML);
		if (successXML.length == 0) {
			this.handleAsyncError(o);
			return;
		}
		if (successXML.attr("goal")) {
			$jQ("#_goalTxt_ a").html(successXML.attr("goal"));
		}
		if (successXML.attr("curl")) {
			opts.curl = successXML.attr("curl");
			if (successXML.attr("cpgnm")) opts.cpgnm = successXML.attr("cpgnm");
		}
		var successMsg = null;
		if (opts.success.parseMsg) {
			successMsg = AJAX_UTIL.parseXMLMsg(o.responseXML, "Success", opts.success.msg);
		}
		if (opts.wait.divEl) {
			AJAX_UTIL.hideWait(opts.wait.divEl, opts.success.divElOps);
		}
		if (opts.success.inDialog) {
			MODAL_PANEL.showAlert(successMsg, "success", {title: opts.success.title, curl: opts.curl, cpgnm: opts.cpgnm});
		}
		if (opts.success.handler) {
			opts.success.handler.call(opts.scope, opts.argument, successMsg, successXML, o);
		}
	}
	this.handleAsyncError = function(o) {
		var opts = o.argument[0];
		var errorMsg = null;

		var xml = $jQ("Error", o.responseXML);
		if (xml.length > 0 && xml.attr("ovr")) {
			errorMsg = AJAX_UTIL.parseXMLMsg(o.responseXML, "Error", opts.error.msg);
			if (xml.attr("ovr") == "1") {
				MODAL_PANEL.showAlert(errorMsg, "error", {title: "Session Expired", curl: xml.attr("curl"), cpgnm: xml.attr("cpgnm")});
			}
			return;
		}
		if (opts.error.parseMsg) {
			errorMsg = AJAX_UTIL.parseXMLMsg(o.responseXML, "Error", opts.error.msg);
		}
		if (opts.wait.divEl) {
			if (opts.error.divElOps) {
				AJAX_UTIL.hideWaitError(opts.wait.divEl, errorMsg, opts.error.divElOps);
			} else {
				AJAX_UTIL.hideWait(opts.wait.divEl);
			}
		}
		if (opts.error.inDialog) {
			MODAL_PANEL.showAlert(errorMsg, "error", {title: opts.error.title});
		}
		if (opts.error.handler) {
			opts.error.handler.call(opts.scope, opts.argument, errorMsg, o);
		}
	}
}

var MODAL_PANEL = new function() {
	this.show = function (divRef, opts) {
		var defaults = {blkElement: null, round: true, nofocus: false, msgBlockClass: "u_block", close: true, shadow: false,
			msgBlockHdClass: "hrDotB", css: {}};
		opts = $jQ.extend({}, defaults, opts || {});
		if (opts.round) {
			opts.blockClass = (opts.blockClass ? opts.blockClass + ' ': '') + 'rndIn';
			opts.preBlockHTML = '<div class="tl"></div><div class="tr"></div><div class="bl"></div><div class="br"></div><div class="tm"></div>';
			opts.postBlockHTML = '<div class="bm"></div>';
		}
		opts.message = $jQ(divRef);
		if (opts.blkElement) {
			$jQ(opts.blkElement).block(opts);
		} else {
			$jQ.blockUI(opts);
		}
		if (!opts.nofocus) {
			setTimeout(function() {$jQ(":input:visible:first", opts.message).focus();}, 10);
		}
		$jQ("body").addClass("yui-skin-flab");
	}
	this.hide = function (blkElement, opts) {
		var defaults = {};
		opts = $jQ.extend({}, defaults, opts || {});
		if (YAHOO.lang.isValue(blkElement)) {
			$jQ(blkElement).unblock(opts);
		} else {
			$jQ.unblockUI(opts);
		}
		$jQ("body").removeClass("yui-skin-flab");
	}
	this.showAlert = function (msg, icon, opts) {
		opts = $jQ.extend({}, {curl: 'javascript:void(0);', cpgnm: 'Close'}, opts || {});
		opts.blockClass = (opts.blockClass ? opts.blockClass + ' ': '') + 'blockAlert';
		var html = '<div class="u_block"><div class="' + icon + 'Alert"></div>';
		html += '<div class="alertMsg">' + msg + '</div></div>';
		html += '<div class="alertAction"><a href="' + opts.curl + '" class="action"><span>' + opts.cpgnm +  '</span></a></div>';

		this.show(html, opts);
		if (opts.curl == 'javascript:void(0);') {
			$jQ(".blockAlert .alertAction a").click(function() {MODAL_PANEL.hide();});
		}
	}
	this.showConfirm = function (msg, opts) {
		var defaults = {scope: this, handler: null, hide: true, yes: {txt: 'Yes'}, no: {txt: 'No'}};
		opts = $jQ.extend({}, defaults, opts || {});
		opts.yes = $jQ.extend(true, {}, defaults.yes, opts.yes || {});
		opts.no = $jQ.extend(true, {}, defaults.no, opts.no || {});
		opts.blockClass = (opts.blockClass ? opts.blockClass + ' ': '') + 'blockAlert';

		var html = '<div class="u_block"><div class="quesAlert"></div>';
		html += '<div class="alertMsg">' + msg + '</div></div>';
		html += '<div class="alertAction"><a href="#" class="action yes"><span>' + opts.yes.txt + '</span></a>'
			+ '&nbsp;&nbsp;<a href="#" class="action no"><span>' + opts.no.txt + '</span></a></div>';

		this.show(html, opts);
		$jQ(".blockAlert .alertAction a").click(function() {
			if (opts.hide) {MODAL_PANEL.hide();} if (opts.handler) {opts.handler.call(opts.scope, $jQ(this).hasClass("yes"));}
			return false;
		});
	}
	this.showWait = function(text, blkElement, timeout) {
		var html = '<h2>' + text + '</h2>';
		html += '<img src="/static/img/bar_loader.gif">';
		MODAL_PANEL.show(html, {close: false, nofocus: true, blkElement: blkElement, blockClass: 'blockLoad'});
		if (YAHOO.lang.isValue(timeout)) {
			setTimeout(function() {MODAL_PANEL.hide(blkElement);}, timeout);
		}
	}
}

var GENERAL_TOOLTIP = new function() {
	this.createTooltip = function(ids, opts) {
		var defaults = {dropShadow: false, htmlShadow: true, tooltipClass: 'help', dataFromFn: true, 
				loadData: this.setTooltipData, mouseOutClose: true, width: 150, mtipzIndex: 1020};
		opts = $jQ.extend({}, defaults, opts || {});
		var els = ".tooltip";
		if (ids) {
			els = $jQ(ids);
		}
		$jQ(els).each(function() {
			var tipCfg = $jQ(this).metadata({type:'attr',name:'tips'});
			var topts = $jQ.extend({}, opts, tipCfg || {});
			$jQ(this).mTooltip(topts);
		});
	}
	this.setTooltipData = function(tipBody, el) {
		var tipCfg = el.metadata({type:'attr',name:'tips'});
		if (tipCfg.tipId) {
			tipBody.html($jQ(tipCfg.tipId).html());
		} else {
			tipBody.html(tipCfg.tooltip);
		}
	}
}

var TRACKER = new function() {
	this.loaded = false;
	this.page = 'unknown';
	this.userType = "b2c";
	this.domain = "lifemojopro.com";
	this.account = "UA-6244285-1";
	this.loader = new YAHOO.util.YUILoader();
	this.pageTracker = null;
	this.onUrchinLoad = function () {
		TRACKER.loaded = true;
		if (YAHOO.lang.isValue(_gat)) {
			TRACKER.pageTracker = _gat._getTracker(TRACKER.account);
			TRACKER.pageTracker._initData();
			TRACKER.log();
		}
	};
	this.log = function(subURL) {
		subURL = (typeof(subURL) == 'undefined')?"":subURL;
		if(this.pageTracker != null) {
			this.pageTracker._trackPageview("/"+TRACKER.userType+"/"+TRACKER.page+"/"+subURL);
		}
	};
	this.init = function() {
		this.loader.addModule({ 
					name: "gatracker", 
					type: "js",
					fullpath: (("https:" == document.location.protocol) ? "https://ssl." : "http://www.") + "google-analytics.com/ga.js",
					varName: "gaTracker" 
			});
		this.loader.require("gatracker");
		this.loader.onSuccess = TRACKER.onUrchinLoad; 
		this.loader.insert();
	};
}
