	SDN.Subscription.ItemStatusList = $H();
	SDN.Subscription.AvailableCountries = $H();
	SDN.Subscription.CountryComponentId = null;
	SDN.Subscription.CurrentLanguage = null;
	
	
	
	SDN.Subscription.ShowPopup = function(id){
		$(id).effect('opacity',{onStart:ShowWrapper}).start(0,1); 
		var width = $(id).getStyle('width'); 
		
		if ( ($(id).offsetLeft + parseInt(width)) > screen.width ){
			$(id).style.left = screen.width - parseInt(width) - 20 + 'px';
			if ( window.ie )				
				$(id).style.top = parseInt($(id).offsetTop + 15) + 'px';
		}   
	}
	
	/*
	* Loads item status/price
	*
	*/
	
	SDN.Subscription.GetItemStatus = function (id,rid,style,displayPrice){
		var parameters = $H();
		parameters.set('id',id);
		parameters.set('rid',rid);
		parameters.set('style',style);
		if ( displayPrice != null )
			parameters.set('displayPrice', displayPrice);
			
		parameters.set('handler','com.sap.sdn.subscription.ajaxhandlers.ItemStatusHandler');
		
		var callbackargs = $H();
		callbackargs.set('id',id);
		
		SDN.Subscription.ItemStatusList.set(id,id);
		
		SDN.Utils.Ajax.ExecutePostRequest(SDN.Subscription.RenderStatus,parameters,callbackargs);
	}

	/*
	* Callback to render item status/price
	*
	*/

	SDN.Subscription.RenderStatus = function(){
		var ajax = this.get('ajax');
		var id = this.get('id');
		SDN.Subscription.ItemStatusList.remove(id);
		try{
			$(id).innerHTML = ajax.response.text;
			if($(id+'countries')){
				$(id+'countries').addEvent('mouseleave',SDN.Subscription.HidePopup);
			}
		}catch(err){
		
		}
		if(SDN.Subscription.ItemStatusList.length==0){
			SDN.Subscription.GetCountries(SDN.Subscription.CountryComponentId,SDN.Subscription.CurrentLanguage)
		}
		
	}
	
	SDN.Subscription.HidePopup = function(event){
		if(event.target){
			if(event.target.id){
				if(event.target.id.indexOf('countries')>0){
					$(event.target.id).effect('opacity').start(1,0);
				}
			}
		}
		if(event.relatedTarget){
			if(event.relatedTarget.id){
				if(event.relatedTarget.id.indexOf('countries')>0){
					$(event.relatedTarget.id).effect('opacity').start(1,0);
				}
			}
		}
		

	}
	
	/*
	* Loads countries
	*
	*/
	SDN.Subscription.GetCountries = function(id,language){
		var parameters = $H();
		parameters.set('handler','com.sap.sdn.subscription.ajaxhandlers.CountryHandler');
		var countries = '';
		for(var i=0;i<SDN.Subscription.AvailableCountries.length;i++){

			countries +=SDN.Subscription.AvailableCountries.keys()[i]+',';
		}
		parameters.set('countries',countries);
		if(language!=null){
			parameters.set('language',language);
		}
		
		
		var callbackargs = $H();
		callbackargs.set('id',id);
		SDN.Utils.Ajax.ExecutePostRequest(SDN.Subscription.RenderCountries,parameters,callbackargs);
	
	}
	
	/*
	* Callback to render countries
	*
	*/
	SDN.Subscription.RenderCountries = function(id){
		var ajax = this.get('ajax');
		var id = this.get('id');
		try{
			$(id).innerHTML = ajax.response.text;
			$('countrywrapper').addEvent('mouseleave',SDN.Subscription.HideCountry);
		}catch(err){
		
		}
	}
	SDN.Subscription.HideCountry = function(){
		$('countries').effect('opacity',{onComplete:SDN.Subscription.HideWrapper}).start(1,0);
	}
	
	SDN.Subscription.ShowWrapper = function(){

		$('countrywrapper').style.display='block';
	}

	SDN.Subscription.HideWrapper = function(){

		$('countrywrapper').style.display='none';
	}
	
	/*
	SDN.Subscription.HideCountry = function(event){
		var targ = event.relatedTarget 
		var src = event.target;
		var editorElement = src.editorElement;
		if(!SDN.Utils.Contains(src,targ)){
			$('countries').effect('opacity',{onComplete:SDN.Subscription.HideWrapper}).start(1,0);
		}
		event.stop();
	}	
	*/
	
	
	/*
	* Executes an arbitary handler - passed a rid and parent rid
	* parent rid is used to allow handler to operate in runtime/edit/mode
	*  
	* 
	*
	*/
	SDN.Subscription.AsyncContentLoad = function (handler,id,parameters){
		if(parameters ==null){
			var parameters = $H();
		}
		parameters.set('handler',handler);
		var callbackargs = $H();
		callbackargs.set('id',id);
		
		
		SDN.Utils.Ajax.ExecutePostRequest(SDN.Subscription.AsyncRender,parameters,callbackargs);
	}

	/*
	* Callback to render from generic content load
	*
	*/
	SDN.Subscription.AsyncRender = function(){
		var ajax = this.get('ajax');
		var id = this.get('id');
		try{
			$(id).innerHTML = ajax.response.text;
			
		}catch(err){
		
		}
		
	}
	
	
/* SDN BUBBLE */

window.addEvent('load', function(){
      
  SDN.Subscription.offsetX = 15;
  SDN.Subscription.offsetY = 10;
      
  $$('.bubblelink').each(function(titleLink) {
          
    	var tooltip = titleLink.getNext();
        
    	if ($defined(tooltip) && tooltip.getProperty('class') == 'sdnbubble') {

        titleLink.addEvent('mouseenter', function(event) {    
			tooltip = SDN.Subscription.addBubble(tooltip); 
			var event = new Event(event);
			
			// ++++ added by c5078939 in order to calculate the tooltip position ++++			
			var x = 0;
			var y = 0;
			var maxX = 0;
			var maxY = 0;
			var offsetX = 0;
			var offsetY = 0;
			var gap = 50;
			var tooltipWidth = parseInt(tooltip.offsetWidth);
			var tooltipHeight = parseInt(tooltip.offsetHeight);
			
			if( typeof( window.innerWidth ) == 'number' ) {
    			//Non-IE
    			maxX = window.innerWidth;
    			maxY = window.innerHeight;
				offsetX = window.pageXOffset;
				offsetY = window.pageYOffset;
  			} 
  			else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    			//IE 6+ in 'standards compliant mode'
    			maxX = document.documentElement.clientWidth;
    			maxY = document.documentElement.clientHeight;
				offsetX = document.documentElement.scrollLeft;
				offsetY = document.documentElement.scrollTop;
  			} 
  			else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    			//IE 4 compatible
    			maxX = document.body.clientWidth;
    			maxY = document.body.clientHeight;
				offsetX = document.body.scrollLeft;
				offsetY = document.body.scrollTop;    			
  			}

			if (tooltipWidth + gap > (maxX - event.client.x)) {
				x = event.client.x - SDN.Subscription.offsetX - tooltipWidth + offsetX;
			}
			else {
				x = event.client.x + SDN.Subscription.offsetX + offsetX;
			}
			
			if (tooltipHeight + gap > (maxY - event.client.y)) {
				y = event.client.y - SDN.Subscription.offsetY - tooltipHeight + offsetY;
			}
			else {
				y = event.client.y + SDN.Subscription.offsetY + offsetY;
			}
 			// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
			tooltip.setStyles({
				'left': (x),
				'top': (y),
				'opacity': 0.9
			});
		}); 
		
        titleLink.addEvent('mouseleave', function() {
			tooltip.setStyle('visibility', 'hidden');
        });		
		
        titleLink.addEvent('mousemove', function(event){
			var event = new Event(event);
			
			// ++++ added by c5078939 in order to calculate the tooltip position ++++
			var x = 0;
			var y = 0;
			var maxX = 0;
			var maxY = 0;
			var offsetX = 0;
			var offsetY = 0;
			var gap = 50;
			var tooltipWidth = parseInt(tooltip.offsetWidth);
			var tooltipHeight = parseInt(tooltip.offsetHeight);
	
			if( typeof( window.innerWidth ) == 'number' ) {
    			//Non-IE
    			maxX = window.innerWidth;
    			maxY = window.innerHeight;
				offsetX = window.pageXOffset;
				offsetY = window.pageYOffset;
  			} 
  			else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    			//IE 6+ in 'standards compliant mode'
    			maxX = document.documentElement.clientWidth;
    			maxY = document.documentElement.clientHeight;
				offsetX = document.documentElement.scrollLeft;
				offsetY = document.documentElement.scrollTop;
  			} 
  			else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    			//IE 4 compatible
    			maxX = document.body.clientWidth;
    			maxY = document.body.clientHeight;
				offsetX = document.body.scrollLeft;
				offsetY = document.body.scrollTop;    			
  			}	

			if (tooltipWidth + gap > (maxX - event.client.x)) {
				x = event.client.x - SDN.Subscription.offsetX - tooltipWidth + offsetX;
			}
			else {
				x = event.client.x + SDN.Subscription.offsetX + offsetX;
			}
			
			if (tooltipHeight + gap > (maxY - event.client.y)) {
				y = event.client.y - SDN.Subscription.offsetY - tooltipHeight + offsetY;
			}
			else {
				y = event.client.y + SDN.Subscription.offsetY + offsetY;
			}			
 			// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
			tooltip.setStyles({
				'left': (x),
				'top': (y) 
			});
		});      
	}
  });
});
      
SDN.Subscription.addBubble = function(rawTooltip) {
          
	// check if border markup already exists
    var firstChild = rawTooltip.getFirst();
	if ($defined(firstChild) &&  firstChild.getProperty('class') == 'sdnbubbleTop') {
		return rawTooltip;
    }
          
	// create elements for border markup
    var borderTop = new Element('div', {
		'class': 'sdnbubbleTop'
	});
	var borderTopSub = new Element('div');
          
	var bodyWrapper = new Element('div', {
		'class': 'sdnbubbleBody'
	});                              
          
	var borderBottom = new Element('div', {
		'class': 'sdnbubbleBottom'
	});          
	var borderBottomSub = new Element('div');
          
	// copy tooltip content inside new wrapper, then empty tooltip
	bodyWrapper.adopt(rawTooltip.getChildren());
	rawTooltip = rawTooltip.empty();     
          
	// add border markup
	borderTop.injectInside(rawTooltip);
	borderTopSub.injectInside(borderTop);
	bodyWrapper.injectInside(rawTooltip);
	borderBottom.injectInside(rawTooltip);
	borderBottomSub.injectInside(borderBottom);
           
	return rawTooltip;            
}


/* SDN BUBBLE END */	

var Tooltip = {
    followMouse: true,
    offX: 8,
    offY: 12,
    tipID: "tipDiv",
    showDelay: 100,
    hideDelay: 200,
    
    ready:false, timer:null, tip:null, 
  
    init: function() {  
        if ( document.createElement && document.body && typeof document.body.appendChild != "undefined" ) {
            if ( !document.getElementById(this.tipID) ) {
                var el = document.createElement("DIV");
                el.id = this.tipID; document.body.appendChild(el);
                this.offX = 4;  
				this.offY = 4;
				this.followMouse = false;  // must be turned off for hover-tip                
            }
            this.ready = true;
        }
    },
    
    show: function(e, msg) {
        if (this.timer) { clearTimeout(this.timer);	this.timer = 0; }
        this.tip = document.getElementById( this.tipID );
        if (this.followMouse) // set up mousemove 
            dw_event.add( document, "mousemove", this.trackMouse, true );
        this.writeTip("");  // for mac ie
        this.writeTip(msg);
        viewport.getAll();
        this.positionTip(e);
        this.timer = setTimeout("Tooltip.toggleVis('" + this.tipID + "', 'visible')", this.showDelay);
    },
    
    writeTip: function(msg) {
        if ( this.tip && typeof this.tip.innerHTML != "undefined" ) this.tip.innerHTML = msg;
    },
    
    positionTip: function(e) {
        if ( this.tip && this.tip.style ) {
            // put e.pageX/Y first! (for Safari)
            var x = e.pageX? e.pageX: e.clientX + viewport.scrollX;
            var y = e.pageY? e.pageY: e.clientY + viewport.scrollY;
    
            if ( x + this.tip.offsetWidth + this.offX > viewport.width + viewport.scrollX ) {
                x = x - this.tip.offsetWidth - this.offX;
                if ( x < 0 ) x = 0;
            } else x = x + this.offX;
        
            if ( y + this.tip.offsetHeight + this.offY > viewport.height + viewport.scrollY ) {
                y = y - this.tip.offsetHeight - this.offY;
                if ( y < viewport.scrollY ) y = viewport.height + viewport.scrollY - this.tip.offsetHeight;
            } else y = y + this.offY;
            
            this.tip.style.left = x + "px"; this.tip.style.top = y + "px";
        }
    },
    
    hide: function() {
        if (this.timer) { clearTimeout(this.timer);	this.timer = 0; }
        this.timer = setTimeout("Tooltip.toggleVis('" + this.tipID + "', 'hidden')", this.hideDelay);
        if (this.followMouse) // release mousemove
            dw_event.remove( document, "mousemove", this.trackMouse, true );
        this.tip = null; 
    },

    toggleVis: function(id, vis) { // to check for el, prevent (rare) errors
        var el = document.getElementById(id);
        if (el) el.style.visibility = vis;
    },
    
    trackMouse: function(e) {
    	e = dw_event.DOMit(e);
     	Tooltip.positionTip(e);
    }
    
}
var viewport = {
  getWinWidth: function () {
    this.width = 0;
    if (window.innerWidth) this.width = window.innerWidth - 18;
    else if (document.documentElement && document.documentElement.clientWidth) 
  		this.width = document.documentElement.clientWidth;
    else if (document.body && document.body.clientWidth) 
  		this.width = document.body.clientWidth;
  },
  
  getWinHeight: function () {
    this.height = 0;
    if (window.innerHeight) this.height = window.innerHeight - 18;
  	else if (document.documentElement && document.documentElement.clientHeight) 
  		this.height = document.documentElement.clientHeight;
  	else if (document.body && document.body.clientHeight) 
  		this.height = document.body.clientHeight;
  },
  
  getScrollX: function () {
    this.scrollX = 0;
  	if (typeof window.pageXOffset == "number") this.scrollX = window.pageXOffset;
  	else if (document.documentElement && document.documentElement.scrollLeft)
  		this.scrollX = document.documentElement.scrollLeft;
  	else if (document.body && document.body.scrollLeft) 
  		this.scrollX = document.body.scrollLeft; 
  	else if (window.scrollX) this.scrollX = window.scrollX;
  },
  
  getScrollY: function () {
    this.scrollY = 0;    
    if (typeof window.pageYOffset == "number") this.scrollY = window.pageYOffset;
    else if (document.documentElement && document.documentElement.scrollTop)
  		this.scrollY = document.documentElement.scrollTop;
  	else if (document.body && document.body.scrollTop) 
  		this.scrollY = document.body.scrollTop; 
  	else if (window.scrollY) this.scrollY = window.scrollY;
  },
  
  getAll: function () {
    this.getWinWidth(); this.getWinHeight();
    this.getScrollX();  this.getScrollY();
  }
  
}
var dw_event = {
  
  add: function(obj, etype, fp, cap) {
    cap = cap || false;
    if (obj.addEventListener) obj.addEventListener(etype, fp, cap);
    else if (obj.attachEvent) obj.attachEvent("on" + etype, fp);
  }, 

  remove: function(obj, etype, fp, cap) {
    cap = cap || false;
    if (obj.removeEventListener) obj.removeEventListener(etype, fp, cap);
    else if (obj.detachEvent) obj.detachEvent("on" + etype, fp);
  }, 

  DOMit: function(e) { 
    e = e? e: window.event;
    e.tgt = e.srcElement? e.srcElement: e.target;
    
    if (!e.preventDefault) e.preventDefault = function () { return false; }
    if (!e.stopPropagation) e.stopPropagation = function () { if (window.event) window.event.cancelBubble = true; }
        
    return e;
  }
  
}


// tooltip content variables
var msgTips = 'Get the latest information about the <a href="http://www.dyn-web.com/dhtml/tooltips/">tooltips</a> currently available at <a href="http://www.dyn-web.com">dyn-web.com</a>.';

//var msgTerms = 'The code is free for <a href="http://www.dyn-web.com/bus/terms.html#personal">personal use</a> but all other uses require purchase of a <a href="http://www.dyn-web.com/bus/purchase.html">license</a>.';

function doTooltip(e, msg) {
  if ( typeof Tooltip == "undefined" || !Tooltip.ready ) return;
  Tooltip.clearTimer();
  var tip = document.getElementById? document.getElementById(Tooltip.tipID): null;
  if ( tip && tip.onmouseout == null ) {
      tip.onmouseout = Tooltip.tipOutCheck;
      tip.onmouseover = Tooltip.clearTimer;
  }
  Tooltip.show(e, msg);
}

function hideTip() {
  if ( typeof Tooltip == "undefined" || !Tooltip.ready ) return;
  Tooltip.timerId = setTimeout("Tooltip.hide()", 300);
}

Tooltip.tipOutCheck = function(e) {
  e = dw_event.DOMit(e);
  // is element moused into contained by tooltip?
  var toEl = e.relatedTarget? e.relatedTarget: e.toElement;
  if ( this != toEl && !contained(toEl, this) ) Tooltip.hide();
}

// returns true of oNode is contained by oCont (container)
function contained(oNode, oCont) {
  if (!oNode) return; // in case alt-tab away while hovering (prevent error)
  while ( oNode = oNode.parentNode ) if ( oNode == oCont ) return true;
  return false;
}

Tooltip.timerId = 0;
Tooltip.clearTimer = function() {
  if (Tooltip.timerId) { clearTimeout(Tooltip.timerId); Tooltip.timerId = 0; }
}

Tooltip.unHookHover = function () {
    var tip = document.getElementById? document.getElementById(Tooltip.tipID): null;
    if (tip) {
        tip.onmouseover = null; 
        tip.onmouseout = null;
        tip = null;
    }
}

dw_event.add(window, "unload", Tooltip.unHookHover, true);

function pageLoaded(){
	Tooltip.init();
}

