/* Konstruktor*/
function DockDrop(div_dock_drop_id){
	
	var self = this;
	//------- Objekt-Attribute:  ---------
	this.id = div_dock_drop_id; 
	this.zoomInInterval;
	this.zoomOutInterval;
	this.div = document.getElementById(div_dock_drop_id);
	this.div.style.position= "absolute";
	//get all 4 child-elements (images only)
	this.img_drop = getElementsByClassName_inDiv("img_drop",div_dock_drop_id)[0];
	this.img_text = getElementsByClassName_inDiv("img_text",div_dock_drop_id)[0];
	this.img_symbol = getElementsByClassName_inDiv("img_symbol",div_dock_drop_id)[0];
	//transparentes div erzeugen, das ueber dem Tropfen-div liegt und die mouseovers abfaengt:
	this.transparent_div = document.createElement('a');	
	this.transparent_img = document.createElement('img'); //ie stellt ein leeres div nicht dar, deswegen wird transparent_div mit diesem img mit durchsichtigem png gefuellt
	this.orig_x_pos;
	this.orig_y_pos;
	this.numberOfZoomOutSteps;
	this.x_range =-1;
	this.y_range = -1;
	this.url;


	//------- Objekt-Methoden:  ---------
	
	this.setXandY_D = setXandY_D;
	this.positionInnerDockDropContent = positionInnerDockDropContent;
	this.initDockDropTransparentDiv = initDockDropTransparentDiv;
	this.setOrigXandYPosition = setOrigXandYPosition;
	this.getFixedCenterCoordinatesDockDrop = getFixedCenterCoordinatesDockDrop;
	this.checkDockDropPosition = checkDockDropPosition;
	this.moveDockDropBack = moveDockDropBack;
	
	
	//------- Initialisierungen:  ---------
	this.div.style.zIndex="30"; //damit es unter dem transparenten div liegt!
	this.positionInnerDockDropContent(); 		
	this.div.style.overflow = "hidden";//wegen ie		
	//div verkleinern
    this.div.style.width =dockDropWidth_unzoomed+"px";
	this.div.style.height = dockDropHeight_unzoomed+"px";		
	// img-text unsichtbar machen:
	this.img_text.style.display = "none";
	//das transparente Div initialisieren:
	this.div.appendChild(this.transparent_div);
	this.transparent_div.appendChild(this.transparent_img);
	this.initDockDropTransparentDiv();
	//onmouseover zoom zu transparent_div hinzufuegen:
	this.transparent_div.onmouseover = function(){zoomInDock(self);}
	//onmouseout, raus-zoomen
	this.transparent_div.onmouseout = function(){zoomOutDock(self);}
}	

/*initialisiert das transparente Div, welches eber dem Tropfen-Div liegt und die mouseover abfaengt,
 * eigene Function, da die function nochmal aufgerufen werden muss, nachdem die Tropfen auf dem document positioniert wurden
 */
function initDockDropTransparentDiv(){
		this.transparent_div.style.display="block";
		this.transparent_div.style.position="absolute";	
		this.transparent_div.style.zIndex="50"; //muss hoeher sein als der zIndex des Tropfens! (zIndex vom Tropfen default: 3)
		this.transparent_div.style.width = dockDropWidth_unzoomed+"px";
		this.transparent_div.style.height = dockDropHeight_unzoomed+"px";
		this.transparent_div.style.top = 0;
		this.transparent_div.style.left = 0; 
		//this.transparent_div.style.backgroundColor="#000";	
		this.transparent_div.style.cursor = "pointer";
		this.transparent_img.src=imgPath+"global/transparent.gif"; //media/global/transparent.gif
		this.transparent_img.style.width = dockDropWidth_unzoomed+"px";
		this.transparent_img.style.height = dockDropHeight_unzoomed+"px";
		this.transparent_img.style.top = 0;
		this.transparent_img.style.left = 0; 		
}

//set X and Y position of drop 
function setXandY_D(x,y){
	this.div.style.left = x+"px";
	this.div.style.top = y+"px";
}

/*positioniert die Tropfen-Bestandteile innerhalb des Tropfendivs)  */
function positionInnerDockDropContent(){
	//tropfen-bild fuellt das gesamte div, deswegen muss nicht positioniert werden	
	this.img_drop.style.position="absolute";	
	this.img_drop.style.left="0px";
	this.img_drop.style.top="0px";		
	this.img_drop.style.width = dockDropWidth_unzoomed+"px";	
	this.img_drop.style.height = dockDropHeight_unzoomed+"px";	
		
	this.img_text.style.position="absolute";
	this.img_text.style.left="7px";
	this.img_text.style.top="73px";
	
	this.img_symbol.style.position="absolute";
	this.img_symbol.style.left=drop_symbol_x_pos+6+"px";
	this.img_symbol.style.top= drop_symbol_y_pos+3+"px";
	//symbol muss auch kleiner skaliert werden:
	//this.img_symbol.style.width = (parseInt(this.img_symbol.style.width)*scaling_factor)+"px";
	//this.img_symbol.style.height = (parseInt(this.img_symbol.style.height)*scaling_factor)+"px";

}

/* setzt die Atrribute, damit der Tropfen seine urspruengliche X und Y Position kennt */
function setOrigXandYPosition(x,y){
	this.orig_x_pos = x;
	this.orig_y_pos = y;
}

/* die Koordinate, an der der Tropfen im Zentrum beim zoomen immer bleiben muss  */
function getFixedCenterCoordinatesDockDrop(){
	var arrTmp = new Array();
	arrTmp[0] = this.orig_x_pos+(parseInt((dockDropWidth_unzoomed)/2));
	arrTmp[1] = this.orig_y_pos+(parseInt((dockDropHeight_unzoomed)/2));
	/*ÜarrTmp[0] = this.div.style.left+(parseInt((this.div.style.width)/2));
	arrTmp[1] = this.div.style.top+(parseInt((this.div.style.height)/2));*/
	return arrTmp;	
}

function zoomInDock(drop){
	tmp_zoomStep = zoomstep;
	clearInterval(drop.zoomOutInterval);
	drop.zoomInInterval = setInterval(function callFunc(){ zoomInDockHelp(drop); },zoomspeed);	
}
function zoomInDockHelp(drop){
	
	if (parseInt(drop.img_drop.style.width) < (dockDropWidth_unzoomed*zoomfactor)){	
		
		//fuer die mittige verschiebung, alte Werte merken:
		var old_left = parseInt(drop.div.style.left);
		var old_width = parseInt(drop.div.style.width);	
		var old_top = parseInt(drop.div.style.top);
		var old_height = parseInt(drop.div.style.height);	
		
		
		//naechste Breite berechnen und zoomStep fuer Beschleunigung anpassen
		var next_width = parseInt(drop.img_drop.style.width)+((dockDropWidth_unzoomed)*tmp_zoomStep);
		var next_height = parseInt(drop.img_drop.style.height)+((dockDropHeight_unzoomed)*tmp_zoomStep);
		tmp_zoomStep = tmp_zoomStep - speedup; // wegen der Beschleunigung
		
		//tropfen-div mitzoomen:
		drop.div.style.width = next_width+"px";
		drop.div.style.height = next_height+"px";
		//transparent-div mitzoomen:
		drop.transparent_div.style.width = next_width+"px"; 
		drop.transparent_div.style.height = next_height+"px"; 
		//transparent_img in transparent_div mitzoomen --> fuer ie
		drop.transparent_img.style.width = next_width+"px"; 
		drop.transparent_img.style.height = next_height+"px"; 
		//tropfenbild zoomen:
		drop.img_drop.style.width=next_width+"px";    //tropfen-breite vergroessern
		drop.img_drop.style.height=next_height+"px"; // tropfen-hoehe vergroessern
		//symbol verschieben:
		drop.img_symbol.style.left = parseInt((parseInt(drop.img_drop.style.width)*0.5)-(parseInt(drop.img_symbol.width)*0.5))+"px";
						
		//ganzen Tropfen nach oben links bewegen, damit es aussieht, als wuerde der Tropfen mittig aufzoomen
		var arrCenterCoord = drop.getFixedCenterCoordinatesDockDrop();
		//var new_left = arrCenterCoord[0] - (parseInt(drop.div.style.width)/2);
		var new_left = old_left + (parseInt(old_width/2) - parseInt(next_width/2));
		//var new_top = drop.orig_y_pos + (dockDropHeight_unzoomed) - parseInt(drop.div.style.height);
		var new_top = old_top + (old_height - next_height);
		drop.div.style.left = new_left+"px";
		drop.div.style.top = new_top+"px";
								
		drop.dock.notifyOtherDockDrops(drop); //alle anderen Tropfen informieren, dass sich dieser Tropfen vergroessert hat
	}
	else{  // damit tropfen nicht unendlich zoomt
		clearInterval(drop.zoomInInterval);
		drop.img_text.style.display="block";
	}
}

function zoomOutDock(drop){
	drop.numberOfZoomOutSteps = getNumberOfDockDropZoomOutSteps(drop);
	clearInterval(drop.zoomInInterval);
	drop.img_text.style.display="none"; //zuerst schrift wieder unsichtbar machen
	drop.zoomOutInterval = setInterval(function callFunct(){ zoomOutDockHelp(drop); },zoomspeed);	
}
function zoomOutDockHelp(drop){		
	if(parseInt(drop.img_drop.style.width) >= (dockDropWidth_unzoomed+(parseInt(drop.img_drop.style.width)*zoomstep))){	
		
		var arrCenterCoord = drop.getFixedCenterCoordinatesDockDrop();
		var new_left = arrCenterCoord[0] - (parseInt(drop.div.style.width)/2);
		var new_top = drop.orig_y_pos + dockDropHeight_unzoomed - parseInt(drop.div.style.height);
		drop.div.style.left = new_left+"px";
		drop.div.style.top = new_top+"px";
		
		var next_width = parseInt(drop.img_drop.style.width)-(parseInt(drop.img_drop.style.width)*zoomstep);
		var next_height = parseInt(drop.img_drop.style.height)-(parseInt(drop.img_drop.style.height)*zoomstep);
		//transparent-div wegzoomen:
		drop.transparent_div.style.width = next_width+"px"; 
		drop.transparent_div.style.height = next_height+"px"; 
		//transparent_img in transparent_div wegzoomen --> fuer ie
		drop.transparent_img.style.width = next_width+"px"; 
		drop.transparent_img.style.height = next_height+"px"; 
		//tropfenbild wegzoomen:
		drop.img_drop.style.width=next_width+"px";    //tropfen-breite verkleinern
		drop.img_drop.style.height=next_height+"px"; // tropfen-hoehe verkleinern
		//tropfen-div wegzoomen:
		drop.div.style.width = next_width+"px";
		drop.div.style.height = next_height+"px";
		//symbol verschieben: (nur in x-richtung!)
		drop.img_symbol.style.left = parseInt((parseInt(drop.img_drop.style.width)*0.5)-(parseInt(drop.img_symbol.width)*0.5))+"px";
		
		//notify others to come back to origin Position:
		drop.dock.notifyOtherDockDropsToComeBack(drop);//alle anderen, die vielleicht verschoben wurden, bescheid sagen, dass sie zurueck duerfen
		
	}
		else{  // damit tropfen nicht unendlich klein wird
		clearInterval(drop.zoomOutInterval);
		drop.positionInnerDockDropContent(); // um rundungsfehler von oben auszugleichen: es kann sein, dass einige komponenten, nicht mehr am richtigen platz sind nach zoomOut
		//drop.setXandY_D(drop.orig_x_pos,drop.orig_y_pos); // um rundungsfehler von oben auszugleichen: auf startposition zuruecksetzen
		drop.div.style.width = dockDropWidth_unzoomed+"px";// um rundungsfehler von oben auszugleichen: div wieder auf richtige Breite setzen, damit vom Tropfenbild nichts "abgeschnitten" wird
		drop.div.style.height = dockDropHeight_unzoomed+"px";
		var noDropZooming = true;  //nur alle zurueck setzen, wenn keine mehr szoomt
		for(var i=0;i<drop.dock.arrDockDrops.length;i++){// um rundungsfehler von oben auszugleichen: auf startposition zuruecksetzen
			if(parseInt(drop.dock.arrDockDrops[i].div.style.width)>dockDropWidth_unzoomed)
				noDropZooming = false;
		}
		if(noDropZooming) //dann alle auf original positionen zuruecksetzen
			for(var i=0;i<drop.dock.arrDockDrops.length;i++){
				drop.dock.arrDockDrops[i].setXandY_D(drop.dock.arrDockDrops[i].orig_x_pos,drop.dock.arrDockDrops[i].orig_y_pos);
			}
	}
}

/*ueberprueft anhand der neuen Position und Groesse des 'other_drop' ob er sich bewegen muss*/
function checkDockDropPosition(other_drop){
	if(getOuterDistance(other_drop,this) < distance_min){

		var arrCenterOtherDrop = centerCoordinates(other_drop);
		var arrCenterThis = centerCoordinates(this);
		var diff_x = parseInt(arrCenterOtherDrop[0]-arrCenterThis[0]);
		var diff_y = parseInt(arrCenterOtherDrop[1]-arrCenterThis[1]);
		var sign_x=0;
		var sign_y=0;
		if(diff_x < 0) sign_x =1;
		if(diff_x> 0) sign_x=-1;
		if(diff_y < 0) sign_y =1;
		if(diff_y> 0) sign_y=-1;
		
		//now: move!
		var new_x = parseInt(this.div.style.left)+ (sign_x*getPixelToMoveDockDrop(other_drop,this));
		var new_y = parseInt(this.div.style.top)+ (sign_y*getPixelToMoveDockDrop(other_drop,this));
		this.div.style.left = new_x +"px";
		this.div.style.top =  new_y+"px";
		
		//notifyOtherDrops
		for(var i=0;i<this.dock.arrDockDrops.length;i++){
			if(this.dock.arrDockDrops[i] != this  &&  this.dock.arrDockDrops[i] != other_drop) //nicht sich selbst, und nicht den vorgÃ¤nger benachrichtigen (sonst "flackern")
				this.dock.arrDockDrops[i].checkDockDropPosition(this);
		}
	}			
}

function moveDockDropBack(other_drop){  //to original position
	if(this.x_range == -1 && this.y_range == -1){
		this.x_range = (this.orig_x_pos - parseInt(this.div.style.left))/other_drop.numberOfZoomOutSteps; //weil: left und top verÃ¤ndern sich natuerich, deswegen nur einmal am anfang berechnen
		this.y_range = (this.orig_y_pos - parseInt(this.div.style.top))/other_drop.numberOfZoomOutSteps;
		
	}
	this.div.style.left = parseInt(this.div.style.left) + this.x_range +"px";
	this.div.style.top = parseInt(this.div.style.top) + this.y_range +"px";
	//und transparent-div mitnehmen:
	//this.transparent_div.style.left = parseInt(this.transparent_div.style.left) + this.x_range +"px";
	//this.transparent_div.style.top = parseInt(this.transparent_div.style.top) + this.y_range +"px";
}

