 var numberOfSoftronicWindows = 0;

 var resizeX = null;
 var resizeY = null;
 
 var north = 1;
 var south = 2;
 var east = 3;
 var west = 4;
 var move = 5;

 var minWidth = 200;
 var minHeight = 200;
 
 var currentElement = null;
 
 var _lastPointer = null;
 
 Event.observe(document, "mousemove", eventMouseMove);
 
 function eventMouseMove(event) {
    var pointer = [Event.pointerX(event), Event.pointerY(event)];
    
    if(!_lastPointer){
      _lastPointer = pointer;
      return;
    }
    
    if(pointer[0] == _lastPointer[0] && pointer[1] == _lastPointer[1]) return;
    
    var deltaX = pointer[0] - _lastPointer[0];
    var deltaY = pointer[1] - _lastPointer[1];
    
    if(!currentElement){
      _lastPointer = pointer;
      return;
    }
    
    if(!currentElement.style.top){
      currentElement.style.top = findPos(currentElement)[1] + "px";
      currentElement.style.left = findPos(currentElement)[0] + "px";
      currentElement.style.height = currentElement.offsetHeight + "px";
      currentElement.style.width = currentElement.offsetWidth + "px";
    }
    
    var currentTop = getRawPxValueFromString(currentElement.style.top);
    var currentLeft = getRawPxValueFromString(currentElement.style.left);
    var currentHeight = getRawPxValueFromString(currentElement.style.height);
    var currentWidth = getRawPxValueFromString(currentElement.style.width);
    
    var newTop = currentTop;
    var newLeft = currentLeft;
    var newWidth = currentWidth;
    var newHeight = currentHeight;
    
    switch(resizeY){
      case move: 
        newTop = currentTop + deltaY;
        break;
      case north:
        newHeight = max(currentHeight - deltaY, minHeight);
        newTop = currentTop + (currentHeight - newHeight);
        break;
      case south:
        newHeight = max(currentHeight + deltaY, minHeight);
        break;
      default: break;
    }
    
    switch(resizeX){
      case move: 
        newLeft = currentLeft + deltaX;
        break;
      case east:
        newWidth = max(currentWidth + deltaX, minWidth);
        break;
      case west:
        newWidth = max(currentWidth - deltaX, minWidth);
        newLeft = currentLeft + (currentWidth - newWidth);
        break;
      default: break;
    }
    
    currentElement.style.height = newHeight + "px";
    currentElement.style.top = newTop + "px";
    currentElement.style.width = newWidth + "px";
    currentElement.style.left = newLeft + "px";
    
    _lastPointer = pointer;
  }
 
 function startResizeNorth(id){
  setMouseTrapCursor("n-resize");
  showMousetrap();
  resizeY = north;
  resizeX = null;
  currentElement = document.getElementById(id);
 }
 function startResizeNorthEast(id){
  setMouseTrapCursor("ne-resize");
  showMousetrap();
  resizeY = north;
  resizeX = east;
  currentElement = document.getElementById(id);
 }
 function startResizeEast(id){
  setMouseTrapCursor("e-resize");
  showMousetrap();
  resizeY = null;
  resizeX = east;
  currentElement = document.getElementById(id);
 }
 function startResizeSouthEast(id){
  setMouseTrapCursor("se-resize");
  showMousetrap();
  resizeY = south;
  resizeX = east;
  currentElement = document.getElementById(id);
 }
 function startResizeSouth(id){
  setMouseTrapCursor("s-resize");
  showMousetrap();
  resizeY = south;
  resizeX = null;
  currentElement = document.getElementById(id);
 }
 function startResizeSouthWest(id){
  setMouseTrapCursor("sw-resize");
  showMousetrap();
  resizeY = south;
  resizeX = west;
  currentElement = document.getElementById(id);
 }
 function startResizeWest(id){
  setMouseTrapCursor("w-resize");
  showMousetrap();
  resizeY = null;
  resizeX = west;
  currentElement = document.getElementById(id);
 }
 function startResizeNorthWest(id){
  setMouseTrapCursor("nw-resize");
  showMousetrap();
  resizeY = north;
  resizeX = west;
  currentElement = document.getElementById(id);
 }
 
 function startMove(id){
  setMouseTrapCursor("default");
  showMousetrap();
  resizeX = move;
  resizeY = move;
  currentElement = document.getElementById(id);
 }
 
 function setMouseTrapCursor(cursor){
  document.getElementById("softronic-mousetrap").style.cursor = cursor;
 }
 
 function stopResize(){
  document.getElementById("softronic-mousetrap").style.display = "none";
  resizeX = null;
  resizeY = null;
  currentElement = null;
 }

 
 function showMousetrap(){
  document.getElementById("softronic-mousetrap").style.display = "block";
 }
 
function findPos(obj) {
  var curleft = curtop = 0;
  if (obj.offsetParent) {
    curleft = obj.offsetLeft
    curtop = obj.offsetTop
    while (obj = obj.offsetParent) {
      curleft += obj.offsetLeft
      curtop += obj.offsetTop
    }
  }
  return [curleft,curtop];
}

  function max(x, y){
    if(x > y){
      return x;
    } else {
      return y;
    }
  }

function getRawPxValueFromString(string){
  return parseInt(string.substring(0, string.length - 2));
}

function attachSoftronicWindows(){
  assertThatMousetrapExists();

  var elements = document.getElementsByClassName("softronic-window");

  for(var i = 0; i < elements.length; i++){
    var element = elements[i];
    
    var content = element.innerHTML;
    
    if(element.getElementsByClassName("softronic-main-panel").length == 0){
      content = "<div class=\"softronic-main-panel\">" + content + "</div>";
    }
    
    var id = assertThatElementHasCorrectId(element);
    
    element.innerHTML =  "" +
    
    "<div class=\"softronic-main-panel-background\"></div>" +
    
    content +
    
    "<div class=\"softronic-top-left-edge\"></div>" +
    "<div class=\"softronic-top-edge\"><span>Title here</span></div>" +
    "<div class=\"softronic-top-right-edge\"></div>" +
    
    "<div class=\"softronic-right-edge\"></div>" +
    "<div class=\"softronic-left-edge\"></div>" +
    
    "<div class=\"softronic-bottom-left-edge\"></div>" +
    "<div class=\"softronic-bottom-edge\"></div>" +
    "<div class=\"softronic-bottom-right-edge\"></div>" +
    
    "<div class=\"softronic-top-left-edge-field\" onmousedown=\"startResizeNorthWest('" + id + "')\"></div>" +
    "<div class=\"softronic-top-edge-field\" onmousedown=\"startMove('" + id + "')\"></div>" +
    "<div class=\"softronic-top-most-edge-field\" onmousedown=\"startResizeNorth('" + id + "')\"></div>" +
    "<div class=\"softronic-top-right-edge-field\" onmousedown=\"startResizeNorthEast('" + id + "')\"></div>" +
    
    "<div class=\"softronic-right-edge-field\" onmousedown=\"startResizeEast('" + id + "')\"></div>" +
    "<div class=\"softronic-left-edge-field\" onmousedown=\"startResizeWest('" + id + "')\"></div>" +
    
    "<div class=\"softronic-bottom-left-edge-field\" onmousedown=\"startResizeSouthWest('" + id + "')\"></div>" +
    "<div class=\"softronic-bottom-edge-field\" onmousedown=\"startResizeSouth('" + id + "')\"></div>" +
    "<div class=\"softronic-bottom-right-edge-field\" onmousedown=\"startResizeSouthEast('" + id + "')\"></div>" +
    
    "";
  }
}

function assertThatElementHasCorrectId(element){
  var id = element.id;

  if(!id || id.length == 0){
    id = "softwin-" + ++numberOfSoftronicWindows;
    element.id = id;
  }
  
  return id;
}

function assertThatMousetrapExists(){
  if(!document.getElementById("softronic-mousetrap")){
    document.getElementsByTagName("body")[0].innerHTML += "<div id=\"softronic-mousetrap\" onmouseup=\"stopResize()\"></div>";
  }
}

function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
        oldonload();
      }
      func();
    }
  }
}

function resizeRelevantIframes(){
  var elements = document.getElementsByClassName("softronic-main-panel");
  
  if(elements.length == 0){
    return;
  }
  
  for(var i = 0; i < elements.length; i++){
    var element = elements[i];
    
    var parent = element.parentNode;
  
    var supposedWidth = parent.offsetWidth - 42;
    var supposedHeight = parent.offsetHeight - 57;
    
    if(supposedWidth != element.offsetWidth){
      element.style.width = supposedWidth + "px";
    }
    
    if(supposedHeight != element.offsetHeight){
      element.style.height = supposedHeight + "px";
    }
  }
  
  setTimeout("resizeRelevantIframes()", 300);
 }

addLoadEvent(attachSoftronicWindows);
addLoadEvent(resizeRelevantIframes);