function down(e){
	if (!e) { var e = window.event };
	var element=e.target?e.target:e.srcElement;
	if ((!element.interactive)&&(element.parentNode.interactive)) {
		element = element.parentNode;
	}
	if (element.drag) {
		offsetX=e.clientX;
		offsetY=e.clientY;
		if(!element.style.left){element.style.left='0px'};
		if(!element.style.top){element.style.top='0px'};
		coordX=element.centerX;
		coordY=element.centerY;
		drag=true;
	} else {
		drag=false;
	}
}

function move(e){
	if (!e) { var e = window.event };
	var element=e.target?e.target:e.srcElement;
	if ((!element.interactive)&&(element.parentNode.interactive)) {
		element = element.parentNode;
	}
	if (element.interactive) {
		if (drag) {
			element.centerX=coordX+e.clientX-offsetX;
			element.centerY=coordY+e.clientY-offsetY;
			element.dragged = true;
		} else {
			element.dragged = false;
			if (element.hover) { tags(element,1); }
		}
	} else {
		drag = false;
	}
	tip = document.getElementById('tooltip');
	if (element.getAttribute('tip')) {
		element.tip = element.getAttribute('tip');
	}
	if (element.tip) {
		//window.status = element.tip;
		tip.style.left = e.clientX + 20 + 'px';
		tip.style.top = e.clientY + 8 + 'px';
		tip.innerHTML = element.tip;
	} else {
		tip.innerHTML = '';
	}
	return false;
}

function up(e){
	if (!e) { var e = window.event };
	var element=e.target?e.target:e.srcElement;
	if ((!element.interactive)&&(element.parentNode.interactive)) {
		element = element.parentNode;
	}
	if (element.interactive) {
		if ((element.klik)&&(!element.dragged)) {			
			match=true;
			for (i=0;i<document.clicked.length;i++) {
				if (element==document.clicked[i]) {
					if (document.clicked[i].className=='square') {
						match=false;
						if (element.link) { 
							wnd = document.getElementById('window');
							wnd.style.visibility = 'visible';
						}
					}
				}
				if ((element.name==document.clicked[i].name)||(document.clicked[i].className=='square')) {
					document.clicked.splice(i,1);
					
				}
			}
			if (element.show=='all') {
				match=false;
			}
			if (match) {
				document.clicked.push(element);
				if (element.link) { 
					wnd = document.getElementById('window');
					fill(wnd,element.link,'inherit',90,'fit');
				}
			}			
		}
		tags(element,1);
	}
	drag = false;
}

function tags(element,scale) {	//okreslenie podobienstwa
	if (element.show) {
		show = element.show;
	} else if (element.tag) {
		show = element.tag;
	}
	if (show) {
		for (g=0;g<elements.length;g++) {
			element2 = elements[g];
			if ((element2.tag)&&((element.affect==element2.className)||(!element.affect))) {
				tag = element2.tag.slice(0);
				match = 1;
				if ((document.clicked.length>0)&&(element2.className=='square')) {
					for (h=0;h<document.clicked.length;h++) {
						if (document.clicked[h].className=='menu') {
							match = 0;
							for (i=0;i<document.clicked[h].tag.length;i++) {							
								for (j=0;j<tag.length;j++) {
									if (document.clicked[h].tag[i]==tag[j]) { 
										match = match + 1;
										tag[j] = '#';
										break;
									}
								}
							}
							if (match==0) {
								break;
							}
						}
					}
				}
				if (match>0) {
					match = 0;
					tag = element2.tag.slice(0);
					for (i=0;i<show.length;i++) {
						for (j=0;j<tag.length;j++) {
							if ((show[i]==tag[j])||(show[i]=='all')) { 
								match = match + 1;
								tag[j] = '#';
								break;
							}
						}
					}
				}
				match = match/element2.tag.length;
				if (match<=0) {
					match = 0;
				} else if (match<0.66) {
					match = 1;
				} else if (match<1) {
					match = 2; 
				} else {
					match = 3;
				}
				element2.style.zIndex = match*scale*10;
			}
		}
		for (i=0;i<document.clicked.length;i++) {
			document.clicked[i].style.zIndex = 180;
		}
	}
}

function transform() {
	processed = 0;
	for (i=0;i<elements.length;i++) {
		element=elements[i];
		if ((!element.dragged)&&(!element.bounced)&&(!element.fixed)) {
			element.changed = false;
		} else {
			element.changed = true;
			element.bounced = false;
		}
		if (element.scale) {
			elementwidth=parseInt(element.style.width);	//dopasowanie wielkosci
			elementheight=parseInt(element.style.height);
			stepX=gridX*element.style.zIndex/10-elementwidth-border;
			stepY=gridY*element.style.zIndex/10-elementheight-border;
			if (stepX != 0) { element.changed = true; }
			if (stepY != 0) { element.changed = true; }
			if (stepX==1) { stepX=2; }
			if (stepY==1) { stepY=2; }
			elementwidth = Math.floor(elementwidth+stepX*speed/2);
			elementheight = Math.floor(elementheight+stepY*speed/2);
			if (elementwidth<0) { elementwidth=0; }
			if (elementheight<0) { elementheight=0; }
			element.style.width = elementwidth + 'px';	//faktyczne rozciagniecie
			element.style.height = elementheight + 'px';
		}
		
		if ((element.snap)&&(element.style.zIndex!=0)) {	//dopasowanie do siatki
			if (element.snap == 'center') {
				inGridX = (element.centerX-(gridX-border)/2)/gridX;
				if ((inGridX-Math.floor(inGridX))!=0) {
					destX = Math.round(inGridX)*gridX+(gridX-border)/2;
					stepX = (destX-element.centerX)*speed/4;
					if ((Math.abs(stepX<1))&&(Math.abs(stepX>0))) { stepX=1; }
					if (stepX != 0) { element.changed = true; }
					element.centerX = element.centerX+stepX;
				}
				inGridY = (element.centerY-(gridY-border)/2)/gridY;
				if ((inGridY-Math.floor(inGridY))!=0) {
					destY = Math.round(inGridY)*gridY+(gridY-border)/2;
					stepY = (destY-element.centerY)*speed/4;
					if ((Math.abs(stepY<1))&&(Math.abs(stepY>0))) { stepY=1; }
					if (stepY != 0) { element.changed = true; }
					element.centerY = element.centerY+stepY;
				}
			} else {
				elementwidth=parseInt(element.style.width);
				elementheight=parseInt(element.style.height);					
				if (!element.dragged) {
					elementleft=element.centerX-elementwidth/2;
					inGridX = elementleft/gridX;
					if ((inGridX-Math.floor(inGridX))!=0) {
						destX = Math.round(inGridX)*gridX;
						stepX = (destX-elementleft)*speed/4;
						if ((Math.abs(stepX < 1)) && (Math.abs(stepX > 0))) { stepX=1; }
						//if (stepX != 0) { element.changed = true; }
						element.centerX = element.centerX+stepX;
					}
					elementtop=element.centerY-elementheight/2;
					inGridY = elementtop/gridY;
					if ((inGridY - Math.floor(inGridY)) != 0) {
						destY = Math.round(inGridY) * gridY;
						stepY = (destY-elementtop) * speed / 4;
						if ((Math.abs(stepY < 1)) && (Math.abs(stepY > 0))) { stepY = 1; }
						//if (stepY != 0) { element.changed = true; }
						element.centerY = element.centerY + stepY;
					}
				}
			}
		}
		
		if ((element.bounce)&&(element.changed)) {	//odpychanie
			processed += 1;
			elementwidth=parseInt(element.style.width);
			elementheight=parseInt(element.style.height);			
			for (j=0;j<elements.length;j++) {
				element2=elements[j];
				if ((j!=i)&&(!element2.dragged)&&(element2.bounce)) {
					element2width=parseInt(element2.style.width);
					element2height=parseInt(element2.style.height);
					distX=Math.abs(element.centerX-element2.centerX);
					distY=Math.abs(element.centerY-element2.centerY);
					distXmin=(elementwidth+element2width)/2+border;
					distYmin=(elementheight+element2height)/2+border;
					if ((distX<distXmin)&&(distY<distYmin)) {
						element2.bounced = true;
						if (distX>distY) {
							if (element.centerX>element2.centerX) {
								element2.centerX = element.centerX - distXmin;
							} else {
								element2.centerX = element.centerX + distXmin;
							}
						} else if (distX<distY) {
							if (element.centerY>element2.centerY) {
								element2.centerY = element.centerY - distYmin;
							} else {
								element2.centerY = element.centerY + distYmin;
							}
						} else {
							nudge = Math.round(Math.random());
							if (nudge==0) {
								if (element.centerX>element2.centerX) {
									element2.centerX = element.centerX - distXmin;
								} else if (element.centerX<element2.centerX) {
									element2.centerX = element.centerX + distXmin;
								} else {
									dir = Math.round(Math.random())*2-1;
									element2.centerX = element.centerX - distXmin*dir;
								}
							} else {
								if (element.centerY>element2.centerY) {
									element2.centerY = element.centerY - distYmin;
								} else if (element.centerY<element2.centerY) {
									element2.centerY = element.centerY + distYmin;
								} else {
									dir = Math.round(Math.random())*2-1;
									element2.centerY = element.centerY - distYmin*dir;
								}
							}
						}
					}
				}
			}
		}
		
		if (element.limit) {
			element.fixed=false;	//ograniczenie pola
			if (element.centerX<=elementwidth/2) {
				element.centerX=elementwidth/2;
				element.fixed=true;
			} 
			if (element.centerX>=parseInt(element.parentNode.style.width)-elementwidth/2) {
				element.centerX=parseInt(element.parentNode.style.width)-elementwidth/2;
				element.fixed=true;
			}
			if (element.centerY<=elementheight/2) {
				element.centerY=elementheight/2;
				element.fixed=true;
			}
			if (element.centerY>=parseInt(element.parentNode.style.height)-elementheight/2) {
				element.centerY=parseInt(element.parentNode.style.height)-elementheight/2;
				element.fixed=true;
			}
		}
		
		if (element.move) {
			element.style.left = Math.floor(element.centerX-elementwidth/2)+'px';	//faktyczne przesuniecie
			element.style.top = Math.floor(element.centerY-elementheight/2)+'px';
		}
		
		if (element.preview) {
			if (element.style.zIndex>=30) {	//pokazywanie zawartosci
				if (element.childNodes[0]) {
					element.childNodes[0].style.visibility = "visible";
				}
			} else {
				if (element.childNodes[0]) {
					element.childNodes[0].style.visibility = "hidden";
				}
			}
		}
		
		if ((element.style.zIndex == 0)&&(element.collapse)) {
			element.style.display = 'none';
		} else {
			element.style.display = 'block';
		}
	}
	//date = new Date();
	//window.status = date.getTime() + ' / ' + processed;
}

function initialize() {
	divs=document.getElementsByTagName('DIV');
	for (i=0;i<divs.length;i++) {
		element = divs[i];
		if (element.getAttribute('tag')) {
			element.tag = element.getAttribute('tag');
		}
		if (element.getAttribute('show')) {
			element.show = element.getAttribute('show');
		}
		if (element.getAttribute('affect')) {
			element.affect = element.getAttribute('affect');
		}
		if (element.getAttribute('name')) {
			element.name = element.getAttribute('name');
		}
		if (element.getAttribute('src')) {
			element.src = element.getAttribute('src');
		}
		if (element.getAttribute('link')) {
			element.link = element.getAttribute('link');
		}
		if (element.getAttribute('tip')) {
			element.tip = element.getAttribute('tip');
		}
		if (element.getAttribute('interactive')) {
			element.interactive = element.getAttribute('interactive');
		}
		if (element.className == 'square') {
			element.drag = true;
			element.snap = true;
			element.bounce = true;
			element.scale = true;
			element.preview = true;
			element.limit = true;
			element.interactive = true;
			element.move = true;
			element.hover = true;
			element.klik = true;
		}
		if (element.className == 'menu_header') {
			element.affect = 'menu';
			element.interactive = true;
			element.menu = true;
		}
		if (element.className == 'menu') {
			element.interactive = true;
			element.klik = true;
			element.collapse = true;
			element.menu = true;
			element.affect = 'square';
			element.onmouseover = function () { this.style.textDecoration = 'underline'; };
			element.onmouseout = function () { this.style.textDecoration = 'none'; };
		}
		if (element.move) {
			element.position = 'absolute';
			element.centerX=parseInt(element.style.left)+parseInt(element.style.width)/2;
			element.centerY=parseInt(element.style.top)+parseInt(element.style.height)/2;
		}
		if (element.tag) {
			if (typeof element.tag == 'string') {
				element.tag = element.tag.split('::');
			}
		}
		if (element.show) {
			if (typeof element.show == 'string') {
				element.show = element.show.split('::');
			}
		}
		if (element.interactive) {
			elements.push(element);
		}
	}
}

window.onload = function() {
	speed = 1;
	border = 1;
	drag = false;
	squares('square_area');
	elements = new Array;
	initialize();
	document.clicked = new Array;
	document.show = null;
	document.onmousemove = move;
	document.onmousedown = down;
	document.onmouseup = up;
	interval=window.setInterval(transform,20);
}
