package org.kvj.lima1.android.ui.manager;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
public class DateProtocol extends PageProtocol {
private static final String DT_FORMAT = "yyyyMMdd";
private static final String TAG = "dt:";
private DateFormat defaultFormat = new SimpleDateFormat(DT_FORMAT);
Pattern dtPattern = Pattern.compile("^(\\((([ewmdy][+-]?[0-9]+)+)\\))?([EwMdy/\\:\\.]*)$");
Pattern opPattern = Pattern.compile("([ewmdy])([+-]?)([0-9]+)");
@Override
public void prepare(JSONObject config, String value) {
if (!config.has("dt")) {
Date dt = new Date();
try {
dt = defaultFormat.parse(value.substring(value.indexOf(":")+1));
} catch (ParseException e) {
}
try {
config.put("dt", defaultFormat.format(dt));
} catch (JSONException e) {
}
}
}
private int getValue(Date dt, String type) {
Calendar c = Calendar.getInstance();
c.setTime(dt);
if ("e".equals(type)) {
return c.get(Calendar.DAY_OF_WEEK)-Calendar.SUNDAY;
}
if ("w".equals(type)) {
return c.get(Calendar.WEEK_OF_YEAR);
}
if ("d".equals(type)) {
return c.get(Calendar.DAY_OF_MONTH);
}
if ("m".equals(type)) {
return c.get(Calendar.MONTH);
}
if ("y".equals(type)) {
return c.get(Calendar.YEAR);
}
return -1;
}
private void setValue(Date dt, String type, int value) {
Calendar c = Calendar.getInstance();
c.setTime(dt);
if ("e".equals(type)) {
c.set(Calendar.DAY_OF_WEEK, value+Calendar.SUNDAY);
}
if ("w".equals(type)) {
c.set(Calendar.WEEK_OF_YEAR, value);
}
if ("d".equals(type)) {
c.set(Calendar.DAY_OF_MONTH, value);
}
if ("m".equals(type)) {
c.set(Calendar.MONTH, value);
}
if ("y".equals(type)) {
c.set(Calendar.YEAR, value);
}
dt.setTime(c.getTimeInMillis());
}
@Override
public JSONObject accept(JSONObject config, String value) {
try {
Date dt = defaultFormat.parse(value);
// Log.i(TAG, "Accept: "+value+", "+config+", "+dt);
Iterator<String> it = config.keys();
while(it.hasNext()) {
String type = it.next();
JSONArray valArray = config.optJSONArray(type);
int val = getValue(dt, type);
if (-1 != val && null != valArray) {
boolean found = false;
for (int i = 0; i < valArray.length(); i++) {
if (valArray.getInt(i) == val) {
found = true;
break;
}
}
if (!found) {
return null;
}
}
}
JSONObject result = new JSONObject();
result.put("dt", defaultFormat.format(dt));
return result;
} catch (Exception e) {
Log.e(TAG, "Error in accept", e);
}
return null;
}
@Override
public String convert(String text, JSONObject value) {
try {
Date dt = defaultFormat.parse(value.getString("dt"));
Matcher m = dtPattern.matcher(text);
// Log.i(TAG, "convert: "+text+", "+value);
if (m.find()) {
String modifiers = m.group(2);
if (null == modifiers) {
modifiers = "";
}
String format = DT_FORMAT;
if (!"".equals(m.group(4))) {
format = m.group(4);
}
Matcher mm = opPattern.matcher(modifiers);
while (mm.find()) {
String op = mm.group(1);
String sign = mm.group(2);
int val = Integer.parseInt(mm.group(3));
int cur = getValue(dt, op);
if (cur != -1) {
setValue(dt, op, "+".equals(sign)? cur+val: "-".equals(sign)? cur-val: val);
}
}
// Log.i(TAG, "convert2: "+text+", "+format);
return new SimpleDateFormat(format).format(dt);
} else {
Log.w(TAG, "Invalid value: "+text);
}
} catch (Exception e) {
Log.e(TAG, "Error converting", e);
}
return text;
}
}