function findImports(stmt) {
    var imports = "";
    var pats = [
	['iso8601', 'from xml.utils import iso8601'],
	["parsedate", 'from email.utils import parsedate'],
	["formatdate", 'from email.utils import formatdate'],
	['parsedate_tz', 'from email.utils import parsedate_tz, mktime_tz'],
	['time', 'import time'],
        ['datetime', 'import datetime'],
    ];
    for (var i=0; i < pats.length; i++) {
	var s = pats[i][0];
	var pos = stmt.search(s);
 	if (pos != -1) {
	    // workaround for not being about to use "parsedate(" as a key
	    if ((s != "parsedate" || stmt[pos+9] == '(') && 
		(s != 'time' || stmt[pos+4] == '.')) {
  		imports = imports + pats[i][1] + "\n";
	    }
  	}
    }
    if (imports) {
	imports = imports + "\n";
    }
    return imports;
}

function viaTuple(t1, t2) {
    // many of the viaUnix ones should be left as a tuple. Perhaps run
    // both versions and return the one with the shorter code :)

    //todo
}

function viaUnix(t1, t2) {
    // convert via unix seconds (which forgets the tz)

    var unixExpr = {
	unix : 't1', 
	email : 'time.mktime(parsedate(t1))',
	iso : 'iso8601.parse(t1)',
	isodate : 'time.mktime(time.strptime(t1, "%Y-%m-%d"))',
	dtdate : 't1.strftime("%s")', 
	dtdt : 't1.strftime("%s")', 
	//dttime : // N/A
	ymd : 'time.mktime(t1 + (0,0,0,0,0,0)',
	//engdate : '',
	//engtime : '',
	}[t1];
    if (unixExpr == undefined) {
	return;
    }

    var outExpr = {
	unix : '#{secs}', 
	email : 'formatdate(#{secs})',
	iso : 'iso8601.tostring(#{secs})',
	//isodate : 
	dtdate : 'datetime.date.fromtimestamp(#{secs})',
	dtdt : 'datetime.datetime.fromtimestamp(#{secs})',
	//dttime : '
	//ymd : '',
	//engdate : '',
	//engtime : '',
    }[t2];
    if (outExpr == undefined) {
	return;
    }

    outExpr = new Template(outExpr);
    var stmt = "t2 = " + outExpr.evaluate({secs : unixExpr});

    return [findImports(stmt) + stmt, 
	    'This is a conversion via unix seconds, which loses the timezone (if there was one).'];

}

function specialCase(t1, t2) {
    var badTz = "This version may handle timezones incorrectly.";
    var specialCase = {
	'email' : {
	    'iso' : ['z = parsedate_tz(t1)\nt2 = iso8601.tostring(mktime_tz(z), -z[-1])', ''],
	    'ymd' : ['t2 = parsedate_tz(t1)[:3]', badTz],
	          },
	'dtdate' : { 
	    'isodate' : ['t2 = t1.isoformat()', ''],
	           },
	
    };
    var r = specialCase[t1];
    if (r != undefined) { 
	r = r[t2]; 
    }
    if (r != undefined) {
	return [findImports(r[0]) + r[0], r[1]];
    }
    return;
}

function code(t1, t2) {
    $('conv').innerHTML = t1 + "-" + t2;
    if (!t1 || !t2) {
	return ['raise NotImplementedError', 'Select two formats.'];
    }
    if (t1 == t2) {
	return ["t2 = t1", "Nothing to convert"];
    }
    
    var r = specialCase(t1, t2);
    if (r) { 
	return r; 
    }

    r = viaUnix(t1, t2);
    if (r) { 
	return r; 
    }

    return ["raise NotImplementedError", 'help'];
}

function update() {
    var t1 = $('t1').value;
    var t2 = $('t2').value;

    var r = code(t1, t2)
    $('answer').innerHTML = r[0];
    if (r[1] == 'help') {
	$('answer').style.display = "none";
	$('help').style.display = "block";
	$('notes').innerHTML = "";
    } else {
	$('answer').style.display = "block";
	$('help').style.display = "none";
	$('notes').innerHTML = r[1];
    }
}

(function() {
    var format = new Hash({
        email : '"Mon, 20 Nov 1995 19:12:08 -0500"',
	unix : '1199158767 (unix seconds)',
	iso : '"2007-07-18T15:00:00-08:00"',
	isodate : '"2007-07-18"',
        dtdate : 'datetime.date(2007, 10, 12)',
	dtdt : 'datetime.datetime(2007, 10, 12, 13, 15, 0)',
	dttime : 'datetime.time(13, 15, 0)',
	ymd : '(2007, 10, 18)',
	engdate : '"March 19, 1997"',
	engtime : '"March 19, 1997 11:45AM"',
    });
    format.each(function(x) { 
	$('t1').options[$('t1').options.length] = new Option(x.value, x.key);
	$('t2').options[$('t2').options.length] = new Option(x.value, x.key);
    });
    $('t1').observe('change', function(event) { update(); });
    $('t2').observe('change', function(event) { update(); });
})();

