/*
  -- AOL Standard Feed Subscribe Widget --
  Public vars:    version, Text, Readers
  Public methods: setText(), setReaders(), setAlertLink(), show(), showBlog()
  Author: Miodrag Kekic (mkekic0993@aol.com)

  Credits:
    Position object is based on Yahoo UILib YAHOO.util.Dom version 0.11.1
    Copyright (c) 2006, Yahoo! Inc. All rights reserved.
    License: http://developer.yahoo.net/yui/license.txt
*/

aol_feeds_subscribe = { version: "1.1e" };

// Text for the widget provided for reference 
aol_feeds_subscribe.Text = {
   close    : "Close", 
   text_0   : "Subscribe Now", 
   text_1   : "With these fine readers:",
   text_2   : "Don't use these readers? Get the feed manually.",
   text_3   : "Copy and paste the appropriate feed into your reader.",
   text_4   : "RSS",
   text_5   : "or",
   text_6   : "Atom",
   text_7   : "Get an Alert for the feed",
   reader_1 : "Subscribe via MyAOL",
   reader_2 : "Subscribe via Bloglines",
   reader_3 : "Subscribe via Goolge Reader",
   reader_4 : "Subscribe via NewsGator",
   reader_5 : "Subscribe via YahooReader",
   reader_6 : "Subscribe via Netvibes"
};

aol_feeds_subscribe.CustomText = null; // custom text - i18n etc.

// Feed Readers' definition
aol_feeds_subscribe.Readers = {
reader_1: {
  url:  'http://feeds.my.aol.com/add.jsp?url=__FEED__',
  img:  'images/feed-icons/myaol_cta1.gif',
  text: 'Subscribe via MyAOL'
  },
reader_2: {
  url:  'http://www.bloglines.com/sub/__FEED__',
  img:  'images/feed-icons/sub_modern5.gif',
  text: 'Subscribe via Bloglines'
  },
reader_3: {
  url:  'http://fusion.google.com/add?feedurl=__FEED__',
  img:  'images/feed-icons/googlereader.gif',
  text: 'Subscribe via Google Reader'
  },
reader_4: {
  url:  'http://www.newsgator.com/ngs/subscriber/subext.aspx?url=__FEED__',
  img:  'images/feed-icons/ngsub1.gif',
  text: 'Subscribe via NewsGator'
  },
reader_5: {
  url:  'http://add.my.yahoo.com/content?url=__FEED__',
  img:  'images/feed-icons/addtomyyahoo4.gif',
  text: 'Subscribe via Yahoo Reader'
  },
reader_6: {
  url:  'http://www.netvibes.com/subscribe.php?url=__FEED__',
  img:  'images/feed-icons/add2netvibes.gif',
  text: 'Subscribe via Netvibes'
  }
};

aol_feeds_subscribe.CustomReaders = null; // custom reader list - i18n etc.

aol_feeds_subscribe.AlertLink="http://alerts.aol.com/ar/dlink/dlink.rr?dl_type=rss&amp;dl_data=__FEED__";

aol_feeds_subscribe.CustomAlertLink=null; // custom alert link - i18n etc.

/*
 * Customize the widget text
 */
aol_feeds_subscribe.setText = function( text ) {
    aol_feeds_subscribe.CustomText = text;
}

/*
 * Customize the widget readers
 */
aol_feeds_subscribe.setReaders = function( readers ) {
    aol_feeds_subscribe.CustomReaders = readers;
    aol_feeds_subscribe.atomFeed = null;
    aol_feeds_subscribe.rssFeed  = null;
}

/*
 * Customize the alert link
 */
aol_feeds_subscribe.setAlertLink = function( link ) {
    aol_feeds_subscribe.CustomAlertLink = link;
    aol_feeds_subscribe.atomFeed = null;
    aol_feeds_subscribe.rssFeed  = null;
}

aol_feeds_subscribe.show = function(refEl, atomFeed, rssFeed) {
    if ( arguments.length == 2 ) {
        aol_feeds_subscribe.setFeedURLs( atomFeed,  null );
    }
    else {
        aol_feeds_subscribe.setFeedURLs( atomFeed,  rssFeed );
    }

    var popup = document.getElementById( aol_feeds_subscribe.POPUP_ID );

    if ( ! popup ) {
        popup = document.createElement('div');
        popup.setAttribute( 'id',  aol_feeds_subscribe.POPUP_ID);
        popup.innerHTML = aol_feeds_subscribe.popup_html;
        popup.style.display = 'none';
        popup.style.position = 'absolute';
        popup.style.left = '0px';
        popup.style.top  = '0px';
        if ( refEl ) {
            aol_feeds_subscribe.Position.setOpacity(popup, 0);
        }
        document.body.appendChild(popup);

        if ( ! aol_feeds_subscribe.Position.isIE ) {
            aol_feeds_subscribe.adjustImgSrc(popup);
        }
        else {
            // Setting src with a delay - workaround for IE6 (AimPages env)
            setTimeout('aol_feeds_subscribe.adjustImgSrc()',  10);
        }
        aol_feeds_subscribe.configReaders(popup);
        aol_feeds_subscribe.configAlertLink(popup);
        aol_feeds_subscribe.configText(popup);
        aol_feeds_subscribe.configFeeds(popup);
        popup.style.display = 'block';
        if ( refEl ) {
            setTimeout('aol_feeds_subscribe.fadeInPopup(0.2)', 200);
        }
        else {
            setTimeout('aol_feeds_subscribe.refreshImages()', 500);
        }
    } 
    else if ( refEl && popup.style.display != 'none' &&
              refEl == aol_feeds_subscribe.refEl ){
        aol_feeds_subscribe.closeTwisty();
        popup.style.display = 'none';
        return popup;
    }
    else  {
        if ( aol_feeds_subscribe.UpdateFeeds) {
           popup.innerHTML = aol_feeds_subscribe.popup_html;
           if ( ! aol_feeds_subscribe.Position.isIE ) {
              aol_feeds_subscribe.adjustImgSrc(popup);
           }
           else {
              // Setting src with a delay - workaround for IE6 (AimPages env)
              setTimeout('aol_feeds_subscribe.adjustImgSrc()',  10);
           }
        }
        aol_feeds_subscribe.configReaders(popup);
        aol_feeds_subscribe.configAlertLink(popup);
        aol_feeds_subscribe.configText(popup);
        aol_feeds_subscribe.configFeeds(popup);
        aol_feeds_subscribe.closeTwisty();
        popup.style.display = 'block';
        if ( refEl ) {
            aol_feeds_subscribe.setPosition(refEl, popup);
        }
    }

    aol_feeds_subscribe.popup = popup;
    aol_feeds_subscribe.refEl = refEl;
    return popup;
}
 
// Aol Journals friendly way to show popup using blog
aol_feeds_subscribe.showBlog = function(refEl, blogURL) {
    var feeds = aol_feeds_subscribe.blogToFeedURLs(blogURL);
    return aol_feeds_subscribe.show(refEl,  feeds[0], feeds[1] );
}

// Show/hide subscribe popup
aol_feeds_subscribe.hide = function () {
    var popup = document.getElementById( aol_feeds_subscribe.POPUP_ID );
    if ( popup != null ) {
       aol_feeds_subscribe.closeTwisty();
       popup.style.display = 'none';
    }
    return false;
};

aol_feeds_subscribe.closeTwisty = function() {
    var feedsNode = document.getElementById( aol_feeds_subscribe.URLS_ID );
    var twistyImg = document.getElementById( aol_feeds_subscribe.TWISTY_ID );
    if ( twistyImg == null || feedsNode == null ) {
       return false; // error
    }
    feedsNode.style.display = 'none';
    twistyImg.className='twisty_closed';
};

// Turn twisty on/off
aol_feeds_subscribe.toggleTwisty = function() {

    var feedsNode = document.getElementById( aol_feeds_subscribe.URLS_ID );
    var twistyImg = document.getElementById( aol_feeds_subscribe.TWISTY_ID );
   
    if ( twistyImg == null || feedsNode == null ) {
       return false; // error
    }
   
    if ( feedsNode.style.display == 'none' ) {
       feedsNode.style.display = 'block';
       twistyImg.className='twisty_open';
    }
    else {
       feedsNode.style.display = 'none';
       twistyImg.className='twisty_closed';
    }

    return false;
};

aol_feeds_subscribe.UpdateFeeds = null;

aol_feeds_subscribe.refEl = null;
aol_feeds_subscribe.popup = null;
aol_feeds_subscribe.popupFirstTime = false;

aol_feeds_subscribe.POPUP_ID  = "aol_feeds_subscribe_popup";
aol_feeds_subscribe.URLS_ID   = "aol_feeds_subscribe_urls";
aol_feeds_subscribe.TWISTY_ID = "aol_feeds_subscribe_twisty_img";

// Template patterns
aol_feeds_subscribe.atomFeed = null;
aol_feeds_subscribe.rssFeed  = null;

aol_feeds_subscribe.blogToFeedURLs = function(blogURL) {
    var feeds = [];
    var slash = (blogURL.lastIndexOf('/') == (blogURL.length - 1)) ? '' : '/';
    feeds[0] = blogURL + slash + "atom.xml";
    feeds[1] = blogURL + slash + "rss.xml";
    return feeds;
};

aol_feeds_subscribe.setFeedURLs = function(atomFeed, rssFeed) {
    var changed = false;
    if ( aol_feeds_subscribe.atomFeed != atomFeed ) {
         aol_feeds_subscribe.atomFeed = atomFeed;
         changed = true;
    }
    if ( aol_feeds_subscribe.rssFeed != rssFeed ) {
         aol_feeds_subscribe.rssFeed = rssFeed;
         changed = true;
    }
    if ( changed ) {
        aol_feeds_subscribe.UpdateFeeds = {
            atomFeed: aol_feeds_subscribe.atomFeed,
            rssFeed:  aol_feeds_subscribe.rssFeed 
        };
    }
};

// Find the widget base
aol_feeds_subscribe.getBase = function() {
   var scripts = document.getElementsByTagName('script');
   for ( var i=0; i < scripts.length; i++) {
       var src = scripts[i].src;
       if ( src && src.length ) {
           if ( src == 'feeds_subscribe.js' ) {
               return "";
           }
           if ( /\/feeds_subscribe.js$/.test(src) ) {
               return src.replace(/(^.*\/)feeds_subscribe.js/, "$1");
           }
      }
   }
   return null;
};


// Adjust src for images to have base pointing to the widget hosting site 
aol_feeds_subscribe.adjustImgSrc = function(popup) {

   if ( arguments.length == 0 ) {
       popup = aol_feeds_subscribe.popup;
   }

   var base = aol_feeds_subscribe.getBase();
   if ( base == null || base.length == 0 ) {
      return;
   }

   var imgs = popup.getElementsByTagName('img');
   for ( var i=0; i < imgs.length; i++) {
       var src = imgs[i].src;
       if ( src && src.length ) {
          var imgref = src.match(/\/(images\/.*)$/);
          if ( imgref ) {
             imgs[i].src = base + imgref[1];
          }
       }
   }
};

// Replace feed vars in the widget popup template
aol_feeds_subscribe.replaceFeedVars = function(el, attr) {
   var atomFeed = aol_feeds_subscribe.UpdateFeeds.atomFeed;
   var rssFeed  = aol_feeds_subscribe.UpdateFeeds.rssFeed;
   var feed     = atomFeed || rssFeed;
   if ( el[attr] ) {
       aol_feeds_subscribe.replaceFeedVar( el, attr, '__FEED__', feed);
       aol_feeds_subscribe.replaceFeedVar( el, attr, '__ATOM_FEED__', atomFeed);
       aol_feeds_subscribe.replaceFeedVar( el, attr, '__RSS_FEED__', rssFeed);
       el[attr] = el[attr].replace('http://some.domain.com/', '');
   }
};
aol_feeds_subscribe.replaceFeedVar = function(el, attr, feedVar, feed) {
   if ( el[attr] ) {
       if ( el[attr].indexOf('/' + feedVar) >= 0 ) {
            el[attr] = el[attr].replace(feedVar, encodeURI(feed));
       }
       else if ( el[attr].indexOf('=' + feedVar) >= 0 ) {
            el[attr] = el[attr].replace(feedVar, encodeURIComponent(feed));
       }
       else if ( el[attr].indexOf(feedVar) >= 0 ) {
            el[attr] = el[attr].replace(feedVar, feed);
       }
   }
};

aol_feeds_subscribe.configFeeds = function(popup) {
    if ( aol_feeds_subscribe.UpdateFeeds == null ) {
        return ;
    }
    var els = popup.getElementsByTagName('a');
    for ( var i=0; i < els.length; i++ ) {
        if ( els[i].href ) {
           aol_feeds_subscribe.replaceFeedVars( els[i], "href" );
        }
    } 
    els = popup.getElementsByTagName('input');
    for ( var i=0; i < els.length; i++ ) {
        if ( els[i].value ) {
           aol_feeds_subscribe.replaceFeedVars( els[i], "value" );
        }
    } 

    // Hide rss or atom feed if undefined
    var el = document.getElementById('aol_feeds_subscribe_rss_feed');
    if ( el ) {
       el.style.display = aol_feeds_subscribe.rssFeed == null ? 'none' : '';
    }
    el = document.getElementById('aol_feeds_subscribe_atom_feed');
    if ( el ) {
       el.style.display = aol_feeds_subscribe.atomFeed == null ? 'none' : '';
    }
    var singleFeed = aol_feeds_subscribe.rssFeed == null || 
                     aol_feeds_subscribe.atomFeed == null;
    el = document.getElementById('aol_feeds_subscribe_text_5'); // 'or' cell
    if ( el ) {
       el.style.display = singleFeed ? 'none' : '';
    }

    if ( aol_feeds_subscribe.CustomReaders == null &&
         aol_feeds_subscribe.CustomAlertLink == null ) {
        aol_feeds_subscribe.UpdateFeeds = null;
    }
}

aol_feeds_subscribe.configText = function(popup) {
    if ( aol_feeds_subscribe.CustomText == null ) {
       return;
    }

    for (var id in aol_feeds_subscribe.CustomText ) {
        var text =  aol_feeds_subscribe.CustomText[id];
        if (id.indexOf("text_") == 0 ) {
            var el = document.getElementById('aol_feeds_subscribe_' + id );
            if ( el ) {
                el.innerHTML = text;
            }
        }
        else if ( id == 'close' ) {
            var el = document.getElementById('aol_feeds_subscribe_' + id );
            if ( el ) {
                aol_feeds_subscribe.configLinkText(el, text);
           }
        }
    }

    // Readers text
    var el =  document.getElementById('aol_feeds_subscribe_readers');
    if ( el ) {
        var readers = el.getElementsByTagName('a');
        if (readers && readers.length == 6 ) {
            for ( var i=0; i< readers.length; i++) {
               var text = aol_feeds_subscribe.CustomText['reader_' + (i+1)];
               if ( text ) {
                   aol_feeds_subscribe.configLinkText(readers[i], text);
               }
            }
        }
    }
}

aol_feeds_subscribe.configLinkText = function(el, text) {
    el.setAttribute('title', text);
    var img = el.getElementsByTagName('img');
    if ( img && img[0] ) {
       img[0].setAttribute('alt', text);
    }
}

aol_feeds_subscribe.configAlertLink = function(popup) {
    if ( aol_feeds_subscribe.CustomAlertLink == null ) {
        return ;
    }
    var el = document.getElementById('aol_feeds_subscribe_alert');
    if ( el ) {
        var link = el.getElementsByTagName('a');
        if ( link && link[0] ) {
            link[0].setAttribute('href', aol_feeds_subscribe.CustomAlertLink);
        }
    }
}

aol_feeds_subscribe.configReaders = function(popup) {
    if ( aol_feeds_subscribe.CustomReaders== null ) {
       return;
    }

    var ids = [];
    for ( var i in aol_feeds_subscribe.CustomReaders ) { ids.push(i); }
    ids.sort( function(x,y) {
              return Number(x.replace(/[^0-9]/g, '')) -
                     Number(y.replace(/[^0-9]/g, ''));
    });

    var reader_nodes = [];
    var el =  document.getElementById('aol_feeds_subscribe_readers');
    if ( el ) {
       var cell_template = null;
       var reader_cells = el.getElementsByTagName('div');
       if (reader_cells && reader_cells.length ) {
          var cell_template = reader_cells[0];
           for ( var i=0; i< ids.length; i++) {
              var cell_def = aol_feeds_subscribe.CustomReaders[ids[i]];
              reader_nodes.push(
                 aol_feeds_subscribe.createReaderNode(cell_def, cell_template)
              );
           }
       }
    }
    if ( el && reader_nodes.length ) {
       el.innerHTML = '';
       for ( var i=0; i < reader_nodes.length; i++) {
          el.appendChild(reader_nodes[i]);
       }
    }
}

aol_feeds_subscribe.createReaderNode  = function(cell_def, cell_template) {
    var cell = cell_template.cloneNode(true);
    var link = cell.getElementsByTagName('a');
    var url  = cell_def['url'] || '';
    var img  = cell_def['img'] || '';
    var text = cell_def['text'] || '';
    if ( link && link.length ) {
       link[0].setAttribute('href', url); 
       link[0].setAttribute('title', text);
       var icon = link[0].getElementsByTagName('img');
       if ( icon && icon.length ) {
          icon[0].setAttribute('src', img);
          icon[0].setAttribute('alt', text);
       }
    }
    return cell;
}

// First popup display might need repositioning. Use fade-in to mask movement.  
aol_feeds_subscribe.fadeInPopup = function(opacity) { 
    var refEl  = aol_feeds_subscribe.refEl;
    var  popup = aol_feeds_subscribe.popup;
    if ( popup != null && refEl != null ) {
       aol_feeds_subscribe.setPosition(refEl, popup);
       aol_feeds_subscribe.Position.setOpacity(popup, opacity);
       if ( opacity < 1 ) {
          opacity += 0.2;
          setTimeout('aol_feeds_subscribe.fadeInPopup(' + opacity + ')', 75);
       }
       else if ( ! aol_feeds_subscribe.popupFirstTime ) {
          aol_feeds_subscribe.popupFirstTime = true;
          setTimeout('aol_feeds_subscribe.refreshImages()', 200);
       }
    }
}

// Refresh img src and background images on first widget show (IE workaround)
aol_feeds_subscribe.refreshImages = function() {
   var popup = aol_feeds_subscribe.popup;
   if ( popup ) {
       var images = popup.getElementsByTagName('img');
       for ( var i=0; i < images.length; i++ ) {
           images[i].src = images[i].src;
           var className = images[i].className;
           if ( className ) {
               images[i].className = className;
           }
       }
   }
}

aol_feeds_subscribe.setPosition = function(refEl, popup) { 

    if ( refEl == null || refEl == document.body ) {
       return;
    }

    var Position = aol_feeds_subscribe.Position;
    popup.style.position = 'absolute';

    // Ref el geometry
    var elXY = Position.getXY(refEl);
    if ( ! elXY ) return;
    var elLeft = elXY[0];
    var elTop  = elXY[1];
    var elWidth  = refEl.offsetWidth;
    var elHeight = refEl.offsetHeight;

    // Viewport geometry 
    var vpLeft   = document.documentElement.scrollLeft ||
                   document.body.scrollLeft;
    var vpTop    = document.documentElement.scrollTop  ||
                   document.body.scrollTop ;
    var vpWidth  = Position.getViewportWidth();
    var vpHeight = Position.getViewportHeight();

    var vpLeftMax = vpLeft + vpWidth;
    var vpTopMax  = vpTop  + vpHeight;

    // Popup geometry
    var popupLeft = 0;
    var popupTop  = 0;
    var popupLeftMax = 0;
    var popupTopMax = 0;
    var popupWidth = popup.offsetWidth;
    var popupHeight = popup.offsetHeight;

    // Position 1: bottom left
    popupLeft = elLeft;
    popupTop  = elTop + elHeight;
    popupLeftMax = popupLeft + popupWidth;
    popupTopMax  = popupTop  + popupHeight;
    if (  popupTop  >= vpTop  && popupTopMax  <= vpTopMax   && 
          popupLeft >= vpLeft && popupLeftMax <= vpLeftMax  ) {
       Position.setXY(popup, [ popupLeft, popupTop ]);
       return;
    }

    // Position 2: bottom right
    popupLeft = elLeft + elWidth - popupWidth;
    popupTop  = elTop + elHeight;
    popupLeftMax = popupLeft + popupWidth;
    popupTopMax  = popupTop  + popupHeight;
    if (  popupTop  >= vpTop  && popupTopMax  <= vpTopMax   && 
          popupLeft >= vpLeft && popupLeftMax <= vpLeftMax  ) {
       Position.setXY(popup, [ popupLeft, popupTop ]);
       return;
    }

    // Position 3: top left
    popupLeft = elLeft;
    popupTop  = elTop - popupHeight;
    popupLeftMax = popupLeft + popupWidth;
    popupTopMax  = popupTop  + popupHeight;
    if (  popupTop  >= vpTop  && popupTopMax  <= vpTopMax   && 
          popupLeft >= vpLeft && popupLeftMax <= vpLeftMax  ) {
       Position.setXY(popup, [ popupLeft, popupTop ]);
       return;
    }

    // Position 4: top right
    popupLeft = elLeft + elWidth - popupWidth;
    popupTop  = elTop - popupHeight;
    popupLeftMax = popupLeft + popupWidth;
    popupTopMax  = popupTop  + popupHeight;
    if (  popupTop  >= vpTop  && popupTopMax  <= vpTopMax   && 
          popupLeft >= vpLeft && popupLeftMax <= vpLeftMax  ) {
       Position.setXY(popup, [ popupLeft, popupTop ]);
       return;
    }

    // Can not fit in viewport - apply position 1 or 2
    // Position 1: bottom left
    popupLeft = elLeft;
    popupTop  = elTop + elHeight;
    popupLeftMax = popupLeft + popupWidth;
    if ( popupLeft >= vpLeft && popupLeftMax <= vpLeftMax  ) {
       Position.setXY(popup, [ popupLeft, popupTop ]);
       return;
    }

    // Position 2: bottom right
    popupLeft = elLeft + elWidth - popupWidth;
    popupTop  = elTop + elHeight;
    popupLeftMax = popupLeft + popupWidth;
    if ( popupLeft >= vpLeft && popupLeftMax <= vpLeftMax  ) {
       Position.setXY(popup, [ popupLeft, popupTop ]);
       return;
    }

    Position.setXY(popup, [  elLeft, elTop + elHeight ]);
}
   
/*
  Position object is created from the Yahoo UILib YAHOO.util.Dom version 0.11.1
*/
aol_feeds_subscribe.Position = {};
aol_feeds_subscribe.Position.isOpera =
   (navigator.userAgent.toLowerCase().indexOf('opera') > -1);
aol_feeds_subscribe.Position.isSafari =
   (navigator.userAgent.toLowerCase().indexOf('safari') > -1);
aol_feeds_subscribe.Position.isIE = (window.ActiveXObject);

aol_feeds_subscribe.Position.toCamel = function(property) {
   var convert = function(prop) {
      var test = /(-[a-z])/i.exec(prop);
      return prop.replace(RegExp.$1, RegExp.$1.substr(1).toUpperCase());
   };
   while(property.indexOf('-') > -1) {
      property = convert(property);
   }
   return property;
};
   
aol_feeds_subscribe.Position.toHyphen = function(property) {
   if (property.indexOf('-') > -1) { // assume hyphen
      return property;
   }
   var converted = '';
   for (var i = 0, len = property.length;i < len; ++i) {
      if (property.charAt(i) == property.charAt(i).toUpperCase()) {
         converted = converted + '-' + property.charAt(i).toLowerCase();
      } else {
         converted = converted + property.charAt(i);
      }
   }
   return converted;
};

aol_feeds_subscribe.Position.getStyle = function(el, property) {
   var Position = aol_feeds_subscribe.Position;
   var value = null;
   var dv = document.defaultView;

   var camel =  Position.toCamel(property);
   var hyphen = Position.toHyphen(property);

   if (el.style[camel]) { // camelCase for valid styles
      value = el.style[camel];
   }
   else if (Position.isIE && el.currentStyle && el.currentStyle[camel]) {
      // camelCase for currentStyle;
      // isIE to workaround broken Opera 9 currentStyle
      value = el.currentStyle[camel];
   }
   else if ( dv && dv.getComputedStyle ) {
      // hyphen-case for computedStyle
      var computed = dv.getComputedStyle(el, '');
      if (computed && computed.getPropertyValue(hyphen)) {
         value = computed.getPropertyValue(hyphen);
      }
   }
   return value;
};

aol_feeds_subscribe.Position.setOpacity = function(el, val) {
   var Position = aol_feeds_subscribe.Position;
   if (Position.isIE && typeof el.style.filter == 'string') {
      el.style.filter = 'alpha(opacity=' + val * 100 + ')';
   }
   else {
     el.style.opacity = val;
     el.style['-moz-opacity'] = val;
     el.style['-khtml-opacity'] = val;
   }
}

aol_feeds_subscribe.Position.getXY = function(el) {
   var Position = aol_feeds_subscribe.Position;
   
   // has to be part of document to have pageXY
   if (el.offsetParent === null || Position.getStyle(el, 'display') == 'none') {
      return false;
   }
         
   var parentNode = null;
   var pos = [];
   var box;
         
   if (el.getBoundingClientRect) { // IE
      box = el.getBoundingClientRect();
      var doc = document;
      if ( !Position.inDocument(el) && parent.document != document) {
         // might be in a frame, need to get its scroll
         doc = parent.document;

         if ( !Position.isAncestor(doc.documentElement, el) ) {
            return false;                 
         }
      }

      var scrollTop = Math.max(doc.documentElement.scrollTop,
                               doc.body.scrollTop);
      var scrollLeft = Math.max(doc.documentElement.scrollLeft,
                               doc.body.scrollLeft);
      return [box.left + scrollLeft, box.top + scrollTop];
   }
   else { // safari, opera, & gecko
      pos = [el.offsetLeft, el.offsetTop];
      parentNode = el.offsetParent;
      if (parentNode != el) {
         while (parentNode) {
            pos[0] += parentNode.offsetLeft;
            pos[1] += parentNode.offsetTop;
            parentNode = parentNode.offsetParent;
         }
      }
      if (Position.isSafari && Position.getStyle(el, 'position') == 'absolute' ) {
         // safari doubles in some cases
         pos[0] -= document.body.offsetLeft;
         pos[1] -= document.body.offsetTop;
      } 
   }

   if (el.parentNode) { parentNode = el.parentNode; }
   else { parentNode = null; }

   while (parentNode && parentNode.tagName.toUpperCase() != 'BODY' &&
          parentNode.tagName.toUpperCase() != 'HTML') 
   { // account for any scrolled ancestors
      pos[0] -= parentNode.scrollLeft;
      pos[1] -= parentNode.scrollTop;

      if (parentNode.parentNode) { parentNode = parentNode.parentNode; } 
      else { parentNode = null; }
   }
   return pos;
};

aol_feeds_subscribe.Position.setXY = function(el, pos, noRetry) {
   var Position = aol_feeds_subscribe.Position;
   var style_pos = Position.getStyle(el, 'position');
   if (style_pos == 'static') { // default to relative
      el.style.position = 'relative';
      style_pos = 'relative';
   }

   var pageXY = Position.getXY(el);
   if (pageXY === false) { // has to be part of doc to have pageXY
      return false; 
   }

   var delta = [ // assuming pixels; if not we will have to retry
      parseInt( Position.getStyle(el, 'left'), 10 ),
      parseInt( Position.getStyle(el, 'top'), 10 )
   ];

   if ( isNaN(delta[0]) ) {// in case of 'auto'
      delta[0] = (style_pos == 'relative') ? 0 : el.offsetLeft;
   }
   if ( isNaN(delta[1]) ) { // in case of 'auto'
      delta[1] = (style_pos == 'relative') ? 0 : el.offsetTop;
   }

   if (pos[0] !== null) { el.style.left = pos[0] - pageXY[0] + delta[0] + 'px'; }
   if (pos[1] !== null) { el.style.top = pos[1] - pageXY[1] + delta[1] + 'px'; }

   var newXY = Position.getXY(el);

   // if retry is true, try one more time if we miss 
   if (!noRetry && (newXY[0] != pos[0] || newXY[1] != pos[1]) ) {
      Position.setXY(el, pos, true);
   }
};

aol_feeds_subscribe.Position.isAncestor = function(haystack, needle) {
   if (!haystack || !needle) { return false; }
   var Position = aol_feeds_subscribe.Position;

   if (haystack.contains && !Position.isSafari) {
      // safari "contains" is broken
      return haystack.contains(needle);
   }
   else if ( haystack.compareDocumentPosition ) {
      return (haystack.compareDocumentPosition(needle) & 16) != 0;
   }
   else { // loop up and test each parent
      var parent = needle.parentNode;
      
      while (parent) {
         if (parent == haystack) {
            return true;
         }
         else if (parent.tagName.toUpperCase() == 'HTML') {
            return false;
         }
         parent = parent.parentNode;
      }
      return false;
   }
};

aol_feeds_subscribe.Position.inDocument = function(el) {
   var Position = aol_feeds_subscribe.Position;
   return Position.isAncestor(document.documentElement, el);
};

aol_feeds_subscribe.Position.getViewportHeight = function() {
   var Position = aol_feeds_subscribe.Position;
   var height = -1;
   var mode = document.compatMode;

   if ( (mode || Position.isIE) && !Position.isOpera ) {
      switch (mode) { // (IE, Gecko)
         case 'CSS1Compat': // Standards mode
            height = document.documentElement.clientHeight;
            break;

         default: // Quirks
            height = document.body.clientHeight;
      }
   } else { // Safari, Opera
      height = self.innerHeight;
   }
   return height;
};

aol_feeds_subscribe.Position.getViewportWidth = function() {
   var Position = aol_feeds_subscribe.Position;
   var width = -1;
   var mode = document.compatMode;
         
   if (mode || Position.isIE) { // (IE, Gecko, Opera)
      switch (mode) {
      case 'CSS1Compat': // Standards mode 
         width = document.documentElement.clientWidth;
         break;
         
      default: // Quirks
         width = document.body.clientWidth;
      }
   } else { // Safari
      width = self.innerWidth;
   }
   return width;
};

/* popup_html extracted from _feeds_subscribe_.html template */
aol_feeds_subscribe.popup_html=
 "<a id=\"aol_feeds_subscribe_close\" href=\"#\" onclick=\"return aol_feeds_subscribe.hide();\"  title=\"Close\">" +
 "<img class=\"close_btn\" src=\"images/clear_pix.gif\" alt=\"Close\"/>" +
 "</a>" +
 "<h2 id=\"aol_feeds_subscribe_text_0\">Subscribe Now</h2>" +
 "<p id=\"aol_feeds_subscribe_text_1\">With these fine readers:</p>" +
 "<div id=\"aol_feeds_subscribe_readers\">" +
 "<div class=\"reader_cell\">" +
 "<a target=\"_blank\" href=\"http://feeds.my.aol.com/add.jsp?url=__FEED__\" onclick=\"aol_feeds_subscribe.hide();\" title=\"Subscribe via MyAOL\"><img class=\"feedIcon\" src=\"images/feed-icons/myaol_cta1.gif\" alt=\"Subscribe via MyAOL\"/></a>" +
 "</div>" +
 "<div class=\"reader_cell\">" +
 "<a target=\"_blank\" href=\"http://www.bloglines.com/sub/__FEED__\" onclick=\"aol_feeds_subscribe.hide();\"  title=\"Subscribe via Bloglines\"><img class=\"feedIcon\" src=\"images/feed-icons/sub_modern5.gif\" alt=\"Subscribe via Bloglines\"/></a>" +
 "</div>" +
 "<div class=\"reader_cell\">" +
 "<a target=\"_blank\" href=\"http://fusion.google.com/add?feedurl=__FEED__\" onclick=\"aol_feeds_subscribe.hide()\" title=\"Subscribe via Google Reader\"><img src=\"images/feed-icons/googlereader.gif\" alt=\"Subscribe via Google Reader\"/></a>" +
 "</div>" +
 "<div class=\"reader_cell\">" +
 "<a target=\"_blank\" href=\"http://www.newsgator.com/ngs/subscriber/subext.aspx?url=__FEED__\" onclick=\"aol_feeds_subscribe.hide();\" title=\"Subscribe via NewsGator\"><img class=\"feedIcon\" src=\"images/feed-icons/ngsub1.gif\" alt=\"Subscribe via NewsGator\"/></a>" +
 "</div>" +
 "<div class=\"reader_cell\">" +
 "<a target=\"_blank\" href=\"http://add.my.yahoo.com/content?url=__FEED__\" onclick=\"aol_feeds_subscribe.hide();\" title=\"Subscribe via Yahoo Reader\"><img class=\"feedIcon\" src=\"images/feed-icons/addtomyyahoo4.gif\" alt=\"Subscribe via Yahoo Reader\"/></a>" +
 "</div>" +
 "<div class=\"reader_cell\">" +
 "<a target=\"_blank\" href=\"http://www.netvibes.com/subscribe.php?url=__FEED__\" onclick=\"aol_feeds_subscribe.hide();\" title=\"Subscribe via Netvibes\"><img class=\"feedIcon\" src=\"images/feed-icons/add2netvibes.gif\" alt=\"Subscribe via Netvibes\"/></a>" +
 "</div>" +
 "</div>" +
 "<div id=\"aol_feeds_subscribe_get_feeds\">" +
 "<a href=\"#\" onclick=\"return aol_feeds_subscribe.toggleTwisty();\">" +
 "<img id=\"aol_feeds_subscribe_twisty_img\" class=\"twisty_closed\" src=\"images/clear_pix.gif\" alt=\"\"/></a>" +
 "<a href=\"#\" onclick=\"return aol_feeds_subscribe.toggleTwisty();\">" +
 "<span id=\"aol_feeds_subscribe_text_2\" class=\"twisty_text\">Don\'t use these readers? Get the feed manually.</span></a>" +
 "</div>" +
 "<div id=\"aol_feeds_subscribe_urls\" style=\"display: none;\">" +
 "<div id=\"aol_feeds_subscribe_text_3\" class=\"info_text\">Copy and paste the appropriate feed into your reader.</div>" +
 "<div id=\"aol_feeds_subscribe_rss_feed\" class=\"feed_cell\">" +
 "<a target=\"_blank\" href=\"http://some.domain.com/__RSS_FEED__\" onclick=\"aol_feeds_subscribe.hide();\"><span id=\'aol_feeds_subscribe_text_4\'>RSS</span></a>" +
 "<input type=\"text\" readonly=\"readonly\" value=\"__RSS_FEED__\" onclick=\"this.focus(); this.select();\"/>" +
 "</div>" +
 "<div id=\"aol_feeds_subscribe_text_5\" class=\"info_text\">or</div>" +
 "<div id=\"aol_feeds_subscribe_atom_feed\" class=\"feed_cell\">" +
 "<a target=\"_blank\" href=\"http://some.domain.com/__ATOM_FEED__\" onclick=\"aol_feeds_subscribe.hide();\"><span id=\'aol_feeds_subscribe_text_6\'>Atom</span></a>" +
 "<input type=\"text\" readonly=\"readonly\" value=\"__ATOM_FEED__\" onclick=\"this.focus(); this.select();\"/>" +
 "</div>" +
 "</div>" +
 "<div id=\"aol_feeds_subscribe_alert\">" +
 "<a target=\"_blank\" href=\"http://alerts.aol.com/ar/dlink/dlink.rr?dl_type=rss&dl_data=__FEED__\" onclick=\"aol_feeds_subscribe.hide();\"><span id=\'aol_feeds_subscribe_text_7\'>Get an Alert for the feed</span></a>" +
 "</div>";


/*
   Lazy loading with feeds_subscribe_lazyload.js 
   Send load notification or complete panding calls
*/
if ( typeof aol_feeds_subscribe_lazyload != 'undefined' ) {

    if ( aol_feeds_subscribe_lazyload.loadCallback ) {
        if ( aol_feeds_subscribe_lazyload.timeoutId ) {
            clearTimeout(aol_feeds_subscribe_lazyload.timeoutId);
        }
        aol_feeds_subscribe_lazyload.timeoutId = null;

        var callback = aol_feeds_subscribe_lazyload.loadCallback;
        aol_feeds_subscribe_lazyload.loadCallback = null;
        if ( callback ) {
           callback(true); // Send loaded notification
        }
    }

    // Exec pending calls
    for ( var i=0; i < aol_feeds_subscribe_lazyload.pendingCalls.length; i++ ){
        var call = aol_feeds_subscribe_lazyload.pendingCalls[i];
        if ( call.method == 'setText' ) {
            aol_feeds_subscribe.setText(call.text);
        }
        if ( call.method == 'setReaders' ) {
            aol_feeds_subscribe.setReaders(call.readers);
        }
        if ( call.method == 'setAlertLink' ) {
            aol_feeds_subscribe.setAlertLink(call.link);
        }
        if ( call.method == 'showBlog' ) {
            aol_feeds_subscribe.showBlog(call.refEl, call.blogURL);
        }
        if ( call.method == 'show' ) {
            aol_feeds_subscribe.show(call.refEl,
                                     call.atomFeed, call.rssFeed);
        }
   }
}

