	// <SCRIPT> Extending string capabilities by inheritance
	
	// Supported time formats
	var timeFormatAsString = 1;
	var timeFormatAsMinutesSinceMidnite = 2;

  function String_spanExcluding(strExcludeBeg, strExcludeEnd)
	{
		var beg = !strExcludeBeg ? -1 : this.indexOf(strExcludeBeg);
		var end = -1;
		if(beg != -1 && this.substr(beg+1).indexOf(strExcludeEnd) != -1)
			end = beg + this.substr(beg+1).indexOf(strExcludeEnd);
		else if(beg == -1 && this.indexOf(strExcludeEnd) != -1)
			end = this.indexOf(strExcludeEnd);

		if(beg != -1 && end != -1)
			return this.substr(beg+1, end-beg);
		else if(beg != -1)
			return this.substr(beg+1);
		else if(end != -1)
			return this.substr(0, end);
		else
			return null;
  }
  String.prototype.SpanExcluding = String_spanExcluding;
  
  String.prototype.days = new Array("", "", "", "");
  function String_getDayString()
	{
 	  return(this.days[this.getDay()]);
  }
  String.prototype.getDayString = String_getDayString;
    
  function String_parseURL()
	{
	   var l_strQuery = this.SpanExcluding("?");
		if(!l_strQuery)
			return null;
			
		var l_rgbQuery = l_strQuery.split("&");
		//var l_dictQuery = new ActiveXObject("Scripting.Dictionary");
		var l_arrQuery = new Array();
		for(var i=0; i < l_rgbQuery.length; i++)
		{
			l_arrQuery[i] = l_rgbQuery[i].split("=");
			//l_dictQuery.Add(l_rgbQuery[i].split("=")[0], l_rgbQuery[i].split("=")[1]);
		}
			
		return l_arrQuery;
  }
  String.prototype.parseURL = String_parseURL;

  function String_searchEx(p_strPattern)
	{
		var l_re = new RegExp(p_strPattern, "i");
		return (this.search(l_re) == 0) ? true : false;
  }
  String.prototype.searchEx = String_searchEx;

	function String_isEmpty() 
	{ 
		return (this==null) || (this.length==0); 
	}
	String.prototype.isEmpty = String_isEmpty;
	
	String.prototype.whitespace = "\n\r\t ";
	function String_trim(l, r)
	{
		if(this.isEmpty()) return "";
	 
		// the general focus here is on minimal method calls - hence only one substring is used to complete the trim.
		var left=0; var right=0;
		var i=0; var k=0;

		// modified to properly handle strings that are all whitespace
		if(l) { while((i<this.length) && (this.whitespace.indexOf(this.charAt(i++))!=-1)) left++;}
		if(r) { k=this.length-1; while((k>=left) && (this.whitespace.indexOf(this.charAt(k--))!=-1)) right++; }
		return this.substring(left, this.length - right);
	}
	String.prototype.trim = String_trim;
	
	// --------------------------------- CSS Tokenizer -------------------------------------
	function String_getTokens(begDelimiter1, endDelimiter1, begDelimiter2, endDelimiter2) 
	{
		var pos = 0;
		var attributes = new Array();
		var attributeValues = new Array();
		var attributeString  = new String(this.trim("true", "true"));
		while(1)
	  {
			var stringAttribute = attributeString.substring(pos).SpanExcluding(begDelimiter1, endDelimiter1);
			if(!stringAttribute.length)
				break;
			pos += stringAttribute.length + 1;
			stringAttribute = stringAttribute.trim("true", "true");
			
			var stringValue = attributeString.substring(pos).SpanExcluding(begDelimiter2, endDelimiter2);
			pos += stringValue.length + 2;
			stringValue = stringValue.trim("true", "true");
			
			attributes[attributes.length] = stringAttribute;
	    attributeValues["_" + attributes[(attributes.length)-1]] = stringValue;
		}
		return(attributeValues);
	}
	String.prototype.getTokens = String_getTokens;
	



