/****************************************************************************************
*****************************************************************************************
***
*** main JavaScript source
***
***--------------------------------------------------------------------------------------
***
*** @package      Homepage Eva Gerholdt
*** @version      $Id: default.js 68 2011-07-11 12:30:42Z al $
*** @link         $HeadURL: file:///X:/src/repos/svn-win/projects/2009/Homepage%20Eva%20Gerholdt/trunk/site/script/default.js $
*** @dependencies 
*** @author       Achim Liese <devel001 [at] achim-liese.de>
*** @copyright    Copyright (C) 2009 Achim Liese <devel001 [at] achim-liese.de>
*** @license      contact author
***
***--------------------------------------------------------------------------------------
***
*** ToDo:
*** - 
*** - 
*** - 
***
*****************************************************************************************
****************************************************************************************/


//******************************************************************************
//******************************************************************************
//*** global constants
//******************************************************************************

// svn version infos
// add property "svn:keywords" with value "Date Revision Author HeadURL Id"
// to let svn replace the keywords with values
var svn_LastChangedDate         = '$Date: 2011-07-11 14:30:42 +0200 (Mo, 11 Jul 2011) $'.substr( 7, 19 );
var svn_LastChangedRevision     = '$Revision: 68 $'.substr( 11 ).replace( / \$$/, '' );
var svn_LastChangedBy           = '$Author: al $'.substr( 9 ).replace( / \$$/, '' );
var svn_HeadURL                 = '$HeadURL: file:///X:/src/repos/svn-win/projects/2009/Homepage%20Eva%20Gerholdt/trunk/site/script/default.js $'.substr( 10 ).replace( / \$$/, '' );
var svn_Id                      = '$Id: default.js 68 2011-07-11 12:30:42Z al $';

var this_file_author            = "Achim Liese";
var this_file_filename          = svn_Id.substr( 5 ).replace( / [^\s]+.+/, '' );
var this_file_version           = svn_LastChangedRevision;
var this_file_version_info      = "rev. " + this_file_version + ", ";
    this_file_version_info     += "file: " + this_file_filename + ", ";
    this_file_version_info     += "last modified: " + svn_LastChangedDate + " ";
    this_file_version_info     += "by " + this_file_author;
	 
	 

var wait_after_preload           = false;
var show_tooltips                = false;
var show_dragslider              = false;
var show_preloaded_images        = false;

var button_fade_min              = 0.01;
var button_fade_duration         = 250;

var menu_bt_z_index              = 20;
var infobox_z_index              = 30;
var gallery_win_z_index          = 2000;

var scrollbar_mouse_wheel_step   = 30;
var scrollbar_btn_step           = 30;
var scrollbar_btn_delay          = 20;

var infobox_slide_duration       = 500;
var gallery_win_fade_duration    = 1000;
var gallery_button_fade_duration = 150;

var dragslider_snap_limit        = 15;
var dragslider_slide_duration    = 1000;



//******************************************************************************
//******************************************************************************
//*** global variables
//******************************************************************************
var browser = null;
var tool_tips = {};
var preInitAfterPreloaderCalled = false;


//******************************************************************************
//******************************************************************************
//*** initialize
//******************************************************************************
window.addEvent( 'domready', function(){
					
	// show warning if browser is too old
	browser = new BrowserDetect();
	if ( browser.hasMinCapabilities ){

		// initialize tooltips
		initToolTips();
		
		// show AL-logo
		initALLogo();
	
		//
		// preloader
		//
		var preloader_images = initPreloader( "images/preloader-image-", 1, 16, "png" );
		var images = [
							// preloader
							"background-fill.png",
							
							// draggable slider
							"dragslider-ruler-repeat.png",
							"dragslider-ruler-left.png",
							"dragslider-ruler-right.png",
							"dragslider-ruler-handle.png",
							"dragslider-ruler-arrow-up-active.png",
							"dragslider-ruler-arrow-up-inactive.png",
							"dragslider-ruler-arrow-down-active.png",
							"dragslider-ruler-arrow-down-inactive.png",
							"dragslider-content-background-fill.png",
							
							// tooltips
							"tooltip-background.png",
	
							// main content
							"background.png",
							
							"menu-referenzen.png",
							"menu-leistungen.png",
							"menu-fotogalerie.png",
							"menu-zur-person.png",
							"menu-impressum.png",
							"menu-kontakt.png",
						  
							"infobox-kontakt.png",
							"infobox-leistungen.png",
							"infobox-referenzen.png",
							"infobox-zur-person.png",
	
							"scrollbar-vert-track.png",
							"scrollbar-vert-handle-active.png",
							"scrollbar-vert-handle-inactive.png",
							"scrollbar-vert-step-back-active.png",
							"scrollbar-vert-step-back-inactive.png",
							"scrollbar-vert-step-forward-active.png",
							"scrollbar-vert-step-forward-inactive.png",
							
							// gallery
							"gallery-background-fill.png",
							"gallery-frame.png",
							
							"gallery-content-001.png",
							"gallery-content-002.png",
							"gallery-content-003.png",
							"gallery-content-004.png",
							"gallery-content-005.png",
							"gallery-content-006.png",
							"gallery-content-007.png",
							"gallery-content-008.png",
							"gallery-content-009.png",
							"gallery-content-010.png",
							"gallery-content-011.png",
							"gallery-content-012.png",
							"gallery-content-013.png",
							"gallery-content-014.png",
							"gallery-content-015.png",
							"gallery-content-016.png",
							"gallery-content-017.png",
							"gallery-content-018.png",
							"gallery-content-019.png",
							"gallery-content-020.png",
							"gallery-content-021.png",
							"gallery-content-022.png",
							"gallery-content-023.png",
							"gallery-content-024.png",
							"gallery-content-025.png",
							"gallery-content-026.png",
							"gallery-content-027.png",
							"gallery-content-028.png",
							
							"gallery-arrow-next-active.png",
							"gallery-arrow-next-inactive.png",
							"gallery-arrow-previous-active.png",
							"gallery-arrow-previous-inactive.png",
							"gallery-quit-active.png",
							"gallery-quit-inactive.png",
							
							"gallery-index-arrow.png",
							"gallery-index-line-active.png",
							"gallery-index-line-inactive.png"
						  ];
		startPreloader( "images/", images, preloader_images );

//	var images = [];
//	for ( var i = 1; i <= 125; i++ ){
//		images.push( "test-" + fillString( String( i ), "0", 4 ) + "." + "png" );
//	}
//	startPreloader( "http://au-dela-des-limites.name/test/hp-eva/images/test/", images, preloader_images );
//	startPreloader( "images/test/", images, preloader_images );

	}
	
}); // domready

//******************************************************************************
//******************************************************************************
//*** initialize preloader
//******************************************************************************
function initPreloader( img_prefix, first_index, last_index, img_extension ){
	
	var filenames = [];
	for ( var i = first_index; i <= last_index; i++ ){
		filenames.push( img_prefix + fillString( String( i ), "0", 4 ) + "." + img_extension );
	}
	var images = new Asset.images( filenames );
	return images;  
}

//******************************************************************************
//******************************************************************************
//*** start preloader
//******************************************************************************
function startPreloader( path, images, preloader_images ){
	
	// make visible
	$('preloader').setStyle('display', 'block' );
	$('continue_after_preload_button_checkbox').checked = wait_after_preload;
	
	// add path to images
	var filenames = [];
	if ( ( path != "" ) && ( path.charAt( path.length-1 ) != "/" ) ){
		path += "/";
	}
	for ( var i = 0; i < images.length; i++ ){
		filenames.push( path + images[i] );
	}
	
	// add event to checkbox to show/hide continue after preload button
	$('continue_after_preload_button_checkbox').addEvents({
		'change': function(){
			if ( $('continue_after_preload_button_checkbox').checked ){
				wait_after_preload = true;
			} else {
				wait_after_preload = false;
			}
		}
	});
	 
	// preload images
	
//	var counter = 0;
//	for(src=0;src<backgrounds.length;src++) {
//		var image = new Image();
//		image.src = backgrounds[src];
//		image.onload = counter++;
//		if (counter == backgrounds.length) {
//			myFunction();
//		}
//	}
	var loader = new Asset.images( filenames, {  
		onProgress: function( counter, index ){ 
		
			// update preloader image
//			i = parseInt( counter * preloader_images.length / filenames.length );
			i = counter % preloader_images.length;
			$('preloader_perc').set('html', ( parseInt( (counter + 1) * 100 / filenames.length ) ) + "%" );
			$('preloader_loaded').set('html', "lade ... " + (counter + 1) + "/" + filenames.length );
			$('preloader').setStyle('background-image', 'url(' + preloader_images[i].src + ')' );
			
//			if ( counter == ( filenames.length - 1 ) ){
			if ( counter >= 3 ){
				preInitAfterPreloader( loader );
			}
		},
		onComplete: function(){
//			alert( "preloader finished!" );
			preInitAfterPreloader( loader );
		}
	});  
	
}

//******************************************************************************
//******************************************************************************
//*** prepare initialization after preloader
//******************************************************************************
function preInitAfterPreloader( loader ){
	
	if ( preInitAfterPreloaderCalled ){
		return;
	}
	preInitAfterPreloaderCalled = true;
	
	//			$('preloader_perc').set('html', '100%' );
	//			$('preloader_loaded').set('html', filenames.length + "/" + filenames.length );
	
	// show preloaded images in container
	if ( show_preloaded_images ){
		$('images_holder').setStyle('display', 'block');
		var transparency = $('preloaded_images_transparency').getStyle('background-image');
		loader.each(function(im,i){
			el = new Element('img',{ src:im.src }).inject($('images_holder'));
			el.setStyle('background-image', transparency );
			el.store('tip:title', "image " + (i + 1) );
			el.store('tip:text', im.width + " x " + im.height + " px<br />"
										+ im.src.substring( im.src.lastIndexOf('/') + 1, im.src.length )
										);
			el.addClass('tooltip_element').addClass('images_holder_img');
		});
		if ( show_tooltips ){
			tool_tips.attach('.images_holder_img');
		}
	}
	
	// hide preloader and show content
	if ( wait_after_preload ){
		
		// init draggable slider
		if ( show_dragslider ){
			initDragSlider( dragslider_snap_limit, dragslider_slide_duration );
		}
		
		// show continue button
		$('continue_after_preload_button').setStyle('display', 'block');
		$('continue_after_preload_button').addEvents({
			'click': function(){
				initMain();
			}
		});
		
	} else {
		
		initMain();
	}
}

//******************************************************************************
//******************************************************************************
//*** initialize tooltips
//******************************************************************************
function initToolTips(){
	
	//
   // init tooltips
	//
	var tooltip_list = [
//		[ '#svn_revision', 'svn revision ' + this_file_version,
//		   'file: ' + this_file_filename + '<br />last modified: ' + svn_LastChangedDate + ' by ' + this_file_author ],
		[ '#svn_revision', ( project_version_info['version'] != "" ) ?
			'ver. ' + project_version_info['version'] + ' (rev. ' + project_version_info['revision'] + ')' :
			'rev. ' + project_version_info['revision'],
		   'project name: ' + project_version_info['name'] + '<br />last modified: ' + project_version_info['date_locale'] ],
		[ '#enable_tooltips_span', 'Tooltips', 'Zum aktivieren oder deaktiveren der Tooltips hier clicken.' ],

		// preloader
		[ '#preloader_perc', 'Preloader-Status<br>(Provisorium von mir)',
			'Hier wird der aktuelle Status des Ladevorgangs der Seite als Bild und in Prozent angezeigt.' ],
		[ '#preloader_loaded', 'Preloader-Status (geladene Bilder)<br>(Provisorium von mir)',
			'Hier wird der aktuelle Status des Ladevorgangs angezeigt (Anzahl geladene Bilder).' ],
		[ '#continue_after_preload_button', 'Weiter-Button', 'Nötig für Pause, um sich Preloader in Ruhe anzuschauen. '
		 	+ 'Entferne ich, sobald der Preloader fertiggestellt ist.' ],
		
		// draggable slider
		[ '.dragslider_ruler_repeat_frame', 'Werkzeugkasten',
		   'Zum öffnen den Griff in der Mitte anfassen und ziehen oder rechts auf den Pfeil klicken.' ],
		[ '.dragslider_ruler_handle', 'Griff', 'Zieh mich!' ],
		[ '.dragslider_ruler_open_close', 'Pfeil', 'Klick mich!' ],
		[ '#select_effect', 'Richtung / Alpha', 'Richtung des Effektes in Abhängigkeit von den Tasten einstellen, '
		 	+ 'oder Transparenz-Überblendung wählen.' ],
		[ '#select_transition_func', 'Funktion', 'Effekt-Funktion wählen. (Geschwindigkeitsänderung des Effektes)' ],
		[ '#select_transition_ease', 'Verlauf', 'Verlauf des Effektes einstellen.' ],
		[ '#select_transition_duration', 'Dauer', 'Effekt-Dauer (in ms) einstellen.' ],
		[ '#continue_after_preload_button_checkbox_span', 'Weiter-Button zeigen', 'Zeigt den "Weiter-Button" nach vollständigem Preload an.' ],
		[ '#show_js_warning', 'Warnmeldung zeigen', 'Zeigt die Warnmeldung an, die erscheint, wenn Javascript deaktiviert ist.' ],
		[ '#show_ie6_warning', 'Warnmeldung zeigen', 'Zeigt die Warnmeldung an, die erscheint, wenn der Internet Explorer zu alt ist (<= Ver.6).' ],
		[ '#images_holder', 'Preloaded images container', 'Zur Kontrolle der Funktion des Preloaders. '
		 	+ 'Zeigt die durch den Preloader geladenen Bilder an.' ],
		[ '#preloaded_images_transparency', 'Transparente Bereiche', 'Zeigt transparente Bereiche der Bilder an.' ]
				
//		[ '', '', '' ],
	];
	for (var i = 0; i < tooltip_list.length; i++ ){
		$$(tooltip_list[i][0]).store('tip:title', tooltip_list[i][1]);
		$$(tooltip_list[i][0]).store('tip:text', tooltip_list[i][2]);
		$$(tooltip_list[i][0]).addClass('tooltip_element');
	}
	$('enable_tooltips_span').removeClass('tooltip_element');
	
	tool_tips = new Tips( $('enable_tooltips_span'), {
		timeOut:        700,
		maxTitleChars:   50,
		maxOpacity:     0.9,
		className:      'tooltip_container'
	});
	
	$('enable_tooltips').checked = show_tooltips;
	if ( show_tooltips ){
		tool_tips.attach('.tooltip_element');
	}

	$('enable_tooltips').addEvents({
		'change': function(){
			if ( $('enable_tooltips').checked ){
				tool_tips.attach('.tooltip_element');
			} else {
				tool_tips.detach('.tooltip_element');
			}
			show_tooltips = $('enable_tooltips').checked;
		}
	});
	
//	tool_tips.addEvent('show', function(tip){
//		 tip.fade('in');
//	});
//	tool_tips.addEvent('hide', function(tip){
//		 tip.fade('out');
//	});
	
	
}

//******************************************************************************
//******************************************************************************
//*** initialize main components
//******************************************************************************
function initMain(){
	
	//
	// hide preloader and show main content
	//
//	$('background').setStyle('opacity', 0);
	if ( show_dragslider ){
		initDragSlider( dragslider_snap_limit, dragslider_slide_duration );
	}
	$('background').setStyle('display', 'block');
	$('preloader_background').set('tween', { duration: gallery_win_fade_duration,
														  onComplete: function(){
															  $('preloader_background').setStyle('display', 'none');
														}
									});
	$('preloader_background').fade('out'); // als chain?

	


   //
	// initialize gallery viewer
	//
	initGalleryViewer();

   // 		
	// add sliding effects to info boxes
	//	
	var infobox_params = {
									'menu_referenzen': {
										'box': $('infobox_referenzen'),
										'tween': [ 'margin-left', [-$('infobox_referenzen').getStyle('width').toInt(), 0] ]
										},
									'menu_leistungen': {
										'box': $('infobox_leistungen'),
										'tween': [ 'margin-left', [$('infobox_leistungen').getStyle('width').toInt(), 0] ]
										},
									'menu_zur_person': {
										'box': $('infobox_zur_person'),
										'tween': [ 'margin-left', [$('infobox_zur_person').getStyle('width').toInt(), 0] ]
										},
									'menu_impressum': {
										'box': $('infobox_impressum'),
										'tween': [ 'margin-left', [$('infobox_impressum').getStyle('width').toInt(), 0] ]
										},
									'menu_kontakt': {
										'box': $('infobox_kontakt'),
										'tween': [ 'margin-left', [$('infobox_kontakt').getStyle('width').toInt(), 0] ]
										}
	};
	for (key in infobox_params ){
		var el = infobox_params[key].box;
		var wrapper_id = el.id + '_wrapper';
		var wrapper = new Element('div', {id: wrapper_id});
		wrapper.wraps(el);
		wrapper.setStyles( el.getStyles( 'top', 'left', 'width', 'height' ) );
		wrapper.setStyles( {'position':'absolute', 'overflow':'hidden', 'z-index':-1 } );
//		wrapper.setStyles( {'background':'#F0A040' } );
		el.setStyles( {'top':0, 'left':0, 'right':0, 'bottom':0 } );
		el.setStyle( infobox_params[key].tween[0], infobox_params[key].tween[1][0].toInt() );
		$(key).addEvents({
			'click': function(){
				for (key in infobox_params ){
					el = infobox_params[key].box;
					if ( ( key == this.id ) && ( el.getStyle( infobox_params[key].tween[0] ).toInt() != infobox_params[key].tween[1][1] ) ){
						
						// slide in
						el.getParent().setStyle('z-index', infobox_z_index);
						el.set('tween', { duration: infobox_slide_duration });
						el.tween( infobox_params[this.id].tween );
						
					} else if ( el.getStyle( infobox_params[key].tween[0] ).toInt() != infobox_params[key].tween[1][0] ){
						
						// slide out
						el.set('tween', { duration: infobox_slide_duration,
												onComplete: function(el){
													el.getParent().setStyle('z-index',-1);
												}
								 });
						el.tween( infobox_params[this.id].tween[0],
									[ infobox_params[key].tween[1][1],
									  infobox_params[key].tween[1][0]
									] ); // als chain?
					}
				}
			}
		});
		if ( el.id != "infobox_impressum" ){ // neues Feld 'close' mit close button elem?
			
			el.addEvents({
				'click': function(){
					for (key in infobox_params ){
						if ( infobox_params[key].box.id == this.id ){
							menu_key = key;
						}
					}
					this.set('tween', { duration: infobox_slide_duration,
											  onComplete: function(el){
												  el.getParent().setStyle('z-index',-1);
											  }
								});
					this.tween( infobox_params[menu_key].tween[0],
									[ infobox_params[menu_key].tween[1][1],
									  infobox_params[menu_key].tween[1][0]
									]); // als chain?
				}
			});
			
		} else {
			
			$('infobox_impressum_close').addEvents({
				'click': function(){
					var el = $('infobox_impressum');
					for (key in infobox_params ){
						if ( infobox_params[key].box.id == el.id ){
							menu_key = key;
						}
					}
					el.set('tween', { duration: infobox_slide_duration,
											  onComplete: function(el){
												  el.getParent().setStyle('z-index',-1);
											  }
								});
					el.tween( infobox_params[menu_key].tween[0],
									[ infobox_params[menu_key].tween[1][1],
									  infobox_params[menu_key].tween[1][0]
									]); // als chain?
				}
			});
		}
	}
	
	// add fade in effekt to gallery
	$('menu_fotogalerie').addEvents({
		'click': function(){
         $('gallery_background').set('tween', { duration: gallery_win_fade_duration,
																onComplete: function(){
																	$('gallery_content').fade('in');
																}
											});
         $('gallery_content').set('tween', {duration: gallery_win_fade_duration});
			$('gallery_background').setStyle('opacity', 0);
			$('gallery_content').setStyle('opacity', 0);
			
			$('gallery_background').setStyle('z-index', gallery_win_z_index);
			$('gallery_background').fade('in');  // als chain?
		}
	});
	
	
	
	// main menu buttons
	$$('.menu_buttons').setStyles( { 'z-index': menu_bt_z_index } );
	
	// add scrollbar to impressum box
	makeScrollbar( $('infobox_impressum_text'), $('infobox_impressum_scrollbar_track'), $('infobox_impressum_scrollbar_handle'),
						$('infobox_impressum_scrollbar_step_back'), $('infobox_impressum_scrollbar_step_forward') );
	

   // 		
	// add fade in/out effect to all buttons for mouse enter/leave event
	//	
	$$('.fade_button').setStyle('opacity', button_fade_min);
	$$('.fade_button').addEvents({
		'mouseenter': function(){
			this.set('tween', {duration: button_fade_duration}).fade('in');
		},
		'mouseleave': function(){
			this.set('tween', {duration: button_fade_duration}).fade( button_fade_min );
		}
	});

}

//******************************************************************************
//******************************************************************************
//*** initialize gallery viewer
//******************************************************************************
function initGalleryViewer(){

	// set to invisible and activate (transparent) rendering
	$('gallery_background').setStyle('display', 'block');
	$('gallery_background').setStyle('visibility', 'hidden');

	// add indicator lines that show index of displayed image
	var gallery_index_indicator_line_first = $$('#gallery_index_indicator_line_container div')[0];
	var gallery_index_indicator_line_top   = gallery_index_indicator_line_first.getStyle('top').toInt();
	var gallery_index_indicator_line_dist  = gallery_index_indicator_line_first.getStyle('height').toInt();
	var gallery_index_indicator_arrow_top  = $('gallery_index_indicator_arrow').getStyle('top').toInt();
	for (var i = 1; i < $$('#gallery_box div').length; i++ ){
		el = gallery_index_indicator_line_first.clone();
		el.setStyle( 'top', i * gallery_index_indicator_line_dist + gallery_index_indicator_line_top );
		el.inject('gallery_index_indicator_line_container');
	}
	var gallery_index_indicator_lines = $$('.gallery_index_indicator_line.mouseover');
	$('gallery_index_indicator_line_container').setStyle('height', gallery_index_indicator_lines.length * gallery_index_indicator_line_dist );
	
	// gallery index indicator lines fade effect
	gallery_index_indicator_lines.setStyle('opacity', button_fade_min);
	gallery_index_indicator_lines.addEvents({
		'mouseenter': function(){
			this.opacity_org = this.getStyle('opacity');
			this.set('tween', {duration: gallery_button_fade_duration}).fade('in');
		},
		'mouseleave': function(){
			this.set('tween', {duration: gallery_button_fade_duration}).fade( this.opacity_org );
		},
		'click': function(){
			this.opacity_org = 1;
		}
	});

   // create viewer object
	var gallery_viewer = new viewer($('gallery_box').getChildren(),{
		mode:      'right',
		mode_prev: 'left',
		sizes:     {w:680, h:380},
		onWalk: function(current_index){
			gallery_index_indicator_lines.setStyle('opacity', button_fade_min);
			gallery_index_indicator_lines[current_index].setStyle('opacity', 1);
//				$$('#gallery_index_indicator_line_container').set('tween', {duration: button_fade_duration}).fade( button_fade_min );
//				$$('#gallery_index_indicator_line_container')[current_index].set('tween', {duration: button_fade_duration}).fade('in');
			$('gallery_index_indicator_arrow').setStyle( 'top', gallery_index_indicator_line_dist * current_index + gallery_index_indicator_arrow_top );
		}
	});
	$('gallery_button_prev').addEvent('click',gallery_viewer.previous.bind(gallery_viewer));
	$('gallery_button_next').addEvent('click',gallery_viewer.next.bind(gallery_viewer));
	gallery_index_indicator_lines.each(function(el,i){el.addEvent('click',gallery_viewer.walk.bind(gallery_viewer,i,true));});
	gallery_index_indicator_lines[0].setStyle('opacity', 1);

	// 		
	// add fade in/out effect to all buttons for mouse enter/leave event
	//	
	$$('.gallery_fade_button').setStyle('opacity', button_fade_min);
	$$('.gallery_fade_button').addEvents({
		'mouseenter': function(){
			this.set('tween', {duration: gallery_button_fade_duration}).fade('in');
		},
		'mouseleave': function(){
			this.set('tween', {duration: gallery_button_fade_duration}).fade( button_fade_min );
		}
	});
	
	// gallery quit button
	$('gallery_button_quit').addEvents({
		'click': function(){
			$('gallery_background').set('tween', { duration: gallery_win_fade_duration,
																onComplete: function(el){
																   el.setStyle('z-index',-1);
															   }
											 });
         $('gallery_content').set('tween', { duration: gallery_win_fade_duration,
															onComplete: function(){
																$('gallery_background').fade('out');
															}
											});
			$('gallery_content').fade('out'); // als chain?
		}
	});
	
	
	
	//
	// form: add events to comboboxes to choose effects
	//
	var mode_prev_from_mode = {
		left: 'right',
		top: 'bottom',
		right: 'left',
		bottom: 'top',
		alpha: 'alpha'
	};
	$('select_effect').addEvents({
		'change': function(){
			gallery_viewer.setOptions({
				mode:      this.getElements('option[selected]')[0].value,
				mode_prev: mode_prev_from_mode[this.getElements('option[selected]')[0].value]
			});
		}
	});
	$$('.select_transition').addEvents({
		'change': function(){
			gallery_viewer.setOptions({
				fxOptions: {
					duration:   $('select_transition_duration').getElements('option[selected]')[0].value,
					transition: $('select_transition_func').getElements('option[selected]')[0].value + ":"
								 + $('select_transition_ease').getElements('option[selected]')[0].value
				}
			});
		}
	});

	// set visibility
	$('gallery_background').setStyle('visibility', 'visible');
}

//******************************************************************************
//******************************************************************************
//*** 
//******************************************************************************
function initALLogo(){

	// adjust position if draggabale slider is visible
	if ( show_dragslider ){
		$('AL_Logo_info').setStyle('bottom', $('dragslider_ruler').getStyle('height') );
	}

	// set header of info box
	var info_text = "<h1>";
	info_text += ( project_version_info['name'] != "" ) ?
			'project \"' + project_version_info['name'] + '\" ' : "";
	info_text += ( project_version_info['version'] != "" ) ?
			'ver. ' + project_version_info['version'] + ' (rev. ' + project_version_info['revision'] + ')' :
			'rev. ' + project_version_info['revision'];
	info_text += " from " + project_version_info['date_locale'] + "</h1>";
	info_text += "<div id='AL_Logo_info_close_window_btn'><img src='images/window-close-active.png' alt='' /></div>";
	info_text += "<div id='AL_Logo_info_resize_window_btn'><img src='images/window-maximize-active.png' alt='' /></div>";
	info_text += "<div style='clear: both'></div>";
	document.getElementById('AL_Logo_info_header').innerHTML = info_text;
			
	// set content of info box
	info_text = '<p>project name: ' + project_version_info['name'] + '<br />last modified: ' + project_version_info['date_locale'];
	info_text += " by Achim Liese<br />\n";

	info_text += "<br />\n";
	for ( key in project_version_info ){
		info_text += "   " + key + " = " + project_version_info[key] + "<br />\n";
	}
	info_text += "</p>\n";
	document.getElementById('AL_Logo_info_content').innerHTML = info_text;

	// initialize
	$('AL_Logo').setStyle('opacity', button_fade_min);
	$('AL_Logo_info_box').setStyle('opacity', button_fade_min);

	// set event handlers
	$('AL_Logo').onclick = ALLogoEventHandler;
	$$('#AL_Logo_info_resize_window_btn img', '#AL_Logo_info_close_window_btn img').addEvents({
		'mouseenter': function(){
			this.set('tween', {duration: button_fade_duration}).fade('in');
		},
		'mouseleave': function(){
			this.set('tween', {duration: button_fade_duration}).fade( button_fade_min );
		}
	});
	$('AL_Logo_info_resize_window_btn').addEvents({
		'click': function(){
			
			var el = $('AL_Logo_info_content');
			var elh = parseInt( el.getStyle('height') ) + parseInt( el.getStyle('padding-top') ) + parseInt( el.getStyle('padding-bottom') );
			var fx = new Fx.Tween( el, {
					property:   'margin-bottom',
					duration:   1000,
					transition: Fx.Transitions.Cubic.easeOut
			});
			
			if ( parseInt( el.getStyle('margin-bottom') ) < 0 ){
				
				// slide in
				fx.start( -15 ).chain(function(){
					var elb = $('AL_Logo_info_resize_window_btn');
					elb.setStyle('backgroundImage', 'url(images/window-minimize-inactive.png)');
					elb.getElementsByTagName('img')[0].src = "images/window-minimize-active.png";
					el.setStyle('margin-bottom', 0 );
				});
				
			} else {
				
				// slide out
				fx.start( -elh + 15 ).chain(function(){
					var elb = $('AL_Logo_info_resize_window_btn');
					elb.setStyle('backgroundImage', 'url(images/window-maximize-inactive.png)');
					elb.getElementsByTagName('img')[0].src = "images/window-maximize-active.png";
					el.setStyle('margin-bottom', -elh );
				});
			}
		}
	});
	$('AL_Logo_info_close_window_btn').addEvents({
		'click': function(){
			$('AL_Logo_info_box').fade( button_fade_min ).get('tween').chain( function(){
				$('AL_Logo_info_box').setStyle('display', 'none');
				$('AL_Logo').fade( button_fade_min );
			});		
		}
	});

}

//******************************************************************************
//******************************************************************************
//*** 
//******************************************************************************
function ALLogoEventHandler( e ){

   if ( !e ){ var e = window.event; }

	if ( ( e.altKey && e.ctrlKey ) && ( $('AL_Logo').getStyle('opacity') < 1 ) ){
		
		var elb = $('AL_Logo_info_resize_window_btn');
		elb.setStyle('backgroundImage', 'url(images/window-maximize-inactive.png)');
		elb.getElementsByTagName('img')[0].src = "images/window-maximize-active.png";
		
		$('AL_Logo').fade( button_fade_min, 1 ).get('tween').chain( function(){
			$('AL_Logo_info_box').setStyle('display', 'block');
			$('AL_Logo_info_content').setStyle('margin-bottom', -( parseInt( $('AL_Logo_info_content').getStyle('height') )
				+ parseInt( $('AL_Logo_info_content').getStyle('padding-top') )
				+ parseInt( $('AL_Logo_info_content').getStyle('padding-bottom') ) )
			);
			$('AL_Logo_info_box').fade( button_fade_min, 0.85 );		
		});		
		
	} else if ( $('AL_Logo').getStyle('opacity') == 1 ){
		
		$('AL_Logo_info_box').fade( button_fade_min ).get('tween').chain( function(){
			$('AL_Logo_info_box').setStyle('display', 'none');
			$('AL_Logo').fade( button_fade_min );
		});		
	}
}

//******************************************************************************
//******************************************************************************
//*** fill a string up to a specified length
//******************************************************************************
function fillString( str, fillChar, len ){
	
	for ( var i = str.length; i < len; i++ ){
		str = fillChar + str;
	}
	return ( str );	
}




//******************************************************************************
//******************************************************************************
//*** scrollbar
//******************************************************************************
function makeScrollbar(content,scrollbar,handle,back_btn,forward_btn,horizontal,ignoreMouse){
	
	var steps = (horizontal?(content.getScrollSize().x - content.getSize().x):(content.getScrollSize().y - content.getSize().y))
	var slider = new Slider(scrollbar, handle, {	
		steps: steps,
		mode: (horizontal?'horizontal':'vertical'),
		onChange: function(step){
			// Scrolls the content element in x or y direction.
			var x = (horizontal?step:0);
			var y = (horizontal?0:step);
			content.scrollTo(x,y);
		}
	}).set(0);
	
	if( !(ignoreMouse) ){
		// Scroll the content element when the mousewheel is used within the 
		// content or the scrollbar element.
		$$(content, scrollbar).addEvent('mousewheel', function(e){	
			e = new Event(e).stop();
			var step = slider.step - e.wheel * scrollbar_mouse_wheel_step;	
			slider.set(step);					
		});
	}
		
	if( back_btn != null ){
		back_btn.addEvent('mousedown', function(event){
			this.interval = (function(event){
				var step = slider.step - scrollbar_btn_step;	
				slider.set(step);	
			}.bind(this).periodical(scrollbar_btn_delay))
		}.bind(this));	
		back_btn.addEvent('mouseup', function(event){
			$clear(this.interval);
		}.bind(this));
		back_btn.addEvent('mouseout', function(event){
			$clear(this.interval);
		}.bind(this));
	}
	
	if( forward_btn != null ){
		forward_btn.addEvent('mousedown', function(event){
			this.interval = (function(event){
				var step = slider.step + scrollbar_btn_step;	
				slider.set(step);	
			}.bind(this).periodical(scrollbar_btn_delay))
		}.bind(this));	
		forward_btn.addEvent('mouseup', function(event){
			$clear(this.interval);
		}.bind(this));
		forward_btn.addEvent('mouseout', function(event){
			$clear(this.interval);
		}.bind(this));
	}
	
	// Stops the handle dragging process when the mouse leaves the document body.
//	$(document.body).addEvent('mouseleave',function(){slider.drag.stop()});
}



//******************************************************************************
//******************************************************************************
//*** scrollbar class
//******************************************************************************
var ScrollBar = new Class({

	Implements: [Events, Options],

	options: {
		maxThumbSize: 15,
		wheel: 8,
		arrows: true,
		hScroll: true // horizontal scrollbars
	},

	initialize: function(main, content, options){
		this.setOptions(options);
		
		this.main = $(main);
		this.content = $(content);
		
		if (this.options.arrows == true){
			this.arrowOffset = 30;
		} else {
			this.arrowOffset = 0;
		}
		
		if (this.options.hScroll == true){
			this.hScrollOffset = 15;
		} else {
			this.hScrollOffset = 0;
		}				

		this.vScrollbar = new Element('div', {
				'class': 'vScrollbar'
			}).injectAfter(this.content);				

		if (this.options.arrows == true){				
			this.arrowUp = new Element('div', {
					'class': 'arrowUp'
				}).injectInside(this.vScrollbar);
		}	

		this.vTrack = new Element('div', {
				'class': 'vTrack'
			}).injectInside(this.vScrollbar);
			
		this.vThumb = new Element('div', {
				'class': 'vThumb'
			}).injectInside(this.vTrack);

		if (this.options.arrows == true){				
			this.arrowDown = new Element('div', {
					'class': 'arrowDown'
				}).injectInside(this.vScrollbar);
		}		
		
		this.hScrollbar = new Element('div', {
				'class': 'hScrollbar'
			}).injectAfter(this.vScrollbar);

		if (this.options.arrows == true){							
			this.arrowLeft = new Element('div', {
					'class': 'arrowLeft'
				}).injectInside(this.hScrollbar);
		}		

		this.hTrack = new Element('div', {
				'class': 'hTrack'
			}).injectInside(this.hScrollbar);
			
		this.hThumb = new Element('div', {
				'class': 'hThumb'
			}).injectInside(this.hTrack);							

		if (this.options.arrows == true){
			this.arrowRight = new Element('div', {
					'class': 'arrowRight'
				}).injectInside(this.hScrollbar);
		}											

		this.corner = new Element('div', {
				'class': 'corner'
			}).injectAfter(this.hScrollbar);
		
		this.bound = {
			'vStart': this.vStart.bind(this),
			'hStart': this.hStart.bind(this),				
			'end': this.end.bind(this),
			'vDrag': this.vDrag.bind(this),
			'hDrag': this.hDrag.bind(this),				
			'wheel': this.wheel.bind(this),
			'vPage': this.vPage.bind(this),
			'hPage': this.hPage.bind(this)				
		};

		this.vPosition = {};
		this.hPosition = {};			
		this.vMouse = {};
		this.hMouse = {};			
		this.update();
		this.attach();
	},

	update: function(){
		
		this.main.setStyle('height', this.content.offsetHeight + this.hScrollOffset);
		this.vTrack.setStyle('height', this.content.offsetHeight - this.arrowOffset);
					
		this.main.setStyle('width', this.content.offsetWidth + 15);
		this.hTrack.setStyle('width', this.content.offsetWidth - this.arrowOffset);
		
		// Remove and replace vertical scrollbar			
		if (this.content.scrollHeight <= this.main.offsetHeight) {
			this.vScrollbar.setStyle('display', 'none');
			if (this.options.hScroll == true){				
				this.hTrack.setStyle('width', this.hTrack.offsetWidth + 15);
			}	
			this.content.setStyle('width', this.content.offsetWidth + 15);	
		} else {
			this.vScrollbar.setStyle('display', 'block');			
		}
		
		if (this.options.hScroll == true){			
		
			// Remove and replace horizontal scrollbar
			if (this.content.scrollWidth <= this.main.offsetWidth) {
				this.hScrollbar.setStyle('display', 'none');
				this.vTrack.setStyle('height', this.vTrack.offsetHeight + this.hScrollOffset);				
				this.content.setStyle('height', this.content.offsetHeight + this.hScrollOffset);	
			} else {
				this.hScrollbar.setStyle('display', 'block');			
			}
		
			// Remove and replace bottom right corner spacer			
			if (this.content.scrollHeight <= this.main.offsetHeight || this.content.scrollWidth <= this.main.offsetWidth) {
				this.corner.setStyle('display', 'none');				
			} else {
				this.corner.setStyle('display', 'block');			
			}		
		
			// Horizontal

			this.hContentSize = this.content.offsetWidth;
			this.hContentScrollSize = this.content.scrollWidth;
			this.hTrackSize = this.hTrack.offsetWidth;

			this.hContentRatio = this.hContentSize / this.hContentScrollSize;

			this.hThumbSize = (this.hTrackSize * this.hContentRatio).limit(this.options.maxThumbSize, this.hTrackSize);

			this.hScrollRatio = this.hContentScrollSize / this.hTrackSize;

			this.hThumb.setStyle('width', this.hThumbSize);

			this.hUpdateThumbFromContentScroll();
			this.hUpdateContentFromThumbPosition();			

		} else {
				this.hScrollbar.setStyle('display', 'none');
				this.corner.setStyle('display', 'none');										
		}
		

		// Vertical
		
		this.vContentSize = this.content.offsetHeight;
		this.vContentScrollSize = this.content.scrollHeight;
		this.vTrackSize = this.vTrack.offsetHeight;

		this.vContentRatio = this.vContentSize / this.vContentScrollSize;

		this.vThumbSize = (this.vTrackSize * this.vContentRatio).limit(this.options.maxThumbSize, this.vTrackSize);

		this.vScrollRatio = this.vContentScrollSize / this.vTrackSize;

		this.vThumb.setStyle('height', this.vThumbSize);

		this.vUpdateThumbFromContentScroll();
		this.vUpdateContentFromThumbPosition();
		
	},

	vUpdateContentFromThumbPosition: function(){
		this.content.scrollTop = this.vPosition.now * this.vScrollRatio;
	},
	
	hUpdateContentFromThumbPosition: function(){
		this.content.scrollLeft = this.hPosition.now * this.hScrollRatio;
	},		

	vUpdateThumbFromContentScroll: function(){
		this.vPosition.now = (this.content.scrollTop / this.vScrollRatio).limit(0, (this.vTrackSize - this.vThumbSize));
		this.vThumb.setStyle('top', this.vPosition.now);
	},
	
	hUpdateThumbFromContentScroll: function(){
		this.hPosition.now = (this.content.scrollLeft / this.hScrollRatio).limit(0, (this.hTrackSize - this.hThumbSize));
		this.hThumb.setStyle('left', this.hPosition.now);
	},		

	attach: function(){
		this.vThumb.addEvent('mousedown', this.bound.vStart);
		if (this.options.wheel) this.content.addEvent('mousewheel', this.bound.wheel);
		this.vTrack.addEvent('mouseup', this.bound.vPage);
		
		this.hThumb.addEvent('mousedown', this.bound.hStart);
		this.hTrack.addEvent('mouseup', this.bound.hPage);			
		
		if (this.options.arrows == true){
			this.arrowUp.addEvent('mousedown', function(event){
					this.interval = (function(event){
					this.content.scrollTop -= this.options.wheel;
					this.vUpdateThumbFromContentScroll();
				}.bind(this).periodical(40))
			}.bind(this));
		
			this.arrowUp.addEvent('mouseup', function(event){
				$clear(this.interval);
			}.bind(this));
		
			this.arrowUp.addEvent('mouseout', function(event){
				$clear(this.interval);
			}.bind(this));
					
			this.arrowDown.addEvent('mousedown', function(event){
					this.interval = (function(event){
					this.content.scrollTop += this.options.wheel;
					this.vUpdateThumbFromContentScroll();
				}.bind(this).periodical(40))
			}.bind(this));
		
			this.arrowDown.addEvent('mouseup', function(event){
				$clear(this.interval);
			}.bind(this));
		
			this.arrowDown.addEvent('mouseout', function(event){
				$clear(this.interval);
			}.bind(this));
		
			this.arrowLeft.addEvent('mousedown', function(event){
					this.interval = (function(event){
					this.content.scrollLeft -= this.options.wheel;
					this.hUpdateThumbFromContentScroll();
				}.bind(this).periodical(40))
			}.bind(this));
		
			this.arrowLeft.addEvent('mouseup', function(event){
				$clear(this.interval);
			}.bind(this));
		
			this.arrowLeft.addEvent('mouseout', function(event){
				$clear(this.interval);
			}.bind(this));
		
			this.arrowRight.addEvent('mousedown', function(event){
					this.interval = (function(event){
					this.content.scrollLeft += this.options.wheel;
					this.hUpdateThumbFromContentScroll();
				}.bind(this).periodical(40))
			}.bind(this));
		
			this.arrowRight.addEvent('mouseup', function(event){
				$clear(this.interval);
			}.bind(this));
		
			this.arrowRight.addEvent('mouseout', function(event){
				$clear(this.interval);
			}.bind(this));
		}			
					
	},
	
	wheel: function(event){
		this.content.scrollTop -= event.wheel * this.options.wheel;
		this.vUpdateThumbFromContentScroll();
		event.stop();
	},

	vPage: function(event){
		if (event.page.y > this.vThumb.getPosition().y) this.content.scrollTop += this.content.offsetHeight;
		else this.content.scrollTop -= this.content.offsetHeight;
		this.vUpdateThumbFromContentScroll();
		event.stop();
	},
	
	hPage: function(event){
		if (event.page.x > this.hThumb.getPosition().x) this.content.scrollLeft += this.content.offsetWidth;
		else this.content.scrollLeft -= this.content.offsetWidth;
		this.hUpdateThumbFromContentScroll();
		event.stop();
	},		

	vStart: function(event){
		this.vMouse.start = event.page.y;
		this.vPosition.start = this.vThumb.getStyle('top').toInt();
		document.addEvent('mousemove', this.bound.vDrag);
		document.addEvent('mouseup', this.bound.end);
		this.vThumb.addEvent('mouseup', this.bound.end);
		event.stop();
	},
	
	hStart: function(event){
		this.hMouse.start = event.page.x;		
		this.hPosition.start = this.hThumb.getStyle('left').toInt();
		document.addEvent('mousemove', this.bound.hDrag);
		document.addEvent('mouseup', this.bound.end);
		this.hThumb.addEvent('mouseup', this.bound.end);
		event.stop();
	},		

	end: function(event){
		document.removeEvent('mousemove', this.bound.vDrag);
		document.removeEvent('mousemove', this.bound.hDrag);			
		document.removeEvent('mouseup', this.bound.end);
		this.vThumb.removeEvent('mouseup', this.bound.end);
		this.hThumb.removeEvent('mouseup', this.bound.end);			
		event.stop();
	},

	vDrag: function(event){
		this.vMouse.now = event.page.y;
		this.vPosition.now = (this.vPosition.start + (this.vMouse.now - this.vMouse.start)).limit(0, (this.vTrackSize - this.vThumbSize));
		this.vUpdateContentFromThumbPosition();
		this.vUpdateThumbFromContentScroll();
		event.stop();
	},
	
	hDrag: function(event){
		this.hMouse.now = event.page.x;
		this.hPosition.now = (this.hPosition.start + (this.hMouse.now - this.hMouse.start)).limit(0, (this.hTrackSize - this.hThumbSize));
		this.hUpdateContentFromThumbPosition();
		this.hUpdateThumbFromContentScroll();
		event.stop();
	}		

});

//******************************************************************************
//******************************************************************************
//***
//*** get infos about browser
//***
//*** Browser Detect  v2.1.6
//*** documentation: http://www.dithered.com/javascript/browser_detect/index.html
//*** license: http://creativecommons.org/licenses/by/1.0/
//*** code by Chris Nott (chris[at]dithered[dot]com)
//*** extended 2009 by Achim Liese
//***
//******************************************************************************
function BrowserDetect(){
	
   var ua = navigator.userAgent.toLowerCase(); 

   // browser engine name
   this.isGecko       = (ua.indexOf('gecko') != -1 && ua.indexOf('safari') == -1);
   this.isAppleWebKit = (ua.indexOf('applewebkit') != -1);

   // browser name
   this.isKonqueror   = (ua.indexOf('konqueror') != -1); 
   this.isSafari      = (ua.indexOf('safari') != - 1);
   this.isOmniweb     = (ua.indexOf('omniweb') != - 1);
   this.isOpera       = (ua.indexOf('opera') != -1); 
   this.isIcab        = (ua.indexOf('icab') != -1); 
   this.isAol         = (ua.indexOf('aol') != -1); 
   this.isIE          = (ua.indexOf('msie') != -1 && !this.isOpera && (ua.indexOf('webtv') == -1) ); 
   this.isMozilla     = (this.isGecko && ua.indexOf('gecko/') + 14 == ua.length);
   this.isFirefox     = (ua.indexOf('firefox/') != -1 || ua.indexOf('firebird/') != -1);
   this.isNS          = ( (this.isGecko) ? (ua.indexOf('netscape') != -1) : ( (ua.indexOf('mozilla') != -1) && !this.isOpera && !this.isSafari && (ua.indexOf('spoofer') == -1) && (ua.indexOf('compatible') == -1) && (ua.indexOf('webtv') == -1) && (ua.indexOf('hotjava') == -1) ) );
   
   // spoofing and compatible browsers
   this.isIECompatible = ( (ua.indexOf('msie') != -1) && !this.isIE);
   this.isNSCompatible = ( (ua.indexOf('mozilla') != -1) && !this.isNS && !this.isMozilla);
   
   // rendering engine versions
   this.geckoVersion = ( (this.isGecko) ? ua.substring( (ua.lastIndexOf('gecko/') + 6), (ua.lastIndexOf('gecko/') + 14) ) : -1 );
   this.firefoxVersion = ( (this.isFirefox) ? ua.substring( (ua.lastIndexOf('firefox/') + 8), (ua.lastIndexOf('firefox/') + 16) ) : -1 );
   this.equivalentMozilla = ( (this.isGecko) ? parseFloat( ua.substring( ua.indexOf('rv:') + 3 ) ) : -1 );
   this.appleWebKitVersion = ( (this.isAppleWebKit) ? parseFloat( ua.substring( ua.indexOf('applewebkit/') + 12) ) : -1 );
   
   // browser version
   this.versionMinor = parseFloat(navigator.appVersion); 
   
   // correct version number
   if (this.isGecko && !this.isMozilla) {
	  if (this.isFirefox) {
         this.versionMinor = parseFloat( this.firefoxVersion );
	  } else {
         this.versionMinor = parseFloat( ua.substring( ua.indexOf('/', ua.indexOf('gecko/') + 6) + 1 ) );
	  }
   }
   else if (this.isMozilla) {
      this.versionMinor = parseFloat( ua.substring( ua.indexOf('rv:') + 3 ) );
   }
   else if (this.isIE && this.versionMinor >= 4) {
      this.versionMinor = parseFloat( ua.substring( ua.indexOf('msie ') + 5 ) );
   }
   else if (this.isKonqueror) {
      this.versionMinor = parseFloat( ua.substring( ua.indexOf('konqueror/') + 10 ) );
   }
   else if (this.isSafari) {
      this.versionMinor = parseFloat( ua.substring( ua.lastIndexOf('safari/') + 7 ) );
   }
   else if (this.isOmniweb) {
      this.versionMinor = parseFloat( ua.substring( ua.lastIndexOf('omniweb/') + 8 ) );
   }
   else if (this.isOpera) {
      this.versionMinor = parseFloat( ua.substring( ua.indexOf('opera') + 6 ) );
   }
   else if (this.isIcab) {
      this.versionMinor = parseFloat( ua.substring( ua.indexOf('icab') + 5 ) );
   }
   
   this.versionMajor = parseInt(this.versionMinor); 
   this.versionMinor = parseInt( ( this.versionMinor - this.versionMajor ) * 10 ); 
//   this.versionMajor = 6; 
//   this.versionMinor = 3; 
   
   // dom support
   this.isDOM1 = ( document.getElementById ) ? true : false;
   this.isDOM2Event = (document.addEventListener && document.removeEventListener) ? true : false;
   
   // css compatibility mode
   this.mode = document.compatMode ? document.compatMode : 'BackCompat';

   // platform
   this.isWin    = (ua.indexOf('win') != -1);
   this.isWin32  = (this.isWin && ( ua.indexOf('95') != -1 || ua.indexOf('98') != -1 || ua.indexOf('nt') != -1 || ua.indexOf('win32') != -1 || ua.indexOf('32bit') != -1 || ua.indexOf('xp') != -1) );
   this.isMac    = (ua.indexOf('mac') != -1);
   this.isUnix   = (ua.indexOf('unix') != -1 || ua.indexOf('sunos') != -1 || ua.indexOf('bsd') != -1 || ua.indexOf('x11') != -1)
   this.isLinux  = (ua.indexOf('linux') != -1);
   
   // specific browser shortcuts
   this.isNS4x = (this.isNS && this.versionMajor == 4);
   this.isNS40x = (this.isNS4x && this.versionMinor < 4.5);
   this.isNS47x = (this.isNS4x && this.versionMinor >= 4.7);
   this.isNS4up = (this.isNS && this.versionMinor >= 4);
   this.isNS6x = (this.isNS && this.versionMajor == 6);
   this.isNS6up = (this.isNS && this.versionMajor >= 6);
   this.isNS7x = (this.isNS && this.versionMajor == 7);
   this.isNS7up = (this.isNS && this.versionMajor >= 7);
   
   this.isIE4x = (this.isIE && this.versionMajor == 4);
   this.isIE4up = (this.isIE && this.versionMajor >= 4);
   this.isIE5x = (this.isIE && this.versionMajor == 5);
   this.isIE55 = (this.isIE && this.versionMinor == 5.5);
   this.isIE5up = (this.isIE && this.versionMajor >= 5);
   this.isIE6x = (this.isIE && this.versionMajor == 6);
   this.isIE6up = (this.isIE && this.versionMajor >= 6);
   this.isIE7 = (this.isIE && this.versionMajor == 7);
   this.isIE7up = (this.isIE && this.versionMajor >= 7);
   
   this.isIE4xMac = (this.isIE4x && this.isMac);
   
   // browser minimum requirements for PNG alpha, CSS, DOM (early alpha! Only tested for Firefox and IE!)
   this.hasMinCapabilities = ( this.isDOM1 && document.compatMode && ( this.isIE ? this.isIE7up : true ) ) ? true : false;
//   this.hasMinCapabilities = false;
}







