
var test_sort_obj={};(function($){test_sort_obj.demo_base=50;test_sort_obj.demo_steps=5;test_sort_obj.demo_num=50;test_sort_obj.demo_list=[];var BOX_ID="demo_box";var MAX_MOVES=30000;var BAR_BASE_HT=5;var BAR_HT_MUL=3;var BAR_WIDTH=6;var BAR_SP=1;var BAR_COLOR="green";var HL_BAR_COLOR="red";var HL_BAR_COLOR2="orange";var DEMO_STEP_DELAY=200;test_sort_obj.test=function(list,moves){mk_kv_list(list);var num_calls=0;list.sort(function(a,b){++num_calls;var res;if(a.k<b.k)
res=-1;else if(a.k>b.k)
res=1;else
res=0;store_move(a,b,res);return res;});return num_calls;function store_move(a,b,res){if(moves==null||moves.length>=MAX_MOVES)
return;var a_pos;$.each(list,function(idx){if(list[idx].v==a.v){a_pos=idx;return false;}});var b_pos;$.each(list,function(idx){if(list[idx].v==b.v){b_pos=idx;return false;}});moves.push({a_pos:a_pos,b_pos:b_pos,a:a,b:b,res:res,list:list.slice()});}};test_sort_obj.init_demo=function(){var moves=[];test_sort_obj.test([3,2,1],moves);sort_updates_elm_flag=true;for(var i=1;i<moves.length&&sort_updates_elm_flag;++i)
sort_updates_elm_flag&=moves[i].list[0].k==moves[0].list[0].k;sort_updates_elm_flag=!sort_updates_elm_flag;enable_radio_ctl();var s=sort_updates_elm_flag?"rand":"asc";$("input[name=elm_type][value="+s+"]").click();};var sort_updates_elm_flag;var box_ht;var moves;var move_idx;var stop_flag;function enable_radio_ctl(t){if(t===false){$("#demo_box_inp input[name=elm_type]").attr("disabled",true).parent().addClass("disabled");return;}
$("#demo_box_inp input[name=elm_type]").attr("disabled",false).parent().removeClass("disabled");if(sort_updates_elm_flag)
return;$("input[name=elm_type][value=desc]").attr("disabled",true).parent().addClass("disabled");$("input[name=elm_type][value=step_desc]").attr("disabled",true).parent().addClass("disabled");$("input[name=elm_type][value=rand]").attr("disabled",true).parent().addClass("disabled");}
function draw_bar(idx,value,color){var ht=value+BAR_BASE_HT;var top=box_ht-ht*BAR_HT_MUL;$("#"+BOX_ID+idx).css({top:(top+1)+"px",height:(ht*BAR_HT_MUL)+"px","background-color":color});}
function draw_full(list){var box=$("#"+BOX_ID);box_ht=box.height()-2;if($("#"+BOX_ID+"0").length===0){for(var i=0;i<list.length;++i){box.append("<div id='"+BOX_ID+i+"'></div");$("#"+BOX_ID+i).css({position:"absolute",left:(i*(BAR_WIDTH+BAR_SP)+1)+"px",width:BAR_WIDTH+"px"});}}
for(var i=0;i<list.length;++i){draw_bar(i,list[i].k,BAR_COLOR);}}
function mk_kv_list(list){for(var i=0;i<list.length;++i){if($.typeOf(list[i])!="object")
list[i]={k:list[i],v:list[i]};}}
$(document).ready(function(){$("input[name=elm_type]").click(function(){var list=test_sort_obj.demo_list;var num=test_sort_obj.demo_num;switch($(this).val()){case"same":for(var i=0;i<num;++i)
list[i]={k:test_sort_obj.demo_base,v:i};break;case"asc":for(var i=0;i<num;++i)list[i]=i;break;case"desc":for(var i=0;i<num;++i)list[i]=num-1-i;break;case"step_asc":for(var i=0;i<num;++i)
list[i]={k:Math.floor(i/test_sort_obj.demo_steps)*test_sort_obj.demo_steps,v:i};break;case"step_desc":for(var i=0;i<num;++i)
list[i]={k:num-1-Math.floor(i/test_sort_obj.demo_steps)*test_sort_obj.demo_steps,v:i};break;default:case"rand":for(var i=0;i<num;++i)list[i]=i;for(var i=0;i<num;++i){var t=Math.floor(Math.random()*num);var v=list[i];list[i]=list[t];list[t]=v;}
break;}
mk_kv_list(list);draw_full(list);$("#start_btn").val("Start");});$("#start_btn").click(function(){if($("#start_btn").val()=="Pause"){stop();return;}
if($("#start_btn").val()=="Resume"){play();return;}
moves=[];test_sort_obj.test(test_sort_obj.demo_list,moves);move_idx=0;play();});});function play(){enable_radio_ctl(false);$("#start_btn").val("Pause");stop_flag=false;setTimeout(iterate,DEMO_STEP_DELAY);}
function stop(){stop_flag=true;$("#start_btn").val("Resume");enable_radio_ctl();}
function iterate(){var mv;$("#demo_idx").val(move_idx+"/"+moves.length);if(move_idx>=moves.length||stop_flag){stop();return;}
mv=moves[move_idx];draw_full(mv.list);draw_bar(mv.a_pos,mv.list[mv.a_pos].k,HL_BAR_COLOR);draw_bar(mv.b_pos,mv.list[mv.b_pos].k,HL_BAR_COLOR2);++move_idx;setTimeout(iterate,DEMO_STEP_DELAY);}})(jQuery);