var Popup = function(options)  {
	// properties
	this.$popup = $('<div></div>');
	this.$popupShaddow = $('<div class="popupShaddow"></div>');
	this.$popupLoading = null;
	this.popupLoadingImg = null;
	this.$popupContent = null;
	this.iframe = null;
	this.hiddenSelects = null; // for correcting IE stupidity of having selects on top of everything
	this.options = {
      	url: '#',
      	width: 300,
      	height: 300,
      	method: "get",
     	header: true,
      	center: true,
      	onLoad: null,
      	draggable: false,
      	destroyOnClose:true,
      	loadingImg: null,
      	text:'',
      	callback: null,
      	content:''
    };

	// public methods
	this.showPopup = showPopup;
	this.closePopup = closePopup;
	this.hidePopup = hidePopup;
	this.unhidePopup = unhidePopup;
	this.loadContent = loadContent;
	this.insertContent = insertContent;
	this.startLoading = startLoading;
	this.stopLoading = stopLoading;
	this.unHideSelectsUnderPopup = unHideSelectsUnderPopup;




    var options = $.extend(this.options, options || {});

	if (this.options.header) {
		var $header = $('<div class="popupHeader"><h3>'+ this.options.text +'</h3></div>');
		this.$popup.append($header);

		$el = $('<div class="popupClose"></div>');
		var parent = this;
		$el.bind('click', function(e){
			parent.closePopup();
			e.preventDefault();
		});
		$header.append($el);

		$el = $('<br clear="all"/>');
		$header.append($el);

		/* TODO
		 if (this.options.draggable) {
		    new Draggable(this.popup,{
		    	handle:$header,
				starteffect: null ,
				endeffect: null
		          	});
		}*/

		if ( options.loadingImg ) {
			this.popupLoadingImg = new Image();
			this.popupLoadingImg.src = this.options.loadingImg;

			this.$popupLoading = $('<div class="popupLoading"></div>');
			$header.append(this.$popupLoading);
		}
	}
	this.$popupContent =  $('<div class="popupContent"></div>');
	this.$popupContent.hide();
	this.$popup.append(this.$popupContent);

	//alert(this.$popupShaddow);
	//$(body).append(this.$popupShaddow);

	$('body').append(this.$popup);
	$('body').append(this.$popupShaddow);

	this.showPopup();
	if(this.options.url != "#"){
		this.loadContent();
	}
	else{
		this.insertContent();
	}


	/////////////////////////////////////////////////////////////////////
	//////////////         method implementation           //////////////
	/////////////////////////////////////////////////////////////////////

	function showPopup() {	//old: show()

		this.$popup.css({width: this.options.width+'px',height: this.options.height+'px'});
		this.$popupShaddow.css({width: (this.options.width+15)+'px',height: (this.options.height+21)+'px'});

	  	if (this.options.center) {
			this.$popup.addClass("popup");

			//xOffset = window.pageXOffset ? window.pageXOffset : 0;
			//yOffset = window.pageYOffset ? window.pageYOffset : 0;
			
			var xOffset = 0, scrOfY = 0;
			  
			if( typeof( window.pageYOffset ) == 'number' ) {
				//Netscape compliant
				yOffset = window.pageYOffset;
			    xOffset = window.pageXOffset;
			} else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
			    //DOM compliant
				yOffset = document.body.scrollTop;
			    xOffset = document.body.scrollLeft;
			} else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
			    //IE6 standards compliant mode
				yOffset = document.documentElement.scrollTop;
			    xOffset = document.documentElement.scrollLeft;
			}

			if (document.documentElement && document.documentElement.clientWidth) {
				frameWidth = document.documentElement.clientWidth;
				frameHeight = document.documentElement.clientHeight;
			} else if (document.body) {
				frameWidth = document.body.clientWidth;
				frameHeight = document.body.clientHeight;
			}

			this.$popup.css({left:(xOffset + (frameWidth - this.options.width)/2) + 'px',
							 top: (yOffset + (frameHeight - this.options.height)/2) + 'px'});

			var shaddowPosTop = parseInt(this.$popup.css("top"))-1;
			var shaddowPosLeft = parseInt(this.$popup.css("left"))-1;

			this.$popupShaddow.css({left: shaddowPosLeft + 'px',
				 top: shaddowPosTop + 'px'});
	  	}


	  	// are you a stupid user using Internet Explorer?
	  	if (this.$popup.getClientRects) {
	  		this.hideSelectsUnderPopup();
	  	}
		this.$popup.show();
//		this.$popupShaddow.show = this.$popup.show;
//		this.$popupS.show();
	}
	function hightlightMsg(){
		//$(".messagesList table tr td").css('background-color','red');
	}
	/*
	hideSelectsUnderPopup: function() {
		this.hiddenSelects = new Array();
  		var windowScrollY = 0;
		var windowScrollX = 0;
		if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
			windowScrollY = document.body.scrollTop;
			windowScrollX = document.body.scrollLeft;
		}
		var selectBoxes = document.getElementsByTagName('select');
		var left = parseInt(this.popup.style.left, 10) - windowScrollX;
		var top = parseInt(this.popup.style.top, 10) - windowScrollY;
		//alert('Y: '+windowScrollY+'| X: '+windowScrollX+' | top: '+ top+' | parsedTop: '+parseInt(this.popup.style.top, 10));
		var right = left + this.options.width;
		var bottom = top + this.options.height;
		for (var i = 0; i < selectBoxes.length; i++) {
			if (selectBoxes[i].getClientRects) {
				var rects = selectBoxes[i].getClientRects();
				for (var j = 0; j < rects.length; j++) {
					if (rects[j].top < bottom
						&& top < rects[j].bottom
						&& rects[j].left < right
						&& left < rects[j].right && selectBoxes[i].style.visibility != 'hidden') {
							selectBoxes[i].style.visibility = 'hidden';
							this.hiddenSelects[this.hiddenSelects.length] = selectBoxes[i];
							break;
					}
				}
			}
		}
	},
	*/
	function unHideSelectsUnderPopup(){
		if (this.hiddenSelects) {
			for (var i = 0; i < this.hiddenSelects.length; i++) {
	   			this.hiddenSelects[i].style.visibility = 'visible';
			}
		}
	}
	function closePopup() {
		if ( this.options.destroyOnClose ) {
			this.$popup.remove();
			this.$popupShaddow.remove();
			this.$popup = null;
		} else {
			this.$popup.hide();
			this.$popupShaddow.hide();
		}

		this.unHideSelectsUnderPopup();
	}

	function unhidePopup(){
		this.$popup.show();
		this.$popupShaddow.show();
	}

	function hidePopup(){
		this.$popup.hide();
		this.$popupShaddow.hide();
	}


	function loadContent(url) {
		var $me = this.$popupContent;
		var parent = this;
		this.startLoading();
		var options = this.options;
		$.ajax({
			url:url || this.options.url,
			type: this.options.method,
			success: function(data){
				$me.html(data).show();

				parent.stopLoading();
				if (parent.options.onLoad) {
					parent.options.onLoad();
				}
		  		// gemius
				options.callback();
			},
			error: function(data){
				this.stopLoading();
				alert('errorLoading:'+data);
			}
		});
	}
	function insertContent(content) {
		var $me = this.$popupContent;

		var options = this.options;
		var data = content || this.options.content;

		$me.html(data).show();

		if(options.callback){
			options.callback();
		}
	}
	function startLoading() {
		if (this.$popupLoading && this.popupLoadingImg) {
			this.$popupLoading.append(this.popupLoadingImg);
		}
	}
	function stopLoading() {
		if (this.$popupLoading) {
			this.$popupLoading.html('');
		}
	}


	/*realScrolled: function() {
		var x,y;
		if (self.pageYOffset) // all except Explorer
		{
			x = self.pageXOffset;
			y = self.pageYOffset;
		}
		else if (document.documentElement && document.documentElement.scrollTop)
			// Explorer 6 Strict
		{
			x = document.documentElement.scrollLeft;
			y = document.documentElement.scrollTop;
		}
		else if (document.body) // all other Explorers
		{
			x = document.body.scrollLeft;
			y = document.body.scrollTop;
		}
		return [x, y];
	}*/
}
