function PatternLayoutParser(pattern){
	var m = pattern.indexOf("%m");
	if (m > 0){		// The %m (message) ends the pattern
		pattern = pattern.substr(0, m+2);
	}
 	this.pattern = pattern;
 	this.expressions = new Array();
 
 this.isSpecialChar = function(c){
	switch (c){
		case 'c':
			return true;
		case 'C':
			return true;
		case 'd':
			return true;
		case 'F':
			return true;
		case 'l':
			return true;
		case 'L':
			return true;
		case 'm':
			return true;
		case 'M':
			return true;
		case 'n':
			return true;
		case 'p':
			return true;
		case 'r':
			return true;
		case 't':
			return true;
		case 'x':
			return true;
		case 'X':
			return true;
	}
	return false; 
 }
 
this.getDatePattern = function(line, pos){
	var i = pos;
	if (line.charAt(pos) != '{') 
		return "yyyy-MM-dd HH:mm:ss,SSS";
	
	pos++;	
	var pattern = "";
	while (i<line.length && line.charAt(i) != '}'){
		pattern += line.charAt(i);
		i++;
	}
	if (pattern == "ABSOLUTE")
		pattern = "HH:mm:ss,SSS";
	else if (pattern == "DATE")
		pattern = "dd MMM yyyy HH:mm:ss,SSS";
	else if (pattern == "ISO8601")
		pattern = "yyyy-MM-dd HH:mm:ss,SSS";
	else if (i == 0)
		pattern = "yyyy-MM-dd HH:mm:ss,SSS";

	return pattern;
}
 
this.parsePattern = function(){
 	var expParser;
 	var lastExpression;
 	var buf = this.pattern;
 	var exp = "";
 	var j = 0;
 	var i = 0;
	var datePattern = null;
 	var expCount = 0;
 	for (i=0; i<this.pattern.length; i++){
 		if (buf.charAt(i) == '%'){
 			if (j > 0){
 				expParser = new DelimiterParser(exp.substr(0, j));
 				expParser.type = "TYPE_TEXT";
 				if (lastExpression != null)
 					lastExpression.nextExp = expParser;
 				this.expressions[expCount] = expParser;
 				expCount++;
 				exp = "";
 				j = 0;
 				}
 			i++;
 			j = 0;
 			exp = "";
 			while (!this.isSpecialChar(buf.charAt(i))){	// To do: take care of %%
				exp += buf.charAt(i);
				i++;
				j++;
 			}
 			exp += buf.charAt(i);
			
			datePattern = null;
			if (buf.charAt(i) == 'd'){
				datePattern = this.getDatePattern(buf, i+1);
			}
			
 			if (i<buf.length-1)
 			if (buf.charAt(i+1) == '{'){
 				while(buf.charAt(i) != '}'){
 					i++;
 					j++;
 					exp += buf.charAt(i);
 				}
 			}
			if (datePattern != null){
				expParser = new DateParser(datePattern, "TYPE_DATE");
				//alert(datePattern);
				expParser.type = "TYPE_DATE";
			}
			else{
				expParser = new ExpParser(exp.substr(0, j+1));
				expParser.type = "TYPE_KEY";
			}
 			this.expressions[expCount] = expParser;
			lastExpression = expParser;
 			expCount++;
 			exp = "";
 			j = 0;
 		}
 		else{
 			exp += buf.charAt(i);
 			j++;
 		}
 		}
 		if (j > 0){
 			expParser = new DelimiterParser(exp.substr(0, j));
 			expParser.type = "TYPE_TEXT";
 			this.expressions[expCount] = expParser;
 			expCount++;
 			if (lastExpression != null)
 				lastExpression.nextExp = expParser;
 			exp = "";
 			j = 0;
 		}
 		return this.expressions;
 }

}
