home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 2000 July / macformat-092.iso / Dreamweaver 3 / Configuration / Commands / Rollover.js < prev    next >
Encoding:
Text File  |  1999-12-01  |  9.3 KB  |  307 lines

  1. //
  2. // Copyright 1998 Macromedia, Inc. All rights reserved. 
  3. // ----------------------------------------------------
  4. //
  5. // Rollover.js
  6. //
  7. // Implementation of Rollover Image object
  8. //
  9.  
  10. //********************* GLOBALS **************************
  11.  
  12. var helpDoc = MM.HELP_objRolloverImage;
  13.  
  14. //********************* API **************************
  15.     
  16. function commandButtons()
  17. {
  18.    return new Array( BTN_OK,     "setRolloverTag()" 
  19.                    , BTN_Cancel, "cancelRolloverTag()"
  20.                    , BTN_Help,   "displayHelp()");
  21. }
  22.  
  23.  
  24. //**************** LOCAL FUNCTIONS *******************
  25.  
  26. // initializeUI()
  27. //
  28. // Called from rollover body onload
  29. //
  30. function initializeUI()
  31. {
  32.   document.rolloverForm.tbImageName.value = getUniqueImgName();
  33.   document.rolloverForm.tbImageName.focus();
  34.   document.rolloverForm.tbImageName.select();
  35. }
  36.  
  37.  
  38. function setRolloverTag() {
  39.    with( document.rolloverForm ) {
  40.       // Validate that we at least have an original 
  41.       // and a rollover image
  42.       //
  43.       if ( tbRolloverImage.value == "" ||
  44.            tbOriginalImage.value == "" )
  45.       {           
  46.          alert( MSG_NoImagesToInsert );
  47.          return;
  48.       }
  49.  
  50.       // We require a unique image name; the form was initialized 
  51.       // with one; if the user has deleted it or has chosen a non
  52.       // unique name, warn and regenerate one
  53.       //      
  54.       if ( tbImageName.value == "" )
  55.       {
  56.          alert( MSG_NoImageName );
  57.          tbImageName.value = getUniqueImgName();
  58.          return;      
  59.       }
  60.       else
  61.       if ( !validateUniqueImgName( tbImageName.value ) )
  62.       {
  63.          alert( MM_format( MSG_NameNotUnique, tbImageName.value ) );
  64.          tbImageName.value = getUniqueImgName();
  65.          return;      
  66.       }
  67.  
  68.       // Build an image tag with a unique name for the original image
  69.       //
  70.       var imgTagFmt     = "<img name=\"%s\" border=\"0\" src=\"%s\">";
  71.       var imgName       = tbImageName.value;
  72.       var imgTag        = MM_format( imgTagFmt
  73.                                    , imgName
  74.                                    , dw.doURLEncoding( tbOriginalImage.value ) );
  75.                                    
  76.       // Quote note: the final behavior string will be applied
  77.       // by swap image applyBehavior(), which will escape URLs
  78.       // and escape-quote references.  The string we generate 
  79.       // here is passed directly to inspectBehavior(), and our
  80.       // image references must match the image references as it
  81.       // loads them in it's initializeUI.  We don't need to escape
  82.       // all quotes here to make this match, but we do on imgName
  83.       // as *unbalanced* single quotes will throw off getTokens()
  84.       // which is used by inspectBehavior() to parse this argument
  85.       // string.
  86.       //                                   
  87.  
  88.       //For DW3, we simplified calls to MM_swapImage(), just pass simple name
  89.       //var nsImageRef    = getFullImgRef( "NS 4.0", imgName );
  90.       //var ieImageRef    = getFullImgRef( "IE 4.0", imgName );
  91.  
  92.       var nsImageRef    = imgName;
  93.       var ieImageRef    = "";
  94.       
  95.       // Now build the wrapper anchor tag with the swap image
  96.       // event handlers around this image to return
  97.       //
  98.       var anchorTagFmt    = "<a href=\"%s\" onMouseOut=\"%s\" onMouseOver=\"%s\">%s</a>";
  99.       var gotoURL         = (tbURL.value == "")? "#" : dw.doURLEncoding( tbURL.value );
  100.       var swapImageFnCall = null;
  101.  
  102.       // Note that a preload flag of 1
  103.       // tells inspectBehavior() to install the proper
  104.       // preload call in the documents onload handler
  105.       //
  106.       var swapImageFmt = "MM_swapImage('%s','%s','%s',%s)";
  107.       var preloadFlag = ( cbPreloadImages.checked )? "1" : "0";
  108.       swapImageFnCall  = MM_format( swapImageFmt
  109.                                   , nsImageRef
  110.                                   , ieImageRef
  111.                                   , dw.doURLEncoding( tbRolloverImage.value )
  112.                                   , preloadFlag );
  113.       
  114.       MM.commandReturnValue = MM_format( anchorTagFmt
  115.                              , gotoURL
  116.                              , "MM_swapImgRestore()"
  117.                              , swapImageFnCall
  118.                              , imgTag );
  119.       window.close();                             
  120.    }
  121. }
  122.  
  123. function cancelRolloverTag()
  124. {
  125.    MM.commandReturnValue = "";
  126.    window.close()
  127. }
  128.  
  129. //
  130. // --------- Local Rollover functions ---------
  131. //
  132.  
  133. // getFullImgRef()
  134. //
  135. // Return a full object name reference for the given 
  136. // image name in the given browser.  The object name
  137. // returned must match the object names for images
  138. // expected by the swap image behavior
  139. //
  140. function getFullImgRef( browser, imgName )
  141. {
  142.    var framePrefix = "";
  143.    var objectName  = "document." + escQuotes( imgName ); // see quote note
  144.  
  145.    // Always use a frame prefix even when image is in current
  146.    // frame to match swap image behavior naming expectations   
  147.    //
  148.    var frameset = dreamweaver.getDocumentDOM( "parent" );
  149.    if ( frameset )
  150.    {
  151.       var i;
  152.       var current = dreamweaver.getDocumentDOM( "document" );                
  153.       var frames  = frameset.getElementsByTagName( "frame" );
  154.       for( i = 0; i < frames.length; i++ )
  155.       {
  156.          if ( current == dreamweaver.getDocumentDOM( "parent.frames[" + i + "]" ) )
  157.          {
  158.             var frameName = frames[i].getAttribute( "name" );
  159.             if ( !frameName )
  160.                framePrefix = "parent.frames[" + i + "].";
  161.             else
  162.                framePrefix = "parent.frames['" + frameName + "'].";
  163.                
  164.             break;                  
  165.          }
  166.       }
  167.    }
  168.    
  169.    // Netscape considers layers in its hierarchical
  170.    // containment/naming -- build an encompassing
  171.    // layer refs string if any around our insertion 
  172.    // point for the image
  173.    //   
  174.    if ( browser.indexOf( "NS" ) != -1 )
  175.    {
  176.       var selArr     = dreamweaver.getSelection();
  177.       var root       = dreamweaver.getDocumentDOM( "document" );
  178.       var layerRefs  = new Array();
  179.       
  180.       buildNSLayerRefs( root.layers, selArr[1], layerRefs );
  181.       
  182.       if ( layerRefs.length > 0 )
  183.          return( framePrefix + layerRefs.join(".") + "." + objectName );
  184.    }
  185.    
  186.    // else IE reference, or no NS layers
  187.    return( framePrefix + objectName );
  188. }
  189.  
  190. // buildNSLayerRefs()
  191. //
  192. // Given a dreamweaver document.layers array
  193. // and an insertion point offset, recurse 
  194. // encompassing layers, pushing layer references
  195. // along the way into the given array
  196. //
  197. function buildNSLayerRefs( layers, ip, layerRefs )
  198. {
  199.    var layerOffsets;
  200.    
  201.    for( var i = 0; i < layers.length; i++ )
  202.    {
  203.       layerOffsets = dreamweaver.nodeToOffsets( layers[i] );
  204.       
  205.       // ips on boundaries are not within scope of tag
  206.       if ( (ip > layerOffsets[0]) && (ip < layerOffsets[1]) )
  207.       {                                                      
  208.          // Push this layer reference; prefer ID to NAME to index
  209.          var layerRef;
  210.          var layerName = layers[i].getAttribute( "id" );
  211.          
  212.          if ( !layerName )
  213.             layerName = layers[i].getAttribute( "name" );
  214.             
  215.          if ( layerName )
  216.             layerRef = "document.layers['" + layerName + "']";
  217.          else
  218.             layerRef = "document.layers[" + i + "]";
  219.          
  220.          layerRefs.push( layerRef );
  221.  
  222.          // Dive into this layer's layers if there are any         
  223.          if ( layers[i].document.layers )
  224.             buildNSLayerRefs( layers[i].document.layers, ip, layerRefs );
  225.             
  226.          break;               
  227.       }
  228.    }
  229. }
  230.  
  231. // getUniqueImgName()
  232. //
  233. // This guy returns a unique image name that
  234. // doesn't exist as yet in the user's document.
  235. // 
  236. function getUniqueImgName()
  237. {
  238.    var frameset      = dreamweaver.getDocumentDOM( "parent" );
  239.    var existingImgs  = new Array();
  240.    var i;
  241.    
  242.    if ( frameset )
  243.    {
  244.       var nFrames = frameset.getElementsByTagName( "frame" ).length;
  245.       for( i = 0; i < nFrames; i++ )
  246.          existingImgs = existingImgs.concat( dreamweaver.getDocumentDOM( "parent.frames[" + i + "]" ).getElementsByTagName( "IMG" ) );
  247.    }
  248.    else
  249.    {
  250.       existingImgs = dreamweaver.getDocumentDOM( "document" ).getElementsByTagName( "IMG" );
  251.    }
  252.    
  253.    var   namePrefix = "Image";
  254.    var   nameIdx    = existingImgs.length + 1;
  255.    var   imgName    = namePrefix + nameIdx++;
  256.    var   bExists    = false;
  257.    
  258.    while( true )
  259.    {
  260.       bExists = false;
  261.       for( i = 0; i < existingImgs.length; i++ )
  262.       {
  263.          if ( existingImgs[i].getAttribute( "name" ) == imgName )
  264.          {
  265.             bExists = true;
  266.             break;
  267.          }
  268.       }
  269.       
  270.       if ( !bExists )
  271.          break;
  272.       
  273.       imgName = namePrefix + nameIdx++;
  274.    }
  275.  
  276.    return imgName;
  277. }
  278.  
  279. // validateUniqueImgName()
  280. //
  281. // Given an image name, return true if it is unique, 
  282. // false otherwise
  283. //
  284. function validateUniqueImgName( imgName )
  285. {
  286.    var frameset      = dreamweaver.getDocumentDOM( "parent" );
  287.    var existingImgs  = new Array();
  288.    var i;
  289.    
  290.    if ( frameset )
  291.    {
  292.       var nFrames = frameset.getElementsByTagName( "frame" ).length;
  293.       for( i = 0; i < nFrames; i++ )
  294.          existingImgs = existingImgs.concat( dreamweaver.getDocumentDOM( "parent.frames[" + i + "]" ).getElementsByTagName( "IMG" ) );
  295.    }
  296.    else
  297.    {
  298.       existingImgs = dreamweaver.getDocumentDOM( "document" ).getElementsByTagName( "IMG" );
  299.    }
  300.    
  301.    for( i = 0; i < existingImgs.length; i++ )
  302.       if ( existingImgs[i].getAttribute( "name" ) == imgName )
  303.          return( false ); // name is not unique
  304.       
  305.    return( true );
  306. }
  307.