// Copyright Toni Cornelissen 2005

  var pUnitValue = new Array(0);
  var pUnitName  = new Array(0);
  pUnitValue[pUnitValue.length] =            1;  pUnitName[pUnitName.length] =  'm';
  pUnitValue[pUnitValue.length] =         1000;  pUnitName[pUnitName.length] = 'km';
  pUnitValue[pUnitValue.length] =     1609.344;  pUnitName[pUnitName.length] = 'mile';
  var pUnitDefault = pUnitName.length
  pUnitValue[pUnitValue.length] = 149597870000;  pUnitName[pUnitName.length] = 'AE';
  pUnitValue[pUnitValue.length] =    9.4607E12;  pUnitName[pUnitName.length] = 'ly';

  var vUnitValue = new Array();
  var vUnitName  = new Array();
  var vUnitDefault = vUnitName.length
  vUnitValue[vUnitValue.length] =            1;  vUnitName[vUnitName.length] =  'm/s';
  vUnitValue[vUnitValue.length] =      1 / 3.6;  vUnitName[vUnitName.length] = 'km/h';

  var mUnitValue = new Array();
  var mUnitName  = new Array();
  mUnitValue[mUnitValue.length] = 1/2.20462262;  mUnitName[mUnitName.length] = 'lb';
  var mUnitDefault = mUnitName.length
  mUnitValue[mUnitValue.length] =            1;  mUnitName[mUnitName.length] = 'kg';
  mUnitValue[mUnitValue.length] =    5.9742E24;  mUnitName[mUnitName.length] = 'em';

  var tUnitValue = new Array();
  var tUnitName  = new Array();
  tUnitValue[tUnitValue.length] =            1;  tUnitName[tUnitName.length] = 'sec';
  tUnitValue[tUnitValue.length] =           60;  tUnitName[tUnitName.length] = 'min';
  tUnitValue[tUnitValue.length] =         3600;  tUnitName[tUnitName.length] = 'h';
  var tUnitDefault = tUnitName.length
  tUnitValue[tUnitValue.length] =      24*3600;  tUnitName[tUnitName.length] = 'd';
  tUnitValue[tUnitValue.length] =    7*24*3600;  tUnitName[tUnitName.length] = 'w';
  tUnitValue[tUnitValue.length] =365.24*24*3600; tUnitName[tUnitName.length] = 'y';

  var t     = 0;
  var G       = 6.67E-11;	// Gravinational constant [N m2 kg-2]
  var Uk = 0;	// Kinetic energy
  var Up = 0;	// Potential energy
  var dm = 5.9742E24 // Default masss
  var ds = 10;	// Default size
  var dc = '#0000FF';

  // Create an uniq id
  function uniqId(str) {
	var i = 1
    if (str) {
	  if (!document.getElementById(str)) {
	    return str;
	  }
	} else {
	  var str = "id";
	}
	while (document.getElementById(str + i)) { i++; }
	return str + i;
  } // uniqId

  // Get the position of the mouseclick (relative to the page)
  function mousePosition(event) {
    //alert("mousePosition(" + event.toString() + ")");
	var pos = new Array(2); 
    pos[0] = 0;
	pos[1] = 0;

	if (event.pageX || event.pageY)
	{
		pos[0] = event.pageX;
		pos[1] = event.pageY;
	}
	else if (event.clientX || event.clientY)
	{
		pos[0] = event.clientX + document.body.scrollLeft;
		pos[1] = event.clientY + document.body.scrollTop;
	}

	return pos;
  } // mousePosition

  // Transform the position of the mouseclick lelative to the page
  function mouseTransform(pos, obj) {
    ///alert("mouseTransform(" + pos.toString() + ", " + obj.toString());
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			pos[0] -= obj.offsetLeft;
			pos[1] -= obj.offsetTop;

			pos[0] -= parseInt(obj.style.borderWidth); 
			pos[1] -= parseInt(obj.style.borderWidth); 
			obj = obj.offsetParent;
		}
	}
	else if (obj.x) {
		pos[0] -= obj.x;
		pos[0] -= obj.y;
	}
	return pos;
  } // mouseTransform

  function propertiesTable(obj) {
    var mu = parseInt(document.editform.mUnit.value);
    var pu = parseInt(document.editform.pUnit.value);
    var vu = parseInt(document.editform.vUnit.value);
    var m  = parseFloat(obj.getAttribute('m'))  / mUnitValue[mu]; if (m.toPrecision)  m  = m.toPrecision(3);
    var px = parseFloat(obj.getAttribute('px')) / pUnitValue[pu]; if (px.toPrecision) px = px.toPrecision(3);
    var px = parseFloat(obj.getAttribute('px')) / pUnitValue[pu]; if (px.toPrecision) px = px.toPrecision(3);
    var py = parseFloat(obj.getAttribute('py')) / pUnitValue[pu]; if (py.toPrecision) py = py.toPrecision(3);
    var vx = parseFloat(obj.getAttribute('vx')) / vUnitValue[vu]; if (vx.toPrecision) vx = vx.toPrecision(3);
    var vy = parseFloat(obj.getAttribute('vy')) / vUnitValue[vu]; if (vy.toPrecision) vy = vy.toPrecision(3);
    var ax = parseFloat(obj.getAttribute('ax')); if (ax.toPrecision) ax = ax.toPrecision(3);
    var ay = parseFloat(obj.getAttribute('ay')); if (ay.toPrecision) ay = ay.toPrecision(3);
    var fx = parseFloat(obj.getAttribute('fx')); if (fx.toPrecision) fx = fx.toPrecision(3);
    var fy = parseFloat(obj.getAttribute('fy')); if (fy.toPrecision) fy = fy.toPrecision(3);

    var str = '';
	str += '<table>';
    str += '<tr><th colspan="2">' + obj.getAttribute('id') + '</th></tr>';
    str += '<tr>';
    str +=   '<td>m:</td>';
	str +=   '<td>' + '</td>';
	str +=   '<td>' + m + '</td>';
	str +=   '<td>' + mUnitName[mu] + '</td>';
	str += '</tr>';
	str += '<tr>';
    str +=   '<td>p:</td>';
	str +=   '<td>' + px + '</td>';
	str +=   '<td>' + py + '</td>';
	str +=   '<td>' + pUnitName[pu] + '</td>';
	str += '</tr>';
	str += '<tr>';
    str +=   '<td>v:</td>';
	str +=   '<td>' + vx + '</td>';
	str +=   '<td>' + vy + '</td>';
	str +=   '<td>' + vUnitName[vu] + '</td>';
	str += '</tr>';
	str += '<tr>';
    str +=   '<td>a:</td>';
	str +=   '<td>' + ax + '</td>';
	str +=   '<td>' + ay + '</td>';
	str +=   '<td>' + 'ms/s<sup>2</sup>' + '</td>';
	str += '</tr>';
	str += '<tr>';
    str +=   '<td>F:</td>';
	str +=   '<td>' + fx + '</td>';
	str +=   '<td>' + fy + '</td>';
	str +=   '<td>' + 'N' + '</td>';
	str += '</tr>';
	str += '<table>';

	return str;
  } // propertiesTable


  function onClick(event) {
     ///alert("onClick(" + event.toString() + ")");
    // Reset the timer
	if (gtimer) {
		window.clearTimeout(gtimer);
		gtimer = null;
	}

	 if (!event) event = window.event;
	 var pos = mousePosition(event);
	 pos = mouseTransform(pos, canvas);
     // alert("pos: " + pos.toString());

	 if (edit) {
	   handleEdit(pos);
	 } else {
	   edit = findElement(pos);
	   if (edit) {
	     document.editform.radio[0].checked = true;
	   } else {
	     document.editform.radio[1].checked = true;
	     edit = createElement(pos);
	   }
	   startEdit();
     }
  }

  function onKeyDown(event) {
	var code;
	if (!event) var event = window.event;
	if (event.keyCode) code = event.keyCode;
	else if (event.which) code = event.which;
	var ch = String.fromCharCode(code);
	//alert('Character was ' + ch);
    switch (ch) {
      case 'A': if (setAdvanced) setAdvanced(); break;
      case 'S': if (saveGravity) saveGravity(); break;
	}
  }

  function onMouseOver() {
    var id = this.getAttribute('id');
	var label = document.getElementById(id + "_label");
    label.style.left = parseInt(this.style.left) + parseInt(this.style.width)  / 2;
    label.style.top  = parseInt(this.style.top)  + parseInt(this.style.height) / 2;
    label.innerHTML = propertiesTable(this);
	label.style.visibility = "";

	//this.style.backgroundColor='#CC0000';
	//this.innerHTML = this.getAttribute('id');
  }

  function onMouseOut()
  {
    var id = this.getAttribute('id');
	var label = document.getElementById(id + "_label");
    label.style.visibility = "hidden";

	//this.style.backgroundColor='#666666';
	//this.innerHTML = "&nbsp;";
  }

  function findElement(pos) {
    //alert("findElement(" + pos.toString() + ")");
    var elements = canvas.childNodes;
	var x, y, w, h;
	for (var i = 0; i < elements.length; i += 2) {
	   x = parseInt(elements[i].style.left);
	   y = parseInt(elements[i].style.top);
	   w = parseInt(elements[i].style.width);
	   h = parseInt(elements[i].style.height);
	   if ((pos[0] > x) && (pos[0] < (x+w)) &&
	       (pos[1] > y) && (pos[1] < (y+h))) {
		 return elements[i];
	   }
    }
	return null;
  } // findElement
  
  function createElement(pos) {
    ///alert("createElement(" + pos.toString() + ")");
	var element = document.createElement('div');
	var id = uniqId();
	element.setAttribute('id', id);
	///alert(pos[0] + ' ' + pos[1]);
    
	var px = pixelToPosX(pos[0]);
	var py = pixelToPosY(pos[1]);
//	alert(px + ' ' + py);
    element.setAttribute('px', px);
    element.setAttribute('py', py);
    element.setAttribute('vx', 0);
    element.setAttribute('vy', 0);
    element.setAttribute('m',  dm);
	element.innerHTML = '&nbsp;';	
	element.style.position = 'absolute';
	element.style.overflow = 'hidden';
	element.style.width  = ds;
	element.style.height = ds;
	element.style.zIndex = 10;
	element.style.left = pos[0] - parseInt(element.style.width)  / 2;
	element.style.top  = pos[1] - parseInt(element.style.height) / 2;
    element.style.backgroundColor = dc;
	element.onmouseover = onMouseOver;
	element.onmouseout = onMouseOut;

	canvas.appendChild(element);

	var label = document.createElement('div');
	label.setAttribute('id', id + "_label");
    label.innerHTML = id;	
	label.style.position = 'absolute';
	label.style.visibility = 'hidden';
	label.style.backgroundColor = "#999999";
	label.style.zIndex = 20;
    canvas.appendChild(label);

	return element;
  } // createElement

  function startEdit() {
    ///alert("startEdit(" + element.toString() + ")");
    edit.style.borderStyle = "solid";
    edit.style.borderWidth = 1;
	edit.style.borderColor='#FF6666';

    fillForm();
	document.editform.style.display = "";
  } // startEdit

  function handleEdit(pos) {
    if (document.editform.radio[0].checked) {
	  editSetPosition(pos); 
    } else if (document.editform.radio[1].checked) {
	  editSetVelocity(pos); 
    } else if (document.editform.radio[2].checked) {
	  editSetMass(pos); 
    } else if (document.editform.radio[3].checked) {
	  editSetSize(pos); 
	} else {
	  document.editform.update.focus();
    }
	updateElement();
  }

  function editSetPosition(pos) {
	var ps = pUnitValue[document.editform.pUnit.value];
    document.editform.px.value = pixelToPosX(pos[0]) / ps; 
    document.editform.py.value = pixelToPosY(pos[1]) / ps; 
    document.editform.radio[1].checked = true;
  } // editSetPosition

  function editSetVelocity(pos) {
	var vs = vUnitValue[document.editform.vUnit.value];
    document.editform.vx.value = (pixelToPosX(pos[0]) - edit.getAttribute('px')) / dt / vs / 25; 
    document.editform.vy.value = (pixelToPosY(pos[1]) - edit.getAttribute('py')) / dt / vs / 25; 
    document.editform.radio[2].checked = true;
  } // editSetPosition

  function editSetMass(pos) {
	var ms = mUnitValue[document.editform.mUnit.value];
    var dx = Math.abs(parseInt(edit.style.left) + parseInt(edit.style.width)  / 2 - pos[0]) * 2;
    var dy = Math.abs(parseInt(edit.style.top)  + parseInt(edit.style.height) / 2 - pos[1]) * 2;
    var d  = Math.sqrt(dx*dx + dy*dy);
	document.editform.m.value = Math.exp(d / mScale);
    document.editform.radio[3].checked = true;
  } // editSetMass

  function editSetSize(pos) {
    var sizex = Math.abs(parseInt(edit.style.left) + parseInt(edit.style.width)  / 2 - pos[0]) * 2;
    var sizey = Math.abs(parseInt(edit.style.top)  + parseInt(edit.style.height) / 2 - pos[1]) * 2;
    var size;
	if (sizex < sizey) { 
	  size = sizey;
	} else {
	  size = sizex;
	}
	editform.s.value = size;
    document.editform.radio[0].checked = true;
    //document.editform.update.focus();
  } // editSetSize

  function deleteEdit() {
    id = edit.getAttribute('id');
    label = document.getElementById(id + "_label");
	canvas.removeChild(label);
	canvas.removeChild(edit);
    label = null;
	edit  = null;
    endEdit();
  }

  function endEdit() {
    if (edit) {
      edit.style.borderStyle = "";
      edit = null;
    }
    document.editform.style.display = "none";
	firstStep();
  }
  
  function fillForm() {
    ///alert('fillForm()');
    document.editform.id.value = edit.getAttribute('id');

    var ps = pUnitValue[document.editform.pUnit.value];
    document.editform.px.value = edit.getAttribute('px') / ps;
    document.editform.py.value = edit.getAttribute('py') / ps;

	var vs = vUnitValue[document.editform.vUnit.value];
    document.editform.vx.value = edit.getAttribute('vx') / vs;
    document.editform.vy.value = edit.getAttribute('vy') / vs;

	var ms = mUnitValue[document.editform.mUnit.value];
    document.editform.m.value = edit.getAttribute('m') / ms;

    document.editform.c.value = edit.style.backgroundColor;
    document.editform.s.value = parseInt(edit.style.width);
  } // fillForm
  
  function updateElement() {
    id = edit.getAttribute("id");
	if (id != document.editform.id.value) {
	  id = uniqId(document.editform.id.value);
	  label = document.getElementById(edit.getAttribute('id') + '_label');
      edit.setAttribute('id', id);
      label.setAttribute('id', id + "_label");
	  document.editform.id.value = id;
	}

	edit.style.backgroundColor = document.editform.c.value;

	edit.style.width  = parseInt(document.editform.s.value);
	edit.style.height = parseInt(document.editform.s.value);

	var vs = vUnitValue[document.editform.vUnit.value];
    vx = parseFloat(document.editform.vx.value) * vs;
    vy = parseFloat(document.editform.vy.value) * vs;
	edit.setAttribute('vx', vx);
    edit.setAttribute('vy', vy);
	
	var ps = pUnitValue[document.editform.pUnit.value];
    px = parseFloat(document.editform.px.value) * ps;
    py = parseFloat(document.editform.py.value) * ps;
	edit.setAttribute('px', px);
    edit.setAttribute('py', py);
	edit.style.left = posToPixelX(px) - parseInt(edit.style.width)  / 2;
	edit.style.top  = posToPixelY(py) - parseInt(edit.style.height) / 2;

	var ms = mUnitValue[document.editform.mUnit.value];
    m = parseFloat(document.editform.m.value) * ms;
	edit.setAttribute('m', m);
  } // updateElement

  function posToPixelX(x) {
    return ((x - 0) / pScale) + parseInt(canvas.style.width)  / 2;
  } // posToPixelX

  function posToPixelY(y) {
    return ((-y - 0) / pScale) + parseInt(canvas.style.height) / 2;
  } // posToPixelY

  function pixelToPosX(x) {
    ///alert("pixelToPosX(" + x +")");
    return ((x  - parseInt(canvas.style.width) / 2) * pScale) - 0;
  } // pixelToPosX

  function pixelToPosY(y) {
    return ((parseInt(canvas.style.height) / 2 - y) * pScale) - 0;
  } // pixelToPosY
 
  function resetForces() {
    var nodes = canvas.childNodes;
	for (var i = 0; i < nodes.length; i += 2) {
      ///alert("Node: " + i);
	  nodes[i].setAttribute('fx', 0);
	  nodes[i].setAttribute('fy', 0);
	}
  } // resetForces

  function calculateForces() {
    var nodes = canvas.childNodes;

    Uk = 0;
	Up = 0;

	for (i = 0; i < nodes.length; i += 2) {
       //document.write(i + ': ');
	   pxi = parseFloat(nodes[i].getAttribute('px'));
	   pyi = parseFloat(nodes[i].getAttribute('py'));
       //alert("Pos("+i+") "+pxi+" "+pyi);
	   
	   vxi = parseFloat(nodes[i].getAttribute('vx'));
	   vyi = parseFloat(nodes[i].getAttribute('vy'));
       
	   mi = parseFloat(nodes[i].getAttribute('m'));

       // Kinetic energy Uk = 0.5 m v^2
	   // Thanks to Pythagoras we can just add the energies of the axes 
	   Uk += mi * (vxi * vxi + vyi * vyi) / 2;

	   for (j = i + 2; j < nodes.length; j += 2) { 
         ///document.write(j + ' ');
	     pxj = nodes[j].getAttribute('px');
	     pyj = nodes[j].getAttribute('py');

		 // distance 
		 r2 = (pxi - pxj) * (pxi - pxj) + (pyi - pyj) * (pyi - pyj);
         ///alert('r2: ' + r2 + ' ' + i + j + " " + G);
         if (0  != r2) {  
		   r  = Math.sqrt(r2);
		   rxu = (pxi - pxj) / r;
		   ryu = (pyi - pyj) / r;

	       mj = parseFloat(nodes[j].getAttribute('m'));

           //F = G \frac{m_1 m_2}{r^2}
		   f = G * (mi * mj) / r2;  
           //alert('F: ' + f + ' ' + i + j);

	       nodes[i].setAttribute('fx', parseFloat(nodes[i].getAttribute('fx')) - f * rxu);
	       nodes[j].setAttribute('fx', parseFloat(nodes[j].getAttribute('fx')) + f * rxu);
	       nodes[i].setAttribute('fy', parseFloat(nodes[i].getAttribute('fy')) - f * ryu);
	       nodes[j].setAttribute('fy', parseFloat(nodes[j].getAttribute('fy')) + f * ryu);

           // Potential energy Up = - G mi mj / 2 r
		   Up -= G * mi * mj / r;
         }
	   }
       ///document.write('<br />');
    } // loop i
    tmp = document.getElementById('Uk');   if (tmp) tmp.innerHTML = Uk.toPrecision(3);
    tmp = document.getElementById('Up');   if (tmp) tmp.innerHTML = Up.toPrecision(3);
    tmp = document.getElementById('Utot'); if (tmp) tmp.innerHTML = (Uk + Up).toPrecision(3);
  } // calculateForces

  function calculateSpeedAndPosition() {
	t += dt;
	var time = document.getElementById("time");
	if (time) {
		var tm = t / tUnitValue[parseInt(document.timeform.tUnit.value)];
		if (tm.toFixed) { tm = tm.toFixed(1); }
		time.innerHTML = tm;
		//alert("tm " +document.timeform.tUnit.value);
	}

    var Smx = 0;
    var Smy = 0;
    var Sm = 0;
    
    var nodes = canvas.childNodes;
	for (var i = 0; i < nodes.length; i += 2) {
      // a = F / m
	  m = parseFloat(nodes[i].getAttribute('m'));
      
      ///document.write('dt: ' + dt + ' ');
      ///document.write('m: ' + m + ' ');
	  
      fx = parseFloat(nodes[i].getAttribute('fx'));
      fy = parseFloat(nodes[i].getAttribute('fy'));
		  
	  // accelerations
	  ax = fx / m;
      ay = fy / m;
      nodes[i].setAttribute('ax', ax);
      nodes[i].setAttribute('ay', ay);
      ///document.write('Acc: (' + ax + ', ' + ay + ')' + m);
     
	  // new speed
      vx = parseFloat(nodes[i].getAttribute('vx')) + ax * dt;
      vy = parseFloat(nodes[i].getAttribute('vy')) + ay * dt;
      nodes[i].setAttribute('vx', vx);
      nodes[i].setAttribute('vy', vy);
      ///document.write('Vel: (' + vx + ', ' + vy + ')');

      // new position
      px = parseFloat(nodes[i].getAttribute('px')) + vx * dt;
      py = parseFloat(nodes[i].getAttribute('py')) + vy * dt;
      nodes[i].setAttribute('px', px);
      nodes[i].setAttribute('py', py);
	
	  // center of gravity
      Smx += m * px;
	  Smy += m * py;
      Sm  += m;

	  // Position on the screen	
	  nodes[i].style.left = posToPixelX(px) - parseInt(nodes[i].style.width)  / 2;
	  nodes[i].style.top  = posToPixelY(py) - parseInt(nodes[i].style.height) / 2;

      ///showLabel(nodes[i]);
      ///document.write('Pos: (' + px + ', ' + py + ')');
      ///document.getElementById('data').innerHTML = i;
	}

	// Center of gravity
	if (0 != Sm) {
	  var mx = Smx / Sm;
	  var my = Smy / Sm;
	  centerOfGravity(mx, my);
      //document.getElementById('mx').innerHTML = mx;
      //document.getElementById('my').innerHTML = my;
	}
  } // calculateSpeedAndPosition

  function centerOfGravity(mx, my) {
    var px, py, vx, vy;
	for (i = 0; i < childs.length; i += 2) {
	  childs[i].setAttribute('px', childs[i].getAttribute('px') - mx);
      childs[i].setAttribute('py', childs[i].getAttribute('py') - my);
	  childs[i].setAttribute('vx', childs[i].getAttribute('vx') - mx / dt);
      childs[i].setAttribute('vy', childs[i].getAttribute('vy') - my / dt);
	}	
  } // centerOfGravity

  function nextStep() {
    //alert("nextStep()");
	resetForces();
	calculateForces();
	calculateSpeedAndPosition()
	gtimer = window.setTimeout("nextStep()", 1);
  } // nextStep

  function firstStep() {
    var Smx = 0;
    var Smy = 0;
    var Sm = 0;
	var mx = 0;
	var my = 0;
	var m = 0;
	var px = 0;
	var py = 0;
    var childs = canvas.childNodes;
	// Find the center of gravity.
    for (i = 0; i < childs.length; i += 2) {
	  m = parseFloat(childs[i].getAttribute('m'));
	  px = parseFloat(childs[i].getAttribute('px'));
	  py = parseFloat(childs[i].getAttribute('py'));
      Smx += m * px;
	  Smy += m * py;
      Sm  += m;
    }

	if (0 != Sm) {
	  mx = Smx / Sm;
	  my = Smy / Sm;
	}

    // Move so the center of gravity is really the center
	for (i = 0; i < childs.length; i += 2) {
      childs[i].setAttribute('px', childs[i].getAttribute('px') - mx);
      childs[i].setAttribute('py', childs[i].getAttribute('py') - my);
    }	

    nextStep();
	//gtimer = window.setTimeout("nextStep()", 1);
  } // firstStep

function saveGravity() {
	var url = '';
//	url += 'http://gravity.technetium.be';
	url += 'http://astro.localhost';
	url += '/gravity/?';
	url += 'dat[dt]=' + dt + '&';
	url += 'dat[scale]=' +  pScale + '&';

	var childs = canvas.childNodes;
	for (var i = 0; i < childs.length; i += 2) {
		id = childs[i].getAttribute('id');
		url += 'dat[obj][' + id + '][m]='  + childs[i].getAttribute('m') + '&';
		url += 'dat[obj][' + id + '][px]=' + childs[i].getAttribute('px') + '&';
		url += 'dat[obj][' + id + '][py]=' + childs[i].getAttribute('py') + '&';
		url += 'dat[obj][' + id + '][vx]=' + childs[i].getAttribute('vx') + '&';
		url += 'dat[obj][' + id + '][vy]=' + childs[i].getAttribute('vy') + '&';
		url += 'dat[obj][' + id + '][s]='  + parseInt(childs[i].style.width) + '&';
		url += 'dat[obj][' + id + '][c]='  + childs[i].style.backgroundColor.toString() + '&';
    }

	//alert(url);
	if (window.external) { window.external.AddFavorite(url,'Gravity'); }
	location.href = url;
} // saveGravity



  function factorObject(obj, prop, f) {
    var obj = document.getElementById(obj);
	var val = 0;
	if ('s' == prop) {
      val = parseInt(obj.style.width) * f;
      if (0 == val) { val = 1; }
	  obj.style.width = val;
	  obj.style.height = val;
    } else {
      val = parseFloat(obj.getAttribute(prop)) * f;
	  obj.setAttribute(prop, val);
    }	
  }

