
	UMG.FrameLoader = function() {
		var private = {

			url			: null,

			width		: null,
			height		: null,

			title		: null,

			xPos		: null,
			yPos		: null,

			xPosReal	: null,
			yPosReal 	: null,

			movingTrigger 		: false,
			mouseDownPosition	: 0,
			diffX				: 0,
			diffY				: 0,

			getMousePosition: function (e) {
				if(!e) e = window.event;

				xPos = 0;
				yPos = 0;

				if(e.pageX) {
					xPos = e.pageX;
					yPos = e.pageY;
				}
				else if(e.clientX) {
					scrollOffset = document.viewport.getScrollOffsets()
					xPos = e.clientX + scrollOffset.left;
					yPos = e.clientY + scrollOffset.top;
				}

				var pos = new Object({
					'left':xPos,
					'top':yPos
				});

				return(pos);
			},

			initMouseDown: function(e, type) {								
				private.movingTrigger = false;
				
				if(type == 'moving') {
					private.movingTrigger = true;
				}

				private.mouseDownPosition = private.getMousePosition(e);

				var pos = UMG.getElementPosition($('popup-layer-mouse-window'));

				private.diffX = private.mouseDownPosition.left - pos.left;
				private.diffY = private.mouseDownPosition.top - pos.top;
				
				$('popup-layer-mouse-frame-locker').setStyle({
					'left'	: '0',
					'top'	: $('popup-layer-mouse-navigation').getHeight() + 'px',
					'width'	: private.width + 'px',
					'height': private.height + 'px'
				});
				if($('popup-layer-mouse-frame-locker')) {
					$('popup-layer-mouse-frame-locker').show();
					$('popup-layer-mouse-frame-locker').setOpacity(0.45);
				}
				
				document.body.onSelectStart = private.noSelect;
				
				document.observe("mousemove", private.move);
				document.observe("mouseup",   private.cancelMouseDown);
				document.observe("selectstart", private.noSelect);
			},

			cancelMouseDown: function(type) {
				private.movingTrigger = false;

				document.body.onSelectStart = null;
				
				document.stopObserving("mousemove", private.move);
				document.stopObserving("mouseup",   private.cancelMouseDown);
				document.stopObserving("selectstart", private.noSelect);
				
				if($('popup-layer-mouse-frame-locker')) {
					$('popup-layer-mouse-frame-locker').setOpacity(1);
					$('popup-layer-mouse-frame-locker').hide();
				}
			},
			
			noSelect: function() {
				
				return(false);
			},

			move: function(e) {
				if(!e) e = window.event;
				if(private.movingTrigger) {
					
					$('popup-layer-mouse-window').focus();
					
					$('popup-layer-mouse-window').style.left = (private.getMousePosition(e).left - private.diffX) + 'px';
					$('popup-layer-mouse-window').style.top = (private.getMousePosition(e).top - private.diffY) + 'px';

					if (UMG.checkBrowserName('MSIE')) {
					    e.cancelBubble = true;
					    e.returnValue = false;
					}
					else {
						e.preventDefault();
					}
				}
			},

			clear: function () {
				private.url 				= null;
				private.imageUrl			= null;
				private.width 				= null;
				private.height 				= null;
				private.title 				= null;
				private.xPos 				= null;
				private.yPos 				= null;
				private.xPosReal 			= null;
				private.yPosReal 			= null;
				private.movingTrigger 		= false;
				private.mouseDownPosition 	= 0;
				private.diffX 				= 0;
				private.diffY 				= 0;
			},

			getPageSize: function(){

			var xScroll, yScroll;

			if (window.innerHeight && window.scrollMaxY) {
				xScroll = window.innerWidth + window.scrollMaxX;
				yScroll = window.innerHeight + window.scrollMaxY;
			} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
				xScroll = document.body.scrollWidth;
				yScroll = document.body.scrollHeight;
			} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
				xScroll = document.body.offsetWidth;
				yScroll = document.body.offsetHeight;
			}

			var windowWidth, windowHeight;

			if (self.innerHeight) {	// all except Explorer
				if(document.documentElement.clientWidth){
					windowWidth = document.documentElement.clientWidth;
				} else {
					windowWidth = self.innerWidth;
				}
				windowHeight = self.innerHeight;
			} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
				windowWidth = document.documentElement.clientWidth;
				windowHeight = document.documentElement.clientHeight;
			} else if (document.body) { // other Explorers
				windowWidth = document.body.clientWidth;
				windowHeight = document.body.clientHeight;
			}

			// for small pages with total height less then height of the viewport
			if(yScroll < windowHeight){
				pageHeight = windowHeight;
			} else {
				pageHeight = yScroll;
			}

			// for small pages with total width less then width of the viewport
			if(xScroll < windowWidth){
				pageWidth = xScroll;
			} else {
				pageWidth = windowWidth;
			}

			arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight)
			return arrayPageSize;
		}

		};

		var public = {

			show: function (e, url, width, height, title, opacity, xx, yy) {

				private.clear();

				/* GET MOUSEPOSITION */
				if(!e) e = window.event;

				if (typeof e != 'undefined'){
                    if(e.pageX) {
                        private.xPos = e.pageX;
                        private.yPos = e.pageY;
                    }
                    else if(e.clientX) {
                        scrollOffset = document.viewport.getScrollOffsets()
                        private.xPos = e.clientX + scrollOffset.left;
                        private.yPos = e.clientY + scrollOffset.top;
                    }    
                } else {
                    private.xPos = 0;
                    private.yPos = 0;
                }
				if (!isNaN(opacity) ) {
					var opacitylevel = parseFloat(opacity);
					opacitylevel = (opacitylevel / 100);

					if (opacitylevel>0) {
						this.startOverlay(opacitylevel);
					} 
					
				}

				/* DO WE HAVE A URL? */
				if(url != "") {
					
					/* GET DATA */
					private.url 		= url;
					
					private.width 		= width;
					private.height 		= height;

					if(title != "") {
						private.title = unescape(title);
					}
					else {
						private.title = '';
					}

					/* INIT LAYER */

						/* _layer */
						_layer = new Element('div', {
							'id'		: 'popup-layer-mouse-window',
							'class'		: 'popup-layer-mouse-window',
							'display'	: 'none'
						});
						_layer.setStyle({
							'position'			: 'absolute'
						});

						/* _container */
						_container = new Element('div', {
							'id'		: 'popup-layer-mouse-container'
						});

							/* _navigation */
							_navigation = new Element('div', {
								'id'	: 'popup-layer-mouse-navigation',
								'class'	: 'popup-layer-mouse-navigation'
							});
							_navigation.setStyle({
							  	'width'				: private.width+'px'
							});
							_navigation.observe('mousedown', function (e) {private.initMouseDown(e, 'moving')}, true);

							/* _title */
							_title = new Element('div', {
								'id'	: 'popup-layer-mouse-navigation-title',
								'class'	: 'popup-layer-mouse-navigation-title'
							});
							_title.update(private.title);
							
							/* _button */
							_button = new Element('div', {
								'id'	: 'popup-layer-mouse-navigation-button',
								'class'	: 'popup-layer-mouse-navigation-button'
							});
							_button.observe('click', function () {
								$('popup-layer-mouse-window').remove();
								if ($('overlay')) {
									$('overlay').remove();
								}
								private.cancelMouseDown();
							}, false );
							
							/* _navigation */
							_line = new Element('div', {
								'id'	: 'popup-layer-mouse-line',
								'class'	: 'popup-layer-mouse-line'
							});
							_line.setStyle({
							  	'width'	: private.width+'px'
							});

							/* _iframe */
							_iframe = '<iframe src="" id="popup-layer-mouse-frame" class="popup-layer-mouse-frame" scrolling="no" frameborder="" border="" framespacing="" marginheight="" marginwidth="" width="'+private.width+'" height="'+private.height+'"></iframe>';
							_iframeHolder = new Element('div', {'style' : 'z-index:998;'});
							_iframeHolder.update(_iframe);
							
							/* _locker */
							_locker = new Element('div', {
								'id'			: 'popup-layer-mouse-frame-locker',
								'class' 		: 'popup-layer-mouse-frame-locker',
								'style'			: 'display:none;position:absolute;left:0px;top:0px;'
							});
							
						/* structure */
						_navigation.appendChild(_title);
						_navigation.appendChild(_button);
						_navigation.appendChild(_line);

						_container.appendChild(_navigation);
						_container.appendChild(_iframeHolder);
						_container.appendChild(_locker);
						
						_layer.appendChild(_container);

					if($('popup-layer-mouse-window')) {
						$('popup-layer-mouse-window').remove();
					}

					/* BRING ON SITE */
					document.body.appendChild(_layer);
					$('popup-layer-mouse-window').show();		

					/* GET DIMENSIONS */
					scrollOffset = document.viewport.getScrollOffsets();
					
					visibleWidth = 0;
					visibleHeight = 0;
					
					if(window.innerHeight && window.innerWidth) {
						
						visibleWidth = window.innerWidth;
						visibleHeight = window.innerHeight;
					}
					else if(document.body.clientHeight && document.body.clientWidth) {
						
						visibleWidth = document.body.clientWidth;
						visibleHeight = document.body.clientHeight;
					}
																	
					/* LEFT OR RIGHT STYLE */
					if( (scrollOffset.left + parseInt(visibleWidth)) < (private.xPos + parseInt($('popup-layer-mouse-container').getWidth())) ) {
						if((private.xPos - parseInt($('popup-layer-mouse-container').getWidth()) - 15) < 0) {
							
							private.xPosReal = 0;
						}
						else {
						
							private.xPosReal = (private.xPos - parseInt($('popup-layer-mouse-container').getWidth())) - 15;
						}
					}
					else {
						private.xPosReal = private.xPos + 15;
					}
					
					/* UP OR DOWN STYLE */
					if( (scrollOffset.top + parseInt(visibleHeight)) < (private.yPos + parseInt($('popup-layer-mouse-container').getHeight()) ) ) {
						if((private.yPos - parseInt($('popup-layer-mouse-container').getHeight()) - 15) < 0) {
							
							private.yPosReal = 0;
						}
						else {
						
							private.yPosReal =  (private.yPos - parseInt($('popup-layer-mouse-container').getHeight())) - 15;
						}
					}
					else {
						private.yPosReal = private.yPos + 15;
					}
					
					$('popup-layer-mouse-window').setStyle({
						'width'				: parseInt($('popup-layer-mouse-container').getWidth()) + 'px',
						'height'			: parseInt($('popup-layer-mouse-container').getHeight()) + 'px',
						'left'				: (!isNaN(xx) ? xx : private.xPosReal) + 'px',
						'top'				: (!isNaN(yy) ? yy : private.yPosReal) + 'px'
					});

					$('popup-layer-mouse-frame').src = private.url;
					
					// REPAINT ELEMENTS										
					window.setTimeout(function() {
						$('popup-layer-mouse-window').addClassName('repaint');
						$('popup-layer-mouse-navigation').addClassName('repaint');
						$('popup-layer-mouse-navigation-title').addClassName('repaint');
						$('popup-layer-mouse-navigation-button').addClassName('repaint');
						$('popup-layer-mouse-line').addClassName('repaint');
						$('popup-layer-mouse-frame-locker').addClassName('repaint');
							
						$('popup-layer-mouse-window').removeClassName('repaint');
						$('popup-layer-mouse-navigation').removeClassName('repaint');
						$('popup-layer-mouse-navigation-title').removeClassName('repaint');
						$('popup-layer-mouse-navigation-button').removeClassName('repaint');
						$('popup-layer-mouse-line').removeClassName('repaint');
						$('popup-layer-mouse-frame-locker').removeClassName('repaint');
												
						$('popup-layer-mouse-frame').src = private.url;
					}, 222);
					
				}
			},

			hide: function() {
				$('popup-layer-mouse-window').hide();
				$('popup-layer-mouse-window').remove();
			},

			startOverlay: function(opacitylevel) {
				var objBody = document.body;
				if (!opacitylevel) opacitylevel = 0.6;

				var alreadyExists = false;
				if($('overlay')) {
					alreadyExists = true;
				}
				if(alreadyExists) {
					$('overlay').remove();
				}

				var objOverlayLayer = document.createElement("div");
				objOverlayLayer.setAttribute('id','overlay');
				objOverlayLayer.style.display = 'none';
				//objOverlayLayer.onclick = function() { $('overlay').hide() }
				objOverlayLayer.style.backgroundColor = 'rgb(0,0,0)';
				objOverlayLayer.style.position = 'absolute';
				objOverlayLayer.style.top = '0px';
				objOverlayLayer.style.left = '0px';
				objOverlayLayer.zIndex = 1;
				objBody.appendChild(objOverlayLayer);

				var arrayPageSize = private.getPageSize();

				$('overlay').style.width = arrayPageSize[0] + 'px';
				$('overlay').style.height = arrayPageSize[1] + 'px';

				if(!alreadyExists) {
					$('overlay').show();
					$('overlay').setOpacity(opacitylevel);
				}
				else {
					$('overlay').show();
					$('overlay').setOpacity(opacitylevel);
				}

				window.onresize = function () {
					if($('overlay')) {
						public.startOverlay(opacitylevel);
					}
				};
			}
		}

	return public;
	}();