/* ###########################################################

   Collision Detection

 * ########################################################### */
 
function handleCollisionBetweenInlays (inlay1,inlay2){

   var widthFieldInlay1 = inlay1 + "Width";
   var widthFieldInlay2 = inlay2 + "Width";   

   var offsetFieldInlay1 = inlay1 + "Offset";
   var offsetFieldInlay2 = inlay2 + "Offset";

   var tab1 = "options-" + inlay1;
   var tab2 = "options-" + inlay2;

   var currentTab = getFieldValue('UI_goForm','currentTab');

   var widthFieldInlay1Obj = document.forms["inlayForm"].elements[widthFieldInlay1];
   var widthFieldInlay2Obj = document.forms["inlayForm"].elements[widthFieldInlay2];

   var offsetFieldInlay1Obj = document.forms["inlayForm"].elements[offsetFieldInlay1];
   var offsetFieldInlay2Obj = document.forms["inlayForm"].elements[offsetFieldInlay2];

   inlay1 = getRawObject(inlay1);
   inlay2 = getRawObject(inlay2);

   if (layerIsVisible(inlay1) && 
       layerIsVisible(inlay2) && 
       detectCol(inlay1,inlay2) && 
       detectCol(inlay2,inlay1)) {

      // Reduce the offset of inlay1 (if possible)
      if ((offsetFieldInlay1Obj) && (offsetFieldInlay1Obj.selectedIndex != 0)) {
         decDropdown("inlayForm",offsetFieldInlay1);
         info(20,"An inlay offset has been modifed to ensure that inlays do not overlap.");
         redraw();
         sayMessage("INLAY_OFFSET_REDUCED",Array(inlay1,"right",5));

      // Reduce the offset of inlay2 (if possible)
      } else if ((offsetFieldInlay2Obj) && (offsetFieldInlay2Obj.selectedIndex != 0)) {
         decDropdown("inlayForm",offsetFieldInlay2);
         info(20,"An inlay offset has been modifed to ensure that inlays do not overlap.");
         redraw();
         sayMessage("INLAY_OFFSET_REDUCED",Array(inlay1,"right",5));
         
      // Reduce the width of inlay1 (if possible)
      } else if (widthFieldInlay1Obj.selectedIndex != 0) {
         decDropdown("inlayForm",widthFieldInlay1);
         info(20,"An inlay width has been reduced to fit this ring width.");
         redraw();
         sayMessage("INLAY_WIDTH_REDUCED",Array(inlay1,"right",5));
         
      // Reduce the width of inlay2 (if possible)
      } else if (widthFieldInlay2Obj.selectedIndex != 0) {
         decDropdown("inlayForm",widthFieldInlay2);
         info(20,"An inlay width has been reduced to fit this ring width.");
         redraw();
         sayMessage("INLAY_WIDTH_REDUCED",Array(inlay1,"right",5));
      
      } else {
         // If we get here then we have a collision and we are at the smallest possible inlay widths.
         // Hence, we need to increase the ring width to see if we can fit in the desired layers
         if (goForm.ringWidth.selectedIndex != goForm.ringWidth.length) {
            incDropdown("goForm","ringWidth");
            info(20,"The ring has been made wider to accommodate your selected inlays.");
            redraw();
            sayMessage("RING_WIDTH_INCREASED",Array(inlay1,"right",5));
         } 
         
      }
      
   }

}

function handleCollisionBetweenInlaysAndEdges (inlay, edge) {

   var debug = 0;

   var formFieldInlay = inlay + "Width";
   var formFieldInlayObj = document.forms["inlayForm"].elements[formFieldInlay];

   var inlay = getRawObject(inlay);
   var edge  = getRawObject(edge);

   if (layerIsVisible(inlay) && layerIsVisible(edge) && detectCol(inlay,edge) && detectCol(edge,inlay)) {

      if (formFieldInlayObj.selectedIndex != 0) {
         decDropdown("inlayForm",formFieldInlay);
         redraw();
      } else {
         // If we get here then we have a collision and we are at the smallest possible inlay widths.
         // Hence, we need to increase the ring width to see if we can fit in the desired layers
         if (goForm.ringWidth.selectedIndex != goForm.ringWidth.length) {
            incDropdown("goForm","ringWidth");
            redraw();
         }
      }

   }

}


function detectCol(layer1,layer2) {

   var X1 = getObjectLeft(layer1);
   var Y1 = getObjectTop(layer1);
   var X2 = getObjectLeft(layer2);
   var Y2 = getObjectTop(layer2);

   W1 = getObjectWidth(layer1);
   W2 = getObjectWidth(layer2);
   H1 = getObjectHeight(layer1);
   H2 = getObjectHeight(layer2);

   // Must keep this overlap logic in here (inlays don't detect collisions otherwise)
/*   WILD : I have commented this section out. HOPEFULLY we do not need it!
     IF we have some collision detection problems then we should add it back in

     
   hOverlap=getObjectWidth(layer1)-Math.abs(X2-X1);
   vOverlap=getObjectHeight(layer1)-Math.abs(Y2-Y1);
   hOverlap = (hOverlap==0) ? 1 : hOverlap;
   vOverlap = (vOverlap==0) ? 1 : vOverlap;
   areaOverlap=((hOverlap>0)&&(vOverlap>0))?hOverlap*vOverlap:0;

   //colcoord.innerHTML = "Overlap: " + areaOverlap + " -- h:" + hOverlap + " v:" + vOverlap + " Layer1 coord:" + X1 + "," + Y1 + " Layer2 coord:" + X2 + "," + Y2 + " layer1 height:" + parseFloat(layer1.style.height) + " layer1 width:" + parseFloat(layer1.style.width);

   if (areaOverlap > 0) return true   
*/

   if ((pointInLayer (layer1,X2,Y1))       && (pointInLayer (layer2,X2,Y1)))       return true;
   if ((pointInLayer (layer1,X2,Y1+W1))    && (pointInLayer (layer2,X2,Y1+W1)))    return true;
   if ((pointInLayer (layer1,X2+W2,Y1))    && (pointInLayer (layer2,X2+W2,Y1)))    return true;
   if ((pointInLayer (layer1,X2+W2,Y1+W1)) && (pointInLayer (layer2,X2+W2,Y1+W1))) return true;

   if ((pointInLayer (layer1,X1,Y2))       && (pointInLayer (layer2,X1,Y2)))       return true;
   if ((pointInLayer (layer1,X1,Y2+W2))    && (pointInLayer (layer2,X1,Y2+W2)))    return true;
   if ((pointInLayer (layer1,X1+W1,Y2))    && (pointInLayer (layer2,X1+W1,Y2)))    return true;
   if ((pointInLayer (layer1,X1+W1,Y2+W2)) && (pointInLayer (layer2,X1+W1,Y2+W2))) return true;

   return false;
     
}

// This is specifically for detecting cols between gemstones ONLY
function detectColSettings(layer1,layer2) {

   var X1 = getObjectLeft(layer1);
   var Y1 = getObjectTop(layer1);
   var X2 = getObjectLeft(layer2);
   var Y2 = getObjectTop(layer2);

   W1 = getObjectWidth(layer1);
   W2 = getObjectWidth(layer2);
   H1 = getObjectHeight(layer1);
   H2 = getObjectHeight(layer2);

   hOverlap=getObjectWidth(layer1)-Math.abs(X2-X1);
   vOverlap=getObjectHeight(layer1)-Math.abs(Y2-Y1);
   hOverlap = (hOverlap==0) ? 1 : hOverlap;
   vOverlap = (vOverlap==0) ? 1 : vOverlap;
   areaOverlap=((hOverlap>0)&&(vOverlap>0))?hOverlap*vOverlap:0;

   //colcoord.innerHTML = "Overlap: " + areaOverlap + " -- h:" + hOverlap + " v:" + vOverlap + " Layer1 coord:" + X1 + "," + Y1 + " Layer2 coord:" + X2 + "," + Y2 + " layer1 height:" + parseFloat(layer1.style.height) + " layer1 width:" + parseFloat(layer1.style.width);

   if (areaOverlap > 0) {
      return true;
   } else {
      return false;
   }
     
}


// Returns true if the x,y point passed in is within the layer passed
function pointInLayer (layer,x,y) {
   var xmin = getObjectLeft(layer);
   var xmax = xmin + getObjectWidth(layer);
   var ymin = getObjectTop(layer);
   var ymax = ymin + getObjectHeight(layer);

   return ((x >= xmin && x <= xmax) && (y >= ymin && y < ymax)) ? true : false;  

   // The follow is the original return function. I (wild) modified it as we could
   // not get layers close enough with it. However, the above appears to work
   // much better!
   //return ((x >= xmin && x <= xmax) && (y >= ymin && y <= ymax)) ? true : false;  

}

