var BC_Defaults = {
	home_container: "<div class='bc_home'>#DATA#</div>",
	crumb_container: "<div class='bc_crumb'>#DATA#</div>",
	mustshow_container: "<div class='bc_mustshow'>#DATA#</div>",
	canhide_container: "<div class='bc_canhide'>#DATA#</div>",
	separator: "<div class='bc_separator'></div>",
   allow_loop_crumbs: false,
   homeURL: ""
};
var BC_Config={};
var breadcrumbs = ["Home"];
//-------------------------------------------------------------
//-------------------------------------------------------------
jQuery(document).ready(function(){
	BC_restructureCrumbsBar();
   jQuery.extend(true, BC_Defaults, BC_Config);
});
//-------------------------------------------------------------
function BC_resetCrumbsBar(){
   breadcrumbs.splice(1,1);
   BC_restructureCrumbsBar();
}
//-------------------------------------------------------------
function BC_createCrumbsBar(){
	if (breadcrumbs.length == 0) return;
	var strhtml = BC_Defaults.home_container.replace(/#DATA#/,breadcrumbs[0]);

	for(var i=1; i<breadcrumbs.length; i++){
		strhtml += BC_Defaults.separator;
		var ms = BC_Defaults.mustshow_container.replace(/#DATA#/,breadcrumbs[i][0]);
		var ch = "";
		if (breadcrumbs[i][1] !== null)
			ch = BC_Defaults.canhide_container.replace(/#DATA#/,breadcrumbs[i][1]);
		
		strhtml += BC_Defaults.crumb_container.replace(/#DATA#/, (ms + ch));
	}
	jQuery(".breadcrumbsContainer").html(strhtml);
}
//-------------------------------------------------------------
function BC_restructureCrumbsBar(){
	BC_createCrumbsBar();
	BC_initialize();
}
//-------------------------------------------------------------
function BC_addCrumb(arrData){
   if (!BC_Defaults.allow_loop_crumbs){
      if (arrData[0] == breadcrumbs[breadcrumbs.length-1][0]){
         //do NOTHING
      }else{
         breadcrumbs.push(arrData);
         BC_restructureCrumbsBar();
      }
   }else{
      breadcrumbs.push(arrData);
      BC_restructureCrumbsBar();
   }
}
//-------------------------------------------------------------
function BC_addRootCrumb(arrData){
   breadcrumbs = breadcrumbs.splice(0,1);
   BC_addCrumb(arrData);
}
//-------------------------------------------------------------
function BC_crumbClick(args){
	breadcrumbs = breadcrumbs.splice(0,args.data[0]+2);
	eval(args.data[1]);
	BC_restructureCrumbsBar();
}
//-------------------------------------------------------------
function BC_homeCrumbClick(){window.location=BC_Defaults.homeURL;}
//-------------------------------------------------------------
function BC_removeLastCrumb(){
   breadcrumbs.pop();
   BC_restructureCrumbsBar();
}
//-------------------------------------------------------------
function BC_removeAllUntilRoot(){
   breadcrumbs = breadcrumbs.splice(0,2);
   BC_restructureCrumbsBar();
}
//-------------------------------------------------------------
function BC_clearAllCrumbs(){
   breadcrumbs = breadcrumbs.splice(0,1);
   BC_restructureCrumbsBar();
}
//-------------------------------------------------------------
//-------------------------------------------------------------
var hidetimeoutArray = [];
var hideWidthArray = [];
function BC_initialize(){
   jQuery(".bc_home").bind("click",BC_homeCrumbClick);
	var num_crumbs = jQuery(".bc_crumb").length;
	for (var i=0; i<num_crumbs; i++){
		var curr = jQuery(".bc_crumb:eq("+i+")");
		var mustshow = curr.children(".bc_mustshow");
		var canhide = curr.children(".bc_canhide");
		
		mustshow.bind("mouseover",i,BC_show_canhide);
		mustshow.bind("mouseout",i,BC_timmedhide_canhide);
		
		hideWidthArray[i] = canhide.width();
		canhide.css("width","0px");
		canhide.bind("mouseover", i, BC_cancel_hide);
		canhide.bind("mouseout", i, BC_timmedhide_canhide);
		canhide.attr("bcnum",i);
		
		curr.attr("bcprocessed","true");
		var callback = breadcrumbs[i+1][2];
		curr.bind("click",[i,callback],BC_crumbClick);
	}
}
//-------------------------------------------------------------
function BC_show_canhide(id){
	BC_cancel_hide(id);
	jQuery("[bcnum=" + id.data + "]").animate({width:hideWidthArray[id.data]+"px"}, 500);
}
//-------------------------------------------------------------
function BC_hide_canhide(id){ jQuery("[bcnum=" + id + "]").animate({width:"0px"}, 500); }
//-------------------------------------------------------------
function BC_timmedhide_canhide(id){ hidetimeoutArray[id.data] = setTimeout("BC_hide_canhide(" + id.data + ")",500);}
//-------------------------------------------------------------
function BC_cancel_hide(id){ clearTimeout(hidetimeoutArray[id.data]); }
//-------------------------------------------------------------
//#############################################################
//                           TODO
//-------------------------------------------------------------
function BC_buildRequest(requrl, beforefn, successfn, failurefn){
   return "jQuery.ajax({type: 'GET',url: '"+requrl+"',beforeSend: function(xhr){"+beforefn+";},success: function(data){"+successfn.replace(/#PARAM#/,"data")+";},error: function(xhr,stat,er){"+failurefn+";}});";
}
//-------------------------------------------------------------

//-------------------------------------------------------------
function BC_restructure(){
	var num_crumbs = jQuery(".bc_crumb:not([bcprocessed])").length;
	var num_processed = jQuery(".bc_crumb[bcprocessed]").length;
	for (var i=0; i<num_crumbs; i++){
		var curr = jQuery(".bc_crumb:not([bcprocessed]):eq("+i+")");
		var mustshow = curr.children(".bc_mustshow");
		var canhide = curr.children(".bc_canhide");
		
		mustshow.bind("mouseover",num_processed+i,BC_show_canhide);
		mustshow.bind("mouseout",num_processed+i,BC_timmedhide_canhide);
		
		hideWidthArray[num_processed+i] = canhide.width();
		canhide.css("width","0px");
		canhide.bind("mouseover", num_processed+i, BC_cancel_hide);
		canhide.bind("mouseout", num_processed+i, BC_timmedhide_canhide);
		canhide.attr("bcnum",num_processed+i);
	}
	jQuery(".bc_crumb:not([bcprocessed])").attr("processed","true");
}
