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