var Weblogix = Class.create({

  initialize: function() {

	var self = this;
	
	document.observe("dom:loaded", function() {
		self.lightbox.observe();
	});


  },
  
  dimensions: {
  	
  	getDocumentSize: function() {

		if (window.innerHeight && window.scrollMaxY) {// Firefox
			yWithScroll = window.innerHeight + window.scrollMaxY;
			xWithScroll = window.innerWidth + window.scrollMaxX - 15;
		} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
			yWithScroll = document.body.scrollHeight;
			xWithScroll = document.body.scrollWidth;
		} else { // works in Explorer 6 Strict, Mozilla (not FF) and Safari
			yWithScroll = document.body.offsetHeight;
			xWithScroll = document.body.offsetWidth;
		}

		var dimensions = [];
		dimensions['height'] = yWithScroll;
		dimensions['width'] = xWithScroll;
		
		return dimensions;
		
	},
	//
	// Maxmimizes an object to the size of the document
	//
  	maximizeToDocument: function(object) {
			
		var width = null;
		var height = null;
		
/*
		width = document.body.getWidth();
		height = document.body.getHeight();

*/
		width = weblogix.dimensions.getDocumentSize()['width'];
		height = weblogix.dimensions.getDocumentSize()['height'];
		
/*
		width = document.viewport.getDimensions()['width'];
		height = document.viewport.getDimensions()['height']; 

*/			
		$(object).setStyle({
			width: width + 'px',
			height: height + 'px'
		});


  	
  	},
  	
  	centerToPage: function(object) {

  		var objectDimensions = $(object).getDimensions();

  		var popupWidth = objectDimensions['width'];
  		var popupHeight = objectDimensions['height'];
  		
  		var pageWidth = this.getDocumentSize()['width'];
  		var pageHeight = this.getDocumentSize()['height'];

		var offsetTop = document.viewport.getScrollOffsets()['top'] * 1;
		var offsetLeft = document.viewport.getScrollOffsets()['left'] * 1;
		
		var marginHorizontal = offsetLeft + (document.viewport.getWidth() / 2) - (popupWidth / 2);
		var marginVertical = offsetTop + (document.viewport.getHeight() / 2) - (popupHeight / 2);
		
		$(object).setStyle({
			left: marginHorizontal + 'px',
			top: marginVertical + 'px'
		});		
		
  	
  	}
  	
  
  },
  //
  // Ajax Updater - Beefed up version of Ajax.Updater - with Loader animation
  //
  Updater: function(id_name, url, options) {

	$(id_name).update(''); // clear containers before we populate it

    this.options = {
      parameters: '',
	  method: 'get',
	  animate: false,
	  asynchronous: true,
	  loaderEnabled: true,
	  loaderClass: 'ajaxLoader',
	  loaderBackground: '/images/ajax-loader.gif',
	  loaderText: '',
	  onComplete: ''
    }

    Object.extend(this.options, options || {});
	$(id_name).style.display = 'none'; // Hide destination div
	$(id_name).update('');

	if(this.options.loaderEnabled == true) {

		$(id_name).update(''); // Clear destination div
		var div = $(document.createElement('div')); // Create ajaxloader div

		$(id_name).appendChild(div);

		div.className = this.options.loaderClass; // attach classname incase background is defined

		var container_height = $(id_name).ancestors()[0].getDimensions(); //expand ajaxloader to size of parent

		div.setStyle({
			float: 'left',
			width: '100%',
			height: '100%',
			lineHeight: container_height['height'] + 'px',
			textAlign: 'center',
			fontSize: '14px'
		});

		if (div.style.background == '' || div.style.background == 'none')

		div.setStyle({
			background: 'url(' + this.options.loaderBackground + ') no-repeat',
			backgroundPosition: '50% 50%'
		})
		

		if(this.options.loaderText.length > 1) // Appender loader text, if specified
			div.update(this.options.loaderText);
				
			div.className = this.options.loaderClass; // re-attach classname to overwrite default values above


	}
	
	if(this.options.animate == true) {
		Effect.Appear(id_name,{duration: 0.35, queue: 'front'});
	
	} else {

		Element.show(id_name);	
	}

	var self = this;
	
	new Ajax.Updater(id_name, url, {
		method: this.options.method, 
		evalScripts: true, 
		parameters: this.options.parameters, 
		asynchronous: this.options.asynchronous, 
		onComplete: self.options.onComplete
	});
	
  },

  submitAJAXform: function(form_id, target) {

  				var formParameters = $(form_id).serialize();
				var url = $(form_id).readAttribute('action');
				var method = $(form_id).readAttribute('method');				
				weblogix.Updater(target, url, { method: method, parameters: formParameters, evalScripts: true});
  
  },

  
  //
  //  Lightbox popup
  //
  lightbox: {

  		defaults: {
  			popup_id: 'lightBox',  // popup_id should be null.  Open function will fill in value
  			updateTargetID: 'container', // the actual ID that contains the data
			url: '/',
			parameters: '',
			width: '400px',
			height: '400px',
			offsetTop: 0,
			fromTop: 0,
			toolset: true,
			toolsetID: 'toolset',
			popupClassName: 'ajaxPopup',
			popupBgColor: '#fff',
			popupOverflow: 'auto',
			popupAnimate: false,
			popupDuration: null,
			popupFPS: 60,
			popupClickClose: false,
			popupDraggable: false,
			popupDraggableID: 'dragHandle',
			popupDraggableBox: false,
			popupDraggableText: '(drag)',
			showCloseLink: true,
			closeOnESC: true,
			closeLinkClass: 'closelink', // Class used to trigger close event
			closeLinkID: 'linkClose',
			closeLinkText: 'Close',
			bgdivID: 'pageOverlay',
			bgAnimate: false,
			bgDuration: 0.1,
			bgClassName: '',  //Class overwrites styles
			bgOpacity: 0.4,
			bgColor: '#000',
			bgClickClose: true,
			bgOverlay: true,
			onComplete: '',
			popupRel: 'weblogixLightbox',
			iframe: false,
			closeTimeout: false,
			loaderEnabled: true,
			loaderClass: 'ajaxLoader',
			loaderBackground: '/images/ajax-loader.gif',
			loaderText: 'loading'
  		},
  		
  		options: function() {
  		
  			Object.extend(this.options, this.defaults || {}); // copies options from defaults
  		
  		},
  		
  		open: function (popup_id, options) {	

			this.options();
  			Object.extend(this.options, options || {});
			
			if(popup_id == '' || popup_id == undefined){

				popup_id = this.options.popup_id;

			}
			this.options.popup_id = popup_id;
  			
  			
  			//
  			// Create Background Overlay - BOF 
  			//

			if(this.options.bgOverlay == true) {
		
				var div = $(document.createElement('div'));
				div.id = this.options.bgdivID;
				document.body.appendChild(div);
				$(this.options.bgdivID).setStyle({
					display: 'none',
					position: 'absolute',
					left: '0',
					top: '0',
					backgroundColor: this.options.bgColor,
					zIndex: '100000'
				});

				$(this.options.bgdivID).setOpacity(this.options.bgOpacity);

				weblogix.dimensions.maximizeToDocument(this.options.bgdivID); // maximize background

				if (this.options.bgClassName != '') {
		
					$(this.options.bgdivID).className = this.options.bgClassName;
				}
		

				if (this.options.bgAnimate == true) {

 					Effect.Appear(this.options.bgdivID,{ duration: this.options.bgDuration, to: this.options.bgOpacity, queue: 'front'});

				
				} else {
				
					Element.show(this.options.bgdivID);
				
				}
				
			}

			var self = this;

			//
			// Attach event observer to Background Overlay - BOF
			//
			
			// Close onclick (background)
			if(this.options.bgdivID != undefined && this.options.bgClickClose == true) {

				Event.observe(this.options.bgdivID,'click',function(e){

					self.close();
					Event.stop(e);

				})
			
			}  	

			// Close on press ESC
			if(this.options.closeOnESC == true) {

				Event.observe(document,'keyup',function(f){
	
				  if (f.keyCode == Event.KEY_ESC && $(self.options.bgdivID))
					self.close();
					Event.stop(f);
	
	
				})
			
			
			}
			// Resize background on window resize
			Event.observe(window,'resize',function(){ 		
				weblogix.dimensions.maximizeToDocument(self.options.bgdivID); // maximize background
				weblogix.dimensions.centerToPage(popup_id); // center
							
			})
			


			// Create popup - BOF
			var div = $(document.createElement('div'));
			document.body.appendChild(div);

			div.id = popup_id; // attach ID - primarily to retrieve dimensions (override)
			$(popup_id).className = div.id.className + ' ' + this.options.popupClassName; // attach class - primarily to retrieve dimensions (override)

			
			// Let CSS override size for popup size
			// check that the popup id width is not equal to the screen width - which happens if the display is equal to block
			//			
			if(($(popup_id).getDimensions()['width'] * 1) > 5 && document.viewport.getWidth() != $(popup_id).getDimensions()['width']) {
				this.options.width = $(popup_id).getDimensions()['width'] + 'px';
			}

			if(($(popup_id).getDimensions()['height'] * 1)> 5) {
				this.options.height = $(popup_id).getDimensions()['height'] + 'px';
			}
			
			$(div.id).setStyle({
				display: 'none',
				position: 'absolute',
				left: '0',
				top: '0',
				background: this.options.popupBgColor,
				height: this.options.height,
				width: this.options.width, 
				zIndex: '200000'
			});

//			$(popup_id).className = $(popup_id).className + ' ' + this.options.popupClassName;

			weblogix.dimensions.centerToPage(popup_id);
			
			if(this.options.popupClickClose == true) {

				$(popup_id).writeAttribute('onclick','weblogix.lightbox.close(this.id)')
				
			}
			
			// Populate Popup ID - BOF
			
			
			//
			// Create Toolset Buttons
			//
			if(this.options.toolset == true) {
				$(popup_id).update('<div id="' + this.options.toolsetID + '" style="display: block; cursor: pointer"></div>');
	
				// create close button
				if (this.options.showCloseLink == true) {
	
					new Insertion.Bottom(this.options.toolsetID, '<a id="' + this.options.closeLinkID + '" class="' + this.options.closeLinkClass + '">' + this.options.closeLinkText + '</a>');
					
					$(this.options.closeLinkID).writeAttribute('onclick','weblogix.lightbox.close(this.ancestors()[0].id)')
				}
			}
			

			/// create draggable button
			if (this.options.popupDraggable == true) {
			
				new Insertion.Bottom(this.options.toolsetID, '<div id="' + this.options.popupDraggableID + '">' + this.options.popupDraggableText + '</div>');
			
				if(this.options.popupDraggableBox) {
				
					var mydrag = new Draggable(popup_id, {scroll: window})			
				
				} else {
				
					var mydrag = new Draggable(popup_id, {handle: this.options.popupDraggableID, scroll: window})
								
				}

				


				
			}
			
			

			
			/*
			* Create "Container" element, which holds ALL data
			*/
			
			var updateTarget = this.options.updateTargetID;	
				var div = $(document.createElement('div'));
				div.id = updateTarget;
				$(popup_id).appendChild(div);

				
/*
				$(updateTarget).setStyle({
					float: 'left',
					height: this.options.height,
					width: this.options.width,
					overflow: this.options.popupOverflow
				});
*/

				$(updateTarget).setStyle({
					float: 'left',
					height: this.options.height,
					width: this.options.width,
					overflow: this.options.popupOverflow
				});


				$(updateTarget).update(''); //clear container before populating				


				if(this.options.loaderEnabled == true) {

					$(updateTarget).setStyle({
						background: 'url(' + this.options.loaderBackground + ') no-repeat',
						backgroundPosition: '50% 50%'
					});
					
					if(this.options.loaderText.length > 1) // Appender loader text, if specified
						div.update(this.options.loaderText);
						
					div.className = this.options.loaderClass; // re-attach classname to overwrite default values above
				
				
				}



			if(this.options.iframe == false) {
			
				if (this.options.url.include('http') == false) {

					this.options.iframe = true;
				
				} else {

					this.options.iframe = false;
				
				}			
			}



			
			if (this.options.iframe == true) {

				// we append hostname if not included
				
				if (this.options.url.include('http') == false) {
				
					this.options.url = 'http://' + window.location.hostname + this.options.url;
				
				}
				

				//
				// URL is external - loading iframe window.location.hostname


				var div = $(document.createElement('iframe'));

				div.setStyle({
					height: this.options.height,
					width: this.options.width,
					border: 'none'
				});

				div.writeAttribute('frameborder','0');
				div.writeAttribute('marginheight','0');
				div.writeAttribute('marginwidth','0');
				
				
				div.src = this.options.url;

				$(updateTarget).hide();
				$(updateTarget).update(''); //clear container before populating	
				$(updateTarget).appendChild(div);

				Effect.Appear(updateTarget,{ duration: this.options.popupDuration, fps: this.options.popupFPS, queue: 'back'});
				
			
			} else {

				// we append hostname if not included
				
				if (this.options.url.include('http') == false) {
				
					this.options.url = 'http://' + window.location.hostname + this.options.url;
				
				}
				
				//
				// URL is internal - loading inside div
				//

				$(updateTarget).setStyle({
					background: this.options.popupBgColor
				});				
				
				var self = this;

				weblogix.Updater(updateTarget, this.options.url, {parameters: this.options.parameters, onComplete: function(){

					//
					// Observe content for close links
					//
					var paras = $$('[rel="cancelPopup"]', '[rel="closePopup"]','.cancelPopup', '.closePopup');
					paras.each(function(instance){
		
						if (instance.rel == 'cancelPopup' || instance.className == 'cancelPopup') {
							
							instance.observe('click', function(e) { 
								self.close();
								Event.stop(e);
							 } );
						}				
					});
			
				}});
			
			}
			

			// Show Popup		
			
			if (this.options.popupAnimate == true) {
				
				if (this.options.popupDuration > 0 && this.options.popupFPS > 0) {
				
					Effect.Appear(popup_id,{ duration: this.options.popupDuration, fps: this.options.popupFPS, queue: 'back'});
				
				} else if(this.options.popupDuration > 0) {
				
					Effect.Appear(popup_id,{ duration: this.options.popupDuration, queue: 'back'});
				
				} else if (this.options.popupFPS > 0) {
					
					Effect.Appear(popup_id,{ fps: this.options.popupFPS ,queue: 'back'});
				
				} else {
				
					Effect.Appear(popup_id,{ queue: 'back'});
				
				}
				
			
			} else {
			
				Element.show(popup_id);
			
			}
			
			
			//
			// Timeout window
			//

			if(this.options.closeTimeout != false) {
			
				this.options.setTimeoutElement = setTimeout(function(){self.close()}, this.options.closeTimeout)
			
			}			


			

				
  		},

  		//
  		// Observe Lightbox
  		//
  		observe: function() {

			this.options();
			
			var self = this;

			$$('[rel="' + self.options.popupRel + '"]').each(function(instance){

					instance.writeAttribute("onclick","return false;"); // make sure all returns are false
					
					
					instance.observe('click', function(e, options) { 
					
						return false;
			
						var popupUrl = instance.readAttribute('href');

/* 						instance.removeAttribute('href'); // make sure all returns are false */
						
						/* Parse Parameters */
						var parameters = instance.readAttribute('params');
						var paramOptions = [];

						paramOptions['popup_id'] = self.options.popup_id;
						paramOptions['width'] = self.options.width;
						paramOptions['height'] = self.options.height;
						paramOptions['offsetTop'] = self.options.offsetTop;
						paramOptions['fromTop'] = self.options.fromTop;
						paramOptions['popupClassName'] = self.options.popupClassName;
						paramOptions['popupBgColor'] = self.options.popupBgColor;
						paramOptions['popupOverflow'] = self.options.popupOverflow;
						paramOptions['popupAnimate'] = self.options.popupAnimate;
						paramOptions['popupDuration'] = self.options.popupDuration;
						paramOptions['popupFPS'] = self.options.popupFPS;
						paramOptions['popupClickClose'] = self.options.popupClickClose;
						paramOptions['popupDraggable'] = self.options.popupDraggable;
						paramOptions['popupDraggableID'] = self.options.popupDraggableID;
						paramOptions['popupDraggableBox'] = self.options.popupDraggableBox;
						paramOptions['popupDraggableText'] = self.options.popupDraggableText;
						paramOptions['showCloseLink'] = self.options.showCloseLink;
						paramOptions['closeOnESC'] = self.options.closeOnESC;
						paramOptions['closeLinkClass'] = self.options.closeLinkClass;
						paramOptions['closeLinkID'] = self.options.closeLinkID;
						paramOptions['closeLinkText'] = self.options.closeLinkText;
						paramOptions['popupClickClose'] = self.options.popupClickClose;
						paramOptions['bgdivID'] = self.options.bgdivID;
						paramOptions['bgAnimate'] = self.options.bgAnimate;
						paramOptions['bgDuration'] = self.options.bgDuration;
						paramOptions['bgClassName'] = self.options.bgClassName;
						paramOptions['bgOpacity'] = self.options.bgOpacity;
						paramOptions['bgColor'] = self.options.bgColor;
						paramOptions['bgClickClose'] = self.options.bgClickClose;
						paramOptions['bgOverlay'] = self.options.bgOverlay;
						paramOptions['onClose'] = self.options.onClose;
						paramOptions['popupRel'] = self.options.popupRel;
						paramOptions['iframe'] = self.options.iframe;
						paramOptions['closeTimeout'] = self.options.closeTimeout;
						
						
						if(parameters != undefined) {
						var parameterArray = parameters.split(',')
						var compareLength = parameterArray.length;
						
						if(parameterArray.length > 0) {
						
							for (var i = 0; i < parameterArray.length; i++) {
				
									var currentParameter = parameterArray[i].split('=');
									key = currentParameter[0];
									value = currentParameter[1];
									
									if (value == 'false') {
										value = false;
									}
				
									if (value == 'true') {
										value = true;
									}
									
									if (value != null || value != '') {
										paramOptions[key] = value;
									}
									
							}		
						}
	
			
						self.open(paramOptions['popup_id'], { 
							url: popupUrl, 
							width: paramOptions['width'], 
							height: paramOptions['height'], 
							offsetTop: paramOptions['offsetTop'],
							fromTop: paramOptions['fromTop'],
							popupClassName: paramOptions['popupClassName'],
							popupBgColor: paramOptions['popupBgColor'],
							popupOverflow: paramOptions['popupOverflow'],
							popupAnimate: paramOptions['popupAnimate'],
							popupDuration: paramOptions['popupDuration'],
							popupFPS: paramOptions['popupFPS'],
							popupClickClose: paramOptions['popupClickClose'],
							popupDraggable: paramOptions['popupDraggable'],
							popupDraggableID: paramOptions['popupDraggableID'],
							popupDraggableBox: paramOptions['popupDraggableBox'],
							popupDraggableText: paramOptions['popupDraggableText'],
							showCloseLink: paramOptions['showCloseLink'],
							closeOnESC: paramOptions['closeOnESC'],
							closeLinkClass: paramOptions['closeLinkClass'],
							closeLinkID: paramOptions['closeLinkID'],
							closeLinkText: paramOptions['closeLinkText'],
							popupClickClose: paramOptions['popupClickClose'],
							bgdivID: paramOptions['bgdivID'],
							bgAnimate: paramOptions['bgAnimate'],
							bgDuration: paramOptions['bgDuration'],
							bgClassName: paramOptions['bgClassName'],
							bgOpacity: paramOptions['bgOpacity'],
							bgColor: paramOptions['bgColor'],
							bgClickClose: paramOptions['bgClickClose'],
							bgOverlay: paramOptions['bgOverlay'],
							onClose: paramOptions['onClose'],
							popupRel: paramOptions['popupRel'],
							iframe: paramOptions['iframe'],
							closeTimeout: paramOptions['closeTimeout']
			
						});
					}
					
					 } );
					
			
			});




  		},
  		
  		close: function(popup_id, bgdivID, options) {

			Object.extend(this.options, options || {});  
			
			
			// Cancel timeout timer
			if(this.options.setTimeoutElement != undefined) {
				clearTimeout(this.options.setTimeoutElement)
			}
			
			
			if(!this.options.popup_id) {
				
				this.options.popup_id = popup_id;
			
			}

			if(!this.options.bgdivID) {
				
				this.options.bgdivID = bgdivID;
			
			}
			
			// Close Popup
			if(this.options.popupAnimate == true){
				Effect.Fade($(this.options.popup_id), { duration: this.options.popupDuration, queue: 'front', onComplete: function(){
					$(this.options.popup_id).remove();
				}});
			} else {
				$(this.options.popup_id).remove();			
			}
			
				
			// Close Background
			if(this.options.bgAnimate == true) {
				Effect.Fade($(this.options.bgdivID), { duration: this.options.bgDuration, queue: 'end', onComplete: function(){
					$(this.options.bgdivID).remove();	
				}});
			} else {
				$(this.options.bgdivID).remove();
			}
			
			
			if(this.options.onComplete != false) {

					new this.options.onComplete;
							
			}
			
			// Clean up any existing garbage		
/*
			if($(this.options.bgdivID) != undefined) {
				$(this.options.bgdivID).remove();			
			}
			if($(this.options.popup_id) != undefined) {
				$(this.options.popup_id).remove();
			}
*/
		
		
			
		}
  		
  		
  }
  
  
});




 
var weblogix = new Weblogix;

	document.observe("dom:loaded", function() {
		weblogix.lightbox.observe();
	});
