function IPExchangePopup( divId, options )
{
  var durationItem = false;

	var popupPanel = false;
	var tabView    = false;
	var zIndex = 1;

	var startTab = 0;
	var infoPanel = false;

	var _popupPanelBody = '';
	var _tmpOptions = false;

	var cart = false;
	var cartTabIndex = false;

	var form = {};
	var addItemEvent = false;

	var _sprecherPlaying = false;

	var myTabs = [];

	this.show   = show;
	this.hide   = hide;
	this.addTab = addTab;
	this.create = setPanelBody;
	this.changeTab = changeTab;

	this.cartSend = cartSend;
	this.cartAddItem   = cartAddItem;
	this.cartAddItemNr = cartAddItemNr;
	this.cartDelItem   = cartDelItem;
	this.cartItemCount = cartItemCount;
	this.formSend = formSend;

	var viewport = [ $D.getViewportWidth(), $D.getViewportHeight() ];

	var tabs = new Array();
	var tabCount = 0;

	var formTabSet = false;

	var cartSent = false;

	var blobOut = false;

	function unload()
	{
		popupPanel=null;
		tabView=null;
		cart=null;
		tabs=null;
	}

	function init()
	{
		if ( ! blobOut ) blobOut = new IPExchange.anim.blobOut();
		if ( ! popupPanel ) createPopup();
		if ( popupPanel )
		{
			_popupPanelBody+=getPopupPanelBodyHTML();
		}
	}

	function initCart()
	{
		if ( ! cart )
		{
			var cartNode = document.createElement('div');
			cartNode.id = divId + 'Cart';
			cartNode.innerHTML = '<div style="height: 200px;">';
			cartNode.innerHTML = '</div>';
			$(divId).appendChild(cartNode);
		}
	}

	function loadCart()
	{
		if ( ! cart )
		{
			cart = new IPExchange.util.Cart( divId+'Cart' );
		}
	}

	function addTab( type, title, obj, options )
	{
		var id=false;
		if ( ! popupPanel ) init();
		var setActive=false;
		var setCache=true;
		if ( ! tabView )
		{
			createTabView();
			setActive=true;
		}

		if ( options )
		{
			if ( options.active ) setActive=true;
			if ( options.cache == false )  setCache=false;
		}

		if ( setActive ) startTab=tabCount;

		switch (type)
		{
      case 'duration':
        options.baseUrl = obj
        var objTab={ label: title, active: true }
        _addTab(objTab);
        break;
                
      case 'peering':
        options.baseUrl = obj
        var objTab={ label: title, active: true }
        _addTab(objTab);
        break;         
			case 'iframe':
				var objTab={ label: title, contentEl: false, active: false };
				var iFrame=document.createElement('iframe');
				if ( options.width )  iFrame.style.width=parseInt(options.width)+'px';
				if ( options.height ) iFrame.style.height=parseInt(options.height)+'px';
				iFrame.src=obj;
				iFrame.id=divId+'_'+title;
				objTab.contentEl=iFrame;
				_addTab(objTab);
				break;
			case 'cart':
				var objTab={ label: title, contentEl: false, active: false };
				initCart();
				objTab.contentEl = $(divId+'Cart');
				_addTab(objTab);
				if( cartTabIndex == false ) cartTabIndex=tabCount;
				break;
			case 'ajax':
				var objTab={ label: title, active: false, cacheData: setCache, dataSrc: obj };
				_addTab(objTab);
				break;
			case 'form':
				var objTab={ label: title, active: false, cacheData: setCache, dataSrc: obj };
				_addTab(objTab);
				form[options.formId] = { options: { tabId: tabCount }, obj: false, sent: false };
				if ( options.blobOut ) form[options.formId].options.blobOut = true;
				if ( options.sentGif ) form[options.formId].options.sentGif = options.sentGif;
				if ( options.formCheck ) form[options.formId].options.formCheck = options.formCheck;
				break;
			case 'element':
				id=obj;
				var el = document.createElement('div');
				el.id=divId+'Tab'+tabCount;
				el.innerHTML=$(id).innerHTML;
				$(id).innerHTML='';
				var objTab={ label: title, contentEl: el, active: false };
				_addTab(objTab);
				break;
			default:
				break;
		}

		tabs[tabCount] = { index: tabCount, label: title, id: id, options: options, type: type };
		tabCount++;
	}

	function changeTab( type, title, obj, options )
	{
		var tabIndex=false;
		var tab=false;
		for ( var t=0; t<tabCount; t++ )
		{
			if ( tabs[t].label==title )
			{
				tabIndex=tabs[t].index;
				tab=tabView.getTab(tabIndex);
				break;
			}
		}

		if (  ! tab ) return;

		if ( options && options.newTitle )
		{
			tab.set('label', options.newTitle );
			tabs[tabIndex].label=options.newTitle;
		}

		switch (type)
		{
			case 'iframe':
				var iFrame = $(divId+'_'+title);
				if ( options )
				{
					if ( options && options.width  ) iFrame.style.width=parseInt(options.width)+'px';
					if ( options && options.height ) iFrame.style.height=parseInt(options.height)+'px';
				}
				if ( obj )
				{
					iFrame.src='';
					iFrame.src=obj;
				}
				break;
			case 'ajax':
				tab.set('dataSrc', obj);
				var setCache=tab.get('cacheData');
				tab.set('cacheData', false );
				break;
			case 'form':
				break;
			case 'element':
				$(tabs[t].id).innerHTML=$(divId+'Tab'+tabIndex).innerHTML;
				$(divId+'Tab'+tabIndex).innerHTML=$(obj).innerHTML;
				$(obj).innerHTML='';
				break;
			default:
				break;
		}

		tabView.set('activeTab',tab);

		if ( type == 'ajax' )
		{
			if ( options )
			{
				if ( options.cache == false ) setCache=false;
				if ( options.cache == true )  setCache=true;
			}
			tab.set('cacheData', setCache );
		}

	}

	function _addTab( objTab )
	{
		return tabView.addTab( new YAHOO.widget.Tab( objTab ));
	}

	function createTabView()
	{
		var HTML='';
		HTML+='<div id="' + divId + 'TabView" class="yui-navset" style="z-index: '+(zIndex+2)+'">';
		HTML+='  <ul class="yui-nav" style="font-size: 12px; color: #fff;"></ul>';
		HTML+='  <div class="yui-content"></div>';
		HTML+='</div>';
		_popupPanelBody += HTML;
		tabView=new YAHOO.widget.TabView(divId+'TabView', { orientation: 'top' } );
	}

	function getPopupPanelBodyHTML( HTML )
	{
		var HTML='';
		HTML += '<div style="height: 10px; overflow: hidden;"></div>';
		HTML += '<div class="titlelogo iehack" id="'+divId+'TitleLogo" style="z-index: '+(zIndex+5)+';"></div>';
		HTML += '<div class="title">' + options.title + '</div>';
		HTML += '<div style="height: 25px; overflow: hidden;"></div>';

		HTML += setPopupPanelCloseZIndex();

		return HTML;
	}

	function setPopupPanelCloseZIndex()
	{
		var HTML='';
		if ( options.close )
		{
			HTML += '<style> #' + divId + ' span.container-close { z-index: ' + zIndex+10 + '; position: absolute; right: 5px; top: 6px; } </style>';
		}
		return HTML;
	}

	function createPopup()
	{
		while ( $(divId) ) $(divId).parentNode.removeChild($(divId));
		if ( ! popupPanel )
		{
			// Modal
			var setModal=false;
			if ( options.modal ) setModal=true;

			// Shadow
			var setUnderlay='none';
			if ( options.shadow ) setUnderlay='shadow';

			// Draggable
			var setDraggable=false;
			if ( options.draggable ) setDraggable=true;

			// CloseButton
			var setClose=false;
			if ( options.close ) setClose=true;

			popupPanel = new YAHOO.widget.Panel( divId, { modal: setModal, visible:false, xy: [0,0], draggable: setDraggable, underlay: setUnderlay, close: setClose, constraintoviewport: false } );
			popupPanel.setHeader('');
			popupPanel.setBody('');
			popupPanel.render( document.body );
			popupPanel.hideEvent.subscribe(hide);
			popupPanel.dragEvent.subscribe(move);
		}
		if ( popupPanel )
		{
			setPopupOptions();
			zIndex = parseInt($D.getStyle( divId, 'z-index' ));
		}
	}

	function setPanelBody()
	{
		if (  _popupPanelBody )
		{
			popupPanel.setBody( _popupPanelBody );
			_popupPanelBody = false;
		}
	}

	function infoPanelInit()
	{
		if ( ! infoPanel )
		{
			var pos = [0,0];
			infoPanel = new YAHOO.widget.Panel( divId + 'InfoPanel', { modal: true, draggable: false, visible:false, width: '300px', zIndex: 500, underlay: 'none', xy: pos, constraintoviewport: true, close: false } );
			infoPanel.setBody('');
			infoPanel.setHeader('');
			infoPanel.render( document.body );
		}
		infoPanel.hide();
	}

	function infoPanelShow( header, body, pos )
	{
		if ( ! infoPanel ) infoPanelInit();
		if ( pos ) infoPanel.cfg.setProperty( 'xy', pos );
		infoPanel.setHeader( header );
		infoPanel.setBody( body );
		infoPanel.show();
	}

	function infoPanelHide()
	{
		if ( infoPanel ) infoPanel.hide();
	}

	function setPopupOptions()
	{
		if ( options )
		{
			// Position
			var x=0;
			var y=0;
			if ( options.top )  y=parseInt(options.top);
			if ( options.left ) x=parseInt(options.left);
			if ( x!=0 || y!=0 ) popupPanel.cfg.setProperty( 'xy', [x,y] );

			// Breite
			if ( options.width )
			{
				var width=parseInt(options.width);
				popupPanel.cfg.setProperty( 'width', (width+10)+'px' );
				popupPanel.body.style.width=width+'px';
			}

			// Hoehe
			if ( options.height )
			{
				var height=parseInt(options.height);
				popupPanel.cfg.setProperty( 'height', (height+35)+'px' );
				popupPanel.body.style.height=height+'px';
			}

			/// zIndex
			if ( options.zIndex )
			{
				var zIndex=parseInt(options.zIndex);
				popupPanel.cfg.setProperty( 'zIndex', zIndex );
			}

			// Header
			if ( options.title )
			{
				popupPanel.setHeader( options.title );
			}

			// Timeout in Sekunden
			if ( options.timeout )
			{
				var timeout=parseInt(options.timeout)*1000;
				window.setTimeout( hide, timeout );
			}
		}
	}

	function cartSend( el )
	{
		formSend('kontaktdaten', el);
	}

	function formSend( formId, el )
	{
		if ( ! form ) return false;
		if ( ! form[formId].obj )
		{
			tabView.set( 'activeTab',tabView.getTab( form[formId].options.tabId ) );
			return;
		}
		if ( ! form[formId].sent )
		{
				var checked=form[formId].obj.checkForm( form[formId].options.formCheck );
				if ( checked == true )
				{
					form[formId].obj.send();
					if (el)
					{
						if ( form[formId].options.blobOut ) blobOut.animate($E.getEvent());
						if ( form[formId].options.sentGif )	el.src=form[formId].options.sentGif;
						$E.purgeElement(el);
						el.style.cursor="default";
					}
					form[formId].sent=true;
				}
				else
				{
					tabView.set('activeTab',tabView.getTab( form[formId].options.tabId ));
					checked.focus();
					checked.className=checked.className + " Error";
				}
		}
	}

	function cartAddItem( itemId )
	{
		if ( cart )
		{
			cart.addItemId({}, itemId);
			tabView.set('activeTab',tabView.getTab(cartTabIndex));
		}
	}

	function cartAddItemNr( itemNr )
	{
		addItemEvent = { clientX: $E.getEvent().clientX, clientY: $E.getEvent().clientY };
		_cartAddItemNr( addItemEvent, {}, itemNr )
		if ( ! cart )
		{
			stopFlash();
			infoPanelShow( 'Info', 'Warenkorb wird geladen. Bitte warten.', [ addItemEvent.clientX, addItemEvent.clientY ] );
			loadCart();
			cart.onLoaded.subscribe( _cartAddItemNr, itemNr );
			return;
		}
	}

	function _cartAddItemNr( event, obj, itemNr )
	{
		if ( cart && cart.loadComplete )
		{
			infoPanelHide();
			cart.addItemNr( addItemEvent, itemNr);
			startFlash();
			return;
		}
	}

	function cartDelItem( itemId )
	{
		if ( cart )
		{
			cart.delItemId( {}, itemId);
			tabView.set('activeTab',tabView.getTab(cartTabIndex));
		}
	}

	function cartItemCount()
	{
		var count=0;
		if ( cart )
		{
			count=cart.countItems()
		}
		return count;
	}

	function show( durationItemNumber )
	{
		if ( ! popupPanel ) init();
		if ( popupPanel )
		{
			if ( ! tabView.get('activeTab') )
			{
				tabView.set( 'activeTab', tabView.getTab(0) );
			}
			setPanelBody();

			if ( true /*! formTabSet*/ )
			{
				for( var t=0; t<tabs.length; t++)
				{
					if ( ! cart && tabs[0].type == 'cart' ) loadCart();
					if ( tabs[t].type == 'form' && tabs[t].options && tabs[t].options.formId )
					{
						var tab = tabView.getTab(tabs[t].index);
						form[tabs[t].options.formId].Init = function( e, options ) { form[options.formId].obj = new IPExchange.util.Form( options.formId ); };
						tab.on( 'contentChange', form[tabs[t].options.formId].Init, tabs[t].options );
						if ( t==0 ) form[tabs[t].options.formId].Init( null, tabs[t].options );
					}
          if ( tabs[t].type == 'duration' && tabs[t].options ) 
          {
            var tab = tabView.getTab(tabs[t].index);
            tab.set('dataSrc', tabs[t].options.baseUrl + "?" + tabs[t].options.paramName + "=" + durationItemNumber );
            tab.refresh(); 
          }
          if ( tabs[t].type == 'peering' && tabs[t].options )
          {
            var tab = tabView.getTab(tabs[t].index);
            tab.set('dataSrc', tabs[t].options.baseUrl);
            tab.refresh();
          }
          
				}
				formTabSet=true;
			}
			popupPanel.show();
			if ( YAHOO.Tools.getBrowserEngine().msie ) $D.setStyle(divId+'TitleLogo','top', 5 );
			else $D.setStyle(divId+'TitleLogo','top', 25 );
			stopFlash();
		}
	}

	function hide()
	{
		if ( popupPanel )
		{
			popupPanel.hide();
			startFlash();
		}
	}

	function move(event, obj)
	{
		if ( obj && obj.length > 0 && obj[0] == 'endDrag' )
		{
			var update = false;

			var x=$D.getX( divId );
			var y=$D.getY( divId );

			var width  = parseInt($D.getStyle( divId, 'width' ));
			var height = parseInt($D.getStyle( divId, 'height' ));

			if ( x > viewport[0]-width-15 )
			{
				x=viewport[0]-width-15;
				update=true;
			}
			if ( y > viewport[1]-height-15 )
			{
				y=viewport[1]-height-15;
				update=true;
			}
			if ( x < 20 )
			{
				x=20;
				update=true;
			}
			if ( y < 20 )
			{
				y=20;
				update=true;
			}
			if ( update )	popupPanel.moveTo( x,y );
		}
	}

        function startFlash()
        {
                /*jQuery.noConflict();*/
                if(YAHOO.Tools.getBrowserEngine().msie)
                {
                        jQuery('object.content_flash').show();
                        /*jQuery('object.talker_flash').Play();*/
                }
                else
                {
                        jQuery('embed.content_flash').show();
                        /*jQuery('embed.talker_flash').Play();*/
                }
        }

        function stopFlash()
        {
                /*jQuery.noConflict();*/
                if(YAHOO.Tools.getBrowserEngine().msie)
                {
                        jQuery('object.content_flash').hide();
                        /*jQuery('object.talker_flash').StopPlay();*/
                }
                else
                {
                        jQuery('embed.content_flash').hide();
                        /*jQuery('embed.talker_flash').StopPlay();*/
                }
        }

  function setDuration( itemNumber, durationId )
  {
    var callback = { 
      success: function(o) {/*success handler code*/}, 
      failure: function(o) {/*failure handler code*/} 
    } 

    var parameter = 'screen=setDurationItem';
    parameter += '&itemNumber=' + itemNumber;
    parameter += '&durationId=' + durationId;
    
    window.location.reload();
    return YAHOO.util.Connect.asyncRequest( 'POST', '/fileadmin/cart/ajax.php', callback, parameter );
  }

	init();
	$E.on(window,'unload',unload);
}

  function setDuration( itemNumber, durationId )
    {
        var callback = {
              success: function(o) {/*success handler code*/},
                    failure: function(o) {/*failure handler code*/}
                        }

                            var parameter = 'screen=setDurationItem';
                                parameter += '&itemNumber=' + itemNumber;
                                    parameter += '&durationId=' + durationId;

                                        window.location.reload();
                                            return YAHOO.util.Connect.asyncRequest( 'POST', '/fileadmin/cart/ajax.php', callback, parameter );
                                              }

