

function urlencode_obj(d) { var s = ''; for (p in d) { s = s + encodeURIComponent(p) + "=" + d[encodeURIComponent(p)] + "&"; } return s; }
function in_array(a, v) { for (i in a) { if (a[i] == v) { return true; } } return false; }


function set_param_categories(params) {
 	var tree = YAHOO.widget.TreeView.getTree("treeDiv1");
	params['categories'] = tree.getCheckedNodes().join(',');
  	return params;
}

function set_param_location(params) {
	var location = $("input[id=autocomplete_place]").val();
	var within =  $("input[id=id_within]").val();

	if (location != '') {
	    params['location'] = location; 
	}

	if (within != '') {
	    params['within'] = within;	
	}
    
	return params;
}

function create_date_from_fields(date_field) {

	var day = date_field.find("input[id$='_day']").val();        
	var month = date_field.find("input[@id$='_month']").val();
	var year = date_field.find("input[@id$='_year']").val();
	
	if (day.match(/^\d{1,2}$/) && month.match(/^\d{1,2}$/) && year.match(/^\d{4}$/)) {
	    //Dates are 0 indexed for month. But javascript does a coversion to the correct date if you put in
	    //an out of range date.
	    var event_date = new Date(year, month - 1, day);
	    //python needs 1 indexed months.
	    return event_date.getFullYear() + '-' + (event_date.getMonth() + 1) + '-' + event_date.getDate()
	}

	return null;
}

function set_param_dates(params) {
	
	var date_from = $("div[id=date_field]:first");
	var date_until = $("div[id=date_field]:last"); 
	
	date_from = create_date_from_fields(date_from);
	if (date_from) {
		params["date_from"] = date_from;
	}

	date_until = create_date_from_fields(date_until);
	if (date_until) {
		params["date_until"] = date_until;
	}
	
	return params;
}

function set_param_selected_tab(params) {
	params['selected_tab'] = tabView.get('activeIndex')
	return params;
}

function get_params()
{
    var params = {};
    
    params = set_param_categories(params);
    params = set_param_location(params);    
    params = set_param_dates(params);
    params = set_param_selected_tab(params);    
   
    return params;
}

function clearDate(field, date) {
	var date_field = $(field);

	date_field.find("input[id$='_day']").attr('value', date.getDate());
   	date_field.find("input[id$='_month']").attr('value', date.getMonth() + 1); //zero indexed!
   	date_field.find("input[id$='_year']").attr('value', date.getFullYear());
}

function populate_what(data) {

	if( typeof(data['categories']) != 'undefined')
    {
        var categories = data['categories'].split(',');
        var tree = YAHOO.widget.TreeView.getTree("treeDiv1");
        tree.checkNodes(categories);
    }
}

function populate_when(data) {
	
	if (typeof(data['date_from']) != 'undefined' ) {
		var date_from = data['date_from'].split('-').reverse();
	    
	    $("div[id=date_field]:first").find('input').each(function (i) {
	    	$(this).val(date_from[i]);
	    });
	}
	
	if (typeof(data['date_until']) != 'undefined' ) {
		var date_until = data['date_until'].split('-').reverse();

	    $("div[id=date_field]:last").find('input').each(function (i) {
	    	$(this).val(date_until[i]);
	    });
	}
}

function populate_where(data) {
	if( typeof(data['location']) != 'undefined') {
		$("input[id=autocomplete_place]").val(data['location']);
    }
    
    if( typeof(data['within']) != 'undefined') {
		$("input[id=id_within]").val(data['within']);
    }
}

function set_active_tab(data) {
	if (typeof(data['selected_tab']) != 'undefined') {
		tabView.set('activeIndex', data['selected_tab']);
	}
}

function populateFields(data) {
	populate_what(data);
	populate_where(data);
	populate_when(data);
	set_active_tab(data);
}

function Validator() {
	this.valid = true;
}

Validator.prototype.validate_input_field = function(input_field, regex) {
	if (! regex.test(input_field.val())) {
		input_field.addClass('error');
		this.invalidate();
	} else {
		input_field.removeClass('error');
	}
}

Validator.prototype.date_validation = function(date_field) {
	this.validate_input_field(date_field.find("input[id$='_day']"), /^\d{1,2}$/);
	this.validate_input_field(date_field.find("input[id$='_month']"), /^\d{1,2}$/);
	this.validate_input_field(date_field.find("input[id$='_year']"), /^\d{4}$/);
}

Validator.prototype.validate_integer_input_field = function(input_field) {
	this.validate_input_field(input_field, /^\d*$/);
}

Validator.prototype.validate = function() {
 	this.validate_integer_input_field($('input[id=id_within]'));
 	this.date_validation($('div[id=date_field]:first'));	
 	this.date_validation($('div[id=date_field]:last'));
}

Validator.prototype.invalidate = function () {
	this.valid = false;
}

Validator.prototype.is_valid = function() {
	return this.valid;
}

$(document).ready(function(){
    $('#showEvents').click(function(){
	validator = new Validator();
    	validator.validate();
    	
    	if (validator.is_valid()) { 
	    if( typeof(tabmanager) != 'undefined' )
            {
		tabmanager.get_events( get_params() );
            } else {
		var hField = $('#hiddenParamField');
        	hField.val(urlencode_obj(get_params()));
		$('#hiddenParamForm').submit();
            }
    	}
        
    });

    $('#clearView').click(function(){
        switch ( tabView.get('activeIndex') )
        {
            case 0:
                YAHOO.widget.TreeView.getTree("treeDiv1").uncheckAll();
                break;

            case 1:
            	$("#id_within").val('');
            	$("#autocomplete_place").val('');
                break;

            case 2:
            	date = new Date();
            	clearDate("#date_fields_from_date", date);
            	date.setDate(date.getDate() + 365)
    			clearDate("#date_fields_until_date", date);
                break;
        }  
    });

    $('#resetAllFilters').click(function(){
        var callback = {
            success: function(o)
             {
                 window.location.reload( true );
             },
            failure: function(o) {
                alert("Apologies, An error has occurred. Staff have been notified and we hope to fix this problem soon.");
             },
            arguments:[]
        };
        
        if( typeof(tabmanager) != 'undefined' )
        {
            var transaction = YAHOO.util.Connect.asyncRequest('GET', "/events/json/eventfilter/?reset=1", callback, null);
            
        } else {
            callback.success();
        }
    });
});


