/**
 *
 * Copyright (c) 2014, the Railo Company Ltd. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either 
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public 
 * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
 * 
 **/
/**
 * Implements the CFML Function datepart
 */
package lucee.runtime.functions.dateTime;

import java.util.TimeZone;

import lucee.runtime.PageContext;
import lucee.runtime.exp.ExpressionException;
import lucee.runtime.ext.function.Function;
import lucee.runtime.type.dt.DateTime;

public final class DatePart implements Function {
	
	private static final long serialVersionUID = -4203375459570986511L;

	public static double call(PageContext pc , String datepart, DateTime date) throws ExpressionException {
		return call(pc, datepart, date, null);
	}
	
	public static double call(PageContext pc , String datepart, DateTime date,TimeZone tz) throws ExpressionException {
		datepart=datepart.toLowerCase();
		char first=datepart.length()==1?datepart.charAt(0):(char)0;
		
		if(datepart.equals("yyyy")) return Year.call(pc,date,tz);
		else if(datepart.equals("ww")) return Week.call(pc,date,tz);
		else if(first=='w') return DayOfWeek.call(pc,date,tz);
		else if(first=='q') return Quarter.call(pc,date,tz);
		else if(first=='m') return Month.call(pc,date,tz);
		else if(first=='y') return DayOfYear.call(pc,date,tz);
		else if(first=='d') return Day.call(pc,date,tz);
		else if(first=='h') return Hour.call(pc,date,tz);
		else if(first=='n') return Minute.call(pc,date,tz);
		else if(first=='s') return Second.call(pc,date,tz);
		else if(first=='l') return MilliSecond.call(pc, date,tz);	
		throw new ExpressionException("invalid datepart type ["+datepart+"] for function datePart");
	}
}
@@ -948,24 +948,147 @@
 nException;%0A
+import lucee.runtime.exp.FunctionException;%0Aimport lucee.runtime.exp.PageException;%0Aimport lucee.runtime.ext.function.BIF;%0A
 import lucee
@@ -1115,24 +1115,56 @@
 n.Function;%0A
+import lucee.runtime.op.Caster;%0A
 import lucee
@@ -1223,27 +1223,19 @@
 art 
-implements Function
+extends BIF
  %7B%0A%09
@@ -1489,33 +1489,32 @@
 l(PageContext pc
- 
 , String datepar
@@ -1530,16 +1530,17 @@
 me date,
+ 
 TimeZone
@@ -2388,9 +2388,394 @@
 t%22);%0A%09%7D%0A
+%09%0A%09@Override%0A%09public Object invoke(PageContext pc, Object%5B%5D args) throws PageException %7B%0A%09%09if(args.length==2)%0A%09%09%09return call(pc, Caster.toString(args%5B0%5D), Caster.toDateTime(args%5B1%5D,null));%0A%09%09if(args.length==3)%0A%09%09%09return call(pc, Caster.toString(args%5B0%5D), Caster.toDateTime(args%5B1%5D,null), Caster.toTimeZone(args%5B2%5D));%0A%09%09%0A%09%09throw new FunctionException(pc,%22DatePart%22,2,3,args.length);%0A%09%7D%0A
 %7D

implement BIF