var dc_Popup = function(triggers, settings)
				{
					this.settings = jQuery.extend({
												  popupIframeName: 'dc_PopupIframe',
												  popupWidth: 400,
												  popupHeight: 300,
												  popupLeft: 'viewportCenter',
												  popupTop: 'viewportCenter',
												  popupBackground: 'transparent', 
  												  popupDefaultSrc: '',
												  
												  popupCloseButtonID: 'dc_PopupCloseButton',
												  showCloseButton: true,
												  
												  waitPopupID: 'dc_PopupWaitMessage',
												  popupMaskID: 'dc_ViewportMask',
												  showPopupMask: true,
												  
												  filterAndFormatContent: function(popupIframeName){return false}, // function for filtering and formatting content
												  							
												  popupParentNode: jQuery('body'),
												  
												  triggerDynamicClass: 'dc_PopupTrigger',
												  triggerSelectionClass: 'selected',
												  disabledElementsClass: 'disabledByPopup'
												 
											 },
											 settings);
					
					this.dc_PopupContent = null;
					this.dc_Triggers = triggers;
					this.dc_PopupWaitMessage = null;
					this.dc_PopupMask = null;
					this.dc_PopupCloseButton = null;
					this.displayed = false;
												
					this.init = function()
									{
										this.dc_Triggers
												.css('visibility', 'hidden')  // hide triggers
												.attr('target', dcp.settings.popupIframeName) // target triggers to open inside IFRAME
												.click(function()
													{
														var dc_Trigger = jQuery(this);
														
														dcp.off(); // hide any previously opened popups
														
														// add "selected" state to the trigger clicked on
														dc_Trigger.addClass(dcp.settings.triggerSelectionClass);
														
														dcp.create(); // create popup and popup dependencies
														dcp.standBy(); // display 'please wait' message
														dcp.dc_PopupContent.load(function()
																					{ // show popup when loaded
																						dcp.on();
																						 // show popup close button
																						 if (dcp.settings.showCloseButton)
																							dcp.dc_PopupCloseButton.show();
																					});
													})
												.css('visibility', 'visible') // show triggers
												.addClass(dcp.settings.triggerDynamicClass)
									}
					this.create = function()
									{	
										 // create the IFRAME popup
										dcp.dc_PopupContent = jQuery.dc_PopupIframe(dcp.settings);
										
										
										 // create the close button
										 if (dcp.settings.showCloseButton)
										 {
											dcp.dc_PopupCloseButton = jQuery.dc_PopupCloseBtn(jQuery.extend(
																									dcp.settings,
																									{whenClicked: function()
																													{
																														try{window.customPopups[dcp.settings.popupIframeName].off()}
																													catch(err){}}
																												})
																							 );
										 }
										 
										 // create the viewport mask
										if (dcp.settings.showPopupMask)
										{
											dcp.dc_PopupMask = jQuery.dc_ViewportMask(jQuery.extend(
																							dcp.settings,
																							{whenClicked: function()
																											{
																												try{window.customPopups[dcp.settings.popupIframeName].off()}
																												catch(err){}}
																											})
																						 );
										}

										 // create the wait popup
										dcp.dc_PopupWaitMessage = jQuery.dc_WaitPopup(dcp.settings);
									}
					
					this.standBy = function()
									{
										// show viewport mask
										if (dcp.settings.showPopupMask)
											dcp.dc_PopupMask.show();
										
										// show wait popup
										dcp.dc_PopupWaitMessage.show();
									}
									
					this.on = function()
								{	
									// hide wait popup		
									dcp.dc_PopupWaitMessage.hide();
									
									 // show popup
									dcp.dc_PopupContent.show();
									
									dcp.displayed = true;
								}
								
					this.off = function()
								{
									// remove selection class from the trigger
									jQuery('.' + dcp.settings.triggerDynamicClass)
									 	.removeClass(dcp.settings.triggerSelectionClass);
									
									// remove popup and popup dependencies
									 jQuery('iframe[name=' + dcp.settings.popupIframeName + ']')
										.add('[rel=' + dcp.settings.popupIframeName + ']')
										.remove();
									
									// make elements disabled by popup visible
									jQuery('.'+ dcp.settings.disabledElementsClass)
										.removeClass(dcp.settings.disabledElementsClass)
										.css('visibility', 'visible');
									
									dcp.displayed = false;
								}
					
					var dcp = this; // dcp: dynamic content popup
					dcp.init();
					
					return dcp;
				}
				
jQuery.extend(window, dc_Popup);