/******************************************************************************
-------------------------------------------------------------------------------
  PROJECT: 		OpenCode
  AUTHOR:		mud(tm)
  DATE:			01/01/2007
  COPYRIGHT: 	(c) 2007, PLW.
  REQUIRES:		prototype.js, effects.js, xDesignMode.js
-------------------------------------------------------------------------------
  utilities.js
-------------------------------------------------------------------------------
******************************************************************************/

///////////////////////////////////////////////////////////////////////////////
// GLOBALS

var debug_padding = {x: 6, y: 6};

var _is_rich_editor = false;
var editor;
var library;

var images_over = new Array();
var images_off = new Array();

// Global that holds clipboard content. In the future we can make it an array
// to carry histories...
var clipboard = "";

var showing_library = false;
// Temporarily hold content of library or code when toggling
var tmp_snippet = "";


///////////////////////////////////////////////////////////////////////////////
// FUNCTIONS: Utilities

/*
void set_dimensions()

Sets the dimensions of editor based on the size of the text area.
*/
function set_dimensions() {
	//var dim = Element.getDimensions('code_text_area');
	var dim = {width: 506, height: 474};
	if ($('code_debug')) {
		Element.setStyle('code_debug', {
			width: (dim.width - 2*debug_padding.x - 1) + "px",
			height: (dim.height - 2*debug_padding.y - 1) + "px"
		});
	}
	if ($('code_container')) {
		Element.setStyle('code_container', {
			width: dim.width + "px",
			height: (dim.height + 5) + "px"
		});
	}
	if ($('code_text_frame')) {
		Element.setStyle('code_text_frame', {
			width: (dim.width - 2) + "px",
			height: (dim.height + 5) + "px"
		});
	}	
	if ($('library_text_frame')) {
		Element.setStyle('library_text_frame', {
			width: (dim.width - 2) + "px",
			height: (dim.height + 5) + "px"
		});
	}
}

/*
Boolean is_rtf_compatible()

Returns true if Rich Text Editing is supported.
Use it to set global _is_rich_editor on load.
*/
function is_rtf_compatible() {
	if(navigator.userAgent.match(/Gecko/) && !navigator.userAgent.match(/Safari/)) {
	//if(navigator.userAgent.match(/Gecko/)) {
		if(document.getElementById('code_text_frame').contentDocument.designMode) {
			document.getElementById('code_text_frame').contentDocument.designMode = "on";
			try {
				document.getElementById('code_text_frame').contentDocument.execCommand("undo", false, null);
			} catch (e) {
				alert("This demo is not supported on your level of Mozilla.");
				return false;
			}
			return true;
		}
	}
	return false;
}

/*
String string_clean(string)

Returns strings clean of HTML.
*/
function string_clean(s) {
	s = s.replace(/<br>/gi, "\n");
	s = s.replace(/&nbsp;/gi, " ");
	s = s.replace(/&amp;/gi, "&");
	s = s.stripTags();
	s = s.replace(/&lt;/gi, "<");
	s = s.replace(/&gt;/gi, ">");
	return s;
}

/*
String string_encode(string)

Returns encoded HTML.
*/
function string_encode(s) {
	if (typeof s != "string") {
		s = s.toString();
	}
	s = s.replace(/</gi, '&lt;');
	s = s.replace(/>/gi, '&gt;');
	s = s.replace(/\n/gi, "<br>");
	s = s.replace(/ /gi, "&nbsp;");
	return s;
}

///////////////////////////////////////////////////////////////////////////////
// FUNCTIONS: Compile Applet

/*
void code_compile()

Called when users presses 'Run' button to compile OpenCode. Make sure to look up value of id: version to determine which compiler to use.
*/
function code_compile() {
	if ($('loader')) Element.show('loader');
	var source_code = generate_source_code();
	$('code_text').value = source_code;
	var compiler = ($('compiler').options[$('compiler').selectedIndex].value) ? $('compiler').options[$('compiler').selectedIndex].value : "116";
	new Ajax.Request('/pcompiler_' + compiler + '/Compiler', {
		method: 'post',
		asynchronous: true,
		evalScripts: true,
		onComplete: function(request) {
			if ($('debug_console')) Element.hide('debug_console');
			if(!is_error(request.responseText)) {
				var app_tag = construct_applet(request.responseText);
				code_compile_success(app_tag);
			} else {
				show_error(request.responseText);
				if ($('loader')) Element.hide('loader');
			}
		},
		onFailure: function(request) {
			alert('Sorry, server compile error occurred.');
			if ($('loader')) Element.hide('loader');
		},
		parameters: Form.serialize('form_compile')
	});
}

/*
String generate_source_code()

Generates OpenCode source code.
*/
function generate_source_code() {
	var source = "";
	switch(showing_library) {
		case false:
			source = (_is_rich_editor) ? string_clean(code_text_frame.document.body.innerHTML) : $('code_text_area').value;
			break;
		default:
			source = (_is_rich_editor) ? string_clean(tmp_snippet) : tmp_snippet;
			break;
	}
	return source;
}

/*
DEPRECIATED
String get_package_name(String source_code)

Extracts package name, if none, returns empty string.
*/
function get_package_name(source_code) {
	var package_name = "";
	match_result = source_code.match(/\s*package\s*(.*)\s*/);
	if (match_result != null) {
		// strip package
		package_name = match_result[0].replace(/\s*package\s*/, '');
		// strip leading and trailing spaces
		package_name = package_name.replace(/^\W+/, '').replace(/\W+$/,'');
	}
	return package_name;
}

/*
String construct_applet(String JSON)

Constructs <applet> given a JSON object from servlet.
*/
function construct_applet(r) {
	var response = eval('('+r+')');
	var t = "";
	if (response.opengl == 0) {
		t += '<applet codebase="/files/open_code/'
		t += response.compiler;
		t += '" code="';
		t += response.id;
		t += '" archive="';
		t += response.dependencies.to_s();
		t += '" width="' + response.width + '" height="' + response.height + '" mayscript="true" />';
		t += '<param name="image" value="/tool/open_code/images/loading.gif" />';
		t += '<param name="boxmessage" value="Loading Processing software..." />';
		t += '<param name="boxbgcolor" value="#000000" />';
	} else {
		t += '<applet codebase="/files/open_code/';
		//t += response.complier;
                t += 120;
		t += '" code="com.sun.opengl.util.JOGLAppletLauncher" archive="';
		t += response.dependencies.to_s();
		t += '" width="' + response.width + '" height="' + response.height + '" mayscript="true" />';
		t += '<param name="image" value="/tool/open_code/images/loading.gif" />';
		t += '<param name="boxmessage" value="Loading Processing software..." />';
		t += '<param name="boxbgcolor" value="#000000" />';
		t += '<param name="subapplet.classname" value="' + response.id + '" />';
		t += '<param name="subapplet.displayname" value="' + response.id + '" />';
		t += '<param name="progressbar" value="true" />';
		t += '<param name="cache_archive" value="' + response.dependencies.to_s() + '" />';
		var d = response.dependencies;
		for (var i = 0; i < d.length; i++) {
			d[i] += ";preload";
		}
		t += '<param name="cache_archive_ex" value="' + d.to_s() + '" />';
	}
	t += '</applet>';
	return t;
}

/*
void code_compile_success(app_tag)

Called when compiled successfully.
*/
function code_compile_success(app_tag) {
	if ($('code_text_frame')) Element.setStyle('code_text_frame', {visibility: 'hidden'});
	if ($('code_text_area')) $('code_text_area').style.overflow = 'hidden';
	if ($('code_debug')) $('code_debug').style.overflow = 'hidden';
	if ($('library_text_frame')) Element.setStyle('library_text_frame', {visibility: 'hidden'});
	if ($('library_text_area')) $('library_text_area').style.overflow = 'hidden';
	
	new Effect.BlindUp('page_content', {
		duration: 0.5,
		beforeStart: function() {
			if ($('loader')) Element.hide('loader');
		},
		afterFinish: function() {
			$('applet').innerHTML = app_tag;
			set_applet_background();
			Element.show('applet-wrapper');
		}
	});
}

/*
void set_applet_background()

Sets the dimensions of applet background. Should be called on load and resize.
*/
function set_applet_background() {
	var content_dimensions = getWindowDimensions();
	Element.setStyle('applet-wrapper', {
		width: content_dimensions.width + "px",
		height: content_dimensions.height + "px"
	});
}

/*
void applet_clear()

Closes applet and strips out the innerHTML to prevent Firefox from using cache.
*/
function applet_clear() {
	$('applet').innerHTML = "";
	Element.hide('applet-wrapper');
	new Effect.BlindDown('page_content', {
		duration: 0.5,
		afterFinish: function() {
			if ($('code_text_frame')) Element.setStyle('code_text_frame', {visibility: 'visible'});
			if ($('code_text_area')) Element.setStyle('code_text_area', {overflow: 'auto'});
			if ($('code_debug')) Element.setStyle('code_debug', {overflow: 'auto'});
			if ($('library_text_frame')) Element.setStyle('library_text_frame', {visibility: 'visible'});
			if ($('library_text_area')) Element.setStyle('library_text_area', {overflow: 'auto'});
		}
	});
}

/*
Boolean is_error(String JSON)

Returns boolean whether response from servlet is successful or an error.
*/
function is_error(response) {
	var result = false;
	var r = eval('('+response+')');
	if(r.error) result = true;
	return result;
}

/*
void show_error(String JSON)

Shows error.
*/
function show_error(err) {
	var r = eval('('+err+')');
	var error = '<span class="error_message">';
	error += r.error;
	error += '</span> at line: <span class="error_line">';
	error += r.line;
	error += '</span>';
	$('debug_error').innerHTML = error;
	throw_error();
}

/*
void show_jikes_error(String error)

Shows error from Jikes when building library.
*/
function show_jikes_error(err) {
	var error = '<span class="error_message">';
	error += err;
	error += '</span>';
	$('debug_error').innerHTML = error;
	throw_error();
}

/*
void throw_error()

Opens up error block.
*/
function throw_error() {
	new Effect.BlindDown('debug_console', {
		duration: 0.2
	});
}


///////////////////////////////////////////////////////////////////////////////
// FUNCTIONS: Library

function toggle_library() {
	if($('library_text_area') || $('library_text_frame')) {
		var target = (_is_rich_editor) ? "frame" : "area";
		if (Element.getStyle('library_text_'+target, 'display') == 'none') {
			new Effect.BlindUp('code_text_'+target, {
				duration: 0.4,
				beforeStart: function() {
					tmp_snippet = (_is_rich_editor) ? string_clean(code_text_frame.document.body.innerHTML) : $('code_text_area').value;
				},
				afterFinish: function() {
					if ($('library-link')) $('library-link').innerHTML = "Show Code";
					if ($('editor-title')) $('editor-title').innerHTML = "Library Editor";
					new Effect.BlindDown('library_text_'+target, {duration: 0.4});
					showing_library = true;
				}
			});
		} else {
			new Effect.BlindUp('library_text_'+target, {
				duration: 0.4,
				beforeStart: function() {
					tmp_snippet = (_is_rich_editor) ? string_clean(library_text_frame.document.body.innerHTML) : $('library_text_area').value;
				},
				afterFinish: function() {
					if ($('library-link')) $('library-link').innerHTML = "Show Library";
					if ($('editor-title')) $('editor-title').innerHTML = "Code Editor";
					new Effect.BlindDown('code_text_'+target, {duration: 0.4});
					showing_library = false;
				}
			});
		}
	}
}

function toggle_classes(id) {
	if($(id)) {
		new Effect.toggle(id, 'blind', {duration: 0.2});
	}
}


///////////////////////////////////////////////////////////////////////////////
// FUNCTIONS: Parse Code

function code_parse(evt) {
	if(!_is_rich_editor) {
		$('code').value = $('code_text_area').value;
		new Ajax.Updater('code_debug', '/cgi-bin/parse_code.rb', {
			method: 'post',
			asynchronous: true,
			evalScripts: true,
			onComplete: function(request) {
				Element.show('code_debug');
				Element.hide('code_text');
				set_dimensions();
			},
			parameters:Form.serialize('form_parse')
		});
	}
	else {
		$('code').value = string_clean(editor.mEditorDocument.body.innerHTML);
		new Ajax.Request('/cgi-bin/parse_code.rb', {
			method: 'post',
			parameters: Form.serialize('form_parse'),
			onComplete: function(request) {
				editor.mEditorDocument.body.innerHTML = request.responseText;
			}
		});
	}
}

///////////////////////////////////////////////////////////////////////////////
// FUNCTIONS: Copy+Paste Code

/*
String code_get_selected()

Copies current code into "clipboard." Code segment based on getSel() from:
http://www.quirksmode.org/js/selected.html
*/
function code_get_selected() {
	var text = '';
	if (!showing_library) {
		if (code_text_frame.getSelection) {
			text = unescape(code_text_frame.getSelection()); // running unescape because Safari isn't cooperative...
			// reference: http://www.macosxhints.com/article.php?story=20050422144207644
		}
		else if (editor.mEditorDocument.getSelected) {
			text = editor.mEditorDocument.getSelected;
		}
		else if (editor.mEditorDocument.selection) {
			text = editor.mEditorDocument.selection.createRange().text;
		}
	}
	else {
		if (library_text_frame.getSelection) {
			text = unescape(library_text_frame.getSelection());
		}
		else if (library.mEditorDocument.getSelected) {
			text = library.mEditorDocument.getSelected;
		}
		else if (library.mEditorDocument.selection) {
			text = library.mEditorDocument.selection.createRange().text;
		}
	}
	// Make sure it's a string
	if (typeof(text) != "string") {
		text = text.toString();
	}
	return text;
}

/*
String code_copy()

Copies current code into "clipboard." Make sure this is called onmousedown.
*/
function code_copy() {
	if (_is_rich_editor) {
		clipboard = code_get_selected();
		clipboard_brief = clipboard;
		if (clipboard.length > 30) {
			clipboard_brief = clipboard.substring(0, 30) + "...";
		}
		$('clipboard').title = string_clean(clipboard_brief);
		Element.show('clipboard');
	} else {
		alert("Sorry, this feature is currently not supported by your browser.");
	}
}

/*
void code_paste()

Pastes code from "clipboard" into editor.
*/
function code_paste() {
	if (_is_rich_editor) {
		if (clipboard != "") {
			var code = string_encode(clipboard);
			if (!showing_library) {
				editor.mEditorDocument.body.innerHTML += code;
			}
			else {
				library.mEditorDocument.body.innerHTML += code;
			}
		}
	} else {
		alert("Sorry, this feature is currently not supported by your browser.");
	}
}


///////////////////////////////////////////////////////////////////////////////
// FUNCTIONS: Code Injection

function fetch_code(id, type) {
	// show loader
	if ($('loader')) Element.show('loader');
	var pars = 'id=' + id;
	var url = '/tool/open_code/snippet';
	if (type == 'library') url = '/tool/open_code/snippet_library';
	else if (type == 'tutorial') url = '/tool/open_code/snippet_tutorial'
	var myAjax = new Ajax.Request(
		url, {
			method: 'post', 
			parameters: pars, 
			onComplete: function(request) {
				if (type == 'tutorial') {
					inject_code(request);
				}
				else if (type == 'library') {
					inject_library(request);
				}
				else {
					inject_code(request);
				}
			},
			onFailure: function(request) {
				alert('Sorry, could not fetch code.');
			}
		}
	);
}

function inject_code(request) {
	var snippet = request.responseText;
	if (_is_rich_editor) {
		snippet = string_encode(snippet);
		editor.mEditorDocument.body.innerHTML = snippet;
		if(showing_library) toggle_library();
	}
	else {
		$('code_text_area').value = snippet;
		if(showing_library) toggle_library();
	}
	if ($('loader')) Element.hide('loader');
}

function inject_library(request) {
	if (Element.getStyle('library-link', 'display') == 'none') Element.show('library-link');
	var snippet = request.responseText;
	if (_is_rich_editor) {
		snippet = string_encode(snippet);
		if (library) {
			library.mEditorDocument.body.innerHTML = snippet;
			if (Element.getStyle('library_text_frame', 'display') == "none") toggle_library();
		}
		else {
			alert("Sorry, you've selected a library. Please switch to expert mode.");
		}
	}
	else {
		if ($('library_text_area')) {
			$('library_text_area').value = snippet;
			if (Element.getStyle('library_text_area', 'display') == "none") toggle_library();
		}
		else {
			alert("Sorry, you've selected a library. Please switch to expert mode.");
		}
	}
	if ($('loader')) Element.hide('loader');
}

function create_new_library() {
	new Ajax.Updater('code_repository', '/tool/open_code/create_library', {
		method: 'post',
		parameters: Form.serialize('create_library'),
		onComplete: function() {
			update_library_list();
		},
		onFailure: function(request) {
			$('code_repository-wrapper').innerHTML = '<ul><li class="last"><em>Sorry, could not create the library.</em></li></ul>';
		}
	});
}

function create_new_tutorial() {
	new Ajax.Updater('code_repository', '/tool/open_code/create_tutorial', {
		method: 'post',
		parameters: Form.serialize('create_tutorial'),
		onComplete: function() {
			update_tutorial_list();
		},
		onFailure: function(request) {
			$('code_repository-wrapper').innerHTML = '<ul><li class="last"><em>Sorry, could not create the tutorial.</em></li></ul>';
		}
	});
}

function update_library_list() {
	new Ajax.Updater('form_save_library_file', '/tool/open_code/library_form');
}

function update_tutorial_list() {
	new Ajax.Updater('form_save_tutorial_file', '/tool/open_code/tutorial_form');
}

function delete_library(id) {
	var confirm = window.confirm("Are you sure you want to delete this library? All associated files will also be deleted.");
	if (confirm) {
		new Ajax.Updater('library-'+id, '/tool/open_code/destroy_library/'+id, {
			method: 'post',
			onComplete: function(request) {
				window.setTimeout("new Effect.BlindUp('library-"+id+"', {duration: 0.4})", 2000);
			},
			onFailure: function(request) {
				alert('Sorry, could not delete library.');
			}
		});
	}
}

function delete_tutorial(id) {
	var confirm = window.confirm("Are you sure you want to delete this tutorial? All associated files will also be deleted.");
	if (confirm) {
		new Ajax.Updater('tutorial-'+id, '/tool/open_code/destroy_tutorial/'+id, {
			method: 'post',
			onComplete: function(request) {
				window.setTimeout("new Effect.BlindUp('tutorial-"+id+"', {duration: 0.4})", 2000);
			},
			onFailure: function(request) {
				alert('Sorry, could not delete library.');
			}
		});
	}
}

function delete_library_file(id) {
	var confirm = window.confirm("Are you sure you want to delete this file?");
	if (confirm) {
		new Ajax.Updater('library_file-'+id, '/tool/open_code/destroy_library_file/'+id, {
			method: 'post',
			onComplete: function(request) {
				window.setTimeout("new Effect.BlindUp('library_file-"+id+"', {duration: 0.4})", 2000);
			},
			onFailure: function(request) {
				alert('Sorry, could not delete library file.');
			}
		});
	}
}

function delete_tutorial_file(id) {
	var confirm = window.confirm("Are you sure you want to delete this file?");
	if (confirm) {
		new Ajax.Updater('tutorial_file-'+id, '/tool/open_code/destroy_tutorial_file/'+id, {
			method: 'post',
			onComplete: function(request) {
				window.setTimeout("new Effect.BlindUp('tutorial_file-"+id+"', {duration: 0.4})", 2000);
			},
			onFailure: function(request) {
				alert('Sorry, could not delete library file.');
			}
		});
	}
}

function new_file() {
	if (_is_rich_editor) {
		editor.mEditorDocument.body.innerHTML = "";
	} else {
		$('library_text_area').value = "";
	}
	if (!showing_library) {
		toggle_library();
	}
}

function new_tutorial_file() {
	if (_is_rich_editor) {
		library.mEditorDocument.body.innerHTML = "";
	} else {
		$('code_text_area').value = "";
	}
}

function build_library(id) {
	$('build-'+id).innerHTML = 'Building...';
	new Ajax.Request('/tool/open_code/build_library/'+id, {
		method: 'post',
		onComplete: function(request) {
			if (request.responseText.match(/Error/)) {
				show_jikes_error(request.responseText);
				$('build-'+id).innerHTML = "<strong>Build Failed...</strong>";
			} else {
				$('build-'+id).innerHTML = request.responseText;
			}
		},
		onFailure: function() {
			$('build-'+id).innerHTML = "<strong>Build Failed...</strong>";
		}
	});
}


///////////////////////////////////////////////////////////////////////////////
// FUNCTIONS: Code Repository

function reset_buttons() {
	if ($('button_my_code')) Element.classNames('button_my_code').remove('selected');
	if ($('button_my_library')) Element.classNames('button_my_library').remove('selected');
	if ($('button_public')) Element.classNames('button_public').remove('selected');
	if ($('button_search')) Element.classNames('button_search').remove('selected');
}

function insert_loader() {
	$('code_repository-wrapper').innerHTML = '<div id="code_repository"><img src="/images/loading.gif" alt="loading" style="padding: 4px 0;" /></div>';
}

function press_save() {
	if (!showing_library) {
		new Effect.Appear('form_save-wrapper', {duration: 0.2, to: 0.9});
	}
	else {
		new Effect.Appear('form_save_library-wrapper', {duration: 0.2, to: 0.9});
	}
}

function code_save() {
	var save_method = "";
	$('open_code_compiler').value = $('compiler').options[$('compiler').selectedIndex].value;
	if (!showing_library) {
		save_method = "save";
		$('open_code_source').value = (_is_rich_editor) ? string_clean(editor.mEditorDocument.body.innerHTML) : $('code_text_area').value;
	}
	else {
		save_method = "save_library_file";
		$('library_file_source').value = (_is_rich_editor) ? string_clean(library.mEditorDocument.body.innerHTML) : $('library_text_area').value;
	}
	new Ajax.Updater('status', '/tool/open_code/' + save_method, {
		method: 'post',
		asynchronous: true,
		evalScripts: true,
		parameters:Form.serialize('form_'+save_method),
		onComplete: function() {
			reset_save_form();
			window.setTimeout('reset_status()', 5000);
			if (save_method == "save_library_file") {
				new Ajax.Updater('code_repository', '/tool/open_code/list_library');
			}
		},
		onFailure: function(request) {
			alert('Sorry, could not save.');
		}
	});
}

function tutorial_code_save() {
	$('tutorial_file_source').value = (_is_rich_editor) ? string_clean(editor.mEditorDocument.body.innerHTML) : $('code_text_area').value;
	new Ajax.Updater('status', '/tool/open_code/save_tutorial_file', {
		method: 'post',
		asynchronous: true,
		evalScripts: true,
		parameters:Form.serialize('form_save'),
		onComplete: function() {
			reset_save_form();
			window.setTimeout('reset_status()', 5000);
			new Ajax.Updater('code_repository', '/tool/open_code/list_tutorial');
		},
		onFailure: function(request) {
			alert('Sorry, could not save.');
		}
	});
}

function reset_save_form() {
	if (!showing_library) {
		new Effect.Fade('form_save-wrapper', {duration: 0.4});
		$('button_code_submit').disable = false;
	} else {
		new Effect.Fade('form_save_library-wrapper', {duration: 0.4});
		$('button_library_submit').disable = false;
	}
}

function reset_status() {
	$('status').innerHTML = "";
}

function code_search() {
	new Ajax.Updater('search_results-wrapper', '/tool/open_code/list_code/search', {
		method: 'post',
		asynchronous: true,
		evalScripts: true,
		parameters:Form.serialize('form_search')
	});
}


///////////////////////////////////////////////////////////////////////////////
// FUNCTIONS: Events

function init() {
	// set code_debug dimensions to code
	set_dimensions();
	if($('code_debug')) Element.hide('code_debug');
	
	// see if we can set up rich text editor or not
	if(is_rtf_compatible()) {
		_is_rich_editor = true;
		Element.remove('code_text_area');
		if($('library_text_area')) Element.remove('library_text_area');
		editor = new xbDesignMode("code_text_frame");
		if($('library_text_frame')) {
			library = new xbDesignMode("library_text_frame");
			Element.setStyle('library_text_frame', {display: 'none'});
		}
	}
	else {
		Element.remove('code_text_frame');
		if($('library_text_frame')) Element.remove('library_text_frame');
		if($('library_text_area')) Element.hide('library_text_area');
	}
	
	// load all images
	var images_to_load = new Array(
		{name: 'run', off: '/tool/open_code/images/run.png', over: '/tool/open_code/images/run_over.png'},
		{name: 'save', off: '/tool/open_code/images/save.png', over: '/tool/open_code/images/save_over.png'},
		{name: 'close', off: '/images/close.png', over: '/images/close_over.png'},
		{name: 'close_applet', off: '/images/close.png', over: '/images/close_over.png'},
		{name: 'paste', off: '/tool/open_code/images/paste.png', over: '/tool/open_code/images/paste_over.png'},
		{name: 'copy', off: '/tool/open_code/images/copy.png', over: '/tool/open_code/images/copy_over.png'}
	);
	if ($('close_save_library')) {
		images_to_load.push({name: 'close_save_library', off: '/images/close.png', over: '/images/close_over.png'});
	}
	images_load(images_to_load);
	Element.setStyle('page_content', {visibility: 'visible'});
}

// Safari crashes for some reason when attempting to submit search form by pressing return.
// Probably need a fix in Ajax.Request or Ajax.Updater
function disable_enter(evt) {
	if (navigator.userAgent.match(/Safari/)) {
		evt = (evt) ? evt : ((window.event) ? window.event : null);
		if (evt) {
			var target = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
			if ((evt.keyCode == Event.KEY_RETURN) && (target.type == "text")) {
				return false;
			}
		}	
		return true;
	}
	return true;
}


///////////////////////////////////////////////////////////////////////////////
// EVENTS

if(!window.location.href.match(/info/)) {
	Event.observe(window, 'load', init, false);
	Event.observe(window, 'resize', set_applet_background, false);
}
