var g_offers = new Array();
var g_nabortu_offers = new Array();
var g_davs_offers = new Array();
var g_se_count = 2;
var g_offers_counter = 0;
var g_params = null;
var g_matrix_data = { airlines: new Array(), stops: new Array() };
var g_filter = new Object();
var g_filter_object = null;
var g_matrix_offset = 0;
var g_spb_msc = false;
var g_monthes = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
var g_as_mat_dates = null;
var g_as_mat_data = null;
var g_status = '';

var g_payment_methods = ['Наличным','Курьером','По карте','В терминале','Через банк','WebMoney','Я.Деньги'];
var g_payment_cities = ['Москва','Санкт-Петербург','Новосибирск','Сочи','Хабаровск', 'Рязань'];
var g_payment_rules = [
 [[true,true],[true,true],null,null,null,null,null],
 [[true,false],[true,false],null,null,null,null,null],
 [[true,false],[true,false],null,null,null,null,null],
 [[true,false],[true,false],null,null,null,null,null],
 [[true,false],[true,false],null,null,null,null,null],
 [[true,false],[true,false],null,null,null,null,null]
];

function ts_filter_payment_method_changed() {
	var pm = $('#filter_payment_methods :selected').val();
	var appended = false;
	
	$('#filter_payment_cities').attr('disabled', 'disabled');	
	$("#filter_payment_cities option:not(option:first)").remove();
	
	if (pm == -1) {
		// reset filter
		ts_set_filter(null, 'payment', null);
	} else {		
		for (var i=0; i<g_payment_rules.length; ++i) {
			if (g_payment_rules[i][pm] != null) {
				$('#filter_payment_cities').append('<option value="'+i+'">'+g_payment_cities[i]+'</option');
				appended = true;
			}
		}
		if (appended) {
			$('#filter_payment_cities').removeAttr('disabled');			
		} else {
			// reset filter, all cities allowed
			ts_set_filter(null, 'payment', null);
		}
	}
}

function ts_filter_payment_city_changed() {
	if ($('#filter_payment_cities').attr('disabled')) return;

	var pm = $('#filter_payment_methods :selected').val();	
	var pc = $('#filter_payment_cities :selected').val();
	if (pm < 0 || pc < 0) return;
	
	ts_set_filter(null, 'payment', [pc,pm]);
}


function ts_render_filter_pan() {
	var out = '<div id="filter_pan" class="nano_filter_pan">';
	out += '<table border="0" style="height:34px;width:100%;"><tr><td valign="middle"><ul>'+
	'<li><a href="#filter_pan" onClick="ts_set_filter(this,\'stops\',-1);return false;">Все рейсы</a></li>'+
	'<li><a href="#filter_pan" onClick="ts_set_filter(this,\'stops\',0);return false;">Прямые</a></li>'+
	'<li><a href="#filter_pan" onClick="ts_set_filter(this,\'stops\',100);return false;">С пересадками</a></li>'+	
	'</ul></td><td valign="middle" style="padding-left:1em;border-left:1px solid #ffffff">'+
	'<font style="color:#666666;font-size:12px;">Оплата:</font> <select id="filter_payment_methods" onChange="javascript:ts_filter_payment_method_changed();"><option value="-1" selected>--- не выбрано ---</option>';

	for (var i=0; i<g_payment_methods.length; ++i) {
		out += '<option value="'+i+'">'+g_payment_methods[i]+'</option>';
	}
	
	out += '</select>' +
	'&nbsp;&nbsp;&nbsp;<font style="color:#666666;font-size:12px;">Город:</font> <select onChange="javascript:ts_filter_payment_city_changed();" disabled id="filter_payment_cities"><option value="-1" selected>--- не выбрано ---</option></select>' +
	'</td></tr></table>';
	out += '</div>';
	return out;
}

function formatMoney(v_, perc){
    if("string" == typeof(v_)) return v_;
	//return v_+"";
	
	if (!v_) return '-';
	var v = parseInt(v_);
	if (perc) {		
		v = Math.round(v + v / 100 * perc);
	}
	var l = v.toLocaleString();
	l = l.replace(/,00$/, "")
	return l + " р.";
};

function ts_add_to_matrix(offer) {
	airline = offer.airline_code;
	
	if (!g_matrix_data.airlines[airline]) {
		g_matrix_data.airlines[airline] = { cost: offer.cost_total, name: offer.airline } 
	} else {
		g_matrix_data.airlines[airline].cost = Math.min(g_matrix_data.airlines[airline].cost, offer.cost_total);		
	}	
	
	if (!g_matrix_data.stops[offer.depart_stops]) {
		g_matrix_data.stops[offer.depart_stops] = new Array();
		g_matrix_data.stops[offer.depart_stops]['min_price'] = offer.cost_total;
	} else {
		g_matrix_data.stops[offer.depart_stops]['min_price'] = Math.min(g_matrix_data.stops[offer.depart_stops]['min_price'], offer.cost_total);
	}
	if (!g_matrix_data.stops[offer.depart_stops][airline]) {
		g_matrix_data.stops[offer.depart_stops][airline] = offer.cost_total;
	} else {
		g_matrix_data.stops[offer.depart_stops][airline] = Math.min(g_matrix_data.stops[offer.depart_stops][airline], offer.cost_total)
	}
}

function ts_render_matrix() {
	var sorted_airlines = new Array();
	for (var airline in g_matrix_data.airlines) {
		sorted_airlines.push([g_matrix_data.airlines[airline].name, g_matrix_data.airlines[airline].cost, airline]);
	}
	sorted_airlines.sort(function(a, b) { return a[1] > b[1] });

	matrix_html = "";
	
	matrix_html += "<table class=\"nano_matrix\">";
	matrix_html += "<thead>";
	matrix_html += "<th style=\"background:#fff\"></th>";
	matrix_html += "<th>Все<br>авиакомпании</th>";
	
	var ac = 0;
	for (var i=g_matrix_offset; i<sorted_airlines.length; ++i) {
//		for (var airline in sorted_airlines) {
			matrix_html += "<th>"+sorted_airlines[i][0]+"</th>";
			if (++ac == 5) break;
//		}
	}
	matrix_html += "</thead><tbody>";
	var is_odd = true;
	for (var stops in g_matrix_data.stops) {
		if (is_odd) {
			matrix_html += "<tr class=\"odd\">";
		} else {
			matrix_html += "<tr>";
		}
		is_odd = !is_odd;
		if (stops == "0")
			matrix_html += "<td style=\"color:#5b8ec3\"><a href=\"javascript:void(0);\" onClick=\"ts_set_filter(this,'stops',"+stops+");return false;\">прямой</a></td>";
		else
			matrix_html += "<td style=\"color:#5b8ec3\"><a href=\"javascript:void(0);\" onClick=\"ts_set_filter(this,'stops',"+stops+");return false;\"><nobr>пересадок "+stops+"</nobr></a></td>";
		matrix_html += "<td><a href=\"javascript:void(0);\" onClick=\"ts_set_filter(this,'price',"+g_matrix_data.stops[stops]["min_price"]+");return false;\">"+formatMoney(g_matrix_data.stops[stops]["min_price"])+"</a></td>";
		ac = 0;
		for (var i=g_matrix_offset; i<sorted_airlines.length; ++i) {
			var price = g_matrix_data.stops[stops][sorted_airlines[i][2]];
			if (price) {
				if (sorted_airlines[i][1] == price) {  
					matrix_html += "<td><a href=\"javascript:void(0);\" onClick=\"ts_set_filter(this,'airline','"+sorted_airlines[i][2]+"');return false;\"><nobr><strong>"+formatMoney(price)+"<strong></nobr></a></td>";
				} else { 
					matrix_html += "<td><a href=\"javascript:void(0);\" onClick=\"ts_set_filter(this,'airline','"+sorted_airlines[i][2]+"');return false;\"><nobr>"+formatMoney(price)+"</nobr></a></td>";
				}
			} else {
				matrix_html += "<td></td>";				
			}
			if (++ac == 5) break;
		}
		matrix_html += "</tr>";
	}
	matrix_html += "</tbody></table><div id='nano_matrix_pager_wrapper'>";

	if (sorted_airlines.length > 5 && g_matrix_offset * 5 < sorted_airlines.length) {
		matrix_html += '<p style="text-align:right">';
		if (g_matrix_offset > 0) {
			matrix_html += '<a href="javascript:void(0);" onClick="ts_prev_matrix(); return false;">« предыдущий результат</a>&nbsp;&nbsp;&nbsp;';
		}
		matrix_html += '<a href="javascript:void(0);" onClick="ts_next_matrix(); return false;">другие авиакомпании »</a></p>';
	} else if (g_matrix_offset >0) {
		matrix_html += '<p style="text-align:right"><a href="javascript:void(0);" onClick="ts_prev_matrix(); return false;">« предыдущий результат</a></p>';		
	}
	
	return matrix_html + '</div>';
}

function ts_prev_matrix() {
	--g_matrix_offset;
	$("#nano_matrix_wrapper").html(ts_render_matrix());		
}

function ts_next_matrix() {
	++g_matrix_offset;
	$("#nano_matrix_wrapper").html(ts_render_matrix());	
}

function ts_set_filter(owner, filter_name, value) {
	if (filter_name != 'payment') {
		g_filter.stops = null;
		g_filter.price = null;
		g_filter.airline = null;

		if (g_filter_object == owner) return;
		if (g_filter_object) {
			$(g_filter_object).css("color", "#3E657B");
		}
		g_filter_object = owner;
		$(owner).css("color","#D35F8B");
	}
	g_filter[filter_name] = value;
	
	ts_rebuild();
}

function ts_apply_filter(offer) {
	if (g_filter.length == 0) return true;
	var included = true;
	if (typeof(g_filter.stops) != 'undefined' && g_filter.stops != null && g_filter.stops >= 0) {
		if (g_filter.stops == 100) {
			if (offer.depart_stops == 0) {
				included = false;
			}
		} 
		else if (offer.depart_stops != g_filter.stops) {
			included = false;
		}
	}
	if (g_filter.price && parseInt(offer.cost_total) != parseInt(g_filter.price)) {
		included = false;
	}
	if (g_filter.airline && offer.airline_code != g_filter.airline) {
		included = false;
	}
	var excluded_by_payment = true;
	if (g_filter.payment) {		
		$.each(offer.cost, function(i, cost){
			system_id = (cost.name == 'Давс' ? 0 : 1);
			excluded_by_payment = !g_payment_rules[g_filter.payment[0]][g_filter.payment[1]][system_id];
			if (excluded_by_payment == false) {
				return false;
			}
		});				                        
	} else {
		excluded_by_payment = false;
	}
	if (excluded_by_payment) {
		included = false;
	}
	return included;
}

function ts_search(params) {
	ts_init();	
	g_params = params;

//	if (g_params.euroavia == '1') {
//    window.open('/goto_lenturist?'+jQuery.param(g_params));
//	}
	
	$("#ts_result").html('');
	$("#ts_progress_box").remove();
	ts_result();
}

function ts_show_datetime(timestamp) {
	var dt = new Date(timestamp * 1000);
	return '<font style="color:#4E7CB0">'+dt.getUTCDate() + " " + g_monthes[dt.getUTCMonth()]+'</font>';
}

function ts_render_offer_duration(offer, direct) {
	if (direct == 'depart') {
		out = '<table id="ts_table_inner"><tr><td>' + offer.from + "&nbsp;</td><td><nobr>" + ts_show_datetime(offer.depart_date1) + "&nbsp;" + offer.depart_time1 + "</nobr></td><td class=\"arrow\"></td></tr>";
		if (offer.arrive_flights)
			out += "<tr><td style=\"border-top:1px solid #E4E4E4\">" + offer.to + "&nbsp;</td><td style=\"border-top:1px solid #E4E4E4\"><nobr>" + ts_show_datetime(offer.arrive_date1) + "&nbsp;" + offer.arrive_time1+'</nobr></td><td class=\"arrow\"></td></tr>';
		out += '</table>';
		return out;
	} else {
		out = '<table id="ts_table_inner"><tr><td>' + offer.to + "&nbsp;</td><td><nobr>" + ts_show_datetime(offer.depart_date2) + "&nbsp;" +  offer.depart_time2 + "</nobr></td></tr>";
		if (offer.arrive_flights)
			out += "<tr><td style=\"border-top:1px solid #E4E4E4\">" + offer.from + "&nbsp;</td><td style=\"border-top:1px solid #E4E4E4\"><nobr>" + ts_show_datetime(offer.arrive_date2) + "&nbsp;" + offer.arrive_time2+'</nobr></td><td></td></tr>';
		out += '</table>';
		return out;
	}
}

function ts_render_offer_stops(offer) {
	out = '<div style="float:left;"><table id="ts_table_inner"><tr><td>'+offer.depart_stops+ "&nbsp;/&nbsp;</td><td>" + offer.depart_duration + "</td></tr>";
	if (offer.arrive_flights)
		out += "<tr><td style=\"border-top:1px solid #E4E4E4\">" + offer.arrive_stops + "&nbsp;/&nbsp;</td><td style=\"border-top:1px solid #E4E4E4\">" + offer.arrive_duration+'</td></tr>';
	out += '</table></div>';
	out += '<div style="float:left;margin-left:16px;margin-top:9px;"><a href="javascript:void(0);">купить</a></div><div style="clear:both;"></div>';
	return out;
}

function ts_get_time(timestamp) {
	var d = new Date(timestamp*1000);
	return d.getHours()+":"+d.getMinutes();
}

function ts_get_druation(timestamp1, timestamp2) {
	var d = new Date(timestamp*1000);
	return d.getHours()+":"+d.getMinutes();
}

function ts_render_flights(flights) {
	out = '<div class="ts_flights_table_wrapper"><table class="ts_flights_table"><tbody>';
	$.each(flights, function(i, flight) {
		if (null != flight.delay) {
			out += '<tr><td class="tsf_change_info" colspan="3"><div class="tsf_change_info_border">'+ts_render_change_info(flight)+'</div></td></tr>';
		}
		out += '<tr><td class="tsf_airline">'+flight.airline+'</td><td class="tsf_depart"><p>Время вылета: '+flight.depart_time+'<br><font color="#2A5D8D">'+flight.origin.airport+'</font>';
		if (flight.origin.iata)
			out += ' ('+flight.origin.iata+')';
		out += '</p></td><td class="tsf_arrive">Прибытие: '+flight.arrive_time+'<br><font color="#286A99">'+flight.dest.airport+'</font>';
		if (flight.dest.iata)
			out += '('+flight.dest.iata+')';
		out += '</td></tr>';
		var add_style = '';
		if (i == flights.length-1) {
			add_style = ' style="padding-bottom:10px" ';
		}
		if (flight.duration != '--:--') {
			out += '<tr><td class="tsf_flight_info" '+add_style+' colspan="3"><font color="#C29131">'+flight.duration+'</font> | Рейс '+flight.airline_code+flight.number;
		} else {
			out += '<tr><td class="tsf_flight_info" '+add_style+' colspan="3">Рейс '+flight.airline_code+flight.number;
		}
		if (flight.bort) {
			out += ' | Борт '+flight.bort;
		}
		out += ' | Эконом класс</td></tr>';
	});	
	out += '</tbody></table></div>';
	return out;
}

function ts_render_change_info(flight) {
	var delay = delay_to_string(flight.delay);
	if (!flight.origin.country) { // Ticket from davs
		return "Пересадка  "+flight.origin.airport+". Время ожидания "+delay;
	}
	return "Пересадка  "+flight.origin.country+", "+flight.origin.city+" ("+flight.origin.iata+"). Время ожидания "+delay;	
}

function delay_to_string(delay_in_seconds){
	var hours = parseInt(delay_in_seconds / 3600);
	var minutes = parseInt(delay_in_seconds % 3600 / 60);
	return hours + "ч " + minutes + "мин.";
}

function ts_goto_evroavia(target) {
	url = '/goto_lenturist?'+jQuery.param(g_params);;
	$(target).attr('href', url);
	return true;
}

function ts_load_url(url_id) {
	var nano_host;
	var is_local = -1 != window.location.href.indexOf('.local');
	var is_beta = -1 != window.location.href.indexOf('beta.');
	if(is_local){
		nano_host = 'localhost:8080';
	}else if(is_beta){
		nano_host = 'nano.aviasales.ru:8080'
	}else{
		nano_host = 'nano.aviasales.ru'
	}
	var href = "http://"+ nano_host +"/searches/" + search_id + "/order_urls/" + url_id;
	var url = '<noindex><a href="'+ href +'" target="_blank" rel="nofollow">Купить</a></noindex>';
	return url;
}

function ts_mark_price(system_id, payment_method) {
	if (!g_filter.payment || g_payment_rules[g_filter.payment[0]][payment_method] == null) return '';
	
	if (g_payment_rules[g_filter.payment[0]][payment_method][system_id] == false) {
		return 'style="text-decoration:line-through"';
	} else {
		return '';
	}
}
var PricesMap = {
    // Наборту
    '1': {
        bank: 1,
        yd: 1,
        wm: 1,
        term: 1,
        card: 1
    },
    // Давс
    '2': {
        bank: 1,
        yd: 0.98,
        wm: 1.02,
        term: 1.02,
        card: 1
    },
    // Awad
    '3': {
    },
    // Geruxx
    '4': {
    },
    // Euroavia
    '5': {
        bank: 1,
        card: 1
    },
    // Sindbad
    '6': {
        term: 1,
        card: 1
    },
    // Ozon
    '7': {
        yd: 1,
        wm: 1,
        term: 1,
        card: 1
    },
    // TicketsUa
    '8': {

    },
    // BiletOnLine
    '9': {
        card: 1,
        term: 1
    }
};

function add_other_prices(system_id, cost_hash){
    var costs = $.extend({}, cost_hash);
    var price = parseInt(costs.total);
    $.each(PricesMap[system_id], function(type, tax){
        costs[type] = parseInt(price * parseFloat(tax)) || false;
    });
    return costs;
}

var NABORTU = 1;
var DAVS = 2;
var AWAD = 3;
var GERUXX = 4;
var EUROAVIA = 5;
var SINDBAD = 6;
var OZON = 7;
var TICKETS_UA = 8;
var BILET_ON_LINE = 9;

var NABORTU_ADDITION_TAX = 50;
var EUROAVIA_BANK_TAX = 350;
var NABORTU_DELIVER_TAX = 500;
var DAVS_DELIVER_TAX = 250;
var BILET_ON_LINE_DELIVER_TAX = 500;

var CURRENCY_CODE = {};
CURRENCY_CODE[GERUXX] = 'EUR';
CURRENCY_CODE[TICKETS_UA] = 'UAH';

function ts_render_details(offer_id){
	offer = g_offers[offer_id];
	out = '';
	if (g_spb_msc) {
		out += '<table class="ts_price_table"><thead><tr><th>Компания</th><th>Наличными</th><th>Курьером</th><th>По карте</th><th>В терминале</th><th>Через банк</th><th>WebMoney</th><th>Я.Деньги</th><th></th></tr></thead>';
	} else {
		out += '<table class="ts_price_table"><thead><tr><th>Компания</th><th>Наличными</th><th>По карте</th><th>В терминале</th><th>Через банк</th><th>WebMoney</th><th>Я.Деньги</th><th></th></tr></thead>';		
	}
	out += '<tbody>';
	
	$.each(offer.cost, function(i, cost_hash){
		system_id = parseInt(i);
		var cost = add_other_prices(system_id, cost_hash);
		
		if(NABORTU == system_id){
		  var passengers_count = parseInt(g_params.adults) + parseInt(g_params.children) + parseInt(g_params.infants);
		  for(var type in cost){
		    if(type != 'name'){
		      cost[type] += NABORTU_ADDITION_TAX * passengers_count;
	      }
		  }
		}
		
    if(GERUXX == system_id || TICKETS_UA == system_id){
      cost_total = parseFloat(cost_hash.native_currency_price).toFixed(2) +
        ' ' + CURRENCY_CODE[system_id];
    }else{
      cost_total = formatMoney(cost.total);
    }
    
    if (offer.cost_total == cost.total){
      cost_total = cost_total.bold();
    }
    if(AWAD == system_id || GERUXX == system_id){
      cost.card = cost_total;
      cost_total = '-';
    }
    if(EUROAVIA == system_id){
      cost.bank += EUROAVIA_BANK_TAX;
    }
    
		if (g_spb_msc) {
			cur = null;
			if(DAVS == system_id) {
				cur = parseInt(cost.total) + DAVS_DELIVER_TAX;
			}else if(NABORTU == system_id) {
				cur = parseInt(cost.total) + NABORTU_DELIVER_TAX;
			}else if(BILET_ON_LINE == system_id){
			  cur = parseInt(cost.total) + BILET_ON_LINE_DELIVER_TAX;
			}
			
			out += '<tr><td>' + cost.name + '</td><td '+ts_mark_price(system_id,0)+'>' + cost_total + '</td><td '+ts_mark_price(system_id,1)+'>' + formatMoney(cur) + '</td><td '+ts_mark_price(system_id,2)+'>' + formatMoney(cost.card) + '</td><td '+ts_mark_price(system_id,3)+'>' + formatMoney(cost.term) + '</td><td '+ts_mark_price(system_id,4)+'>' + formatMoney(cost.bank) + '</td><td '+ts_mark_price(system_id,5)+'>' + formatMoney(cost.wm) + '</td><td '+ts_mark_price(system_id,6)+'>' + formatMoney(cost.yd) + '</td><td id="url_'+offer.url[i]+'">' + ts_load_url(offer.url[i]) + '</td></tr>';
		} else {
	      out += '<tr><td>' + cost.name + '</td><td '+ts_mark_price(system_id,0)+'>' + cost_total + '</td><td '+ts_mark_price(system_id,2)+'>' + formatMoney(cost.card) + '</td><td '+ts_mark_price(system_id,3)+'>' + formatMoney(cost.term) + '</td><td '+ts_mark_price(system_id,4)+'>' + formatMoney(cost.bank) + '</td><td '+ts_mark_price(system_id,5)+'>' + formatMoney(cost.wm) + '</td><td '+ts_mark_price(system_id,6)+'>' + formatMoney(cost.yd) + '</td><td id="url_'+offer.url[i]+'">' + ts_load_url(offer.url[i]) + '</td></tr>';						
		}
	});

/*	
	if (g_params.klass == 0)
		out += '<tr><td>ЕвроАвиа</td><td colspan="7"><a target="_blank" href="javascript:void(0);" onClick="ts_goto_evroavia(this);">уточнить на сайте агенства</a></td></tr>';
*/
			
	out += '</tbody></table>';
	out += '<div class="ts_depart_label"><font color="#6C9A3B">Отправление</font> ' + offer.depart_flights[0].depart_datetime + '</div>';
	out += ts_render_flights(offer.depart_flights);
	if (offer.arrive_flights) { 
		out += '<div class="line-middle"></div>';
		out += '<div class="ts_depart_label"><font color="#A70E0E">Возвращение</font> ' + offer.arrive_flights[offer.arrive_flights.length - 1].arrive_datetime + '</div>';
		out += ts_render_flights(offer.arrive_flights);
	}
	$("#ts_details_content_"+offer_id).html(out);
}

function ts_init() {	
	$.tablesorter.addWidget({ 
	    // give the widget a id 
	    id: "tableFacet", 
	    format: function(table) {		 	
			$("tr.ts-table-facet",$("table.ts_table")).remove();
            $.each($("tbody tr.ts_flight_row",table), function(i,val) {
            	offer_id = $(val).attr("id");
            	// $(val).after('<tr class="ts-table-facet"><td colspan="5" style="padding:0;"><div class="ts_more" id="ts_more_'+offer_id+'"><a href="javascript:void(0);" onClick="javascript:ts_show_details('+offer_id+');return false;">подробности</a></div><div class="ts_details" id="ts_details_'+offer_id+'" style="display:none"><div class="line-top"></div><div id="ts_details_content_'+offer_id+'"></div><div class="line-bottom"></div><div class="ts_collapse"><a href="javascript:void(0);" onClick="javascript:ts_hide_details('+offer_id+'); return false;">Скрыть подробности</a></div></div></td></tr>');
            	$(val).after('<tr class="ts-table-facet"><td colspan="5" style="padding:4px 0 0 0;"><div class="ts_details" id="ts_details_'+offer_id+'" style="display:none"><div class="line-top"></div><div id="ts_details_content_'+offer_id+'"></div><div class="line-bottom"></div><div class="ts_collapse"><a href="javascript:void(0);" onClick="javascript:ts_hide_details('+offer_id+'); return false;">Скрыть подробности</a></div></div></td></tr>');
            });
	    }
	});
	$.tablesorter.addParser({
		id: "xml_ticket_price",
		is: function(s) {
			return false;
		},
		format: function(s,table) {
			return s.replace(/[^0-9]/g, '')
		},
		type: "numeric"
	});	 	
}

function ts_rebuild() {
	var progress_html = '<div id="ts_progress_box" style="background:#E6F6D7;margin-bottom:20px;padding:13px 0 13px 20px;">';
	progress_html += '<p align="center" style="font-family:Arial;font-size:14px;font-weight:bold;color:#313131;padding:0;margin:0;">Подождите, ваш запрос обрабатывается.<br><br><img border="0" src="/modules/aviasales_search/js/addons/ajax-loader.gif"></p>';
	progress_html += '</div>';
	$("#ts_filter_plh").html(progress_html);
	setTimeout('ts_result(true)', 1000);
}

function as_mat_hide() {
	$("#as_mat_show_btn").show();
	$("#as_mat_hide_btn").hide();
	$("#as_mat_wrapper").hide();
}

function as_mat_show() {
	$("#as_mat_show_btn").hide();
	$("#as_mat_hide_btn").show();
	$("#as_mat_wrapper").show();	
}

function adult_price_warning(params){
    var warning = "Стоимость указана за одного взрослога пассажира и включает все сборы";
    if (params.infants != 0 || g_params.children != 0) {
        return '<div style="padding-top:0.4em;width:550px">'+ warning +'</div>';
    }
    return '';
}

function ts_result(rebuild) {
	if (g_offers == null) return;
	if (!rebuild) {
		$("#ts_result").html("");
	}
	var out = '';
	if (g_offers.length == 0) {
		out += '<p style="margin-left:20px;color:red;">Вероятно произошел сбой в работе поиска, попробуйте обновить страницу.</p>';
		$("#ts_result").html(out);
		return;
	}
//	out += '<table class="ts_table"><thead><tr><th class="header first_head" width="150"><span>Цена</span></th><th class="header"><span>Авиакомпания</span></th><th class="header" width="114px"><span>Отправление</span></th><th class="header" width="114px"><span>Прибытие</span></th><th class="header last_head"><span style="width:200px;"><nobr>Пересадки / Время в пути</nobr></span></th></thead></tr><tbody>';
	pager_html = '<div id="ts_pager" style="float:right;">'+
		'<table border="0"><tr>'+
		'<td valign="top" style="font-size:11px;">Страница <span class="pagedisplay"/></td>'+	
		'<td><a href="javascript:void(0);"><img title="в начало" src="/misc/addons/pager/icons/first.png" id="pager_first" class="first"/></a></td>'+
		'<td><a href="javascript:void(0);"><img title="пред. страница" src="/misc/addons/pager/icons/prev.png" id="pager_prev"  class="prev"/></a></td>'+
		'<td><a href="javascript:void(0);"><img title="след. страница" src="/misc/addons/pager/icons/next.png" id="pager_next" class="next"/></a></td>'+
		'<td><a href="javascript:void(0);"><img title="в конец" src="/misc/addons/pager/icons/last.png" id="pager_last" class="last"/></a></td>'+
		'</tr></table>'+
		'<select class="pagesize" style="display:none">'+
		'<option selected="selected"  value="30">30</option>'+
		'</select>'+
		'</div><div style="clear:both;"/>';
	pager_html_top = '<div id="ts_pager_top" style="float:right;">'+
	'<table border="0"><tr>'+
	'<td valign="top" style="font-size:11px;">Страница <span class="pagedisplay"/></td>'+	
	'<td><a href="javascript:void(0);" onClick="javascript:$(\'#pager_first\').click();return false;"><img title="в начало" src="/misc/addons/pager/icons/first.png"/></a></td>'+
	'<td><a href="javascript:void(0);" onClick="javascript:$(\'#pager_prev\').click();return false;"><img title="пред. страница" src="/misc/addons/pager/icons/prev.png"/></a></td>'+
	'<td><a href="javascript:void(0);" onClick="javascript:$(\'#pager_next\').click();return false;"><img title="след. страница" src="/misc/addons/pager/icons/next.png"/></a></td>'+
	'<td><a href="javascript:void(0);" onClick="javascript:$(\'#pager_last\').click();return false;"><img title="в конец" src="/misc/addons/pager/icons/last.png"/></a></td>'+
	'</tr></table>'+
	'<select class="pagesize" style="display:none">'+
	'<option selected="selected"  value="30">30</option>'+
	'</select>'+
	'</div><div style="clear:both;"/>';
	
	if (!rebuild)
		out += '<div id="ts_filter_plh"></div><div id="ts_result_container">';
	out += pager_html_top;
	out += '<table class="ts_table"><thead><tr><th class="first_head" width="150"><span>Цена</span></th><th><span>Авиакомпания</span></th><th width="114px"><span>Отправление</span></th><th width="114px"><span>Прибытие</span></th><th class="last_head" style="width:182px;"><span><nobr>Пересадки / Время в пути</nobr></span></th></thead></tr><tbody>';
	counter = 0;
	included_offers = 0;
	$.each(g_offers, function(i, offer) {
		if (!rebuild) {
			ts_add_to_matrix(offer);
		}
		//if (counter < 4) {
			if (ts_apply_filter(offer)) {
				++included_offers;
			//if (offer.cost.length > 0 && (offer.airline == 'Sky Express' || offer.airline == 'ЭХ') && offer.depart_time1=='15:00') {
				out += '<tr class="ts_flight_row" id="' + offer.id + '" onMouseover="javascript:ts_highlight_ticket(this, true);" onMouseout="javascript:ts_highlight_ticket(this,false);" onClick="javascript:ts_show_details('+offer.id+')"><td class="ts_price">' + formatMoney(offer.cost_total) + '</td><td class="ts_airline">' + offer.airline;
				out += '</td><td>' + ts_render_offer_duration(offer, 'depart') + '</td><td>' + ts_render_offer_duration(offer, 'arrive') + '</td><td class="ts_stops">' + ts_render_offer_stops(offer) + '</td></tr>';
			//}
			}
		//}
			//++counter;			
	});
	out += '</tbody></table>';
	out += pager_html;
	
	var matrix_out = '';
	if (!rebuild) {
		matrix_out += '<div id="nano_matrix_wrapper">'+ts_render_matrix()+'</div>';
		if (g_status != '') {
			matrix_out += '<p style="font-size:16px;color:red;">'+g_status+'</p>';
			g_status = '';
		}
		if (parseInt(g_params.klass) == 0) {
			if (parseInt(g_params.oneway) == 1) {
				g_as_mat_dates = as_mat_get_initial_dates_oneway(g_params.date1);		
				matrix_out += '<div style="margin-bottom:1.4em;padding:1em;background:#f4f2e7;">'
					+ '<div style="color:#4F87BF;font-weight:bold;font-size:16px;">Календарь лучших цен &nbsp;&nbsp;<a style="color:#c62d2d;font-size:12px;" href="javascript:void(0);" id="as_mat_hide_btn" onClick="javascript:as_mat_hide();"><i>(скрыть)</i></a><a id="as_mat_show_btn" style="display:none;color:#c62d2d;font-size:12px;" href="javascript:void(0);" onClick="javascript:as_mat_show();"><i>(показать)</i></a></div>'
					+ '<div id="as_mat_wrapper">'
					+ '<div style="background:url(/themes/aviasales2/images/hd_sep.png) repeat-x scroll center center;height:1px;padding:10px 0;"></div>'
					+  adult_price_warning(g_params)
					+ '<div style="color:#424e5b;margin-bottom:4px;"><i>Используя стрелки выберите нужные даты вылета и возвращения</i></div>'
					+ '<div id="as_dates_mat">' + as_mat_render_oneway(g_as_mat_dates) + '</div>';
					matrix_out += '<div style="float:right;margin-top:0.4em;background:url(/themes/aviasales2/images/as_mat_bullet.gif) left center no-repeat;padding-bottom:2px;padding-left:24px">&#8212; <i>лучшее предложение</i></div>'
						+ '<div style="clear:both;"></div>'
						+ '</div></div>';			
			} else {
				g_as_mat_dates = as_mat_get_initial_dates(g_params.date1, g_params.date2);		
				matrix_out += '<div style="margin-bottom:1.4em;padding:1em;background:#f4f2e7;">'
					+ '<div style="color:#4F87BF;font-weight:bold;font-size:16px;">Календарь лучших цен &nbsp;&nbsp;<a style="color:#c62d2d;font-size:12px;" href="javascript:void(0);" id="as_mat_hide_btn" onClick="javascript:as_mat_hide();"><i>(скрыть)</i></a><a id="as_mat_show_btn" style="display:none;color:#c62d2d;font-size:12px;" href="javascript:void(0);" onClick="javascript:as_mat_show();"><i>(показать)</i></a></div>'
					+ '<div id="as_mat_wrapper">'
					+ '<div style="background:url(/themes/aviasales2/images/hd_sep.png) repeat-x scroll center center;height:1px;padding:10px 0;"></div>'
					+  adult_price_warning(g_params)
					+ '<div style="color:#424e5b;margin-bottom:4px;"><i>Используя стрелки выберите нужные даты вылета и возвращения</i></div>'
					+ '<div id="as_dates_mat">' + as_mat_render(g_as_mat_dates) + '</div>';
				matrix_out += '<div style="float:right;margin-top:0.4em;background:url(/themes/aviasales2/images/as_mat_bullet.gif) left center no-repeat;padding-bottom:2px;padding-left:24px">&#8212; <i>лучшее предложение</i></div>'
					+ '<div style="clear:both;"></div>'
					+ '</div></div>';
			}
			matrix_out += ts_render_filter_pan();
		}
	}
	
	if (!rebuild) out += '</div>';
	if (included_offers == 0) {
		out = '<p style="margin-left:20px;color:red;">Не найдено ни одного билета удовлетворяющего вашим критериям.</p>';
		$("#ts_filter_plh").html(out);
		out = '';
	}	
	if (!rebuild) {
		$("#ts_result").html('<span id="ts_top"></span>' + matrix_out + out);
		if (parseInt(g_params.klass) == 0) {
			as_mat_fill();
		}
	}
	else {
		$("#ts_result_container").html(out);
	}

	$("table.ts_table").tablesorter({
		headers: { 0: { sorter: "xml_ticket_price" } },
		widgets: ['tableFacet'],
		pagerPositionSet: true,
		sortList: [[0,0]] 		
	})
	.tablesorterPager({
		container: $("#ts_pager"), 
		size:30
	});

	$("table.ts_table").bind("sortEnd",function() { 
		$("#ts_filter_plh").html(""); 
    });     
}

function ts_highlight_ticket(obj, mode) {
	if (mode) {
		$(obj).find("td").css('background-color','#E0EFEF');
	} else {
		$(obj).find("td").css('background-color','#F2F4F4');
	}
}

function ts_show_details(offer_id) {
	if ($("#ts_details_"+offer_id).is(':visible')) {
		ts_hide_details(offer_id);
	} else {
		ts_render_details(offer_id);
		$("#ts_details_"+offer_id).show();
	}
}

function ts_hide_details(offer_id) {
	$("#ts_details_content_"+offer_id).html("");
	$("#ts_details_"+offer_id).hide();
}

function ts_davs_order(form_name) {
  $("#form_"+form_name).get(0).submit();
  return true;
}

function as_mat_str2date(str) {
	var t = str.split('.');
	var d = new Date(parseInt(t[2]), parseInt(t[1]) - 1, parseInt(t[0]));
	return d;
}

function as_mat_get_initial_dates_oneway(depart) {
	var dd = new Date(depart*1000);//as_mat_str2date(depart);

	var ddd = (dd.getDay() == 0 ? 7 : dd.getDay()) - 1;

	if (ddd > 0) {
		dd = new Date(dd.getTime() - ddd * 86400000);	
	}

	return {
		depart : dd,
		arrive : 0
	};
}

function as_mat_get_initial_dates(depart, arrive) {
	var dd = new Date(depart*1000);//as_mat_str2date(depart);
	var da = new Date(arrive*1000);//as_mat_str2date(arrive);

	var ddd = (dd.getDay() == 0 ? 7 : dd.getDay()) - 1;
	var dda = (da.getDay() == 0 ? 7 : da.getDay());

	if (ddd > 0) {
		dd = new Date(dd.getTime() - ddd * 86400000);	
	}
	if (dda == 1) {
		da = new Date(da.getTime() - 6 * 86400000);
	} else if (dda > 2) {
		da = new Date(da.getTime() - (dda-2) * 86400000);
	}
	
	if (da - dd < 0) {
//		da.setDate(dd.getDate() + 1);
	}

	return {
		depart : dd,
		arrive : da
	};
}

function as_mat_num2str(val) {
	//return val;
	return val < 10 ? '0' + val.toString() : val.toString();
}

function as_mat_dateformat(date) {
	var days = [ "Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб" ];
	return days[date.getDay()] + ' ' + as_mat_num2str(date.getDate()) + '.'
			+ as_mat_num2str(date.getMonth() + 1);
}

function as_mat_check_min_date(date) {
	var current_date = new Date();
	return date - current_date > 86400000;
}

function as_mat_check_max_date(date) {
	return true;
}

function as_mat_arrive_prev() {
	if (!as_mat_check_min_date(g_as_mat_dates.arrive))
		return;
	g_as_mat_dates.arrive = new Date(
			g_as_mat_dates.arrive.getTime() - 86400000 * 7);

	if (g_as_mat_dates.arrive - g_as_mat_dates.depart < 0) {
		g_as_mat_dates.depart = new Date(
				g_as_mat_dates.arrive.getTime() - 86400000);
	}

	as_mat_render(g_as_mat_dates);
}

function as_mat_arrive_next() {
	g_as_mat_dates.arrive = new Date(
			g_as_mat_dates.arrive.getTime() + 86400000 * 7);
	as_mat_render(g_as_mat_dates);
}

function as_mat_depart_prev() {
	if (!as_mat_check_min_date(g_as_mat_dates.depart))
		return;
	g_as_mat_dates.depart = new Date(
			g_as_mat_dates.depart.getTime() - 86400000 * 7);
	as_mat_render(g_as_mat_dates);
}

function as_mat_depart_next() {
	g_as_mat_dates.depart = new Date(
			g_as_mat_dates.depart.getTime() + 86400000 * 7);

	if (g_as_mat_dates.arrive - g_as_mat_dates.depart < 0) {
		g_as_mat_dates.arrive = new Date(
				g_as_mat_dates.depart.getTime() + 86400000);
	}

	as_mat_render(g_as_mat_dates);
}

function as_mat_depart_prev_oneway() {
	if (!as_mat_check_min_date(g_as_mat_dates.depart))
		return;
	g_as_mat_dates.depart = new Date(
			g_as_mat_dates.depart.getTime() - 86400000 * 7);
	as_mat_render_oneway(g_as_mat_dates);
}

function as_mat_depart_next_oneway() {
	g_as_mat_dates.depart = new Date(
			g_as_mat_dates.depart.getTime() + 86400000 * 7);
	as_mat_render_oneway(g_as_mat_dates);
}

function as_mat_timestamp2str(timestamp) {
	var date = new Date(timestamp);
	return (date.getDate()<10?'0'+date.getDate().toString():date.getDate().toString())+
		'.'+((date.getMonth()+1)<10?'0'+(date.getMonth()+1).toString():(date.getMonth()+1).toString())+'.'+date.getFullYear().toString();
}

function as_mat_refresh(depart, arrive) {
	if (arrive == 0) {
		var depart = as_mat_timestamp2str(depart*1000);
		window.location.href = $.query.set('date1', depart).set('date2', '').set('oneway', 1).toString();  
	} else {
		var depart = as_mat_timestamp2str(depart*1000);
		var arrive = as_mat_timestamp2str(arrive*1000);
		window.location.href = $.query.set('date1', depart).set('date2', arrive).set('oneway',0).toString();  
	}
}

function as_correct_price(price) {
	if (parseInt(g_params.infants) == 0 && parseInt(g_params.children) == 0) {
		return parseInt(price)*parseInt(g_params.adults);
	} else {
		return price;
	}
}

function as_mat_fill_done(data) {
	if (data) {
		var min_price = 0xffffff;
		for(var i in g_as_mat_data) {		
			var key = 'k' + g_as_mat_data[i].depart.toString();
			if (parseInt(g_params.oneway) != 1) {
				key += + g_as_mat_data[i].arrive.toString();
			}
			
			var val = data[key];
			if (val) {
				min_price = Math.min(parseInt(min_price), as_correct_price(val));
			}
		}
		for(var i in g_as_mat_data) {		
			var key = 'k' + g_as_mat_data[i].depart.toString();
			if (parseInt(g_params.oneway) != 1) {
				key += + g_as_mat_data[i].arrive.toString();
			}
			var val = data[key];
			if (!val) {
				val = 'найти';
			}
			else {
				val = '<b>'+as_correct_price(val)+'</b>';
			}
			var arrive_s = 0;
			if (parseInt(g_params.oneway) != 1) {
				arrive_s = g_as_mat_data[i].arrive.toString();				
			}
			var link = '<a href="javascript:void(0);" onClick="javascript:as_mat_refresh('+g_as_mat_data[i].depart.toString()+','+arrive_s+');">'+val+'</a>';
			$("#as_mat_"+g_as_mat_data[i].index.toString()).html(link);
		}
		$("#as_dates_mat td").each(function(index) {
			if (parseInt($(this).text()) == min_price) {
				$(this).css('background-color', '#97c820');
				$("a", this).css('color', '#ffffff');
			}
		});
	}
	$("#as_mat_progress").hide();
}

function as_mat_fill() {
	$("#as_mat_progress").show();	

	var url = "/ts_dmr/"+g_params.from+"/"+g_params.to+"/"+(g_as_mat_dates.depart.getTime()/1000).toString(); 
	if (parseInt(g_params.oneway) != 1) {
		url += "/"+(g_as_mat_dates.arrive.getTime()/1000).toString();
	}
		
 	$.ajax({  
 	   type: "GET",  
 	   url: url,  
 	   dataType: "json",
 	   success: function(data) {
 		as_mat_fill_done(data);
 	   },     
 	   error: function() { 
 		as_mat_fill_done(null);
 	   }
	});  		
}

function as_mat_render(dates) {
	out = '';
	out += '<table style="width:100%;border-collapse:separate;background:#ffffff;"><tbody style="border:none;">'
			+ '<tr>'
			+ '<td align="center"><div style="width:16px;height:16px;"><div id="as_mat_progress" style="display:none;"><img border="0" src="/misc/ac/indicator.gif"></div></div></td><td></td><td colspan="7" style="padding-top:0;padding-bottom:0;color:#b43533;font-weight:bold;background:#e7b6b5;">'
			+ '<table border="0" style="width:100%;"><tr><td style="padding-bottom:0;padding-top:4px;"><a href="javascript:void(0);" onClick="javascript:as_mat_arrive_prev();"><img border="0" src="/themes/aviasales2/images/mat_arr_btn1.gif"></a></td>'
			+ '<td style="padding-bottom:0;padding-top:0;width:166px;background: url(/themes/aviasales2/images/mat_bg1.gif) center center no-repeat"></td>'
			+ '<td align="right"  style="padding-bottom:0;padding-top:4px;"><a href="javascript:void(0);" onClick="javascript:as_mat_arrive_next();"><img border="0" src="/themes/aviasales2/images/mat_arr_btn2.gif"></a></td></tr></table></td>'
			+ '</tr>'
			+ '<tr>'
			+ '<td rowspan="8" valign="top" style="width:22px;color:#608f36;font-weight:bold;background:#c5eaa3;">'
			+ '<table border="0" style="width:100%;"><tr><td><a href="javascript:void(0);" onClick="javascript:as_mat_depart_prev();"><img border="0" src="/themes/aviasales2/images/mat_dep_btn1.gif"></a></td></tr>'
			+ '<tr><td style="height:140px;background: url(/themes/aviasales2/images/mat_bg2.gif) center center no-repeat"></td></tr>'
			+ '<tr><td><a href="javascript:void(0);" onClick="javascript:as_mat_depart_next();"><img border="0" src="/themes/aviasales2/images/mat_dep_btn2.gif"></a></td></tr></table></td>'
			+ '<td align="center" style="background:#d8d4ba"></td>';
	// fill arrive header
	for ( var i = 0; i < 7; ++i) {
		var date = new Date(dates.arrive.getTime() + 86400000 * i);
		out += '<td align="center" style="background:#d8d4ba;color:#a60d0d;">' + as_mat_dateformat(date) + '</td>';
	}
	out += '</tr>';

	// fill depart header
	var current_date = new Date();
	g_as_mat_data = new Array();
	
	for ( var i = 0; i < 7; ++i) {
		var date = new Date(dates.depart.getTime() + 86400000 * i);
		out += '<tr>' + '<td align="center" style="background:#d8d4ba;color:#608f36;">' + as_mat_dateformat(date) + '</td>';
		for ( var j = 0; j < 7; ++j) {
			var arrive_date = new Date(dates.arrive.getTime() + 86400000 * j);
			if ((arrive_date - date < 0)
					|| ((date - current_date) * 86400000 < 1)) {
				out += '<td align="center" style="background:#f4f2e7;color:#959591"><i>&#8212;&#124&#124&#8212;</i></td>';
			} else {
				out += '<td align="center" style="background:#f4f2e7" id="as_mat_'+g_as_mat_data.length+'"></td>';
				g_as_mat_data.push({ depart:date.getTime()/1000, arrive:arrive_date.getTime()/1000, index:g_as_mat_data.length });
			}
		}
		out += '</tr>';
	}

	out += '</tbody></table>';

	var elem = document.getElementById('as_dates_mat');
	if (elem) {
		elem.innerHTML = out;
		as_mat_fill();
	} else {		
		return out;
	}
}

function as_mat_render_oneway(dates) {
	out = '';
	out += '<table style="width:100%;border-collapse:separate;background:#ffffff;"><tbody style="border:none;">'
			+ '<tr>'
			+ '<td align="center"><div style="width:16px;height:16px;"><div id="as_mat_progress" style="display:none;"><img border="0" src="/misc/ac/indicator.gif"></div></div></td><td colspan="7" style="padding-top:0;padding-bottom:0;color:#b43533;font-weight:bold;background:#e7b6b5;">'
			+ '<table border="0" style="width:100%;"><tr><td style="padding-bottom:0;padding-top:4px;"><a href="javascript:void(0);" onClick="javascript:as_mat_depart_prev_oneway();"><img border="0" src="/themes/aviasales2/images/mat_arr_btn1.gif"></a></td>'
			+ '<td style="padding-bottom:0;padding-top:0;width:166px;font-size:14px;"><b>отправление</b></td>'
			+ '<td align="right"  style="padding-bottom:0;padding-top:4px;"><a href="javascript:void(0);" onClick="javascript:as_mat_depart_next_oneway();"><img border="0" src="/themes/aviasales2/images/mat_arr_btn2.gif"></a></td></tr></table></td>'
			+ '</tr>'
			+ '<tr>'
			+ '<td></td>';
	// fill arrive header
	for ( var i = 0; i < 7; ++i) {
		var date = new Date(dates.depart.getTime() + 86400000 * i);
		out += '<td align="center" style="background:#d8d4ba;color:#a60d0d;">' + as_mat_dateformat(date) + '</td>';
	}
	out += '</tr>';

	var current_date = new Date();
	g_as_mat_data = new Array();

	out += '<tr><td></td>';
	for ( var j = 0; j < 7; ++j) {
		var depart_date = new Date(dates.depart.getTime() + 86400000 * j);
		if ((depart_date - current_date) * 86400000 < 1) {
			out += '<td align="center" style="background:#f4f2e7;color:#959591"><i>&#8212;&#124&#124&#8212;</i></td>';
		} else {
			out += '<td align="center" style="background:#f4f2e7" id="as_mat_'+g_as_mat_data.length+'">&nbsp;</td>';
			g_as_mat_data.push({ depart:depart_date.getTime()/1000, index:g_as_mat_data.length });
		}
	}
	out += '</tr>';
	
/*	
	// fill depart header
	var current_date = new Date();
	g_as_mat_data = new Array();
	
	for ( var i = 0; i < 7; ++i) {
		var date = new Date(dates.depart.getTime() + 86400000 * i);
		out += '<tr>' + '<td align="center" style="background:#d8d4ba;color:#608f36;">' + as_mat_dateformat(date) + '</td>';
		for ( var j = 0; j < 7; ++j) {
			var arrive_date = new Date(dates.arrive.getTime() + 86400000 * j);
			if ((arrive_date - date < 0)
					|| ((date - current_date) * 86400000 < 1)) {
				out += '<td align="center" style="background:#f4f2e7;color:#959591"><i>&#8212;&#124&#124&#8212;</i></td>';
			} else {
				out += '<td align="center" style="background:#f4f2e7" id="as_mat_'+g_as_mat_data.length+'"></td>';
				g_as_mat_data.push({ depart:date.getTime()/1000, arrive:arrive_date.getTime()/1000, index:g_as_mat_data.length });
			}
		}
		out += '</tr>';
	}
*/
	out += '</tbody></table>';

	var elem = document.getElementById('as_dates_mat');
	if (elem) {
		elem.innerHTML = out;
		as_mat_fill();
	} else {		
		return out;
	}
}

/**
 * jQuery.query - Query String Modification and Creation for jQuery
 * Written by Blair Mitchelmore (blair DOT mitchelmore AT gmail DOT com)
 * Licensed under the WTFPL (http://sam.zoy.org/wtfpl/).
 * Date: 2009/8/13
 *
 * @author Blair Mitchelmore
 * @version 2.1.7
 *
 **/
new function(settings) { 
  // Various Settings
  var $separator = settings.separator || '&';
  var $spaces = settings.spaces === false ? false : true;
  var $suffix = settings.suffix === false ? '' : '[]';
  var $prefix = settings.prefix === false ? false : true;
  var $hash = $prefix ? settings.hash === true ? "#" : "?" : "";
  var $numbers = settings.numbers === false ? false : true;
  
  jQuery.query = new function() {
    var is = function(o, t) {
      return o != undefined && o !== null && (!!t ? o.constructor == t : true);
    };
    var parse = function(path) {
      var m, rx = /\[([^[]*)\]/g, match = /^([^[]+)(\[.*\])?$/.exec(path), base = match[1], tokens = [];
      while (m = rx.exec(match[2])) tokens.push(m[1]);
      return [base, tokens];
    };
    var set = function(target, tokens, value) {
      var o, token = tokens.shift();
      if (typeof target != 'object') target = null;
      if (token === "") {
        if (!target) target = [];
        if (is(target, Array)) {
          target.push(tokens.length == 0 ? value : set(null, tokens.slice(0), value));
        } else if (is(target, Object)) {
          var i = 0;
          while (target[i++] != null);
          target[--i] = tokens.length == 0 ? value : set(target[i], tokens.slice(0), value);
        } else {
          target = [];
          target.push(tokens.length == 0 ? value : set(null, tokens.slice(0), value));
        }
      } else if (token && token.match(/^\s*[0-9]+\s*$/)) {
        var index = parseInt(token, 10);
        if (!target) target = [];
        target[index] = tokens.length == 0 ? value : set(target[index], tokens.slice(0), value);
      } else if (token) {
        var index = token.replace(/^\s*|\s*$/g, "");
        if (!target) target = {};
        if (is(target, Array)) {
          var temp = {};
          for (var i = 0; i < target.length; ++i) {
            temp[i] = target[i];
          }
          target = temp;
        }
        target[index] = tokens.length == 0 ? value : set(target[index], tokens.slice(0), value);
      } else {
        return value;
      }
      return target;
    };
    
    var queryObject = function(a) {
      var self = this;
      self.keys = {};
      
      if (a.queryObject) {
        jQuery.each(a.get(), function(key, val) {
          self.SET(key, val);
        });
      } else {
        jQuery.each(arguments, function() {
          var q = "" + this;
          q = q.replace(/^[?#]/,''); // remove any leading ? || #
          q = q.replace(/[;&]$/,''); // remove any trailing & || ;
          if ($spaces) q = q.replace(/[+]/g,' '); // replace +'s with spaces
          
          jQuery.each(q.split(/[&;]/), function(){
            var key = decodeURIComponent(this.split('=')[0] || "");
            var val = decodeURIComponent(this.split('=')[1] || "");
            
            if (!key) return;
            
            if ($numbers) {
              if (/^[+-]?[0-9]+\.[0-9]*$/.test(val)) // simple float regex
                val = parseFloat(val);
              else if (/^[+-]?[0-9]+$/.test(val)) // simple int regex
                val = parseInt(val, 10);
            }
            
            val = (!val && val !== 0) ? true : val;
            
            if (val !== false && val !== true && typeof val != 'number')
              val = val;
            
            self.SET(key, val);
          });
        });
      }
      return self;
    };
    
    queryObject.prototype = {
      queryObject: true,
      has: function(key, type) {
        var value = this.get(key);
        return is(value, type);
      },
      GET: function(key) {
        if (!is(key)) return this.keys;
        var parsed = parse(key), base = parsed[0], tokens = parsed[1];
        var target = this.keys[base];
        while (target != null && tokens.length != 0) {
          target = target[tokens.shift()];
        }
        return typeof target == 'number' ? target : target || "";
      },
      get: function(key) {
        var target = this.GET(key);
        if (is(target, Object))
          return jQuery.extend(true, {}, target);
        else if (is(target, Array))
          return target.slice(0);
        return target;
      },
      SET: function(key, val) {
        var value = !is(val) ? null : val;
        var parsed = parse(key), base = parsed[0], tokens = parsed[1];
        var target = this.keys[base];
        this.keys[base] = set(target, tokens.slice(0), value);
        return this;
      },
      set: function(key, val) {
        return this.copy().SET(key, val);
      },
      REMOVE: function(key) {
        return this.SET(key, null).COMPACT();
      },
      remove: function(key) {
        return this.copy().REMOVE(key);
      },
      EMPTY: function() {
        var self = this;
        jQuery.each(self.keys, function(key, value) {
          delete self.keys[key];
        });
        return self;
      },
      load: function(url) {
        var hash = url.replace(/^.*?[#](.+?)(?:\?.+)?$/, "$1");
        var search = url.replace(/^.*?[?](.+?)(?:#.+)?$/, "$1");
        return new queryObject(url.length == search.length ? '' : search, url.length == hash.length ? '' : hash);
      },
      empty: function() {
        return this.copy().EMPTY();
      },
      copy: function() {
        return new queryObject(this);
      },
      COMPACT: function() {
        function build(orig) {
          var obj = typeof orig == "object" ? is(orig, Array) ? [] : {} : orig;
          if (typeof orig == 'object') {
            function add(o, key, value) {
              if (is(o, Array))
                o.push(value);
              else
                o[key] = value;
            }
            jQuery.each(orig, function(key, value) {
              if (!is(value)) return true;
              add(obj, key, build(value));
            });
          }
          return obj;
        }
        this.keys = build(this.keys);
        return this;
      },
      compact: function() {
        return this.copy().COMPACT();
      },
      toString: function() {
        var i = 0, queryString = [], chunks = [], self = this;
        var encode = function(str) {
          str = str + "";
          if ($spaces) str = str.replace(/ /g, "+");
          return encodeURIComponent(str);
        };
        var addFields = function(arr, key, value) {
          if (!is(value) || value === false) return;
          var o = [encode(key)];
          if (value !== true) {
            o.push("=");
            o.push(encode(value));
          }
          arr.push(o.join(""));
        };
        var build = function(obj, base) {
          var newKey = function(key) {
            return !base || base == "" ? [key].join("") : [base, "[", key, "]"].join("");
          };
          jQuery.each(obj, function(key, value) {
            if (typeof value == 'object') 
              build(value, newKey(key));
            else
              addFields(chunks, newKey(key), value);
          });
        };
        
        build(this.keys);
        
        if (chunks.length > 0) queryString.push($hash);
        queryString.push(chunks.join($separator));
        
        return queryString.join("");
      }
    };
    
    return new queryObject(location.search, location.hash);
  };
}(jQuery.query || {}); // Pass in jQuery.query as settings object

