var css=new Array();
var regexp_parse_id = /((^[^\d]+)_|^)(\d+)/;
var regexp_title_replace = /[^\d]*?(\d+)title/;
var noClose=new Array();

function toggleHiddenButton(ele) {
	ele = (typeof ele == 'string') ? $('#' + ele) : $(ele);
	ele.toggleClass('hiddenButton');
	checkInvisibility(ele);
}

function isHiddenButton(ele) {
	ele = (typeof ele == 'string') ? $('#' + ele) : $(ele);
	return ele.hasClass('hiddenButton') || ele.parent().hasClass('hiddenButton');
}

/**	deletes the last unique part of id, so it can be used for ButtonFinding
 */
function extractFirstOfId(id) {
	var regex = /^(.*?)([0-9]+)$/;
	var res = id.match(regex);
	return (res && res[1]) || id;
}

/**	Finds all buttons that have that same id, but can have different number in the end
 */
function getButtonByFirstOfId(id) {
	id = extractFirstOfId(id);
	var a = $("div[id^="+id+"][class^=off]").filter(
		function() {
			return (new RegExp('^'+id+'[0-9]*$')).test(this.id);
		}
	);
	return a;
}


function showItem(item_id)
{
	if (item_id.indexOf('*') != -1)
		return;

	var group_id;
	var class_name;

	if(getButtonByFirstOfId(item_id).parents("[id*='item']:hidden").length) {
		getButtonByFirstOfId(item_id).parents("[id*='title']").click();
	}

	if (!arguments[1]) //No group id defined
	{
		var match_info = item_id.match(regexp_parse_id);
		var group_id = match_info[3];
		var class_name = match_info[2];
	}
	else 
	{
		var group_id = arguments[1];
		var class_name = arguments[2];
	}

	//First let's try to get link without class name
	var link_id = item_id.replace(regexp_title_replace, "$1title");


//    $("[id="+item_id+"]").removeClass().addClass("g"+group_id);
//     	if ($("#"+link_id).size() == 1)
// 		$("#"+link_id).removeClass().addClass("g"+group_id);
// 	else if (link_id != item_id)
// 	{
// 		if ($("#"+item_id).size() == 1) //If direct link is exists
// 			$("#"+item_id).removeClass().addClass("g"+group_id);
// 	}
//     AM 27 Oktober 2009 durch Georg ersetzt. Siehe Folgezeilen,    Zu deinem coluor problem.
//     und dann funktioniert auch, dass du bei den IDs am Ende eine 0 oder ein X oder sonst irgendwas haben kannst.

    getButtonByFirstOfId(item_id).removeClass('off'+group_id).addClass("g"+group_id);
    if (getButtonByFirstOfId(link_id).size() == 1)
        getButtonByFirstOfId(link_id).removeClass('off'+group_id).addClass("g"+group_id);
    else if (link_id != item_id)
    {
        if (getButtonByFirstOfId(item_id).size() == 1) //If direct link is exists
            getButtonByFirstOfId(item_id).removeClass('off'+group_id).addClass("g"+group_id);
    }


	var layer_id = extractFirstOfId(item_id.replace(regexp_title_replace, "$1item"));

	//Add specified class to layer, if need
	//	if (class_name)
		//		$("#"+layer_id).attr('class', class_name).show();
	//	else
		//	$("#"+layer_id).addClass(css[layer_id]).show(); //.removeClass()
	//}

	// Add specified class to layer, if need
	// seit 20100419    : siehe neue Folgezeile: - ID Namen können eine belibige Zahl am Ende ausweisen  
    if (class_name)
            $("[id^="+layer_id+"]").attr('class', class_name).show();
    else
        $("[id^="+layer_id+"]").addClass(css[layer_id]).show(); //.removeClass()
	}

function hideItem(item)
{
	var match_info = item.id.match(regexp_parse_id);
	var group_id = match_info[3];
	$(item).removeClass('g' + group_id).addClass(css[item.id]);
	$("#" + item.id.replace(regexp_title_replace, "$1item")).hide();
// seit 20100419 Item könnte auch eine andere Zahl am Ende tragen als die  title-id : dann : siehe neue Folgezeile:
//	$("[id^=" + extractFirstOfId(item.id.replace(regexp_title_replace, "$1item")) + "]").hide();  
}

function callOneItem (item) {
	if (item.id.indexOf('*') != -1)
		return;

	var match_info = item.id.match(regexp_parse_id);
        
        if (!noClose[match_info[3]])
          {
        	$("[id*='"+match_info[3]+"title']").each(function(){
  		hideItem(this, match_info[3]);
   	  });
	}

	showItem(item.id, match_info[3], match_info[2]);
}

function showAllItems(item_id)
{    var match_info = item_id.match(regexp_parse_id);
     var first=match_info[3];
     var css_layer=match_info[2];

//    $("[id^='"+first+"item']").hide();
hideAllItems(first);

    $("[id*='"+first+"title']:visible").each(function(){
     if ($(this).parent("[id*='title']").length)
    	showItem($(this).parent("[id*='title']").attr("id"));
     else
        showItem(this.id);
    $("#"+this.id.replace("title","item")).addClass(css_layer);
    });
}

function hideAllItems(item_id)
{
	var first=item_id.substr(0,2);
	$("[id*='"+first+"title']").each(function(){
		hideItem(this, first);
	});
}

function makeAction(elem_id, group_id, class_name)
{
	if (elem_id.indexOf('title') != -1)
		showItem(elem_id, group_id, class_name);
	else if (elem_id.indexOf('show') != -1)
		showAllItems(elem_id);
	else if (elem_id.indexOf('off') != -1)
		hideAllItems(elem_id);

}

function showMultiple(item_id)
{
	var first;
	var groups = new Array();
	var match_info;
	//Lets split it
	var ids = item_id.split('*');

	for (var i = 0; i < ids.length; i++)
	{
		match_info = ids[i].match(regexp_parse_id);
		if(match_info) {
			group_id = match_info[3];
			if (groups[group_id] != 1)
			{
				groups[group_id] = 1;
				$("[id*='"+group_id+"title']").each(function(){
					hideItem(this, group_id);
				});
			}
			makeAction(ids[i], group_id, match_info[2]);
		}
	}
}

function callItem(items_list)
{
	showMultiple(items_list);
}


//Waits until document completely load
$(document).ready(function(){
  //ALL GROUPS
  //Hide all items that contains the word "item" in their ID's adding them the class "hide"
  $("[class*='off']").hover(function(){
    var tmp=this.className;
    $(this).removeClass(tmp).toggleClass(tmp+"hover");
    },function(){
    var tmp=this.className;
    tmp=tmp.replace(/hover/ig, "");
    $(this).removeClass(tmp+"hover").addClass(tmp);
      })
  $("*[id]").each(function(i){
  	css[this.id]=this.className;
  });

  $("[id*='item']").hide();

   //Adds the class "hand" to all items with their ID containing the word "title" and assign them a click event;
  $("[id*='title']").click(function(){
  	callOneItem(this);
  });

  //OFF BUTTON
    $("[id*='off']").click(function(){
  	  if (this.id == 'off')
    	{
      	$("[id*='title']").each(function(){
      		hideItem(this);
				});
    	}
    	else
	    	hideAllItems(this.id);
  	});

  //SHOW BUTTON
    $("[id*='show']").click(function(){

    	if (this.id == 'show')
    	{
      	$("[id*='title']").each(function(){
      		showItem(this.id);
      	});
    	}
    	else
    		showAllItems(this.id);
  	});

  	$("[id*='*']").click(function(){
  		showMultiple(this.id);
  	});
});


