
function Utils()
{
	var me = this;
	/**
	*  Tries to run or eval 'func'
	*/
	this.exec = function(func)
	{
//		logger.dump('utils exec ' + typeof(func));
		var type = typeof(func);
		if(type == 'function' || type == 'string') 
//			logger.dump('utils exec running' + func);
			window.setTimeout(func, 10);
	}

	var digits = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8',
							'9', 'A', 'B', 'C', 'D', 'E', 'F');
	
	this.decToBase = function (num, base) {
		if (base > 16) {
			alert ('sorry hex is max can\'t convert to base:[' + base + ']');
			return null;
		}
		var idx = num % base;
		var out = digits[idx];
		num -= idx;
		if (num) {
			out = me.decToBase(num / base, base) + '' + out;
		}
		return out;
	}


	this.getFromDelimiter = function(inString, delimiter, includeDelim) {
		return me.getFromOrToDelimiter(true, inString, delimiter, includeDelim);
	}

	this.getToDelimiter = function(inString, delimiter, includeDelim) {
		return me.getFromOrToDelimiter(false, inString, delimiter, includeDelim);
	}

	this.getFromOrToDelimiter = function(isFrom, inString, delimiter, includeDelim) {
		var split = inString.indexOf(delimiter);
		var isIncluded = (typeof(includeDelim) != 'undefined' && includeDelim);
		if (split < 0) {
			if (isFrom) {
				return '';
			} else {
				return inString;
			}
		}
		if (isFrom) {
			split += (isIncluded? 0:1)
			return inString.substr(split);
		} else {
			split += (isIncluded? 1:0)
			return inString.substr(0, split);
		}
	}


// **********************************************
	/**
	 * Slices string looking for [?|&]field=.* and return the prefix, 
	 * the field itself and the suffix. if field is not found it is properly
	 * appended to the end.
	 * @param myUrl		the reuest url to use
	 * @param myField	the field to append or slice out
	 * @param useAmp	set to force using & whether ? was found or not.
	 */
	this.sliceFieldFromGetRequest = function(myUrl, myField, useAmp) {
		// deal with # first
		var pSplit = myUrl.indexOf('#');
		var extra = '';
		if (pSplit > 0) {
			extra = myUrl.substr(pSplit);
			myUrl = myUrl.substr(0, pSplit);
		}


		if(debug) logger.dump('myUrl:' + myUrl);
		if(debug) logger.dump('extra:' + extra);
		if(debug) logger.dump('looking for myField:' + myField);
		var expr = "^(.*[\?&]" + myField + "=)(.[^&]?)(&.*)?$";
		if(debug) logger.dump('with exprsssion:' + expr);
		var re = new RegExp(expr);
		if(myUrl.match(re)) {

			if(debug) logger.dump('$1:' + RegExp.$1);
			if(debug) logger.dump('$2:' + RegExp.$2);
			if(debug) logger.dump('$3:' + RegExp.$3);

			return new Array(RegExp.$1, RegExp.$2, RegExp.$3 + extra);
		}
		var cat = '?';
		if (useAmp || myUrl.indexOf('?') > 0) {
			cat = '&';
		}
		return new Array(myUrl + cat + myField + '=', '', extra);
	}


// **********************************************
	/**
	 * Adds a GET field/value pair to url.
	 * updates the value if field already exists.
	 * @param $url		the reuest url to use`
	 * @param $field	the field to add
	 * @param $value	set to force using & whether ? was found or not.
	 */
	this.addFieldToUrl = function(myUrl, myField, myValue) {
		if (typeof(myValue) == 'undefined' || null == myValue || '' == myValue){
			return myUrl;
		}
		var ret = me.sliceFieldFromGetRequest(myUrl, myField, false);
		return ret[0] + escape(myValue) + ret[2];
	}


// **********************************************
	/**
	 * retrieves value of a GET field from url.
	 * @param $url		the reuest url to use`
	 * @param $field	the field to add
	 */
	this.getFieldFromUrl = function(myUrl, myField) {
		var ret = me.sliceFieldFromGetRequest(myUrl, myField, false);
		return unescape(myValue);
	}

// **********************************************
	/**
	 * retrieves value of a GET field from url.
	 * @param $url		the reuest url to use`
	 * @param $field	the field to add
	 */
	this.getFieldFromUrl = function(myUrl, myField) {
		var ret = me.sliceFieldFromGetRequest(myUrl, myField, false);
		return unescape(myValue);
	}


// **********************************************
	/**
	 * returns after millis milliseconds
	 * @param $millis number of milliseconds to wait
	 */
	this.delay = function(millis) {
		var c;
		var y = new Date();
		var t = y.getTime() + millis;
		do {
			y = new Date();
			c = y.getTime();
		} while (c < t);
		return;
	}


// **********************************************
	/**
	 * returns after millis milliseconds
	 * @param $millis number of milliseconds to wait
	 */
	this.getSelectedValue = function(myTag) {
		if (typeof(myTag.value) == 'string') return myTag.value;
		if (!myTag.options.length) return '';
		if (typeof(myTag.selectIndex) == 'number') 
			return myTag.options[myTag.selectedIndex].value;
		return myTag.options[0].value;
	}


// **********************************************
	/**
	 * set select tag to specified value does nothing 
	 * if value not found
	 * @param myTag reference to select tag
	 * @param myValue value to set
	 * @return true upon success false otherwise
	 */
	this.setSelectedValue = function(myTag, myValue) {
		if (typeof(myTag.value) == 'string') {
			myTag.value = myValue;		
			return true;	
		}
		var last = myTag.options.length;
		for(var i = 0; i < last; i++) {
 			if (myValue == myTag.options[i].value) {
				myTag.selectedIndex = i;
				return true;
			}
		}
		return false;
	}

}
