зеркало из https://github.com/mozilla/pjs.git
887 строки
30 KiB
JavaScript
887 строки
30 KiB
JavaScript
/* ***** BEGIN LICENSE BLOCK *****
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
* http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
* for the specific language governing rights and limitations under the
|
|
* License.
|
|
*
|
|
* The Original Code is Mozilla Communicator client code, released
|
|
* March 31, 1998.
|
|
*
|
|
* The Initial Developer of the Original Code is
|
|
* Netscape Communications Corporation.
|
|
* Portions created by the Initial Developer are Copyright (C) 1999-2000
|
|
* the Initial Developer. All Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
* Dan Haddix (dan6992@hotmail.com)
|
|
*
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
|
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
* of those above. If you wish to allow use of your version of this file only
|
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
* use your version of this file under the terms of the MPL, indicate your
|
|
* decision by deleting the provisions above and replace them with the notice
|
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
* the provisions above, a recipient may use your version of this file under
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
*
|
|
* ***** END LICENSE BLOCK ***** */
|
|
|
|
var downTool = false;
|
|
var dragActive = false;
|
|
var dragObject = false;
|
|
var startX = null;
|
|
var startY = null;
|
|
var endX = null;
|
|
var endY = null;
|
|
var downTool = false;
|
|
var currentElement = [];
|
|
var currentTool = "pointer";
|
|
var currentRect = null;
|
|
var currentCir = null;
|
|
var currentPoly = null;
|
|
var currentPoint = null;
|
|
var rectCount = 1;
|
|
var cirCount = 1;
|
|
var polyCount = 1;
|
|
var pointCount = 1;
|
|
var xlock = false;
|
|
var ylock = false;
|
|
var resize = false;
|
|
var currentZoom = 1;
|
|
var clipBoard = [];
|
|
|
|
function Rect(coords, href, target, alt, construct){
|
|
newRect = frameDoc.createElement("div");
|
|
newRect.setAttribute("class", "rect");
|
|
newRect.setAttribute("id", "rect"+rectCount++);
|
|
newRect.setAttribute("name", "hotspot");
|
|
currentRect = selectElement(frameDoc.body.appendChild(newRect));
|
|
|
|
// Add resize handles
|
|
// waiting for better drawing code
|
|
handletl = frameDoc.createElement("div");
|
|
handletl.setAttribute("class", "handletl");
|
|
handletl.setAttribute("name", "handle");
|
|
handletr = frameDoc.createElement("div");
|
|
handletr.setAttribute("class", "handletr");
|
|
handletr.setAttribute("name", "handle");
|
|
handlebl = frameDoc.createElement("div");
|
|
handlebl.setAttribute("class", "handlebl");
|
|
handlebl.setAttribute("name", "handle");
|
|
handlebr = frameDoc.createElement("div");
|
|
handlebr.setAttribute("class", "handlebr");
|
|
handlebr.setAttribute("name", "handle");
|
|
handlet = frameDoc.createElement("div");
|
|
handlet.setAttribute("class", "handlet");
|
|
handlet.setAttribute("name", "handle");
|
|
handlel = frameDoc.createElement("div");
|
|
handlel.setAttribute("class", "handlel");
|
|
handlel.setAttribute("name", "handle");
|
|
handler = frameDoc.createElement("div");
|
|
handler.setAttribute("class", "handler");
|
|
handler.setAttribute("name", "handle");
|
|
handleb = frameDoc.createElement("div");
|
|
handleb.setAttribute("class", "handleb");
|
|
handleb.setAttribute("name", "handle");
|
|
currentRect.appendChild(handletl);
|
|
currentRect.appendChild(handletr);
|
|
currentRect.appendChild(handlebl);
|
|
currentRect.appendChild(handlebr);
|
|
currentRect.appendChild(handlet);
|
|
currentRect.appendChild(handlel);
|
|
currentRect.appendChild(handler);
|
|
currentRect.appendChild(handleb);
|
|
|
|
if (!coords){
|
|
currentRect.style.left = startX+"px";
|
|
currentRect.style.top = startY+"px";
|
|
//currentRect.style.width = endX+"px";
|
|
//currentRect.style.height = endX+"px";
|
|
}
|
|
else{
|
|
var coordArray = coords.split(',');
|
|
currentRect.style.left = coordArray[0]+"px";
|
|
currentRect.style.top = coordArray[1]+"px";
|
|
currentRect.style.width = (parseInt(coordArray[2])-parseInt(coordArray[0]))+"px";
|
|
currentRect.style.height = (parseInt(coordArray[3])-parseInt(coordArray[1]))+"px";
|
|
if (href)
|
|
currentRect.setAttribute("hsHref", href);
|
|
if (target)
|
|
currentRect.setAttribute("hsTarget", target);
|
|
if (alt)
|
|
currentRect.setAttribute("hsAlt", alt);
|
|
}
|
|
if (construct)
|
|
currentRect = null;
|
|
}
|
|
|
|
function Circle(coords, href, target, alt, construct){
|
|
newCir = frameDoc.createElement("div");
|
|
newCir.setAttribute("class", "cir");
|
|
newCir.setAttribute("id", "cir"+cirCount++);
|
|
newCir.setAttribute("name", "hotspot");
|
|
currentCir = selectElement(frameDoc.body.appendChild(newCir));
|
|
|
|
// Add resize handles
|
|
handletl = frameDoc.createElement("div");
|
|
handletl.setAttribute("class", "handletl");
|
|
handletl.setAttribute("name", "handle");
|
|
handletr = frameDoc.createElement("div");
|
|
handletr.setAttribute("class", "handletr");
|
|
handletr.setAttribute("name", "handle");
|
|
handlebl = frameDoc.createElement("div");
|
|
handlebl.setAttribute("class", "handlebl");
|
|
handlebl.setAttribute("name", "handle");
|
|
handlebr = frameDoc.createElement("div");
|
|
handlebr.setAttribute("class", "handlebr");
|
|
handlebr.setAttribute("name", "handle");
|
|
currentCir.appendChild(handletl);
|
|
currentCir.appendChild(handletr);
|
|
currentCir.appendChild(handlebl);
|
|
currentCir.appendChild(handlebr);
|
|
|
|
if (!coords){
|
|
currentCir.style.left = startX+"px";
|
|
currentCir.style.top = startY+"px";
|
|
//currentCir.style.width = endX+"px";
|
|
//currentCir.style.height = endX+"px";
|
|
}
|
|
else{
|
|
var coordArray = coords.split(',');
|
|
radius = parseInt(coordArray[2]);
|
|
currentCir.style.left = (parseInt(coordArray[0])-radius)+"px";
|
|
currentCir.style.top = (parseInt(coordArray[1])-radius)+"px";
|
|
currentCir.style.width = (radius*2)+"px";
|
|
currentCir.style.height = (radius*2)+"px";
|
|
if (href)
|
|
currentCir.setAttribute("hsHref", href);
|
|
if (target)
|
|
currentCir.setAttribute("hsTarget", target);
|
|
if (alt)
|
|
currentCir.setAttribute("hsAlt", alt);
|
|
}
|
|
if (construct)
|
|
currentCir = null;
|
|
}
|
|
|
|
function Poly(coords, href, target, alt, construct){
|
|
dump('Poly Called\n');
|
|
newPoly = frameDoc.createElement("div");
|
|
newPoly.setAttribute("class", "poly");
|
|
newPoly.setAttribute("id", "poly"+polyCount++);
|
|
newPoly.setAttribute("name", "hotspot");
|
|
currentPoly = selectElement(frameDoc.body.appendChild(newPoly));
|
|
if (currentZoom > 1){
|
|
currentPoly.style.width = imageEl.offsetWidth+"px";
|
|
currentPoly.style.height = imageEl.offsetHeight+"px";
|
|
}
|
|
if (!coords){
|
|
addPoint(null, startX, startY, true);
|
|
//currentPoly.onclick = addPoint;
|
|
currentPoly.style.cursor = "crosshair";
|
|
}
|
|
else{
|
|
var coordArray = coords.split(',');
|
|
var len = coordArray.length;
|
|
for (i=0; i<len; i++){
|
|
addPoint(null, coordArray[i], coordArray[i+1]);
|
|
i++;
|
|
}
|
|
if (href)
|
|
currentPoly.setAttribute("hsHref", href);
|
|
if (target)
|
|
currentPoly.setAttribute("hsTarget", target);
|
|
if (alt)
|
|
currentPoly.setAttribute("hsAlt", alt);
|
|
polyFinish(null, construct);
|
|
}
|
|
}
|
|
|
|
function addPoint(event, pointX, pointY, start){
|
|
if (event){
|
|
dump('addPoint Called with event\n');
|
|
pointX = event.clientX+window.frames[0].pageXOffset;
|
|
pointY = event.clientY+window.frames[0].pageYOffset;
|
|
event.stopPropagation();
|
|
if (event.detail == 2){
|
|
polyFinish();
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
dump('addPoint Called\n');
|
|
newPoint = frameDoc.createElement("div");
|
|
newPoint.setAttribute("class", "point");
|
|
newPoint.setAttribute("id", "point"+pointCount++);
|
|
newPoint.style.left = pointX+"px";
|
|
newPoint.style.top = pointY+"px";
|
|
if (start){
|
|
newPoint.setAttribute("class", "pointStart");
|
|
newPoint.style.cursor = "pointer";
|
|
//newPoint.onclick = polyFinish;
|
|
//newPoint.addEventListener("click", polyFinish, false);
|
|
}
|
|
currentPoly.appendChild(newPoint);
|
|
}
|
|
|
|
function polyFinish(event, construct){
|
|
dump("polyfinish called\n");
|
|
var len = currentPoly.childNodes.length;
|
|
if (len >=3){
|
|
var polyLeft = 1000000;
|
|
var polyTop = 1000000;
|
|
var polyWidth = 0;
|
|
var polyHeight = 0;
|
|
for(p=0; p<len; p++){
|
|
var curEl = currentPoly.childNodes[p];
|
|
curEl.setAttribute("class", "point");
|
|
curEl.style.cursor = "default";
|
|
pointLeft = parseInt(curEl.style.left);
|
|
pointTop = parseInt(curEl.style.top);
|
|
polyLeft = Math.min(polyLeft, pointLeft);
|
|
polyTop = Math.min(polyTop, pointTop);
|
|
dump(polyLeft+"\n");
|
|
}
|
|
for(p=0; p<len; p++){
|
|
var curEl = currentPoly.childNodes[p];
|
|
curEl.style.left = (parseInt(curEl.style.left)-polyLeft)+"px";
|
|
curEl.style.top = (parseInt(curEl.style.top)-polyTop)+"px";
|
|
}
|
|
for(p=0; p<len; p++){
|
|
var curEl = currentPoly.childNodes[p];
|
|
polyWidth = Math.max(polyWidth, (parseInt(curEl.style.left)+3));
|
|
polyHeight = Math.max(polyHeight, (parseInt(curEl.style.top)+3));
|
|
}
|
|
if (parseInt(currentPoly.style.left) >= 0){
|
|
polyLeft += parseInt(currentPoly.style.left);
|
|
polyTop += parseInt(currentPoly.style.top);
|
|
}
|
|
currentPoly.style.left = polyLeft+"px";
|
|
currentPoly.style.top = polyTop+"px";
|
|
currentPoly.style.width = polyWidth+"px";
|
|
currentPoly.style.height = polyHeight+"px";
|
|
//currentPoly.childNodes[0].onclick = null;
|
|
//currentPoly.onclick = null;
|
|
currentPoly.style.cursor = "auto";
|
|
//currentPoly.childNodes[0].removeEventListener("click", polyFinish, false);
|
|
//currentPoly.removeEventListener("click", addPoint, true);
|
|
if (!construct)
|
|
hotSpotProps(currentPoly);
|
|
}
|
|
else
|
|
deleteElement(currentPoly);
|
|
if (event)
|
|
event.stopPropagation();
|
|
|
|
currentPoly = null;
|
|
}
|
|
|
|
function deleteElement(el){
|
|
if (el){
|
|
if (el.length){
|
|
var len = currentElement.length;
|
|
for(i=0; i<len; i++)
|
|
frameDoc.body.removeChild(currentElement[i]);
|
|
}
|
|
else
|
|
frameDoc.body.removeChild(el);
|
|
}
|
|
}
|
|
|
|
function selectAll(){
|
|
objList = frameDoc.getElementsByName("hotspot");
|
|
listLen = objList.length;
|
|
var objCount = 0;
|
|
for(a=0; a<listLen; a++){
|
|
selectElement(objList[a], objCount);
|
|
objCount++;
|
|
}
|
|
}
|
|
|
|
function selectElement(el, add){
|
|
if (add){
|
|
if (currentElement[0].getAttribute("class") != "poly"){
|
|
len = currentElement[0].childNodes.length;
|
|
for(i=0; i<len; i++)
|
|
currentElement[0].childNodes[i].style.visibility = "hidden";
|
|
}
|
|
currentElement.push(el);
|
|
document.getElementById("Map:Cut").setAttribute("disabled", "false");
|
|
document.getElementById("Map:Copy").setAttribute("disabled", "false");
|
|
return currentElement[currentElement.length-1];
|
|
}
|
|
else{
|
|
if (currentElement[0]){
|
|
if (currentElement[0].getAttribute("class") != "poly"){
|
|
len = currentElement[0].childNodes.length;
|
|
for(i=0; i<len; i++)
|
|
currentElement[0].childNodes[i].style.visibility = "hidden";
|
|
}
|
|
}
|
|
currentElement = null;
|
|
currentElement = [];
|
|
currentElement[0] = el;
|
|
if (el != null){
|
|
if (currentElement[0].getAttribute("class") != "poly"){
|
|
len = currentElement[0].childNodes.length;
|
|
for(i=0; i<len; i++)
|
|
currentElement[0].childNodes[i].style.visibility = "visible";
|
|
}
|
|
document.getElementById("Map:Cut").setAttribute("disabled", "false");
|
|
document.getElementById("Map:Copy").setAttribute("disabled", "false");
|
|
return currentElement[0];
|
|
}
|
|
else{
|
|
document.getElementById("Map:Cut").setAttribute("disabled", "true");
|
|
document.getElementById("Map:Copy").setAttribute("disabled", "true");
|
|
}
|
|
}
|
|
}
|
|
|
|
function deSelectElement(el){
|
|
var len = currentElement.length;
|
|
var j=0;
|
|
for(i=0; i<len; i++){
|
|
dump(j+"\n");
|
|
currentElement[j] = currentElement[i];
|
|
if (currentElement[i] != el)
|
|
j++;
|
|
}
|
|
currentElement.pop();
|
|
if (currentElement.length == 1){
|
|
selectElement(currentElement[0]);
|
|
}
|
|
if (currentElement.length >= 1){
|
|
document.getElementById("Map:Cut").setAttribute("disabled", "false");
|
|
document.getElementById("Map:Copy").setAttribute("disabled", "false");
|
|
}
|
|
else{
|
|
document.getElementById("Map:Cut").setAttribute("disabled", "true");
|
|
document.getElementById("Map:Copy").setAttribute("disabled", "true");
|
|
}
|
|
}
|
|
|
|
function marqueeSelect(){
|
|
marTop = parseInt(marquee.style.top);
|
|
marLeft = parseInt(marquee.style.left);
|
|
marRight = parseInt(marquee.style.width)+marLeft;
|
|
marBottom = parseInt(marquee.style.height)+marTop;
|
|
marquee.style.visibility = "hidden";
|
|
marquee.style.top = "-5px";
|
|
marquee.style.left = "-5px";
|
|
marquee.style.width = "1px";
|
|
marquee.style.height = "1px";
|
|
marquee = null;
|
|
objList = frameDoc.getElementsByName("hotspot");
|
|
listLen = objList.length;
|
|
var objCount = 0;
|
|
for(a=0; a<listLen; a++){
|
|
objTop = parseInt(objList[a].style.top);
|
|
objLeft = parseInt(objList[a].style.left);
|
|
objRight = parseInt(objList[a].style.width)+objLeft;
|
|
objBottom = parseInt(objList[a].style.height)+objTop;
|
|
if ((objTop >= marTop) && (objLeft >= marLeft) && (objBottom <= marBottom) && (objRight <= marRight)){
|
|
//objList[i].style.borderColor = "#ffff00";
|
|
selectElement(objList[a], objCount);
|
|
objCount++;
|
|
}
|
|
}
|
|
}
|
|
|
|
function upMouse(event){
|
|
if (currentTool != "poly"){
|
|
if (marquee){
|
|
marqueeSelect();
|
|
}
|
|
if (currentRect){
|
|
if (!resize)
|
|
hotSpotProps(currentRect);
|
|
else
|
|
resize = false;
|
|
}
|
|
else if (currentCir){
|
|
if (!resize)
|
|
hotSpotProps(currentCir);
|
|
else
|
|
resize = false;
|
|
}
|
|
else if (currentPoint)
|
|
polyFinish(null, true);
|
|
|
|
currentRect = null;
|
|
currentCir = null;
|
|
currentPoint=null;
|
|
downTool = false;
|
|
dragActive = false;
|
|
dragObject = false;
|
|
xlock = false;
|
|
ylock = false;
|
|
}
|
|
}
|
|
|
|
function moveMouse(event){
|
|
if (downTool){
|
|
endX = event.clientX+window.frames[0].pageXOffset;
|
|
endY = event.clientY+window.frames[0].pageYOffset;
|
|
|
|
if (dragActive){
|
|
if (currentElement.length > 0){
|
|
if (currentCir){
|
|
radiusWidth = Math.abs((endX-startX));
|
|
radiusHeight = Math.abs((endY-startY));
|
|
circleRadius = Math.max(radiusWidth, radiusHeight);
|
|
currentCir.style.top = Math.max(startY-circleRadius, 0)+"px";
|
|
currentCir.style.left = Math.max(startX-circleRadius, 0)+"px";
|
|
currentCir.style.width = (circleRadius*2)+"px";
|
|
currentCir.style.height = (circleRadius*2)+"px";
|
|
}
|
|
else if (currentRect || marquee){
|
|
var rectObject = (currentRect)? currentRect : marquee;
|
|
if (!xlock){
|
|
if (endX > startX){
|
|
rectWidth = endX-startX;
|
|
rectObject.style.left = Math.max(startX, 0 )+"px";
|
|
rectObject.style.width = rectWidth+"px";
|
|
}
|
|
else{
|
|
rectWidth = startX-endX;
|
|
rectObject.style.left = Math.max(endX, 0)+"px";
|
|
rectObject.style.width = rectWidth+"px";
|
|
}
|
|
}
|
|
if (!ylock){
|
|
if (endY > startY){
|
|
rectHeight = endY-startY;
|
|
rectObject.style.top = startY+"px";
|
|
rectObject.style.height = rectHeight+"px";
|
|
}
|
|
else{
|
|
rectHeight = startY-endY;
|
|
rectObject.style.top = endY+"px";
|
|
rectObject.style.height = rectHeight+"px";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else{
|
|
if (currentTool == "rect"){
|
|
if ((((endX-startX) > 1) || ((endX-startX) < -1)) && (((endY-startY) > 1) || ((endY-startY) < -1))){
|
|
Rect();
|
|
dragActive = true;
|
|
}
|
|
}
|
|
if (currentTool == "cir"){
|
|
if ((((endX-startX) > 1) || ((endX-startX) < -1)) && (((endY-startY) > 1) || ((endY-startY) < -1))){
|
|
Circle();
|
|
dragActive = true;
|
|
}
|
|
}
|
|
if (currentTool == "pointer"){
|
|
if (dragObject){
|
|
var len = currentElement.length;
|
|
var maxX = false;
|
|
var maxY = false;
|
|
for(i=0; i<len; i++){
|
|
newX = Math.max(0, (endX-currentElement[i].startX));
|
|
newY = Math.max(0, (endY-currentElement[i].startY));
|
|
if (newX == 0)
|
|
maxX = true;
|
|
if (newY == 0)
|
|
maxY = true;
|
|
}
|
|
for(i=0; i<len; i++){
|
|
newX = Math.max(0, (endX-currentElement[i].startX));
|
|
newY = Math.max(0, (endY-currentElement[i].startY));
|
|
if ((newX > 0) && (maxX != true))
|
|
currentElement[i].style.left = newX+"px";
|
|
if ((newY >0) && (maxY != true))
|
|
currentElement[i].style.top = newY+"px";
|
|
}
|
|
}
|
|
else if (currentPoint){
|
|
endX = endX-parseInt(currentPoint.parentNode.style.left);
|
|
endY = endY-parseInt(currentPoint.parentNode.style.top);
|
|
newX = Math.max((0-parseInt(currentPoint.parentNode.style.left)), (endX-currentPoint.startX));
|
|
newY = Math.max((0-parseInt(currentPoint.parentNode.style.top)), (endY-currentPoint.startY));
|
|
currentPoint.style.left = newX+"px";
|
|
currentPoint.style.top = newY+"px";
|
|
}
|
|
else{
|
|
marquee = frameDoc.getElementById("marquee");
|
|
marquee.style.visibility = "visible";
|
|
dragActive = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
function downMouse(event){
|
|
dump(event.target.parentNode.id+"\n");
|
|
if (event.button == 0){
|
|
if (currentTool != "poly"){
|
|
startX = event.clientX+window.frames[0].pageXOffset;
|
|
startY = event.clientY+window.frames[0].pageYOffset;
|
|
downTool = true;
|
|
if (currentTool == "pointer"){
|
|
if (event.target.getAttribute("name") == "hotspot"){
|
|
var el = event.target;
|
|
var isSelected = false;
|
|
|
|
if (event.target.getAttribute("cir") == "true")
|
|
el = event.target.parentNode;
|
|
|
|
if (event.shiftKey){
|
|
var len = currentElement.length;
|
|
var deselect = false;
|
|
for(i=0; i<len; i++){
|
|
if (currentElement[i] == el){
|
|
deSelectElement(el);
|
|
return;
|
|
}
|
|
}
|
|
selectElement(el, true);
|
|
isSelected = true;
|
|
}
|
|
else{
|
|
var len = currentElement.length;
|
|
for(i=0; i<len; i++){
|
|
if (currentElement[i] == el)
|
|
isSelected = true;
|
|
}
|
|
}
|
|
|
|
if (isSelected){
|
|
var len = currentElement.length;
|
|
for(i=0; i<len; i++){
|
|
currentElement[i].startX = parseInt(event.clientX+window.frames[0].pageXOffset)-parseInt(currentElement[i].style.left);
|
|
currentElement[i].startY = parseInt(event.clientY+window.frames[0].pageYOffset)-parseInt(currentElement[i].style.top);
|
|
}
|
|
}
|
|
else{
|
|
curObj = selectElement(el);
|
|
curObj.startX = parseInt(event.clientX+window.frames[0].pageXOffset)-parseInt(curObj.style.left);
|
|
curObj.startY = parseInt(event.clientY+window.frames[0].pageYOffset)-parseInt(curObj.style.top);
|
|
}
|
|
dragObject = true;
|
|
}
|
|
else if (event.target.getAttribute("name") == "handle"){
|
|
dump("down on a handle\n");
|
|
resize = true;
|
|
el = event.target;
|
|
curObj = selectElement(el.parentNode);
|
|
if (curObj.className == "rect"){
|
|
currentRect = curObj;
|
|
switch (el.className){
|
|
case "handletl":
|
|
startX = parseInt(curObj.style.left)+parseInt(curObj.style.width);
|
|
startY = parseInt(curObj.style.top)+parseInt(curObj.style.height);
|
|
break;
|
|
case "handletr":
|
|
startX = parseInt(curObj.style.left);
|
|
startY = parseInt(curObj.style.top)+parseInt(curObj.style.height);
|
|
break;
|
|
case "handlebl":
|
|
startX = parseInt(curObj.style.left)+parseInt(curObj.style.width);
|
|
startY = parseInt(curObj.style.top);
|
|
break;
|
|
case "handlebr":
|
|
startX = parseInt(curObj.style.left);
|
|
startY = parseInt(curObj.style.top);
|
|
break;
|
|
case "handlet":
|
|
xlock = true;
|
|
startY = parseInt(curObj.style.top)+parseInt(curObj.style.height);
|
|
break;
|
|
case "handleb":
|
|
xlock = true;
|
|
startY = parseInt(curObj.style.top);
|
|
break;
|
|
case "handlel":
|
|
ylock = true;
|
|
startX = parseInt(curObj.style.left)+parseInt(curObj.style.width);
|
|
break;
|
|
case "handler":
|
|
ylock = true;
|
|
startX = parseInt(curObj.style.left);
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
}
|
|
else{
|
|
currentCir = curObj;
|
|
startX = parseInt(curObj.style.left)+(parseInt(curObj.style.width)/2);
|
|
startY = parseInt(curObj.style.top)+(parseInt(curObj.style.height)/2);
|
|
}
|
|
}
|
|
else if (event.target.getAttribute("class") == "point"){
|
|
dump("down on a point\n");
|
|
selectElement(event.target.parentNode);
|
|
currentPoint = event.target;
|
|
currentPoint.startX = parseInt(event.clientX+window.frames[0].pageXOffset)-(parseInt(currentPoint.style.left)+parseInt(currentPoint.parentNode.style.left));
|
|
currentPoint.startY = parseInt(event.clientY+window.frames[0].pageYOffset)-(parseInt(currentPoint.style.top)+parseInt(currentPoint.parentNode.style.top));
|
|
currentPoly = currentPoint.parentNode;
|
|
}
|
|
else{
|
|
dump(event.target+"\n");
|
|
selectElement(null);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function clickMouse(event){
|
|
if (event.button == 0){
|
|
dump("body clicked\n");
|
|
//alert(frameDoc.+'\n');
|
|
startX = event.clientX+window.frames[0].pageXOffset;
|
|
startY = event.clientY+window.frames[0].pageYOffset;
|
|
if (currentTool == "poly"){
|
|
if (event.target != currentPoly){
|
|
if (currentPoly != null){
|
|
if (event.target == currentPoly.childNodes[0]){
|
|
polyFinish();
|
|
}
|
|
else if (event.detail == 2){
|
|
polyFinish();
|
|
}
|
|
}
|
|
else{
|
|
Poly();
|
|
}
|
|
}
|
|
else{
|
|
addPoint(event);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function changeTool(event, what){
|
|
if (!currentPoly){
|
|
for(i=0; i<4; i++){
|
|
buttonArray[i].setAttribute("toggled", 0);
|
|
if (event.target == buttonArray[i]){
|
|
buttonArray[i].setAttribute("toggled", 1);
|
|
}
|
|
}
|
|
currentTool = what;
|
|
if (currentTool != "pointer"){
|
|
frameDoc.getElementById("bgDiv").style.cursor = "crosshair";
|
|
frameDoc.body.style.cursor = "crosshair";
|
|
}
|
|
else{
|
|
frameDoc.getElementById("bgDiv").style.cursor = "default";
|
|
frameDoc.body.style.cursor = "default";
|
|
}
|
|
|
|
dump(what+" selected\n");
|
|
}
|
|
else {
|
|
for(i=0; i<4; i++){
|
|
if (event.target == buttonArray[i]){
|
|
buttonArray[i].setAttribute("toggled", 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function zoom(direction, ratio){
|
|
dump('zoom called; ratio='+ratio+'\n');
|
|
if (direction == "in")
|
|
ratio = currentZoom*2;
|
|
else if (direction == "out")
|
|
ratio = currentZoom/2;
|
|
|
|
if (ratio > 4 || ratio < 1 || ratio == currentZoom)
|
|
return;
|
|
|
|
if (ratio == 1){
|
|
document.getElementById('Map:ZoomIn').setAttribute('disabled', 'false');
|
|
document.getElementById('Map:ZoomOut').setAttribute('disabled', 'true');
|
|
document.getElementById('Map:Apercent').setAttribute('checked', 'true');
|
|
document.getElementById('Map:Bpercent').setAttribute('checked', 'false');
|
|
document.getElementById('Map:Cpercent').setAttribute('checked', 'false');
|
|
}
|
|
else if (ratio == 4){
|
|
document.getElementById('Map:ZoomIn').setAttribute('disabled', 'true');
|
|
document.getElementById('Map:ZoomOut').setAttribute('disabled', 'false');
|
|
document.getElementById('Map:Apercent').setAttribute('checked', 'false');
|
|
document.getElementById('Map:Bpercent').setAttribute('checked', 'false');
|
|
document.getElementById('Map:Cpercent').setAttribute('checked', 'true');
|
|
}
|
|
else {
|
|
document.getElementById('Map:ZoomIn').setAttribute('disabled', 'false');
|
|
document.getElementById('Map:ZoomOut').setAttribute('disabled', 'false');
|
|
document.getElementById('Map:Apercent').setAttribute('checked', 'false');
|
|
document.getElementById('Map:Bpercent').setAttribute('checked', 'true');
|
|
document.getElementById('Map:Cpercent').setAttribute('checked', 'false');
|
|
}
|
|
|
|
objList = frameDoc.getElementsByName("hotspot");
|
|
len = objList.length;
|
|
for(i=0; i<len; i++){
|
|
if (ratio > currentZoom){
|
|
objList[i].style.width = (parseInt(objList[i].style.width)*(ratio/currentZoom))+"px";
|
|
objList[i].style.height = (parseInt(objList[i].style.height)*(ratio/currentZoom))+"px";
|
|
objList[i].style.top = (parseInt(objList[i].style.top)*(ratio/currentZoom))+"px";
|
|
objList[i].style.left = (parseInt(objList[i].style.left)*(ratio/currentZoom))+"px";
|
|
}
|
|
else{
|
|
objList[i].style.width = (parseInt(objList[i].style.width)/(currentZoom/ratio))+"px";
|
|
objList[i].style.height = (parseInt(objList[i].style.height)/(currentZoom/ratio))+"px";
|
|
objList[i].style.top = (parseInt(objList[i].style.top)/(currentZoom/ratio))+"px";
|
|
objList[i].style.left = (parseInt(objList[i].style.left)/(currentZoom/ratio))+"px";
|
|
}
|
|
if (objList[i].getAttribute("class") == "poly"){
|
|
pointList = objList[i].childNodes;
|
|
plen = pointList.length;
|
|
dump('i='+i+'\n');
|
|
for(j=0; j<plen; j++){
|
|
dump('i='+i+'\n');
|
|
if (ratio > currentZoom){
|
|
pointList[j].style.top = (parseInt(pointList[j].style.top)*(ratio/currentZoom))+"px";
|
|
pointList[j].style.left = (parseInt(pointList[j].style.left)*(ratio/currentZoom))+"px";
|
|
}
|
|
else{
|
|
pointList[j].style.top = (parseInt(pointList[j].style.top)/(currentZoom/ratio))+"px";
|
|
pointList[j].style.left = (parseInt(pointList[j].style.left)/(currentZoom/ratio))+"px";
|
|
}
|
|
}
|
|
currentPoly = objList[i];
|
|
polyFinish(null, true);
|
|
currentPoly = null;
|
|
}
|
|
dump('i='+i+'\n');
|
|
}
|
|
|
|
imgEl = frameDoc.getElementById("mainImg");
|
|
bgDiv = frameDoc.getElementById("bgDiv");
|
|
dump(imgEl.getAttribute("width")+'\n');
|
|
if (ratio > currentZoom){
|
|
imgEl.setAttribute("width", (parseInt(imgEl.offsetWidth)*(ratio/currentZoom)));
|
|
imgEl.setAttribute("height", (parseInt(imgEl.offsetHeight)*(ratio/currentZoom)));
|
|
bgDiv.style.width = imgEl.offsetWidth;
|
|
bgDiv.style.height = imgEl.offsetHeight;
|
|
}
|
|
else{
|
|
imgEl.setAttribute("width", (parseInt(imgEl.offsetWidth)/(currentZoom/ratio)));
|
|
imgEl.setAttribute("height", (parseInt(imgEl.offsetHeight)/(currentZoom/ratio)));
|
|
bgDiv.style.width = imgEl.offsetWidth;
|
|
bgDiv.style.height = imgEl.offsetHeight;
|
|
}
|
|
currentZoom = ratio;
|
|
}
|
|
|
|
function cutCopy(cut){
|
|
len = currentElement.length;
|
|
if (len >= 1){
|
|
clipBoard = [];
|
|
for (i=0; i<len; i++){
|
|
el = currentElement[i];
|
|
if (el.className == 'rect'){
|
|
coords = parseInt(el.style.left)+","+parseInt(el.style.top)+","+(parseInt(el.style.left)+parseInt(el.style.width))+","+(parseInt(el.style.top)+parseInt(el.style.height));
|
|
href = el.getAttribute('hsHref');
|
|
target = el.getAttribute('hsTarget');
|
|
alt = el.getAttribute('hsAlt');
|
|
clipBoard[i] = 'Rect(\"'+coords+'\", \"'+href+'\", \"'+target+'\", \"'+alt+'\", true)';
|
|
}
|
|
else if (el.className == 'cir'){
|
|
radius = Math.floor(parseInt(el.style.width)/2);
|
|
coords = (parseInt(el.style.left)+radius)+","+(parseInt(el.style.top)+radius)+","+radius;
|
|
href = el.getAttribute('href');
|
|
target = el.getAttribute('hsTarget');
|
|
alt = el.getAttribute('hsAlt');
|
|
clipBoard[i] = 'Circle(\"'+coords+'\", \"'+href+'\", \"'+target+'\", \"'+alt+'\", true)';
|
|
}
|
|
else{
|
|
var coords = '';
|
|
var pointlen = el.childNodes.length;
|
|
for(j=0; j<pointlen; j++){
|
|
coords += (parseInt(el.style.left)+parseInt(el.childNodes[j].style.left))+","+(parseInt(el.style.top)+parseInt(el.childNodes[j].style.top))+",";
|
|
}
|
|
coords = coords.substring(0, (coords.length-1));
|
|
href = el.getAttribute('href');
|
|
target = el.getAttribute('hsTarget');
|
|
alt = el.getAttribute('hsAlt');
|
|
clipBoard[i] = 'Poly(\"'+coords+'\", \"'+href+'\", \"'+target+'\", \"'+alt+'\", true)';
|
|
}
|
|
if (cut){
|
|
deleteElement(el);
|
|
}
|
|
}
|
|
document.getElementById('Map:Paste').setAttribute('disabled', 'false');
|
|
}
|
|
}
|
|
|
|
function paste(){
|
|
len = clipBoard.length;
|
|
func = '';
|
|
for (i=0; i<len; i++){
|
|
func += clipBoard[i]+'\;';
|
|
}
|
|
eval(func);
|
|
}
|
|
|
|
function nudge(event, dir){
|
|
/*prevent scrolling
|
|
event.stopPropagation();
|
|
event.preventDefault();*/
|
|
|
|
len = currentElement.length;
|
|
amount = 1;
|
|
if (event.shiftKey)
|
|
amount = 5;
|
|
|
|
|
|
boundRectTop = 1000000;
|
|
boundRectLeft = 1000000;
|
|
for (i=0; i<len; i++){
|
|
curTop = parseInt(currentElement[i].style.top);
|
|
curLeft = parseInt(currentElement[i].style.left);
|
|
if (curTop < boundRectTop)
|
|
boundRectTop = curTop;
|
|
if (curLeft < boundRectLeft)
|
|
boundRectLeft = curLeft;
|
|
}
|
|
|
|
for (i=0; i<len; i++){
|
|
if (dir == "up"){
|
|
curTop = parseInt(currentElement[i].style.top);
|
|
if (boundRectTop >= amount)
|
|
currentElement[i].style.top = (curTop-amount) + "px";
|
|
else
|
|
currentElement[i].style.top = (curTop-boundRectTop) + "px";
|
|
}
|
|
else if (dir == "left"){
|
|
curLeft = parseInt(currentElement[i].style.left);
|
|
if (boundRectLeft >= amount)
|
|
currentElement[i].style.left = (curLeft-amount) + "px";
|
|
else
|
|
currentElement[i].style.left = (curLeft-boundRectLeft) + "px";
|
|
}
|
|
else if (dir == "down"){
|
|
curTop = parseInt(currentElement[i].style.top);
|
|
currentElement[i].style.top = (curTop+amount) + "px";
|
|
}
|
|
else if (dir == "right"){
|
|
curLeft = parseInt(currentElement[i].style.left);
|
|
currentElement[i].style.left = (curLeft+amount) + "px";
|
|
}
|
|
}
|
|
}
|
|
|