var MAG = Object.extend({}, MAG || {});
MAG.Ajax = Class.create();
MAG.Ajax.prototype = {

	ajax_url: _root + 'ajax',

	initialize: function()
	{
		MAG.MagAjax = this;
		this._response = {quarters: [], quarter_groups: []};
		return true;
	},

	make_response: function(url, params, method, oncomplete_callback, more_options)
	{
		var options = {
			method: method,
			parameters: params
		}

		if(Object.isFunction(oncomplete_callback)) {
			options.onComplete = oncomplete_callback;
		}

		if(more_options) {
			Object.extend(options, more_options);
		}
		new Ajax.Request(url, options);
	},

	get_quarters: function(source_id, target_id, fire)
	{
		this.target_quarters_id = target_id;
		this.city_id = $F(source_id);
		this.fire = fire;

		var params = [];
			params.push('action=get_quarters_by_city_id');
			params.push('city_id=' + this.city_id);

		if($$('.loading_'+this.target_quarters_id).first()) {
			$$('.loading_'+this.target_quarters_id).first().toggle();
		}

		if(this._response.quarters[this.city_id]) {
			this.get_quarters_complete(this._response.quarters[this.city_id]);
			return;
		}

		this.make_response(this.ajax_url, params.join('&'), 'get', this.get_quarters_complete.bind(this));
	},

	get_quarters_by_group: function(el, quarter_group_id)
	{
		this.target_quarters = typeof el == 'string' ? el : el.id.toString().match(/(.*?)_groups[0-9]+$/)[1];
		this.quarter_group_id = quarter_group_id;

		var params = ['action=get_quarters_by_quarter_group_id'];
			params.push('city_id='+this.city_id);
			params = 	$(el.parentNode.parentNode)
						.select('input[type=checkbox]')
						.reject(function(el){return !el.checked;})
						.pluck('value')
						.inject(params, function(params, val){params.push('quarter_groups[]='+val);return params;});
			params = 	$(el.form)
						.select('input[name="quarters[]"]')
						.reject(function(el){return !el.checked;})
						.pluck('value')
						.inject(params, function(params, val){params.push('quarters[]='+val);return params;});

		if($$('.loading_'+this.target_quarters_id).first()) {
			$$('.loading_'+this.target_quarters).first().toggle();
		}

		this.make_response(this.ajax_url, params.join('&'), 'post', this.get_quarters_by_group_complete.bind(this));
	},

	get_quarters_by_group_complete: function(res, json)
	{
		var content = "";
		var quarters = res.responseXML.getElementsByTagName('quarter');


		for(i = 0; i < quarters.length; i++) {
			content += '<label for="'+this.target_quarters+quarters[i].getAttribute('id')+'"><input type="checkbox" id="'+this.target_quarters+quarters[i].getAttribute('id')+'" name="quarters[]" value="'+quarters[i].getAttribute('id')+'" checked="checked" class="rchk" />' + quarters[i].childNodes[0].nodeValue + '</label><br />';
		}

		$(this.target_quarters).innerHTML = content;

		if($$('.loading_'+this.target_quarters_id).first()) {
			$$('.loading_'+this.target_quarters).first().toggle();
		}

		var obj = null;
		try {
			obj = eval(this.target_quarters+'_first');
		} catch(e) {}

		if(obj != null)
		{
			$(this.target_quarters).select('input[type=checkbox]').each(function(el){
				el.checked = obj.indexOf(el.value) > -1;
			});
			eval(this.target_quarters+'_first = null;');
		}
	},

	get_quarters_complete: function(res, json)
	{
		this._response.quarters[this.city_id] = res;
		var opt, not_select = null;
		var content = "";
		var qg_container = $(this.target_quarters_id+'_groups');

		try {
			opt = $(this.target_quarters_id).options;
			var length = opt.length;
		} catch(e) {
			opt = $(this.target_quarters_id);
			not_select = 1;
		}

		if(not_select==null) {
			for (i=length-1; i > 0; i--) {
				opt[i] = null;
			}
		}
		else {
			opt.innerHTML = "";
		}

		var quarters = res.responseXML.getElementsByTagName('quarter');
		for(i = 0; i < quarters.length; i++) {
			if(not_select==null) {
				opt[opt.length] = new Option(quarters[i].childNodes[0].nodeValue, quarters[i].getAttribute('id'));
			}
			else {
				content += '<label for="'+opt.id+quarters[i].getAttribute('id')+'"><input type="checkbox" id="'+opt.id+quarters[i].getAttribute('id')+'" name="quarters[]" value="'+quarters[i].getAttribute('id')+'" class="rchk" />' + quarters[i].childNodes[0].nodeValue + '</label><br />';
			}
		}

		if(not_select) {
			opt.innerHTML = content;
		}

		if(qg_container)
		{
			content = "";
			var quarter_groups = res.responseXML.getElementsByTagName('quarter_group');
			var qg_id = null;
			for(i = 0; i < quarter_groups.length; i++) {
				qg_id = quarter_groups[i].getAttribute('id');
				content += '<label for="'+qg_container.id+qg_id+'"><input type="checkbox" name="quarters_groups[]" id="'+qg_container.id+qg_id+'" value="'+qg_id+'" onclick="MagAjax.get_quarters_by_group(this,'+qg_id+')" class="rchk" />' + quarter_groups[i].childNodes[0].nodeValue + '</label><br />';
			}
			qg_container.innerHTML = content;
		}

		if($$('.loading_'+this.target_quarters_id).first()) {
			$$('.loading_'+this.target_quarters_id).first().toggle();
		}

		var groups = null;

		var obj = Try.these(function(){ groups = true; return eval(this.target_quarters_id+'_groups_first');}.bind(this))
				  || Try.these(function(){ groups = false; return eval(this.target_quarters_id+'_first');}.bind(this))
				  || null;

		if(obj != null) {
			obj = $A(obj);
			if(groups)
			{
				if($(this.target_quarters_id+'_groups'+obj.last()))
				{
					obj.each(function(el){
						$(this.target_quarters_id+'_groups'+el).checked = true;
					}.bind(this));
					this.get_quarters_by_group($(this.target_quarters_id+'_groups'+obj.last()), obj.last());
				}
				eval(this.target_quarters_id+'_groups_first = null;');
			}
			else {
				if($(this.target_quarters_id))
				{
					if($(this.target_quarters_id).tagName == 'SELECT')
					{
						$A($(this.target_quarters_id).options).each(function(opt){
							opt.selected = obj.indexOf(opt.value) > -1;
						});
					}
					else if($(this.target_quarters_id).tagName == 'DIV')
					{
						$(this.target_quarters_id).select('input[type=checkbox]').each(function(inp){
							inp.checked = obj.indexOf(inp.value) > -1;
						});
					}
				}
				eval(this.target_quarters_id+'_first = null;');
			}
		}

		if(this.fire) {
			var fire = this.fire;
			fire.element.fire(fire.evt, fire.obj);
		}
	}
};

var MagAjax = new MAG.Ajax;