var Lightbox = {
	_lightboxes: {},
	_lightbox_active: false,
	_close_callbacks: {},
	_ajax_path: '/ajax/',
	_lightbox_path: '/ajax/lightbox/',
	_lb_container: false,
	_lb_backdrop: false,
	_lb_backdrop_spinlock: 0,
	_lb_loader: false,
	_lb_capcode: false,
	_has_inited: false,
	_messages: {},
	_browserInfo: {browser: '', OS: '', version: ''},
	_icon_path: '',
	_icons: {
		'loading': 'loader_green.gif',
		'error': 'lightbox_error.gif',
		'success': 'lightbox_success.gif'
	},
	
	//
	// get position info, set up container
	//
	init: function() {
		if (!$('lb_container')) {
			setTimeout(Lightbox.init.bind(Lightbox), 100);
			return false;
		}
		
		Lightbox._has_inited = true;
	
		var container = '<div id="lb_container" style="display:none;" class="vs-lightbox-container"></div>';
		var backdrop = '<div id="lb_backdrop" style="display:none;" class="vs-lightbox-backdrop"></div>';
		
		//
		// prototype 1.6 lacks Insertion (uses Element.insert)
		//
		if ('undefined' != typeof(Insertion)) {
			//var body = $(document.body);
			//new Insertion.Bottom('vivastreet', container);
			//new Insertion.Bottom('vivastreet', backdrop);
		}
		else {
			//var body = $(document.body);
			//body.insert({bottom: container});
			//body.insert({bottom: backdrop});
		}
		
		this._getBrowserInfo();
		
		Lightbox._lb_container = $('lb_container');
		Lightbox._lb_backdrop = $('lb_backdrop');
		Lightbox._lb_loader = $('lb_content_loader');
		
		Event.observe(window, 'resize', Lightbox._setLightboxDimensions.bind(Lightbox));
		
		Lightbox._setLightboxDimensions();
	},
	
	_detect: navigator.userAgent.toLowerCase(),
	_place: 0,
	_checkstring: '',

	_getBrowserInfo: function() {
		if (this._checkIt('konqueror')) {
			this._browserInfo.browser = "Konqueror";
			this._browserInfo.OS = "Linux";
		}
		else if (this._checkIt('safari')) this._browserInfo.browser 		= "Safari";
		else if (this._checkIt('omniweb')) this._browserInfo.browser 		= "OmniWeb";
		else if (this._checkIt('opera')) this._browserInfo.browser 		= "Opera";
		else if (this._checkIt('webtv')) this._browserInfo.browser 		= "WebTV";
		else if (this._checkIt('icab')) this._browserInfo.browser 		= "iCab";
		else if (this._checkIt('msie')) this._browserInfo.browser 		= "Internet Explorer";
		else if (!this._checkIt('compatible')) {
			this._browserInfo.browser = "Netscape Navigator";
			this._browserInfo.version = this._detect.charAt(8);
		}
		else this._browserInfo.browser = "An unknown browser";
	
		if (!this._browserInfo.version) this._browserInfo.version = this._detect.charAt(this._place + this._checkstring.length);
	
		if (!this._browserInfo.OS) {
			if (this._checkIt('linux')) this._browserInfo.OS 		= "Linux";
			else if (this._checkIt('x11')) this._browserInfo.OS 	= "Unix";
			else if (this._checkIt('mac')) this._browserInfo.OS 	= "Mac";
			else if (this._checkIt('win')) this._browserInfo.OS 	= "Windows";
			else this._browserInfo.OS 						= "an unknown operating system";
		}
	},
	
	_checkIt: function(string) {
		this._place = this._detect.indexOf(string) + 1;
		this._checkstring = string;
		return this._place;
	},
	
	setAjaxPath: function(path) {
		Lightbox._ajax_path = path;
	},
	
	setLightboxPath: function(path) {
		Lightbox._lightbox_path = path;
	},
	
	//
	// example: Lightbox.open('details', {classname: 'vs-lightbox-detail', onload: function() { ... }, script: 'detail.php', params: {classified_id: $classified_id}});
	//
	open: function(id, params) {
		if (Lightbox._has_inited == false) {
			setTimeout(Lightbox.open.bind(Lightbox, id, params), 100);
			return false;
		}
	
		if ('undefined' != typeof(params['script'])) {
			if ('undefined' != typeof(params['lockscrolling'])) var lockScrolling = params['lockscrolling'];
			else var lockScrolling = true;
			if ('undefined' != typeof(params['scrollwithpage'])) var scrollWithPage = params['scrollwithpage'];
			else var scrollWithPage = false;
		
			if (params.modal) var modal = params.modal;
			else var modal = false;
		
			Lightbox._showBackdrop(lockScrolling, modal);
			Lightbox.unhideAll();
		
			var body = $(document.body);
			new Insertion.Bottom(Lightbox._lb_container, '<div id="lb_content_' + id + '" class="vs-lightbox-window" style="display:none;"></div>');
			var lbWindow = $('lb_content_' + id);
		
			var script = Lightbox._lightbox_path + params['script'];
			if ('string' == typeof(params['params'])) {
				var urlparams = params['params'];
			}
			else if ('object' == typeof(params['params'])) {
				var urlparams = $H(params['params']).toQueryString();
			}
			else {
				var urlparams = '';
			}
			
			var url = script + (Lightbox._lb_capcode == true ? '?capcode=1&' : '?') + urlparams;
			
			new Ajax.Request(url, {
					method: ('undefined' != typeof(params['method']) ? params['method'] : 'get'),
					onSuccess: function(transport) {
						Lightbox._processLightboxResponse(id, params, transport);
					},
					onFailure: function(transport) {
						Lightbox._processLightboxFailedResponse(id, params, transport);
					}
				}
			);
		}
	},
	
	_showLoadingBox: function(message, icon) {
		//if ('undefined' != typeof(message)) {
		//	$('lb_loader_message').update(message);
		//}
		//if ('undefined' != typeof(message)) {
		//	$('lb_loader_message').addClassName('vs-loading-message-icon-' + icon);
		//}
		
		Lightbox._lb_loader.show();
	},
	
	_hideLoadingBox: function() {
		Lightbox._lb_loader.hide();
	},
	
	signalResize: function() {
		Lightbox._setLightboxDimensions();
	},
	
	_setLightboxDimensions: function(lbWindow) {
		//var w = document.viewport.getDimensions().width;
		//var h = document.viewport.getDimensions().height;
		
		//
		// TODO: Get scroll offsets for IE and calculate
		// absolute position from that.
		//
		
		if (window.innerWidth && window.innerHeight) {
			var w = window.innerWidth;
			var h = window.innerHeight;
			var offset_y = window.pageYOffset;
		}
		else {
			var ieBody = (document.compatMode && document.compatMode != 'BackCompat' ? document.documentElement : document.body);
		
			var w = ieBody.clientWidth;
			var h = ieBody.clientHeight;
			
			var offset_y = ieBody.scrollTop;
			
			if (Lightbox._browserInfo.browser == 'Internet Explorer' && Lightbox._browserInfo.version >= 7) $('lb_backdrop').style.top = '0px';
			else $('lb_backdrop').style.top = offset_y+'px';
		}
		
		$('lb_backdrop').style.width = w + 'px';
		$('lb_backdrop').style.height = h + 'px';
		
		$$('#lb_container div.vs-lightbox-window').each(
			function(element) {
				var winW = element.getDimensions().width; //console.log("window.width="+element.getDimensions().width);
				var winH = element.getDimensions().height; //console.log("window.height="+element.getDimensions().height);
				var winX = parseInt((w / 2) - (winW / 2));
			
				if (0 == element.getDimensions().height || h < 600) {
					winY = 20;
					winY = winY + offset_y;
				}
				else {
					winY = parseInt((h / 2) - (winH / 2));
					winY = winY + offset_y;
				}
				
				if (winY < 20) {
					winY = 20;
				}
			
				element.style.left = winX + 'px';
				element.style.top = winY + 'px';
			}
		);
	},
	
	//
	// handle lightbox content
	//
	_processLightboxResponse: function(id, params, transport) {
		var lbWindow = $('lb_content_' + id);
		lbWindow.update(transport.responseText);
			
		//
		// add custom class name to lbWindow
		//
		lbWindow.addClassName('vs-lightbox-' + id);
		
		if ('undefined' != params.classname) {
			lbWindow.addClassName(params.classname);
		}
		
		lbWindow.show();
		
		Lightbox._lightbox_active = true;
		
		//
		// calculate size of lightbox
		//
		Lightbox._setLightboxDimensions.bind(Lightbox, lbWindow)();
		setTimeout(Lightbox._setLightboxDimensions.bind(Lightbox, lbWindow), 500);
		
		//
		// call onload callback
		//
		if ('function' == typeof(params['onload'])) {
			params.onload.bind(Lightbox)(lbWindow);
		}
		else if ('string' == typeof(params['onload'])) {
			eval(params['onload']);
		}
		
		if ('undefined' != typeof(params['screen'])) {
			Lightbox.activateScreen(id, params['screen']);
		}
		
		if (params.onclose) {
			Lightbox._close_callbacks[id] = params.onclose;
		}
	},
	
	confirm: function(params) {
		var lbMessage = $('lb_notifier_message');
		var lbButtons = $('lb_notifier_buttons');
		if (params.caption) lbMessage.update(params.caption);
		if (params.buttons) {
			var btnHTML = '';
			
			for (var i = 0; i < params.buttons.length; i++) {
				if ('undefined' == typeof(params.buttons[i]) || 'undefined' == typeof(params.buttons[i]['caption']) || 'undefined' == typeof(params.buttons[i]['action'])) continue;
				btnHTML += '<input type="button" value="'+params.buttons[i]['caption']+'" class="'+params.buttons[i]['class']+'" id="lb_notify_button_'+i+'"/>';
			
				var btnElement = document.createElement('input');
				btnElement.value = params.buttons[i]['caption'];
				$(btnElement).addClassName(params.buttons[i]['class']);
				
				if ('function' == typeof(params.buttons[i]['action'])) btnElement.onclick = params.buttons[i]['action'];
				else if ('string' == typeof(params.buttons[i]['action'])) btnElement.onclick = eval.bind(window, params.buttons[i]['action']);
				
				lbButtons.appendChild(btnElement);
			}
		}
		
		Lightbox.showNotification();
	},
	
	//
	// hide a lightbox, maintain state
	//
	hide: function(id, params) {
		$('lb_content_'+id).hide();
	},
	
	hideAll: function() {
		$('lb_container').hide();
	},
	
	//
	// unhide a lightbox
	//
	unhide: function(id, params) {
		$('lb_content_'+id).show();
	},
	
	unhideAll: function() {
		$('lb_container').show();
	},
	
	//
	// close a lightbox and destroy contents
	//
	close: function(id) {
		var lbWindow = $('lb_content_' + id);
		lbWindow.hide();
		lbWindow.remove();
		
		if ('undefined' != typeof(Lightbox._close_callbacks[id])) {
			Lightbox._close_callbacks[id]();
		}
		
		Lightbox._hideBackdrop();
		Lightbox._lightbox_active = false;
	},
	
	setInnerHTML: function(id, html) {
		if ($(id)) {
			$(id).update(html);
		}
	},
	
	showLogger: function(title) {
		Lightbox.clearLog();
		var lbLogger = $('lb_content_logger');
	
		if ('undefined' == typeof(title)) {
			title = Lightbox._messages['lb_log_header'];
		}
		
		Lightbox.unhideAll();
		Lightbox._showBackdrop();
		lbLogger.show();
		Lightbox._setLightboxDimensions();
	},
	
	hideLogger: function() {
		var lbLogger = $('lb_content_logger');
		lbLogger.hide();
		Lightbox._hideBackdrop();
	},
	
	//
	// adds a message to a lightbox message log
	//
	addLogMessage: function(message, icon) {
		var lbLog = $('lb_logger_ul');
		
		if ('undefined' != typeof(icon)) {
			//$(lastChild).addClassName('vs-lightbox-log-'+icon);
			var backgroundImage = ' style="background-image: url('+Lightbox._icon_path+'/lightbox/' + Lightbox._icons[icon] + ');"';
		}
		else backgroundImage = '';
		
		new Insertion.Bottom(lbLog, '<li'+backgroundImage+'>'+message+'</li>');
	},
	
	//
	// updates the last message in a lightbox
	// message log
	//
	updateLogMessage: function(message, icon, onclose) {
		var lbLog = $('lb_logger_ul');
		onclose = onclose ? "<br /><button onclick='" + onclose + "'>Close</button>" : "";
		if (0 < lbLog.childElements().length) {
			var lastChild = lbLog.childElements()[lbLog.childElements().length - 1];
			lastChild.update(message + onclose);
			if ('undefined' != typeof(icon)) {
				//$(lastChild).addClassName('vs-lightbox-log-'+icon);
				lastChild.style.backgroundImage = 'url('+Lightbox._icon_path+'/lightbox/' + Lightbox._icons[icon] + ')';
			}
		}
	},
	
	//
	// clears a lightbox message log
	//
	clearLog: function() {
		var lbLog = $('lb_logger_ul');
		lbLog.update('');
	},
	
	//
	// switches the visible screens
	//
	activateScreen: function(id, screen, callbacks) {
		var lbScreen = $('lb_' + id + '_screen_' + screen);
		
		if (typeof(callbacks) != 'undefined') {
			if (typeof(callbacks.before) != 'undefined') {
				callbacks.before(lbScreen);
			}
		}
		
		if ('undefined' == typeof(lbScreen)) return false;
		$$('#lb_content_' + id + ' div.vs-lightbox-screen').each(
			function(screen) {
				screen.hide();
			}
		);
		lbScreen.show();
		
		if (typeof(callbacks) != 'undefined') {
			if (typeof(callbacks.after) != 'undefined') {
				callbacks.after(lbScreen);
			}
		}
		
		var lbWindow = $('lb_content_' + id);
		if (lbWindow.down('.vs-lightbox-tabs')) {
			var children = lbWindow.down('.vs-lightbox-tabs').childElements();
			for (var i = 0; i < children.length; i++) {
				$(children[i]).down().removeClassName('vs-lb-tab-active');
			}
			if ($('lb_tab_' + screen)) {
				$('lb_tab_' + screen).addClassName('vs-lb-tab-active');
			}
		}
		
		this._setLightboxDimensions();
	},
	
	_disableScrolling: function() {
	
	},
	
	_enableScrolling: function() {
	
	},
	
	_showBackdrop: function(lockscrolling, modal) {
		if ('undefined' == typeof(lockscrolling)) lockscrolling = true;
	
		if ('Internet Explorer' == this._browserInfo.browser && 6 >= this._browserInfo.version) {
			html = document.getElementsByTagName('html')[0];
			
			//if (lockscrolling = true) {
			//	html.style.overflow = 'hidden';
			//	html.style.height = '100%';
			//}
			
			var selects = document.getElementsByTagName('select');
			for (var i = 0; i < selects.length; i++) {
				selects[i].style.visibility = 'hidden';
			}
		}
		
		$$('.lb-hide').each(function(elem){elem.hide();});

		//
		// to make sure that if multiple lightboxes are open, the backdrop
		// isn't eliminated until the last lightbox is closed
		//
		Lightbox._lb_backdrop_spinlock++;
		
		//if (true == lockscrolling) $('vivastreet').addClassName('vs-noscroll');
		if (modal && modal == true) {
			Lightbox._lb_backdrop.addClassName('vs-backdrop-trans');
			Lightbox._lb_backdrop.show();
			$(document.getElementsByTagName('body')[0]).addClassName('vs-noscroll');
			$(document.getElementsByTagName('html')[0]).addClassName('vs-noscroll');
		}
	},
	
	_hideBackdrop: function() {
		if ('Internet Explorer' == this._browserInfo.browser && 6 >= this._browserInfo.version) {
			html = document.getElementsByTagName('html')[0];
			//html.style.overflow = 'auto';
			//html.style.height = 'auto';
			
			var selects = document.getElementsByTagName('select');
			for (var i = 0; i < selects.length; i++) {
				selects[i].style.visibility = 'visible';
			}
		}
		
		$$('.lb-hide').each(function(elem){elem.show();});
		
		$(document.getElementsByTagName('body')[0]).removeClassName('vs-noscroll');
		$(document.getElementsByTagName('html')[0]).removeClassName('vs-noscroll');
		
		Lightbox._lb_backdrop_spinlock--;
		
		if (0 == Lightbox._lb_backdrop_spinlock) {
			Lightbox._lb_backdrop.removeClassName('vs-backdrop-trans');
			Lightbox._lb_backdrop.hide();
		}
	},
	
	showNotification: function(message, timeout) {
		if (message) $('lb_notifier_message').update(message);
		Lightbox.unhideAll();
		if (false == Lightbox._lightbox_active) Lightbox._showBackdrop();
		$('lb_content_notifier').show();
		Lightbox._setLightboxDimensions();
		if ('undefined' != typeof(timeout)) {
			setTimeout(Lightbox.hideNotification.bind(Lightbox), timeout);
		}
	},
	
	hideNotification: function() {
		$('lb_notifier_buttons').update('');
		$('lb_content_notifier').hide();
		if (false == Lightbox._lightbox_active) Lightbox._hideBackdrop();
	},
	
	lb_detail_onload: function(lbWindow) {
		/*if ($('lb_detail_preview_photo')) {
			var lbprev = $('lb_detail_preview_photo');
			lbprev.style.height = 'auto';
			lbprev.style.width = 'auto';
			
			if (0 == lbprev.getHeight()) {
				setTimeout(Lightbox.lb_detail_onload.bind(Lightbox, lbWindow), 100);
				return false;
			}
			
			var h = lbprev.getHeight();
			var w = lbprev.getWidth();
			var nHeight = h;
			var nWidth = w;
			
			//
			// image is wider than needed, resize accordingly
			//
			if (w > 374) {
				var ratio = 374 / w;
				nWidth = 374;
				nHeight = Math.ceil(h * ratio);
			}
			
			//
			// image is taller than needed
			//
			else if (h > 281) {
				var ratio = 281 / h;
				nWidth = Math.ceil(w * ratio);
				nHeight = 281;
			}
			
			lbprev.style.width = nWidth + 'px';
			lbprev.style.height = nHeight + 'px';
		}*/
	},
	
	changeDetailPhoto: function(src) {
		var lbprev = $('lb_detail_preview_photo');
		lbprev.src = src;
		setTimeout(Lightbox.lb_detail_onload.bind(Lightbox), 100);
	}
};
