
/*
red.select.init(red.dom.byclass('selectable'));
red.select.type = 'isin';
red.select.onselectend = function(){
	alert(red.select.selected);
}
*/

red.prototype.select = {

	tempobj : null,
	
	startxy : null,
	
	elemente2select : null,
	
	parent : null,
	
	selected : null,
	
	style : null,
	
	type : "touch",  /* touch oder isin*/
	
	selectcolor : "#99ff99",
	
	/* key für mehrfachen select bzw. wenn objekt schon selektiert: deselektieren*/
	selectkey : "shift", /* alt, strg oder shift */
	
	keywaspressed : false,
	
	init : function(elements,parent,style){
		if(parent == null){
			red.prototype.event.add(document,'mousedown',red.prototype.select.start);
		}
		else{
			red.prototype.event.add(parent,'mousedown',red.prototype.select.start);
		}
				
		if(!red.prototype.is_array(elements)){
			elements = [elements];
		}
				
		red.prototype.select.elemente2select = elements;
		red.prototype.select.style = style;
		red.prototype.select.parent = parent;	
	},
	
	start : function(e){
		if(red.prototype.select.parent == null){
			red.prototype.event.add(document,'mousemove',red.prototype.select.move);
			red.prototype.event.add(document,'mouseup',red.prototype.select.end);
		}
		else{
			red.prototype.event.add(red.prototype.select.parent,'mousemove',red.prototype.select.move);
			red.prototype.event.add(red.prototype.select.parent,'mouseup',red.prototype.select.end);
		}
		
		/* für mozilla : löscht objekt bevor neues erstellt wird (bei mouseup außerhalb des fensters)*/
		if(red.prototype.select.tempobj != null){
			red.prototype.dom.remove(red.prototype.select.tempobj);
			red.prototype.select.tempobj = null;
			red.prototype.select.startxy = null;
		}
						
		var style = "border:1px dashed #333;";
		if(red.prototype.select.style != null){
			style = red.prototype.select.style;
		}
				
		if ((e.button && e.button == 1)||(e.which && e.which == 1)) {
			red.prototype.select.startxy = red.prototype.mouse.getxy(e);
			var div = red.prototype.dom.create('div');
			red.prototype.select.tempobj = div;
			red.prototype.css.set(div,"font-size:1pt;width:0px;height:0px;position:absolute;z-Index:1000;"+style);
			red.prototype.css.setxy(div,red.prototype.select.startxy);
		}
				
		if(!red.prototype.key[red.prototype.select.selectkey]){
			// farben zurücksetzen
			red.prototype.select.resetcolor();
			red.prototype.select.selected = null;
			red.prototype.select.keywaspressed = false;
		}
		else{
			red.prototype.select.keywaspressed = true;
		}
			
	},
	
	move : function(e){
				
		if ((red.prototype.select.startxy != null) && !((e.button & 1)||(e.which & 1))){
			red.prototype.dom.remove(red.prototype.select.tempobj);
			red.prototype.select.tempobj = null;
			red.prototype.select.startxy = null;
			return false;
		}
				
		if((red.prototype.select.startxy != null) && ((e.button && e.button == 1)||(e.which && e.which == 1))){
			var xy = red.prototype.mouse.getxy(e);
			if((xy[0] >= red.prototype.select.startxy[0])&&(xy[1] >= red.prototype.select.startxy[1])){
				var newsize = [(xy[0]-red.prototype.select.startxy[0]),(xy[1]-red.prototype.select.startxy[1])];
				red.prototype.css.setsizexy(red.prototype.select.tempobj,newsize);
			}
			else if((xy[0] < red.prototype.select.startxy[0])&&(xy[1] >= red.prototype.select.startxy[1])){
				red.prototype.css.setxy(red.prototype.select.tempobj,[xy[0],red.prototype.select.startxy[1]]);
				red.prototype.css.setsizexy(red.prototype.select.tempobj,
											[red.prototype.select.startxy[0]-xy[0],(xy[1]-red.prototype.select.startxy[1])]);
			}
			else if((xy[1] < red.prototype.select.startxy[1])&&(xy[0] >= red.prototype.select.startxy[0])){
				red.prototype.css.setxy(red.prototype.select.tempobj,[red.prototype.select.startxy[0],xy[1]]);
				red.prototype.css.setsizexy(red.prototype.select.tempobj,
											[(xy[0]-red.prototype.select.startxy[0]),red.prototype.select.startxy[1]-xy[1]]);
			}
			else if((xy[0] < red.prototype.select.startxy[0])&&(xy[1] < red.prototype.select.startxy[1])){
				red.prototype.css.setxy(red.prototype.select.tempobj,[xy[0],xy[1]]);
				red.prototype.css.setsizexy(red.prototype.select.tempobj,
											[red.prototype.select.startxy[0]-xy[0],red.prototype.select.startxy[1]-xy[1]]);
											
			}
		}
				
	},
	
	end : function(e){
		//red.prototype.css.set1(document.body,'cursor','default');		
		
		if ((e.button && e.button == 1)||(e.which && e.which == 1)) {
			var endxy 	= red.prototype.css.getxy(red.prototype.select.tempobj);
			var endsize = red.prototype.css.getsizexy(red.prototype.select.tempobj);
			
			var endrect = red.prototype.rect.create(endxy[0],endxy[1],endsize[0],endsize[1]);
						
			red.prototype.dom.remove(red.prototype.select.tempobj);
			red.prototype.select.tempobj = null;
			red.prototype.select.startxy = null;
						
			var temparray = new Array();
			var schondrin = new Array();			
			
			for(var i=0;i<red.prototype.select.elemente2select.length;i++){
				var thisxy 		= red.prototype.css.getxy(red.prototype.select.elemente2select[i]);
				var thissize 	= red.prototype.css.fullsizexy(red.prototype.select.elemente2select[i]);
				var thisrect 	= red.prototype.rect.create(thisxy[0],thisxy[1],thissize[0],thissize[1]);
				
				if(red.prototype.select.type == "touch"){
					var test 		= red.prototype.rect.touch(endrect,thisrect);
				}
				else if(red.prototype.select.type == "isin"){
					var test 		= red.prototype.rect.isin(thisrect,endrect);
				}
				
				if(test == true){
					if(!red.prototype.array.in_array(red.prototype.select.selected,red.prototype.select.elemente2select[i])){
						var altebgfarbe = red.prototype.css.get1(red.prototype.select.elemente2select[i],'backgroundColor');
						red.prototype.select.elemente2select[i].oldcolor = altebgfarbe;
						red.prototype.css.set1(red.prototype.select.elemente2select[i],'backgroundColor',red.prototype.select.selectcolor);
						temparray[temparray.length] = red.prototype.select.elemente2select[i];
					}
					else{
						schondrin[schondrin.length] = red.prototype.select.elemente2select[i];
					}
				}
			}
			if(temparray.length > 0){
				if(red.prototype.key[red.prototype.select.selectkey] && red.prototype.select.selected != null){
					red.prototype.select.selected = red.prototype.array.push(temparray,red.prototype.select.selected);
				}
				else{
					red.prototype.select.selected = temparray;
				}
			}
			else{
				if(!red.prototype.key[red.prototype.select.selectkey]){
					red.prototype.select.resetcolor();
					red.prototype.select.selected = null;
				}
			}
			
			if((schondrin.length > 0) && (red.prototype.select.selected != null)){
				if(red.prototype.key[red.prototype.select.selectkey]){
					red.prototype.select.selected = red.prototype.array.remove(schondrin,red.prototype.select.selected);
					for(var i=0;i<schondrin.length;i++){
						red.prototype.select.reset1(schondrin[i]);
					}
				}
			}
			
			if(red.prototype.select.selected != null && red.prototype.select.selected.length == 0){
				red.prototype.select.selected = null;
			}
			
			if(red.prototype.select.onselectend != null){
				red.prototype.select.onselectend();				
			}
								
		}
		
		/* im falle wenn die selecttaste während des Selektierens losgelassen wird */
		if(red.prototype.select.keywaspressed && !red.prototype.key[red.prototype.select.selectkey]){
			red.prototype.select.correct();
		}
		
		/* events löschen */
		if(red.prototype.select.parent == null){
			red.prototype.event.remove(document,'mousemove',red.prototype.select.move);
			red.prototype.event.remove(document,'mouseup',red.prototype.select.end);
		}
		else{
			red.prototype.event.remove(red.prototype.select.parent,'mousemove',red.prototype.select.move);
			red.prototype.event.remove(red.prototype.select.parent,'mouseup',red.prototype.select.end);
		}
			
	},
	
	onselectend : null,
	
	resetcolor : function(){
		if(red.prototype.select.selected != null){
			for(var i=0;i<red.prototype.select.selected.length;i++){
				red.prototype.css.set1(red.prototype.select.selected[i],'backgroundColor',
										red.prototype.select.selected[i].oldcolor);
			}
		}
	},
	
	reset1 : function(elem){
		if(red.prototype.select.selected != null){
			red.prototype.css.set1(elem,'backgroundColor',elem.oldcolor);
		}
	},
	
	correct : function(){
		for(var i=0;i<red.prototype.select.elemente2select.length;i++){
			if(red.prototype.array.in_array(red.prototype.select.selected,red.prototype.select.elemente2select[i])){
				red.prototype.css.set1(red.prototype.select.elemente2select[i],'backgroundColor',red.prototype.select.selectcolor);
			}
			else{
				red.prototype.css.set1(red.prototype.select.elemente2select[i],'backgroundColor',
										red.prototype.select.elemente2select[i].oldcolor);
			}
		}
	}

}
