YAHOO.namespace("masi.crumb");
YAHOO.masi.crumb.CrumbController = function(config) {
	YAHOO.masi.util.base.call(this,config.unique_id);
	this.crumb_list = {};
	this.crumb_order = new Array();
	this.child_module_render_div = 'crumb_action_div_id_' + this.unique_id;
	this.module_render_div = config.module_render_div;
	this._name_limit = 1000;
	this.invisible = config.invisible;

	this.Panel = config.panel;
	this.show_all = config.show_all;
	this.Panel.setBody('<div id="crumb_html_' + this.unique_id + '"></div><div id="crumb_action_div_id_' + this.unique_id + '" class="crumb_body"></div>');
	this.Panel.setFooter('');
}
YAHOO.masi.crumb.CrumbController.prototype.return_html = function() {
//	if ( this.invisible ) {
//		return '';
//	}
	var content = this.raw_body();
	var row = '';

	// get index of current crumb
	var c_index = 0;
	for(var i=0;i<this.crumb_order.length;i++){
		if ( this.current_id == this.crumb_order[i] ) {
			c_index = i;
		}
	}

	for(var i=0;i<this.crumb_order.length;i++){
		var new_id = this.crumb_order[i];

		var tmp_obj = YAHOO.masi.util.get_object(new_id);
		if ( tmp_obj.no_crumb ) {
			continue;
		}
		var row_section = this.raw_row();
		if ( tmp_obj.status == 'complete' ) {
			row_section = this.raw_row_completed_enabled();
		} else if ( tmp_obj.status == 'inactive' ) {
			row_section = this.raw_row_inactive();
		} else if ( tmp_obj.status == 'label' ) {
			row_section = this.raw_row_label();
        }
		var tmp = row_section.replace(/__id__/g,new_id);
		var additional_class = ''
		if ( tmp_obj.crumb_add_class ) {
			additional_class = tmp_obj.crumb_add_class;
		}
		tmp = tmp.replace(/__additional_class__/g,tmp_obj.crumb_add_class);
		eval('var name = this.crumb_list.id_' + new_id );

		tmp = tmp.replace(/__title_name__/g,name);

		var new_limit = this._name_limit - ( this.crumb_order.length * 3 );
		if ( new_limit < this._name_min ) {
			new_limit = this._name_min;
		}
		name = YAHOO.masi.util.limit_string_cut_center(new_limit,'&hellip;',name);
		tmp = tmp.replace(/__name__/g,name);

		if ( new_id == this.current_id ) {
			tmp = tmp.replace(/__status__/g,"current");
		} else {
			tmp = tmp.replace(/__status__/g,"default");
		}
		tmp = tmp.replace(/__unique_id__/g,this.unique_id);
		row += tmp;
	}
	if ( row ) {
		content = content.replace(/__row__/,row);
	} else {
		content = '';
	}

	// if the current crumb is last in line, we set some classes outside the row
	// ----------------------------------------
	if ( c_index == (this.crumb_order.length - 1) ) {
		content = content.replace(/__class__/g,'current');
	} else {
		content = content.replace(/__class__/g,'gen');
	}
	content = content.replace(/__unique_id__/g,this.unique_id);

	return content;
}
YAHOO.masi.crumb.CrumbController.prototype.add_crumb = function(id,name,no_history) {
	//YAHOO.masi.util.console_log("\t id ->" + id + "<- name ->" + name + "<-");
	if ( !this.rendered ) {
		if ( this.destroy_option ) {
			//this.Panel.setHeader('<div class="panel_title"><a href="javascript:void(0);" class="close_button"  onclick="javascript:YAHOO.masi.util.method_passthrough(\'' + this.unique_id + '\',\'cleanup_crumb\');"></a></div>');
			this.Panel.setHeader('&nbsp;');
		} else {
			this.Panel.setHeader('');
		}
		if ( this.module_render_div ) {
			this.Panel.render(this.module_render_div);
		} else {
			this.Panel.render(document.body);
		}
		this.rendered = 1;
	}

	// cleanup any existing crumbs that are flagged 'no_crumb'
// 	for( var loop_id in this.crumb_list) {
	for(var i=0;i<this.crumb_order.length;i++){
		var new_id = this.crumb_order[i];
		var tmp_obj = YAHOO.masi.util.get_object(new_id);
		if ( tmp_obj.no_crumb ) {
			this.close_crumb(new_id);
		}
	}

	eval('var test = this.crumb_list.id_' + id);
	if ( !test ) {
		this.crumb_order.push(id);
		// create a new module
		var new_obj = YAHOO.masi.util.get_object(id);
		if ( ! new_obj.module_render_div ) {
			new_obj.module_render_div = this.child_module_render_div;
		}
		new_obj.crumbcontroller = this;
		// propogate the destroy on empty option
		if ( this.destroy_on_empty ) {
			new_obj.destroy_on_empty = 1;
		}
	}

	eval('this.crumb_list.id_' + id + ' = "' + name + '";');
	if ( ! no_history ) {
		this.show_crumb(id,no_history);
	}
	if ( this.crumb_order.length < 1 && this._show_div_on_empty ) {
		document.getElementById(this._show_div_on_empty).style.display = 'block';
	} else if ( this._show_div_on_empty ) {
		document.getElementById(this._show_div_on_empty).style.display = 'none';
	}
}
YAHOO.masi.crumb.CrumbController.prototype.push_history = function(show_id) {
	if ( this.crumbcontroller ) {
		this.crumbcontroller.push_history(this.unique_id + ',' + show_id);
	} else {
		YAHOO.util.History.navigate("crumb", 'id_' + show_id);
	}
}
YAHOO.masi.crumb.CrumbController.prototype.historyHandler = function(show_id) {
	//YAHOO.masi.util.console_log("\t history ->" + show_id + "<-");
	var tmp = show_id.replace(/id_/,'');
	this.show_crumb(tmp,'no_history');
}
YAHOO.masi.crumb.CrumbController.prototype.show_crumb = function(show_id,no_history) {
	if ( !this.rendered ) {
		if ( this.destroy_option ) {
			this.Panel.setHeader('&nbsp;');
		} else {
			this.Panel.setHeader('');
		}
		this.Panel.render(this.module_render_div);
		this.rendered = 1;
	}

	var extra_params = false;
	var id = false;
	// we may have more than one level of crumb/modules to show
	var regex = /,/;
	var regex_result = regex.exec(show_id);
	if ( regex_result ) {
		var c_index = show_id.indexOf(',');
		extra_params = show_id.substr(c_index + 1);
		id = show_id.substr(0,c_index);
		//YAHOO.masi.util.console_log("\t id ->" + id + "<- extra ->" + extra_params + "<-");
	} else {
		id = show_id;
	}
	// do nothing if we're expected to show something we do not have
	var match = false;
	for(var i=0;i<this.crumb_order.length;i++){
		var new_id = this.crumb_order[i];
		if ( new_id == id ) {
			match = true;
		}
	}
	if ( ! match && id ) {
		return;
	}
	this.current_id = id;

	if ( ! no_history ) {
		if ( this.crumbcontroller ) {
			this.crumbcontroller.push_history(this.unique_id + ',' + show_id);
		} else {
			YAHOO.util.History.navigate("crumb", 'id_' + show_id);
		}
	}

	var html = this.return_html();
	document.getElementById('crumb_html_' + this.unique_id).innerHTML = html;
	this.Panel.show();

	//YAHOO.masi.util.console_log("\t i am id ->" + this.unique_id + "<-");
	for(var i=0;i<this.crumb_order.length;i++){
		var new_id = this.crumb_order[i];
		var tmp_obj = YAHOO.masi.util.get_object(new_id);
		if ( new_id == this.current_id ) {
			//YAHOO.masi.util.console_log("\t\t displaying at current ->" + new_id + "<-");
			tmp_obj.display(extra_params);
		} else if ( this.show_all ) {
			//YAHOO.masi.util.console_log("\t\t displaying everything else ->" + new_id + "<-");
			tmp_obj.display(extra_params);
		} else {
			//YAHOO.masi.util.console_log("\t\t hiding at id ->" + new_id + "<-");
			tmp_obj.hide();
		}
	}
}
YAHOO.masi.crumb.CrumbController.prototype.display = function(id_string) {
	if ( !this.rendered ) {
		if ( this.destroy_option ) {
			this.Panel.setHeader('&nbsp;');
		} else {
			this.Panel.setHeader('');
		}
		this.Panel.render(this.module_render_div);
		this.rendered = 1;
	}

	var extra_params = false;
	var id = false;
	// we may have more than one level of crumb/modules to show
	if ( id_string ) {
		var regex = /,/;
		var regex_result = regex.exec(id_string);
		if ( regex_result ) {
			var c_index = id_string.indexOf(',');
			extra_params = id_string.substr(c_index + 1);
			id = id_string.substr(0,c_index);
			//YAHOO.masi.util.console_log("\t id ->" + id + "<- extra ->" + extra_params + "<-");
		} else {
			id = id_string;
		}
	}
	// do nothing if we're expected to show something we do not have
	var match = false;
	for(var i=0;i<this.crumb_order.length;i++){
		var new_id = this.crumb_order[i];
		if ( new_id == id ) {
			match = true;
		}
	}
	if ( ! match ) {
		return;
	}
	this.current_id = id;

	var html = this.return_html();
	//YAHOO.masi.util.console_log("\t\t html ->" + html + "<-");
	document.getElementById('crumb_html_' + this.unique_id).innerHTML = html;

	this.Panel.show();

	for(var i=0;i<this.crumb_order.length;i++){
		var new_id = this.crumb_order[i];
		var tmp_obj = YAHOO.masi.util.get_object(new_id);
		if ( new_id == this.current_id ) {
			tmp_obj.display(extra_params);
		} else if ( this.show_all ) {
			tmp_obj.display(extra_params);
		} else {
			tmp_obj.hide();
		}
	}
	if ( this.crumb_order.length < 1 && this._show_div_on_empty ) {
		document.getElementById(this._show_div_on_empty).style.display = 'block';
	} else if ( this._show_div_on_empty ) {
		document.getElementById(this._show_div_on_empty).style.display = 'none';
	}
}
YAHOO.masi.crumb.CrumbController.prototype.show = function() {
	this.Panel.show();
}
YAHOO.masi.crumb.CrumbController.prototype.hide = function() {
	this.Panel.hide();
}
YAHOO.masi.crumb.CrumbController.prototype.close_crumb = function(close_id) {
	for(var i=0;i<this.crumb_order.length;i++){
		var tmp_id = this.crumb_order[i];
		if ( close_id == tmp_id ) {
			var tmp_obj = YAHOO.masi.util.get_object(tmp_id);
			// leave some objects alive, but destroy our relationship
			if ( !tmp_obj.persistent ) {
				tmp_obj.destroy();
			} else {
				delete tmp_obj.crumbcontroller;
				tmp_obj.rendered = 0;
			}
			eval('delete this.crumb_list.id_' + tmp_id);
		}
	}
	// after removing the crumb, let's show the previous or next crumb
	// we should store the currently viewed crumb, and not change display, if it was not the one closed
	// also still need to cleanup the main app object for the closed crumb
	var show_id;
	for(var i=0;i<this.crumb_order.length;i++){
		if ( close_id == this.crumb_order[i] ) {
			if ( this.crumb_order[i-1] ) {
				show_id = this.crumb_order[i-1];
			} else if (this.crumb_order[i+1]) {
				show_id = this.crumb_order[i+1];
			} else {
				show_id = this.crumb_order[0];
			}
			this.crumb_order.splice(i,1);
			break;
		}
	}
	// if we are fully closed, cleanup action content
	if ( this.crumb_order.length == 0 ) {
		if ( this.destroy_on_empty ) {
			this.cleanup_crumb();
		} else {
			this.Panel.setBody('<div id="crumb_html_' + this.unique_id + '"></div><div id="crumb_action_div_id_' + this.unique_id + '" class="crumb_body"></div>');
			this.Panel.hide();
		}
		if ( this._show_div_on_empty ) {
			document.getElementById(this._show_div_on_empty).style.display = 'block';
		} else if ( this._show_div_on_empty ) {
			document.getElementById(this._show_div_on_empty).style.display = 'none';
		}
		return;
	}

	if (close_id == this.current_id) {
		this.show_crumb(show_id);
	} else {
		this.display(this.current_id);
	}
}
YAHOO.masi.crumb.CrumbController.prototype.check_required_steps = function(show_id,new_name) {
	var complete_array = new Array();
	for(var i=0;i<this.crumb_order.length;i++){
		var tmp_id = this.crumb_order[i];
		var tmp_obj = YAHOO.masi.util.get_object(tmp_id);
		if ( tmp_obj.status == 'complete' ) {
			complete_array.push(tmp_obj.unique_id);
		}
	}
	for(var i=0;i<this.crumb_order.length;i++){
		var tmp_id = this.crumb_order[i];
		var tmp_obj = YAHOO.masi.util.get_object(tmp_id);
		tmp_obj.set_status_on_completes(complete_array);
	}
}
YAHOO.masi.crumb.CrumbController.prototype.crumb_change_name = function(show_id,new_name) {
	for(var i=0;i<this.crumb_order.length;i++){
		var tmp_id = this.crumb_order[i];
		if ( show_id == tmp_id ) {
			eval('this.crumb_list.id_' + tmp_id + ' = new_name;');
			break;
		}
	}
	document.getElementById('crumb_html_' + this.unique_id).innerHTML = this.return_html();
	this.Panel.show();
}
YAHOO.masi.crumb.CrumbController.prototype.destroy = function() {
	this.cleanup_crumb();
}
YAHOO.masi.crumb.CrumbController.prototype.empty_crumb = function() {
	for(var i=0;i<this.crumb_order.length;i++){
		var tmp_id = this.crumb_order[i];
		var tmp_obj = YAHOO.masi.util.get_object(tmp_id);
		eval('delete this.crumb_list.id_' + tmp_id);
		tmp_obj.destroy();
	}
	this.crumb_order = new Array();
}
YAHOO.masi.crumb.CrumbController.prototype.cleanup_crumb = function() {
	// we may have a parent crumbcontroller, close our crumb, we'll come back here, but without the crumbcontroller
	if ( this.crumbcontroller ) {
		var crumb = this.crumbcontroller;
		delete this.crumbcontroller;
		crumb.close_crumb(this.unique_id);
		return;
	}

	for(var i=0;i<this.crumb_order.length;i++){
		var tmp_id = this.crumb_order[i];
		var tmp_obj = YAHOO.masi.util.get_object(tmp_id);
		// leave some objects alive, but destroy our relationship
		if ( !tmp_obj.persistent ) {
			tmp_obj.destroy();
		} else {
			delete tmp_obj.crumbcontroller;
			tmp_obj.rendered = 0;
		}
	}
	this.Panel.destroy();

	// let the parent application know to set opacity back to normal if we were in a real panel
	// if we're marked as a panel and there is a panel count
	if ( this.panel_flag && YAHOO.masi.util.panel_count ) {
		YAHOO.masi.util.panel_count--;
		YAHOO.masi.util.panel_check();
	}

	// we may be hiding another crumb, not necessarily our parent, so display it if necessary
	if ( this.on_destroy_display ) {
		var tmp_obj = YAHOO.masi.util.get_object(this.on_destroy_display);
		if ( tmp_obj ) {
			tmp_obj.display();
		}
	}

	YAHOO.masi.util.delete_object(this.unique_id);
}
YAHOO.masi.crumb.CrumbController.prototype.preload_interval = function() {
	var inprocess = false;
	var complete = true;
	for(var i=0;i<this.crumb_order.length;i++){
		var tmp_id = this.crumb_order[i];
		var tmp_obj = YAHOO.masi.util.get_object(tmp_id);

		if ( tmp_obj.preload_flag && tmp_obj._inprocess ) {
			inprocess = true;
		}
		if ( tmp_obj.preload_flag && ! tmp_obj._loaded ) {
			complete = false;
		}
	}
	if ( inprocess ) {
		return;
	}
	if ( complete ) {
		window.clearInterval(this.preload_interval_id);
		return;
	}
	for(var i=0;i<this.crumb_order.length;i++){
		var tmp_id = this.crumb_order[i];
		var tmp_obj = YAHOO.masi.util.get_object(tmp_id);
		if ( ! tmp_obj._loaded && ! tmp_obj._inprocess ) {
			if ( ! tmp_obj.preload_flag ) {
				continue;
			}
			tmp_obj.preload();
			break;
		}
	}
}
YAHOO.masi.crumb.CrumbController.prototype.preload_modules = function() {
	this.preload_interval_id = window.setInterval('YAHOO.masi.util.method_passthrough("' + this.unique_id + '","preload_interval")',700);
}
YAHOO.masi.crumb.CrumbController.prototype.clear_crumb = function() {
	for(var i=0;i<this.crumb_order.length;i++){
		var tmp_id = this.crumb_order[i];
		var tmp_obj = YAHOO.masi.util.get_object(tmp_id);
		// leave some objects alive, but destroy our relationship
		if ( !tmp_obj.persistent ) {
			tmp_obj.destroy();
		} else {
			delete tmp_obj.crumbcontroller;
			tmp_obj.rendered = 0;
		}
		eval('delete this.crumb_list.it_' + tmp_id);
	}
	this.crumb_order = new Array();
	// reset the panel body to reset the browser window length
	this.Panel.setBody('<div id="crumb_html_' + this.unique_id + '"></div><div id="crumb_action_div_id_' + this.unique_id + '" class="crumb_body"></div>');
	this.display();
}
YAHOO.masi.crumb.CrumbController.prototype.raw_body = function() {
	return '<ul class="crumb_ul">__row__</ul>';
}
YAHOO.masi.crumb.CrumbController.prototype.raw_row = function() {
	return '<li class="crumb_li __additional_class__"><a href="javascript:void(0);" id="crumb_link___id__" class="crumb_anchor_enabled" value="__name__" title="__title_name__" onclick="javascript:YAHOO.masi.util.method_passthrough(\'__unique_id__\',\'show_crumb\',\'__id__\');">__name__</a></li>';
}
YAHOO.masi.crumb.CrumbController.prototype.raw_row_inactive = function() {
	return '<li class="crumb_li_inactive __additional_class__">__name__</li>';
}
YAHOO.masi.crumb.CrumbController.prototype.raw_row_label = function() {
	return '<li class="crumb_li_label __additional_class__">__name__</li>';
}
YAHOO.masi.crumb.CrumbController.prototype.raw_row_completed_enabled = function() {
	return '<li class="crumb_li __additional_class__"><a href="javascript:void(0);" id="crumb_link___id__" class="crumb_anchor_completed_enabled" value="__name__" title="__title_name__" onclick="javascript:YAHOO.masi.util.method_passthrough(\'__unique_id__\',\'show_crumb\',\'__id__\');">__name__</a></li>';
}


