/*
 * When selecting a date using a period picker, updates the message
 * below the picker with the real period.
 */

(function($) {
    function make_default_options(options, def) {
        if (typeof(options) == 'undefined') {
            options = {};
        }
	
        for (key in def) {
            if (typeof(options[key]) == 'undefined') {
                options[key] = def[key];
            }
        }
        return options;
    };

    function bind_changes(fieldname, mapping, options) {

	function compute_form(fname) {
	    form = {'fieldname': fname};
	    for (key in mapping) {
		form[key] = parseInt($('#' + fname + '_' + mapping[key]).val());
	    }
	    return form;
	}

	var value_changed = function() {
	    var form = compute_form(fieldname);
	    $.pyproxy_call('jq_show_period_pickers_values',
			   form);

	    if (typeof(options['delta_computer']) == 'function') {
		var key;
		var delta = options['delta_computer']();
		var linked_field = options['linked_field'];
		var field_limits = {
		    'week': 53,
		    'four_weeks': 13,
		    'month': 12
		};
		var new_form = {};
		
		for (key in field_limits) {
		    if (typeof(form[key]) == 'number') {
			new_form[key] = form[key] + delta;

			if (new_form[key] > field_limits[key]) {
			    new_form[key] = 1;
			    new_form['year'] = form['year'] + 1;
			}
			else {
			    new_form['year'] = form['year'];
			}
		    }
		}

		for (key in new_form) {
		    $('#' + linked_field + '_' + mapping[key]).val(
			new_form[key]);
		}

		$.pyproxy_call('jq_show_period_pickers_values',
			       compute_form(linked_field));
	    }
	}

	for (key in mapping) {
	    $('#' + fieldname + '_' + mapping[key]).change(value_changed);
	}

	value_changed();
    }

    $.fn.period_picker = function(options) {
	options = make_default_options(
	    options,
	    {'delta_computer': null,
	     'linked_field': null});

	return this.each(function() {
	    var fieldname, picker_mapping, picker;

	    fieldname = $(this).attr('id');
	    picker_mapping = {'week_picker': {'week': 'week',
					      'year': 'year'},
			      'four_weeks_picker': {'four_weeks': 'four_weeks',
						    'year': 'year'},
			      'month_picker': {'month': 'month',
					       'year': 'year'}};

	    for (picker in picker_mapping) {
		if ($(this).hasClass(picker)) {
		    bind_changes(fieldname,
				 picker_mapping[picker],
				 options)
		}
	    }
	});
    }
})(jQuery)
