function MakeArray( n ) {
	this.length = n;
	for( var i = 1; i <= n; i++ ) {
		this[ i ] = 0;
	}
	return this;
}

function Sort( colnum ) {
	OnSortStart( );
	cur_row = start_row;
	var sort_flag = 1;
	// сохранение нового порядка сортировки
	if( colnum > 0 ) { // 0 - означает сортировать без изменения существующих условий
		for( i = 1; i <= pack_sort.length; i++ ) {
			if( GetColumnIndex( pack_sort[i] ) == colnum ) {
				if( pack_sort[i] % 2 == 1 ) { pack_sort[i]++; break; }
				else { DeleteSort( i ); break; }
			}
			if( pack_sort[i] == 0 ) {
				if( ( i > max_order_size ) && ( max_order_size > 0 ) ) {

					if( limit_excess_behaviour == "push" ) {
						for( var z = 2; z <= pack_sort.length; z++ ) { pack_sort[ z - 1 ] = pack_sort[ z ]; }
						pack_sort[ pack_sort.size ] = 0;
						pack_sort[ max_order_size ] = colnum * 2 - 1;
						break;
					}
					else {
						sort_flag = 0;
						break;
					}

				}
				else {
					pack_sort[ i ] = colnum * 2 - 1; break;
				}
			}
		}
	}

	OnSortReoder( );

	if( sort_flag ) {
		var arr_indexes = new Array();
		for( var z = 0; z < data.length; z++ ) { arr_indexes[ z ] = z; }

		// сортировка
		SortArr( pack_sort, arr_indexes );

		// корректировка названий столбцов в таблице
		ShowSortNames();
	}
	OnSortEnd( );
}

function RemoveFromOrder( colnum ) {
	for( i = 1; i <= pack_sort.length; i++ ) {
		if( GetColumnIndex( pack_sort[i] ) == colnum ) {
			if( pack_sort[i] % 2 == 1 ) { pack_sort[i]++; break; }
			else { break; }
		}
	}
	Sort( colnum );
}

function GetColumnIndex( sc ) {
	if( sc % 2 == 1 ) { return ( sc + 1 ) / 2; }
	else { return sc / 2; }
}

function DeleteSort( ind ) {
	for( j = ind; j < pack_sort.length; j++ ) {
		pack_sort[ j ] = pack_sort[ j+1 ];
	}
	pack_sort[ pack_sort.length ] = 0;
}

function ShowSortNames( ) {
	for( i = 1; i <= data_names.length; i++ ) {
		var sort_direction = "";
		for( j = 1; j <= pack_sort.length; j++ ) {
			if( GetColumnIndex( pack_sort[ j ] ) == i ) { sort_direction = GetSortDirection( pack_sort[ j ] ); break; }
		}
		var order_text = "";
		if( ( j <= pack_sort.length ) && show_order ) { order_text = "<a href='javascript:void(0)' onClick=\"PleaseWait( ); setTimeout( 'RemoveFromOrder( " + i + " )', 100 ); " +
			"data_names[ " + i + " ][ 0 ].setAttribute( 'bgColor', '" + orignal_head_color + "' );\">(" + j + ")</a>"; }
		if( j <= pack_sort.length ) {
			data_names[ i ][ 0 ].innerHTML = "<FONT color=#cc0033>" +  data_names[ i ][ 1 ] + sort_direction + "</FONT>" + order_text;
		}
		else {
			data_names[ i ][ 0 ].innerHTML = data_names[ i ][ 1 ];
		}
	}
}

function GetSortDirection( sc ) {
	if( sc % 2 == 1 ) { return "&#9650;"; }
	else { return "&#9660;"; }
}

function SortArr( cond_arr, arr ) {
	if( ( cond_arr[ 1 ] != 0 ) && ( arr.length > 1 ) ) {
		var col_ind = GetColumnIndex( cond_arr[ 1 ] ) - 1;
		var sort_direct = cond_arr[ 1 ] % 2;
		var n = arr.length;
		var tmp = "";
		var inc = 1;
		do { inc *= 2; } while ( inc <= n );

		if( sort_direct ) {
			do {
				inc /= 2;
				for( i = inc; i <= n - 1; i++ ) {
					var j = i;
					tmp = arr[ i ];
					while( data[ arr[ j - inc ] ][ col_ind ] > data[ tmp ][ col_ind ] ) {
						arr[ j ] = arr[ j - inc ];
						j -= inc;
						if( j < inc ) { break; }
					}
					arr[ j ] = tmp;
				}
			} while ( inc > 1 );
		}
		else {
			do {
				inc /= 2;
				for( i = inc; i <= n - 1; i++ ) {
					var j = i;
					tmp = arr[ i ];
					while( data[ arr[ j - inc ] ][ col_ind ] < data[ tmp ][ col_ind ] ) {
						arr[ j ] = arr[ j - inc ];
						j -= inc;
						if( j < inc ) { break; }
					}
					arr[ j ] = tmp;
				}
			} while ( inc > 1 );

		}

		var z = 0;
		var data_length = arr.length;
		while( z < data_length ) {
			var cur_val = data[ arr[ z ] ][ col_ind ];
			var equal = new Array();
			equal[0] = arr[ z ];
			var x = z + 1;
			var count = 0;
			while( ( x < data_length ) && ( data[ arr[ x ] ][ col_ind ] == cur_val ) ) {
				count++;
				equal[ count ] = arr[ x ];
				x++;
			}
			if( count ) {
				z = x;
				var new_cond_arr = new MakeArray( cond_arr.length );
				for( x = 2; x <=cond_arr.length; x++ ) { new_cond_arr[ x - 1 ] = cond_arr[ x ]; }
				SortArr( new_cond_arr, equal );
			}
			else {
				PrintTableRow( arr[ z ] );
				z++;
			}
		}
	} // if( ( cond_arr[ 1 ] != 0 ) && ( arr.length > 1 ) )
	else {
		for( z = 0; z < arr.length; z++ ) { PrintTableRow( arr[ z ] ); }
	}
}
