From: <ÓÉ Windows Internet Explorer 8 ±£´æ> Subject: Caltech Undergraduate Admissions: Freshman Applicants Date: Tue, 21 Jul 2009 12:34:02 +0800 MIME-Version: 1.0 Content-Type: multipart/related; type="text/html"; boundary="----=_NextPart_000_0061_01CA09FF.878F8200" X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5579 This is a multi-part message in MIME format. ------=_NextPart_000_0061_01CA09FF.878F8200 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.admissions.caltech.edu/applying/freshman Caltech Undergraduate Admissions: Freshman = Applicants
3D"Caltech =20

California Institute of Technology

Caltech Undergraduate Admissions

Freshman Applicants

3D"BreakfastCaltech typically enrolls 230 outstanding = freshmen each=20 fall term. Students who have not yet earned a high school diploma = (including=20 students enrolled in high school/college dual enrollment programs) or = who have=20 not enrolled in college courses for credit after graduating from high = school=20 will be considered as freshman candidates.  =

Application=20 Forms:
Caltech uses the Common Application and our own = Caltech=20 Supplemental Application. Application=20 Forms

Academic=20 Preparation:

    * 4 years of math = (including=20 calculus)
    * 1 year of physics and 1 year of=20 chemistry
    * 3 years of English (4 years=20 recommended)
    * 1 year of U.S. history/government = (waived=20 for international students)

Testing=20 Requirements:

SAT: Critical Reading, = Math, and=20 Writing OR

ACT: (with or = without=20 the optional writing section) = AND

SAT=20 Subject Tests: Mathematics Level 2 and one of the following = Subject=20 Tests: Biology (Ecological), Biology (Molecular), Chemistry, or=20 Physics

If your native language is not English, and you have not = studied=20 for at least two years in an English-speaking country, we encourage (but = don't=20 require) you to take the TOEFL (Test of English as a Foreign Language). = All=20 versions of the TOEFL are acceptable.

Official test scores must = be sent=20 by the testing agency. Please do not rush scores.

Caltech strongly recommends that students submit all SAT and SAT = Subject test=20 scores.


Admission Deadlines:
For a complete list of = admission=20 deadlines please see
Admission= =20 Deadlines.

Credit for Advanced Placement, = International=20 Baccalaureate or College Courses:

Caltech does not grant = credit=20 for AP, IB, or college courses taken prior to enrollment. Each student = will take=20 a math and physics placement exam (and chemistry if pursuing a chemistry = option), prior to enrolling. Based on the results of these exams, a = student may=20 place out of courses and be granted credit for those courses.

In = some=20 cases, Caltech faculty will grant permission to take a higher level = course in=20 other disciplines based on an evaluation of previous preparation in that = discipline. These decisions are made on an individual basis after a = student=20 enrolls at Caltech. 3D"Techer3D"Techer

 

 

 

Caltech Undergraduate Admissions
1200 = E.=20 California Blvd MC 1-94 Pasadena CA = 91125
626 395=20 6341
ugadmissions@caltech.edu
------=_NextPart_000_0061_01CA09FF.878F8200 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.admissions.caltech.edu/images/blank.gif R0lGODlhAQABAJH/AP///wAAAMDAwAAAACH5BAEAAAIALAAAAAABAAEAQAICVAEAOw== ------=_NextPart_000_0061_01CA09FF.878F8200 Content-Type: image/jpeg Content-Transfer-Encoding: base64 Content-Location: http://www.admissions.caltech.edu/uploads/Image/classroom_scenes_labs/lv-donuts.jpg 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 5/n0+Z0cuGWj+Bli/Bw/t3/coch9jQI//9k= ------=_NextPart_000_0061_01CA09FF.878F8200 Content-Type: image/jpeg Content-Transfer-Encoding: base64 Content-Location: http://www.admissions.caltech.edu/uploads/Image/student_life/sm-donuts.jpg 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 dg2qnx+r+qXn4rbMbqEvY5cv/9k= ------=_NextPart_000_0061_01CA09FF.878F8200 Content-Type: image/jpeg Content-Transfer-Encoding: base64 Content-Location: http://www.admissions.caltech.edu/uploads/Image/student_life/sm-frenchfries.jpg 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 ------=_NextPart_000_0061_01CA09FF.878F8200 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://www.admissions.caltech.edu/stylesheets/admissions.css?1181865834 #debug { POSITION: absolute; BACKGROUND: white; TOP: 40px; RIGHT: 0px } BODY { PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: = 0px; BACKGROUND: white; FONT-SIZE: 90%; PADDING-TOP: 0px } #centering_container { TEXT-ALIGN: center } #container { POSITION: relative; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; MARGIN: = auto; PADDING-LEFT: 0px; WIDTH: 740px; PADDING-RIGHT: 0px; PADDING-TOP: = 0px } #pageHeader H1 { DISPLAY: none } #pageHeader H2 { DISPLAY: none } #pageHeader { WIDTH: 740px; BACKGROUND: url(/images/header.gif) no-repeat; HEIGHT: = 102px } #linkList { BACKGROUND-IMAGE: url(/images/nav-top.gif); POSITION: absolute; WIDTH: = 190px; BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: 50% top; = FLOAT: left; TOP: 96px; LEFT: 0px } #linkList2 { BACKGROUND-IMAGE: url(/images/nav-middle.gif); POSITION: relative; = PADDING-BOTTOM: 0px; MARGIN-TOP: 20px; PADDING-LEFT: 0px; PADDING-RIGHT: = 0px; TOP: 10px; PADDING-TOP: 0px } #lresources { BACKGROUND-IMAGE: url(/images/nav-bottom.gif); PADDING-BOTTOM: 20px; = BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: 50% bottom; = MARGIN-BOTTOM: 0px } #linkList UL { LIST-STYLE-TYPE: none; MARGIN-TOP: 3px; PADDING-LEFT: 38px; = PADDING-RIGHT: 2px; FONT-FAMILY: courier; MARGIN-LEFT: 0px; = LIST-STYLE-IMAGE: none } #linkList UL.sublist { MARGIN-TOP: 3px; PADDING-LEFT: 2em; FONT-FAMILY: courier; MARGIN-LEFT: = 0px; FONT-SIZE: 86%; LIST-STYLE-IMAGE: url(/images/dash.gif) } #linkList LI { MARGIN-TOP: 1em } #linkList UL.sublist LI { MARGIN-TOP: 0.3em } #linkList A { BORDER-BOTTOM: 0px; COLOR: #4a4a4a; FONT-WEIGHT: normal; = TEXT-DECORATION: none } #linkList A:visited { BORDER-BOTTOM: 0px; COLOR: #4a4a4a; FONT-WEIGHT: normal; = TEXT-DECORATION: none } #linkList B { COLOR: #41412d; FONT-WEIGHT: bold } #linkList A:hover { BORDER-BOTTOM: 0px; COLOR: #000 } #mininav { BACKGROUND-IMAGE: url(/images/mininav-top.gif); WIDTH: 190px; = BACKGROUND-REPEAT: no-repeat; FONT-FAMILY: courier; BACKGROUND-POSITION: = 50% top; COLOR: #67674b; FONT-SIZE: 86%; PADDING-TOP: 27px } #mininav_content { BACKGROUND-IMAGE: url(/images/mininav-middle.gif) } #mininav_bottom { BACKGROUND-IMAGE: url(/images/mininav-bottom.gif); PADDING-BOTTOM: = 20px; BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: 50% bottom; = MARGIN-BOTTOM: 20px } #mininav UL { LIST-STYLE-TYPE: none; MARGIN-TOP: 3px; PADDING-LEFT: 40px; = PADDING-RIGHT: 35px; FONT-FAMILY: courier; MARGIN-LEFT: 0px; = LIST-STYLE-IMAGE: none } #mininav LI { MARGIN-TOP: 0.75em } #content { WIDTH: 580px; FONT-FAMILY: verdana; MARGIN-LEFT: 200px; FONT-SIZE: 90% } #subpage_content { WIDTH: 580px; FONT-FAMILY: verdana; MARGIN-LEFT: 200px; FONT-SIZE: 90% } #content A { COLOR: #cc3300; TEXT-DECORATION: none } #subpage_content A { COLOR: #cc3300; TEXT-DECORATION: none } #content A:hover { BORDER-BOTTOM: 1px dotted; COLOR: #cc3300; TEXT-DECORATION: none } #subpage_content A:hover { BORDER-BOTTOM: 1px dotted; COLOR: #cc3300; TEXT-DECORATION: none } H3 { PADDING-LEFT: 22px; FONT-FAMILY: courier; COLOR: #ff5300; FONT-SIZE: = 195%; FONT-WEIGHT: bold } H2 { FONT-FAMILY: verdana; COLOR: #333333; FONT-SIZE: 100%; FONT-WEIGHT: = bold } H1 { FONT-FAMILY: verdana; COLOR: #333333; FONT-SIZE: 100%; FONT-WEIGHT: = bold } STRONG { COLOR: #333333 } .bold_orange { COLOR: #ff5300; FONT-WEIGHT: bold } #latest_news { MIN-HEIGHT: 600px; PADDING-LEFT: 22px; PADDING-RIGHT: 110px } #homepage_news P { PADDING-LEFT: 15px; PADDING-RIGHT: 110px } TABLE { FONT-FAMILY: verdana; FONT-SIZE: small } .TopRight { PADDING-BOTTOM: 15px; PADDING-LEFT: 15px; PADDING-RIGHT: 0px; FLOAT: = right; PADDING-TOP: 0px } .Bottom { PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 15px; = PADDING-TOP: 15px } .MiddleLeft { PADDING-BOTTOM: 15px; PADDING-LEFT: 0px; PADDING-RIGHT: 15px; FLOAT: = left; PADDING-TOP: 8px } .Left { PADDING-BOTTOM: 3px; PADDING-LEFT: 0px; PADDING-RIGHT: 15px; FLOAT: = left; PADDING-TOP: 3px } .MiddleRight { PADDING-BOTTOM: 15px; PADDING-LEFT: 15px; PADDING-RIGHT: 0px; FLOAT: = right; PADDING-TOP: 15px } .BottomRight { PADDING-BOTTOM: 0px; PADDING-LEFT: 15px; PADDING-RIGHT: 0px; FLOAT: = right; PADDING-TOP: 15px } #footer { BACKGROUND-IMAGE: url(/images/footer-top.gif); TEXT-ALIGN: right; = WIDTH: 386px; BACKGROUND-REPEAT: no-repeat; FONT-FAMILY: courier; = BACKGROUND-POSITION: 50% top; FLOAT: right; COLOR: #4a4a4a; FONT-SIZE: = 90% } #footer_content { BACKGROUND-IMAGE: url(/images/footer-bottom.gif); PADDING-BOTTOM: 20px; = MIN-HEIGHT: 40px; PADDING-LEFT: 10px; PADDING-RIGHT: 20px; = BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: 50% bottom; = MARGIN-BOTTOM: 0px; PADDING-TOP: 20px } #footer A { COLOR: #474723; FONT-WEIGHT: normal; TEXT-DECORATION: underline } #footer A:hover { COLOR: #41412d; FONT-WEIGHT: bold; TEXT-DECORATION: underline } .destination_category { BORDER-BOTTOM: #70743c 2px solid; PADDING-BOTTOM: 0.5em; MARGIN-TOP: = 2em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BACKGROUND: #cdcd97; = FONT-SIZE: 110%; BORDER-TOP: #70743c 2px solid; FONT-WEIGHT: bold; = PADDING-TOP: 0.5em } .destination_title { FONT-WEIGHT: bold; PADDING-TOP: 1em } .destination_description { PADDING-TOP: 0.2em } .boxes { align: right } .walking { BACKGROUND: #747730; MARGIN-LEFT: 260px } .walking:hover { BACKGROUND: #888d19 } .walking_selected { BACKGROUND: #888d19 } .short-drive { BACKGROUND: #cfa24e; MARGIN-LEFT: 295px } .short-drive:hover { BACKGROUND: #e99a37 } .short-drive_selected { BACKGROUND: #e99a37 } .one-day { BACKGROUND: #c2ba41; MARGIN-LEFT: 330px } .one-day:hover { BACKGROUND: #d8d433 } .one-day_selected { BACKGROUND: #d8d433 } .weekend { BACKGROUND: #ca9d31; MARGIN-LEFT: 365px } .weekend:hover { BACKGROUND: #e4a716 } .weekend_selected { BACKGROUND: #e4a716 } .west-coast { BACKGROUND: #a6a539; MARGIN-LEFT: 400px } .west-coast:hover { BACKGROUND: #a4b523 } .west-coast_selected { BACKGROUND: #a4b523 } .box { BORDER-BOTTOM: #cdcd97 0px solid; POSITION: absolute; BORDER-LEFT: = #cdcd97 3px solid; MARGIN-TOP: -24px; WIDTH: 30px; HEIGHT: 31px; = BORDER-TOP: #cdcd97 0px solid; BORDER-RIGHT: #cdcd97 2px solid } .box:hover { CURSOR: pointer } .hover_pointer { CURSOR: pointer } .rollover_text { POSITION: relative; TEXT-ALIGN: right; WIDTH: 450px; HEIGHT: 30px; TOP: = 40px } .fieldWithErrors { PADDING-BOTTOM: 2px; BACKGROUND-COLOR: red; PADDING-LEFT: 2px; = PADDING-RIGHT: 2px; DISPLAY: table; PADDING-TOP: 2px } #errorExplanation { BORDER-BOTTOM: red 2px solid; BORDER-LEFT: red 2px solid; = PADDING-BOTTOM: 12px; BACKGROUND-COLOR: #f0f0f0; PADDING-LEFT: 7px; = PADDING-RIGHT: 7px; MARGIN-BOTTOM: 20px; BORDER-TOP: red 2px solid; = BORDER-RIGHT: red 2px solid; PADDING-TOP: 7px } #errorExplanation H2 { TEXT-ALIGN: left; PADDING-BOTTOM: 5px; BACKGROUND-COLOR: #c00; MARGIN: = -7px; PADDING-LEFT: 15px; PADDING-RIGHT: 5px; COLOR: #fff; FONT-SIZE: = 12px; FONT-WEIGHT: bold; PADDING-TOP: 5px } #errorExplanation P { PADDING-BOTTOM: 5px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; = MARGIN-BOTTOM: 0px; COLOR: #333; PADDING-TOP: 5px } #errorExplanation UL LI { LIST-STYLE-TYPE: square; FONT-SIZE: 12px } DIV.uploadStatus { MARGIN: 5px } DIV.progressBar { MARGIN: 5px } DIV.progressBar DIV.border { BORDER-BOTTOM: grey 1px solid; BORDER-LEFT: grey 1px solid; = BACKGROUND-COLOR: #fff; WIDTH: 100%; BORDER-TOP: grey 1px solid; = BORDER-RIGHT: grey 1px solid } DIV.progressBar DIV.background { BACKGROUND-COLOR: #333; WIDTH: 0%; HEIGHT: 18px } ------=_NextPart_000_0061_01CA09FF.878F8200 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://www.admissions.caltech.edu/javascripts/prototype.js?1170291493 /* Prototype JavaScript framework, version 1.5.0_rc0=0A= * (c) 2005 Sam Stephenson =0A= *=0A= * Prototype is freely distributable under the terms of an MIT-style = license.=0A= * For details, see the Prototype web site: http://prototype.conio.net/=0A= *=0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= var Prototype =3D {=0A= Version: '1.5.0_rc0',=0A= ScriptFragment: '(?:)((\n|\r|.)*?)(?:<\/script>)',=0A= =0A= emptyFunction: function() {},=0A= K: function(x) {return x}=0A= }=0A= =0A= var Class =3D {=0A= create: function() {=0A= return function() {=0A= this.initialize.apply(this, arguments);=0A= }=0A= }=0A= }=0A= =0A= var Abstract =3D new Object();=0A= =0A= Object.extend =3D function(destination, source) {=0A= for (var property in source) {=0A= destination[property] =3D source[property];=0A= }=0A= return destination;=0A= }=0A= =0A= Object.inspect =3D function(object) {=0A= try {=0A= if (object =3D=3D undefined) return 'undefined';=0A= if (object =3D=3D null) return 'null';=0A= return object.inspect ? object.inspect() : object.toString();=0A= } catch (e) {=0A= if (e instanceof RangeError) return '...';=0A= throw e;=0A= }=0A= }=0A= =0A= Function.prototype.bind =3D function() {=0A= var __method =3D this, args =3D $A(arguments), object =3D args.shift();=0A= return function() {=0A= return __method.apply(object, args.concat($A(arguments)));=0A= }=0A= }=0A= =0A= Function.prototype.bindAsEventListener =3D function(object) {=0A= var __method =3D this;=0A= return function(event) {=0A= return __method.call(object, event || window.event);=0A= }=0A= }=0A= =0A= Object.extend(Number.prototype, {=0A= toColorPart: function() {=0A= var digits =3D this.toString(16);=0A= if (this < 16) return '0' + digits;=0A= return digits;=0A= },=0A= =0A= succ: function() {=0A= return this + 1;=0A= },=0A= =0A= times: function(iterator) {=0A= $R(0, this, true).each(iterator);=0A= return this;=0A= }=0A= });=0A= =0A= var Try =3D {=0A= these: function() {=0A= var returnValue;=0A= =0A= for (var i =3D 0; i < arguments.length; i++) {=0A= var lambda =3D arguments[i];=0A= try {=0A= returnValue =3D lambda();=0A= break;=0A= } catch (e) {}=0A= }=0A= =0A= return returnValue;=0A= }=0A= }=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= var PeriodicalExecuter =3D Class.create();=0A= PeriodicalExecuter.prototype =3D {=0A= initialize: function(callback, frequency) {=0A= this.callback =3D callback;=0A= this.frequency =3D frequency;=0A= this.currentlyExecuting =3D false;=0A= =0A= this.registerCallback();=0A= },=0A= =0A= registerCallback: function() {=0A= setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);=0A= },=0A= =0A= onTimerEvent: function() {=0A= if (!this.currentlyExecuting) {=0A= try {=0A= this.currentlyExecuting =3D true;=0A= this.callback();=0A= } finally {=0A= this.currentlyExecuting =3D false;=0A= }=0A= }=0A= }=0A= }=0A= Object.extend(String.prototype, {=0A= gsub: function(pattern, replacement) {=0A= var result =3D '', source =3D this, match;=0A= replacement =3D arguments.callee.prepareReplacement(replacement);=0A= =0A= while (source.length > 0) {=0A= if (match =3D source.match(pattern)) {=0A= result +=3D source.slice(0, match.index);=0A= result +=3D (replacement(match) || '').toString();=0A= source =3D source.slice(match.index + match[0].length);=0A= } else {=0A= result +=3D source, source =3D '';=0A= }=0A= }=0A= return result;=0A= },=0A= =0A= sub: function(pattern, replacement, count) {=0A= replacement =3D this.gsub.prepareReplacement(replacement);=0A= count =3D count =3D=3D=3D undefined ? 1 : count;=0A= =0A= return this.gsub(pattern, function(match) {=0A= if (--count < 0) return match[0];=0A= return replacement(match);=0A= });=0A= },=0A= =0A= scan: function(pattern, iterator) {=0A= this.gsub(pattern, iterator);=0A= return this;=0A= },=0A= =0A= truncate: function(length, truncation) {=0A= length =3D length || 30;=0A= truncation =3D truncation =3D=3D=3D undefined ? '...' : truncation;=0A= return this.length > length ?=0A= this.slice(0, length - truncation.length) + truncation : this;=0A= },=0A= =0A= strip: function() {=0A= return this.replace(/^\s+/, '').replace(/\s+$/, '');=0A= },=0A= =0A= stripTags: function() {=0A= return this.replace(/<\/?[^>]+>/gi, '');=0A= },=0A= =0A= stripScripts: function() {=0A= return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');=0A= },=0A= =0A= extractScripts: function() {=0A= var matchAll =3D new RegExp(Prototype.ScriptFragment, 'img');=0A= var matchOne =3D new RegExp(Prototype.ScriptFragment, 'im');=0A= return (this.match(matchAll) || []).map(function(scriptTag) {=0A= return (scriptTag.match(matchOne) || ['', ''])[1];=0A= });=0A= },=0A= =0A= evalScripts: function() {=0A= return this.extractScripts().map(function(script) { return = eval(script) });=0A= },=0A= =0A= escapeHTML: function() {=0A= var div =3D document.createElement('div');=0A= var text =3D document.createTextNode(this);=0A= div.appendChild(text);=0A= return div.innerHTML;=0A= },=0A= =0A= unescapeHTML: function() {=0A= var div =3D document.createElement('div');=0A= div.innerHTML =3D this.stripTags();=0A= return div.childNodes[0] ? div.childNodes[0].nodeValue : '';=0A= },=0A= =0A= toQueryParams: function() {=0A= var pairs =3D this.match(/^\??(.*)$/)[1].split('&');=0A= return pairs.inject({}, function(params, pairString) {=0A= var pair =3D pairString.split('=3D');=0A= params[pair[0]] =3D pair[1];=0A= return params;=0A= });=0A= },=0A= =0A= toArray: function() {=0A= return this.split('');=0A= },=0A= =0A= camelize: function() {=0A= var oStringList =3D this.split('-');=0A= if (oStringList.length =3D=3D 1) return oStringList[0];=0A= =0A= var camelizedString =3D this.indexOf('-') =3D=3D 0=0A= ? oStringList[0].charAt(0).toUpperCase() + = oStringList[0].substring(1)=0A= : oStringList[0];=0A= =0A= for (var i =3D 1, len =3D oStringList.length; i < len; i++) {=0A= var s =3D oStringList[i];=0A= camelizedString +=3D s.charAt(0).toUpperCase() + s.substring(1);=0A= }=0A= =0A= return camelizedString;=0A= },=0A= =0A= inspect: function() {=0A= return "'" + this.replace(/\\/g, '\\\\').replace(/'/g, '\\\'') + "'";=0A= }=0A= });=0A= =0A= String.prototype.gsub.prepareReplacement =3D function(replacement) {=0A= if (typeof replacement =3D=3D 'function') return replacement;=0A= var template =3D new Template(replacement);=0A= return function(match) { return template.evaluate(match) };=0A= }=0A= =0A= String.prototype.parseQuery =3D String.prototype.toQueryParams;=0A= =0A= var Template =3D Class.create();=0A= Template.Pattern =3D /(^|.|\r|\n)(#\{(.*?)\})/;=0A= Template.prototype =3D {=0A= initialize: function(template, pattern) {=0A= this.template =3D template.toString();=0A= this.pattern =3D pattern || Template.Pattern;=0A= },=0A= =0A= evaluate: function(object) {=0A= return this.template.gsub(this.pattern, function(match) {=0A= var before =3D match[1];=0A= if (before =3D=3D '\\') return match[2];=0A= return before + (object[match[3]] || '').toString();=0A= });=0A= }=0A= }=0A= =0A= var $break =3D new Object();=0A= var $continue =3D new Object();=0A= =0A= var Enumerable =3D {=0A= each: function(iterator) {=0A= var index =3D 0;=0A= try {=0A= this._each(function(value) {=0A= try {=0A= iterator(value, index++);=0A= } catch (e) {=0A= if (e !=3D $continue) throw e;=0A= }=0A= });=0A= } catch (e) {=0A= if (e !=3D $break) throw e;=0A= }=0A= },=0A= =0A= all: function(iterator) {=0A= var result =3D true;=0A= this.each(function(value, index) {=0A= result =3D result && !!(iterator || Prototype.K)(value, index);=0A= if (!result) throw $break;=0A= });=0A= return result;=0A= },=0A= =0A= any: function(iterator) {=0A= var result =3D true;=0A= this.each(function(value, index) {=0A= if (result =3D !!(iterator || Prototype.K)(value, index))=0A= throw $break;=0A= });=0A= return result;=0A= },=0A= =0A= collect: function(iterator) {=0A= var results =3D [];=0A= this.each(function(value, index) {=0A= results.push(iterator(value, index));=0A= });=0A= return results;=0A= },=0A= =0A= detect: function (iterator) {=0A= var result;=0A= this.each(function(value, index) {=0A= if (iterator(value, index)) {=0A= result =3D value;=0A= throw $break;=0A= }=0A= });=0A= return result;=0A= },=0A= =0A= findAll: function(iterator) {=0A= var results =3D [];=0A= this.each(function(value, index) {=0A= if (iterator(value, index))=0A= results.push(value);=0A= });=0A= return results;=0A= },=0A= =0A= grep: function(pattern, iterator) {=0A= var results =3D [];=0A= this.each(function(value, index) {=0A= var stringValue =3D value.toString();=0A= if (stringValue.match(pattern))=0A= results.push((iterator || Prototype.K)(value, index));=0A= })=0A= return results;=0A= },=0A= =0A= include: function(object) {=0A= var found =3D false;=0A= this.each(function(value) {=0A= if (value =3D=3D object) {=0A= found =3D true;=0A= throw $break;=0A= }=0A= });=0A= return found;=0A= },=0A= =0A= inject: function(memo, iterator) {=0A= this.each(function(value, index) {=0A= memo =3D iterator(memo, value, index);=0A= });=0A= return memo;=0A= },=0A= =0A= invoke: function(method) {=0A= var args =3D $A(arguments).slice(1);=0A= return this.collect(function(value) {=0A= return value[method].apply(value, args);=0A= });=0A= },=0A= =0A= max: function(iterator) {=0A= var result;=0A= this.each(function(value, index) {=0A= value =3D (iterator || Prototype.K)(value, index);=0A= if (result =3D=3D undefined || value >=3D result)=0A= result =3D value;=0A= });=0A= return result;=0A= },=0A= =0A= min: function(iterator) {=0A= var result;=0A= this.each(function(value, index) {=0A= value =3D (iterator || Prototype.K)(value, index);=0A= if (result =3D=3D undefined || value < result)=0A= result =3D value;=0A= });=0A= return result;=0A= },=0A= =0A= partition: function(iterator) {=0A= var trues =3D [], falses =3D [];=0A= this.each(function(value, index) {=0A= ((iterator || Prototype.K)(value, index) ?=0A= trues : falses).push(value);=0A= });=0A= return [trues, falses];=0A= },=0A= =0A= pluck: function(property) {=0A= var results =3D [];=0A= this.each(function(value, index) {=0A= results.push(value[property]);=0A= });=0A= return results;=0A= },=0A= =0A= reject: function(iterator) {=0A= var results =3D [];=0A= this.each(function(value, index) {=0A= if (!iterator(value, index))=0A= results.push(value);=0A= });=0A= return results;=0A= },=0A= =0A= sortBy: function(iterator) {=0A= return this.collect(function(value, index) {=0A= return {value: value, criteria: iterator(value, index)};=0A= }).sort(function(left, right) {=0A= var a =3D left.criteria, b =3D right.criteria;=0A= return a < b ? -1 : a > b ? 1 : 0;=0A= }).pluck('value');=0A= },=0A= =0A= toArray: function() {=0A= return this.collect(Prototype.K);=0A= },=0A= =0A= zip: function() {=0A= var iterator =3D Prototype.K, args =3D $A(arguments);=0A= if (typeof args.last() =3D=3D 'function')=0A= iterator =3D args.pop();=0A= =0A= var collections =3D [this].concat(args).map($A);=0A= return this.map(function(value, index) {=0A= return iterator(collections.pluck(index));=0A= });=0A= },=0A= =0A= inspect: function() {=0A= return '#';=0A= }=0A= }=0A= =0A= Object.extend(Enumerable, {=0A= map: Enumerable.collect,=0A= find: Enumerable.detect,=0A= select: Enumerable.findAll,=0A= member: Enumerable.include,=0A= entries: Enumerable.toArray=0A= });=0A= var $A =3D Array.from =3D function(iterable) {=0A= if (!iterable) return [];=0A= if (iterable.toArray) {=0A= return iterable.toArray();=0A= } else {=0A= var results =3D [];=0A= for (var i =3D 0; i < iterable.length; i++)=0A= results.push(iterable[i]);=0A= return results;=0A= }=0A= }=0A= =0A= Object.extend(Array.prototype, Enumerable);=0A= =0A= if (!Array.prototype._reverse)=0A= Array.prototype._reverse =3D Array.prototype.reverse;=0A= =0A= Object.extend(Array.prototype, {=0A= _each: function(iterator) {=0A= for (var i =3D 0; i < this.length; i++)=0A= iterator(this[i]);=0A= },=0A= =0A= clear: function() {=0A= this.length =3D 0;=0A= return this;=0A= },=0A= =0A= first: function() {=0A= return this[0];=0A= },=0A= =0A= last: function() {=0A= return this[this.length - 1];=0A= },=0A= =0A= compact: function() {=0A= return this.select(function(value) {=0A= return value !=3D undefined || value !=3D null;=0A= });=0A= },=0A= =0A= flatten: function() {=0A= return this.inject([], function(array, value) {=0A= return array.concat(value && value.constructor =3D=3D Array ?=0A= value.flatten() : [value]);=0A= });=0A= },=0A= =0A= without: function() {=0A= var values =3D $A(arguments);=0A= return this.select(function(value) {=0A= return !values.include(value);=0A= });=0A= },=0A= =0A= indexOf: function(object) {=0A= for (var i =3D 0; i < this.length; i++)=0A= if (this[i] =3D=3D object) return i;=0A= return -1;=0A= },=0A= =0A= reverse: function(inline) {=0A= return (inline !=3D=3D false ? this : this.toArray())._reverse();=0A= },=0A= =0A= inspect: function() {=0A= return '[' + this.map(Object.inspect).join(', ') + ']';=0A= }=0A= });=0A= var Hash =3D {=0A= _each: function(iterator) {=0A= for (var key in this) {=0A= var value =3D this[key];=0A= if (typeof value =3D=3D 'function') continue;=0A= =0A= var pair =3D [key, value];=0A= pair.key =3D key;=0A= pair.value =3D value;=0A= iterator(pair);=0A= }=0A= },=0A= =0A= keys: function() {=0A= return this.pluck('key');=0A= },=0A= =0A= values: function() {=0A= return this.pluck('value');=0A= },=0A= =0A= merge: function(hash) {=0A= return $H(hash).inject($H(this), function(mergedHash, pair) {=0A= mergedHash[pair.key] =3D pair.value;=0A= return mergedHash;=0A= });=0A= },=0A= =0A= toQueryString: function() {=0A= return this.map(function(pair) {=0A= return pair.map(encodeURIComponent).join('=3D');=0A= }).join('&');=0A= },=0A= =0A= inspect: function() {=0A= return '#';=0A= }=0A= }=0A= =0A= function $H(object) {=0A= var hash =3D Object.extend({}, object || {});=0A= Object.extend(hash, Enumerable);=0A= Object.extend(hash, Hash);=0A= return hash;=0A= }=0A= ObjectRange =3D Class.create();=0A= Object.extend(ObjectRange.prototype, Enumerable);=0A= Object.extend(ObjectRange.prototype, {=0A= initialize: function(start, end, exclusive) {=0A= this.start =3D start;=0A= this.end =3D end;=0A= this.exclusive =3D exclusive;=0A= },=0A= =0A= _each: function(iterator) {=0A= var value =3D this.start;=0A= do {=0A= iterator(value);=0A= value =3D value.succ();=0A= } while (this.include(value));=0A= },=0A= =0A= include: function(value) {=0A= if (value < this.start)=0A= return false;=0A= if (this.exclusive)=0A= return value < this.end;=0A= return value <=3D this.end;=0A= }=0A= });=0A= =0A= var $R =3D function(start, end, exclusive) {=0A= return new ObjectRange(start, end, exclusive);=0A= }=0A= =0A= var Ajax =3D {=0A= getTransport: function() {=0A= return Try.these(=0A= function() {return new XMLHttpRequest()},=0A= function() {return new ActiveXObject('Msxml2.XMLHTTP')},=0A= function() {return new ActiveXObject('Microsoft.XMLHTTP')}=0A= ) || false;=0A= },=0A= =0A= activeRequestCount: 0=0A= }=0A= =0A= Ajax.Responders =3D {=0A= responders: [],=0A= =0A= _each: function(iterator) {=0A= this.responders._each(iterator);=0A= },=0A= =0A= register: function(responderToAdd) {=0A= if (!this.include(responderToAdd))=0A= this.responders.push(responderToAdd);=0A= },=0A= =0A= unregister: function(responderToRemove) {=0A= this.responders =3D this.responders.without(responderToRemove);=0A= },=0A= =0A= dispatch: function(callback, request, transport, json) {=0A= this.each(function(responder) {=0A= if (responder[callback] && typeof responder[callback] =3D=3D = 'function') {=0A= try {=0A= responder[callback].apply(responder, [request, transport, = json]);=0A= } catch (e) {}=0A= }=0A= });=0A= }=0A= };=0A= =0A= Object.extend(Ajax.Responders, Enumerable);=0A= =0A= Ajax.Responders.register({=0A= onCreate: function() {=0A= Ajax.activeRequestCount++;=0A= },=0A= =0A= onComplete: function() {=0A= Ajax.activeRequestCount--;=0A= }=0A= });=0A= =0A= Ajax.Base =3D function() {};=0A= Ajax.Base.prototype =3D {=0A= setOptions: function(options) {=0A= this.options =3D {=0A= method: 'post',=0A= asynchronous: true,=0A= contentType: 'application/x-www-form-urlencoded',=0A= parameters: ''=0A= }=0A= Object.extend(this.options, options || {});=0A= },=0A= =0A= responseIsSuccess: function() {=0A= return this.transport.status =3D=3D undefined=0A= || this.transport.status =3D=3D 0=0A= || (this.transport.status >=3D 200 && this.transport.status < = 300);=0A= },=0A= =0A= responseIsFailure: function() {=0A= return !this.responseIsSuccess();=0A= }=0A= }=0A= =0A= Ajax.Request =3D Class.create();=0A= Ajax.Request.Events =3D=0A= ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];=0A= =0A= Ajax.Request.prototype =3D Object.extend(new Ajax.Base(), {=0A= initialize: function(url, options) {=0A= this.transport =3D Ajax.getTransport();=0A= this.setOptions(options);=0A= this.request(url);=0A= },=0A= =0A= request: function(url) {=0A= var parameters =3D this.options.parameters || '';=0A= if (parameters.length > 0) parameters +=3D '&_=3D';=0A= =0A= try {=0A= this.url =3D url;=0A= if (this.options.method =3D=3D 'get' && parameters.length > 0)=0A= this.url +=3D (this.url.match(/\?/) ? '&' : '?') + parameters;=0A= =0A= Ajax.Responders.dispatch('onCreate', this, this.transport);=0A= =0A= this.transport.open(this.options.method, this.url,=0A= this.options.asynchronous);=0A= =0A= if (this.options.asynchronous) {=0A= this.transport.onreadystatechange =3D = this.onStateChange.bind(this);=0A= setTimeout((function() = {this.respondToReadyState(1)}).bind(this), 10);=0A= }=0A= =0A= this.setRequestHeaders();=0A= =0A= var body =3D this.options.postBody ? this.options.postBody : = parameters;=0A= this.transport.send(this.options.method =3D=3D 'post' ? body : = null);=0A= =0A= } catch (e) {=0A= this.dispatchException(e);=0A= }=0A= },=0A= =0A= setRequestHeaders: function() {=0A= var requestHeaders =3D=0A= ['X-Requested-With', 'XMLHttpRequest',=0A= 'X-Prototype-Version', Prototype.Version,=0A= 'Accept', 'text/javascript, text/html, application/xml, text/xml, = */*'];=0A= =0A= if (this.options.method =3D=3D 'post') {=0A= requestHeaders.push('Content-type', this.options.contentType);=0A= =0A= /* Force "Connection: close" for Mozilla browsers to work around=0A= * a bug where XMLHttpReqeuest sends an incorrect Content-length=0A= * header. See Mozilla Bugzilla #246651.=0A= */=0A= if (this.transport.overrideMimeType)=0A= requestHeaders.push('Connection', 'close');=0A= }=0A= =0A= if (this.options.requestHeaders)=0A= requestHeaders.push.apply(requestHeaders, = this.options.requestHeaders);=0A= =0A= for (var i =3D 0; i < requestHeaders.length; i +=3D 2)=0A= this.transport.setRequestHeader(requestHeaders[i], = requestHeaders[i+1]);=0A= },=0A= =0A= onStateChange: function() {=0A= var readyState =3D this.transport.readyState;=0A= if (readyState !=3D 1)=0A= this.respondToReadyState(this.transport.readyState);=0A= },=0A= =0A= header: function(name) {=0A= try {=0A= return this.transport.getResponseHeader(name);=0A= } catch (e) {}=0A= },=0A= =0A= evalJSON: function() {=0A= try {=0A= return eval('(' + this.header('X-JSON') + ')');=0A= } catch (e) {}=0A= },=0A= =0A= evalResponse: function() {=0A= try {=0A= return eval(this.transport.responseText);=0A= } catch (e) {=0A= this.dispatchException(e);=0A= }=0A= },=0A= =0A= respondToReadyState: function(readyState) {=0A= var event =3D Ajax.Request.Events[readyState];=0A= var transport =3D this.transport, json =3D this.evalJSON();=0A= =0A= if (event =3D=3D 'Complete') {=0A= try {=0A= (this.options['on' + this.transport.status]=0A= || this.options['on' + (this.responseIsSuccess() ? 'Success' : = 'Failure')]=0A= || Prototype.emptyFunction)(transport, json);=0A= } catch (e) {=0A= this.dispatchException(e);=0A= }=0A= =0A= if ((this.header('Content-type') || = '').match(/^text\/javascript/i))=0A= this.evalResponse();=0A= }=0A= =0A= try {=0A= (this.options['on' + event] || Prototype.emptyFunction)(transport, = json);=0A= Ajax.Responders.dispatch('on' + event, this, transport, json);=0A= } catch (e) {=0A= this.dispatchException(e);=0A= }=0A= =0A= /* Avoid memory leak in MSIE: clean up the oncomplete event handler = */=0A= if (event =3D=3D 'Complete')=0A= this.transport.onreadystatechange =3D Prototype.emptyFunction;=0A= },=0A= =0A= dispatchException: function(exception) {=0A= (this.options.onException || Prototype.emptyFunction)(this, = exception);=0A= Ajax.Responders.dispatch('onException', this, exception);=0A= }=0A= });=0A= =0A= Ajax.Updater =3D Class.create();=0A= =0A= Object.extend(Object.extend(Ajax.Updater.prototype, = Ajax.Request.prototype), {=0A= initialize: function(container, url, options) {=0A= this.containers =3D {=0A= success: container.success ? $(container.success) : $(container),=0A= failure: container.failure ? $(container.failure) :=0A= (container.success ? null : $(container))=0A= }=0A= =0A= this.transport =3D Ajax.getTransport();=0A= this.setOptions(options);=0A= =0A= var onComplete =3D this.options.onComplete || = Prototype.emptyFunction;=0A= this.options.onComplete =3D (function(transport, object) {=0A= this.updateContent();=0A= onComplete(transport, object);=0A= }).bind(this);=0A= =0A= this.request(url);=0A= },=0A= =0A= updateContent: function() {=0A= var receiver =3D this.responseIsSuccess() ?=0A= this.containers.success : this.containers.failure;=0A= var response =3D this.transport.responseText;=0A= =0A= if (!this.options.evalScripts)=0A= response =3D response.stripScripts();=0A= =0A= if (receiver) {=0A= if (this.options.insertion) {=0A= new this.options.insertion(receiver, response);=0A= } else {=0A= Element.update(receiver, response);=0A= }=0A= }=0A= =0A= if (this.responseIsSuccess()) {=0A= if (this.onComplete)=0A= setTimeout(this.onComplete.bind(this), 10);=0A= }=0A= }=0A= });=0A= =0A= Ajax.PeriodicalUpdater =3D Class.create();=0A= Ajax.PeriodicalUpdater.prototype =3D Object.extend(new Ajax.Base(), {=0A= initialize: function(container, url, options) {=0A= this.setOptions(options);=0A= this.onComplete =3D this.options.onComplete;=0A= =0A= this.frequency =3D (this.options.frequency || 2);=0A= this.decay =3D (this.options.decay || 1);=0A= =0A= this.updater =3D {};=0A= this.container =3D container;=0A= this.url =3D url;=0A= =0A= this.start();=0A= },=0A= =0A= start: function() {=0A= this.options.onComplete =3D this.updateComplete.bind(this);=0A= this.onTimerEvent();=0A= },=0A= =0A= stop: function() {=0A= this.updater.onComplete =3D undefined;=0A= clearTimeout(this.timer);=0A= (this.onComplete || Prototype.emptyFunction).apply(this, arguments);=0A= },=0A= =0A= updateComplete: function(request) {=0A= if (this.options.decay) {=0A= this.decay =3D (request.responseText =3D=3D this.lastText ?=0A= this.decay * this.options.decay : 1);=0A= =0A= this.lastText =3D request.responseText;=0A= }=0A= this.timer =3D setTimeout(this.onTimerEvent.bind(this),=0A= this.decay * this.frequency * 1000);=0A= },=0A= =0A= onTimerEvent: function() {=0A= this.updater =3D new Ajax.Updater(this.container, this.url, = this.options);=0A= }=0A= });=0A= function $() {=0A= var results =3D [], element;=0A= for (var i =3D 0; i < arguments.length; i++) {=0A= element =3D arguments[i];=0A= if (typeof element =3D=3D 'string')=0A= element =3D document.getElementById(element);=0A= results.push(Element.extend(element));=0A= }=0A= return results.length < 2 ? results[0] : results;=0A= }=0A= =0A= document.getElementsByClassName =3D function(className, parentElement) {=0A= var children =3D ($(parentElement) || = document.body).getElementsByTagName('*');=0A= return $A(children).inject([], function(elements, child) {=0A= if (child.className.match(new RegExp("(^|\\s)" + className + = "(\\s|$)")))=0A= elements.push(Element.extend(child));=0A= return elements;=0A= });=0A= }=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= if (!window.Element)=0A= var Element =3D new Object();=0A= =0A= Element.extend =3D function(element) {=0A= if (!element) return;=0A= if (_nativeExtensions) return element;=0A= =0A= if (!element._extended && element.tagName && element !=3D window) {=0A= var methods =3D Element.Methods, cache =3D Element.extend.cache;=0A= for (property in methods) {=0A= var value =3D methods[property];=0A= if (typeof value =3D=3D 'function')=0A= element[property] =3D cache.findOrStore(value);=0A= }=0A= }=0A= =0A= element._extended =3D true;=0A= return element;=0A= }=0A= =0A= Element.extend.cache =3D {=0A= findOrStore: function(value) {=0A= return this[value] =3D this[value] || function() {=0A= return value.apply(null, [this].concat($A(arguments)));=0A= }=0A= }=0A= }=0A= =0A= Element.Methods =3D {=0A= visible: function(element) {=0A= return $(element).style.display !=3D 'none';=0A= },=0A= =0A= toggle: function() {=0A= for (var i =3D 0; i < arguments.length; i++) {=0A= var element =3D $(arguments[i]);=0A= Element[Element.visible(element) ? 'hide' : 'show'](element);=0A= }=0A= },=0A= =0A= hide: function() {=0A= for (var i =3D 0; i < arguments.length; i++) {=0A= var element =3D $(arguments[i]);=0A= element.style.display =3D 'none';=0A= }=0A= },=0A= =0A= show: function() {=0A= for (var i =3D 0; i < arguments.length; i++) {=0A= var element =3D $(arguments[i]);=0A= element.style.display =3D '';=0A= }=0A= },=0A= =0A= remove: function(element) {=0A= element =3D $(element);=0A= element.parentNode.removeChild(element);=0A= },=0A= =0A= update: function(element, html) {=0A= $(element).innerHTML =3D html.stripScripts();=0A= setTimeout(function() {html.evalScripts()}, 10);=0A= },=0A= =0A= replace: function(element, html) {=0A= element =3D $(element);=0A= if (element.outerHTML) {=0A= element.outerHTML =3D html.stripScripts();=0A= } else {=0A= var range =3D element.ownerDocument.createRange();=0A= range.selectNodeContents(element);=0A= element.parentNode.replaceChild(=0A= range.createContextualFragment(html.stripScripts()), element);=0A= }=0A= setTimeout(function() {html.evalScripts()}, 10);=0A= },=0A= =0A= getHeight: function(element) {=0A= element =3D $(element);=0A= return element.offsetHeight;=0A= },=0A= =0A= classNames: function(element) {=0A= return new Element.ClassNames(element);=0A= },=0A= =0A= hasClassName: function(element, className) {=0A= if (!(element =3D $(element))) return;=0A= return Element.classNames(element).include(className);=0A= },=0A= =0A= addClassName: function(element, className) {=0A= if (!(element =3D $(element))) return;=0A= return Element.classNames(element).add(className);=0A= },=0A= =0A= removeClassName: function(element, className) {=0A= if (!(element =3D $(element))) return;=0A= return Element.classNames(element).remove(className);=0A= },=0A= =0A= // removes whitespace-only text node children=0A= cleanWhitespace: function(element) {=0A= element =3D $(element);=0A= for (var i =3D 0; i < element.childNodes.length; i++) {=0A= var node =3D element.childNodes[i];=0A= if (node.nodeType =3D=3D 3 && !/\S/.test(node.nodeValue))=0A= Element.remove(node);=0A= }=0A= },=0A= =0A= empty: function(element) {=0A= return $(element).innerHTML.match(/^\s*$/);=0A= },=0A= =0A= childOf: function(element, ancestor) {=0A= element =3D $(element), ancestor =3D $(ancestor);=0A= while (element =3D element.parentNode)=0A= if (element =3D=3D ancestor) return true;=0A= return false;=0A= },=0A= =0A= scrollTo: function(element) {=0A= element =3D $(element);=0A= var x =3D element.x ? element.x : element.offsetLeft,=0A= y =3D element.y ? element.y : element.offsetTop;=0A= window.scrollTo(x, y);=0A= },=0A= =0A= getStyle: function(element, style) {=0A= element =3D $(element);=0A= var value =3D element.style[style.camelize()];=0A= if (!value) {=0A= if (document.defaultView && document.defaultView.getComputedStyle) = {=0A= var css =3D document.defaultView.getComputedStyle(element, null);=0A= value =3D css ? css.getPropertyValue(style) : null;=0A= } else if (element.currentStyle) {=0A= value =3D element.currentStyle[style.camelize()];=0A= }=0A= }=0A= =0A= if (window.opera && ['left', 'top', 'right', = 'bottom'].include(style))=0A= if (Element.getStyle(element, 'position') =3D=3D 'static') value = =3D 'auto';=0A= =0A= return value =3D=3D 'auto' ? null : value;=0A= },=0A= =0A= setStyle: function(element, style) {=0A= element =3D $(element);=0A= for (var name in style)=0A= element.style[name.camelize()] =3D style[name];=0A= },=0A= =0A= getDimensions: function(element) {=0A= element =3D $(element);=0A= if (Element.getStyle(element, 'display') !=3D 'none')=0A= return {width: element.offsetWidth, height: element.offsetHeight};=0A= =0A= // All *Width and *Height properties give 0 on elements with display = none,=0A= // so enable the element temporarily=0A= var els =3D element.style;=0A= var originalVisibility =3D els.visibility;=0A= var originalPosition =3D els.position;=0A= els.visibility =3D 'hidden';=0A= els.position =3D 'absolute';=0A= els.display =3D '';=0A= var originalWidth =3D element.clientWidth;=0A= var originalHeight =3D element.clientHeight;=0A= els.display =3D 'none';=0A= els.position =3D originalPosition;=0A= els.visibility =3D originalVisibility;=0A= return {width: originalWidth, height: originalHeight};=0A= },=0A= =0A= makePositioned: function(element) {=0A= element =3D $(element);=0A= var pos =3D Element.getStyle(element, 'position');=0A= if (pos =3D=3D 'static' || !pos) {=0A= element._madePositioned =3D true;=0A= element.style.position =3D 'relative';=0A= // Opera returns the offset relative to the positioning context, = when an=0A= // element is position relative but top and left have not been = defined=0A= if (window.opera) {=0A= element.style.top =3D 0;=0A= element.style.left =3D 0;=0A= }=0A= }=0A= },=0A= =0A= undoPositioned: function(element) {=0A= element =3D $(element);=0A= if (element._madePositioned) {=0A= element._madePositioned =3D undefined;=0A= element.style.position =3D=0A= element.style.top =3D=0A= element.style.left =3D=0A= element.style.bottom =3D=0A= element.style.right =3D '';=0A= }=0A= },=0A= =0A= makeClipping: function(element) {=0A= element =3D $(element);=0A= if (element._overflow) return;=0A= element._overflow =3D element.style.overflow;=0A= if ((Element.getStyle(element, 'overflow') || 'visible') !=3D = 'hidden')=0A= element.style.overflow =3D 'hidden';=0A= },=0A= =0A= undoClipping: function(element) {=0A= element =3D $(element);=0A= if (element._overflow) return;=0A= element.style.overflow =3D element._overflow;=0A= element._overflow =3D undefined;=0A= }=0A= }=0A= =0A= Object.extend(Element, Element.Methods);=0A= =0A= var _nativeExtensions =3D false;=0A= =0A= if(!HTMLElement && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) {=0A= var HTMLElement =3D {}=0A= HTMLElement.prototype =3D document.createElement('div').__proto__;=0A= }=0A= =0A= Element.addMethods =3D function(methods) {=0A= Object.extend(Element.Methods, methods || {});=0A= =0A= if(typeof HTMLElement !=3D 'undefined') {=0A= var methods =3D Element.Methods, cache =3D Element.extend.cache;=0A= for (property in methods) {=0A= var value =3D methods[property];=0A= if (typeof value =3D=3D 'function')=0A= HTMLElement.prototype[property] =3D cache.findOrStore(value);=0A= }=0A= _nativeExtensions =3D true;=0A= }=0A= }=0A= =0A= Element.addMethods();=0A= =0A= var Toggle =3D new Object();=0A= Toggle.display =3D Element.toggle;=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= Abstract.Insertion =3D function(adjacency) {=0A= this.adjacency =3D adjacency;=0A= }=0A= =0A= Abstract.Insertion.prototype =3D {=0A= initialize: function(element, content) {=0A= this.element =3D $(element);=0A= this.content =3D content.stripScripts();=0A= =0A= if (this.adjacency && this.element.insertAdjacentHTML) {=0A= try {=0A= this.element.insertAdjacentHTML(this.adjacency, this.content);=0A= } catch (e) {=0A= var tagName =3D this.element.tagName.toLowerCase();=0A= if (tagName =3D=3D 'tbody' || tagName =3D=3D 'tr') {=0A= this.insertContent(this.contentFromAnonymousTable());=0A= } else {=0A= throw e;=0A= }=0A= }=0A= } else {=0A= this.range =3D this.element.ownerDocument.createRange();=0A= if (this.initializeRange) this.initializeRange();=0A= = this.insertContent([this.range.createContextualFragment(this.content)]);=0A= }=0A= =0A= setTimeout(function() {content.evalScripts()}, 10);=0A= },=0A= =0A= contentFromAnonymousTable: function() {=0A= var div =3D document.createElement('div');=0A= div.innerHTML =3D '' + this.content + = '
';=0A= return $A(div.childNodes[0].childNodes[0].childNodes);=0A= }=0A= }=0A= =0A= var Insertion =3D new Object();=0A= =0A= Insertion.Before =3D Class.create();=0A= Insertion.Before.prototype =3D Object.extend(new = Abstract.Insertion('beforeBegin'), {=0A= initializeRange: function() {=0A= this.range.setStartBefore(this.element);=0A= },=0A= =0A= insertContent: function(fragments) {=0A= fragments.each((function(fragment) {=0A= this.element.parentNode.insertBefore(fragment, this.element);=0A= }).bind(this));=0A= }=0A= });=0A= =0A= Insertion.Top =3D Class.create();=0A= Insertion.Top.prototype =3D Object.extend(new = Abstract.Insertion('afterBegin'), {=0A= initializeRange: function() {=0A= this.range.selectNodeContents(this.element);=0A= this.range.collapse(true);=0A= },=0A= =0A= insertContent: function(fragments) {=0A= fragments.reverse(false).each((function(fragment) {=0A= this.element.insertBefore(fragment, this.element.firstChild);=0A= }).bind(this));=0A= }=0A= });=0A= =0A= Insertion.Bottom =3D Class.create();=0A= Insertion.Bottom.prototype =3D Object.extend(new = Abstract.Insertion('beforeEnd'), {=0A= initializeRange: function() {=0A= this.range.selectNodeContents(this.element);=0A= this.range.collapse(this.element);=0A= },=0A= =0A= insertContent: function(fragments) {=0A= fragments.each((function(fragment) {=0A= this.element.appendChild(fragment);=0A= }).bind(this));=0A= }=0A= });=0A= =0A= Insertion.After =3D Class.create();=0A= Insertion.After.prototype =3D Object.extend(new = Abstract.Insertion('afterEnd'), {=0A= initializeRange: function() {=0A= this.range.setStartAfter(this.element);=0A= },=0A= =0A= insertContent: function(fragments) {=0A= fragments.each((function(fragment) {=0A= this.element.parentNode.insertBefore(fragment,=0A= this.element.nextSibling);=0A= }).bind(this));=0A= }=0A= });=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= Element.ClassNames =3D Class.create();=0A= Element.ClassNames.prototype =3D {=0A= initialize: function(element) {=0A= this.element =3D $(element);=0A= },=0A= =0A= _each: function(iterator) {=0A= this.element.className.split(/\s+/).select(function(name) {=0A= return name.length > 0;=0A= })._each(iterator);=0A= },=0A= =0A= set: function(className) {=0A= this.element.className =3D className;=0A= },=0A= =0A= add: function(classNameToAdd) {=0A= if (this.include(classNameToAdd)) return;=0A= this.set(this.toArray().concat(classNameToAdd).join(' '));=0A= },=0A= =0A= remove: function(classNameToRemove) {=0A= if (!this.include(classNameToRemove)) return;=0A= this.set(this.select(function(className) {=0A= return className !=3D classNameToRemove;=0A= }).join(' '));=0A= },=0A= =0A= toString: function() {=0A= return this.toArray().join(' ');=0A= }=0A= }=0A= =0A= Object.extend(Element.ClassNames.prototype, Enumerable);=0A= var Selector =3D Class.create();=0A= Selector.prototype =3D {=0A= initialize: function(expression) {=0A= this.params =3D {classNames: []};=0A= this.expression =3D expression.toString().strip();=0A= this.parseExpression();=0A= this.compileMatcher();=0A= },=0A= =0A= parseExpression: function() {=0A= function abort(message) { throw 'Parse error in selector: ' + = message; }=0A= =0A= if (this.expression =3D=3D '') abort('empty expression');=0A= =0A= var params =3D this.params, expr =3D this.expression, match, = modifier, clause, rest;=0A= while (match =3D = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=3D)(?:"([^"]*)"|([^\]\s]*))= )?\]$/i)) {=0A= params.attributes =3D params.attributes || [];=0A= params.attributes.push({name: match[2], operator: match[3], value: = match[4] || match[5] || ''});=0A= expr =3D match[1];=0A= }=0A= =0A= if (expr =3D=3D '*') return this.params.wildcard =3D true;=0A= =0A= while (match =3D expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {=0A= modifier =3D match[1], clause =3D match[2], rest =3D match[3];=0A= switch (modifier) {=0A= case '#': params.id =3D clause; break;=0A= case '.': params.classNames.push(clause); break;=0A= case '':=0A= case undefined: params.tagName =3D clause.toUpperCase(); break;=0A= default: abort(expr.inspect());=0A= }=0A= expr =3D rest;=0A= }=0A= =0A= if (expr.length > 0) abort(expr.inspect());=0A= },=0A= =0A= buildMatchExpression: function() {=0A= var params =3D this.params, conditions =3D [], clause;=0A= =0A= if (params.wildcard)=0A= conditions.push('true');=0A= if (clause =3D params.id)=0A= conditions.push('element.id =3D=3D ' + clause.inspect());=0A= if (clause =3D params.tagName)=0A= conditions.push('element.tagName.toUpperCase() =3D=3D ' + = clause.inspect());=0A= if ((clause =3D params.classNames).length > 0)=0A= for (var i =3D 0; i < clause.length; i++)=0A= conditions.push('Element.hasClassName(element, ' + = clause[i].inspect() + ')');=0A= if (clause =3D params.attributes) {=0A= clause.each(function(attribute) {=0A= var value =3D 'element.getAttribute(' + attribute.name.inspect() = + ')';=0A= var splitValueBy =3D function(delimiter) {=0A= return value + ' && ' + value + '.split(' + = delimiter.inspect() + ')';=0A= }=0A= =0A= switch (attribute.operator) {=0A= case '=3D': conditions.push(value + ' =3D=3D ' + = attribute.value.inspect()); break;=0A= case '~=3D': conditions.push(splitValueBy(' ') + = '.include(' + attribute.value.inspect() + ')'); break;=0A= case '|=3D': conditions.push(=0A= splitValueBy('-') + '.first().toUpperCase() = =3D=3D ' + attribute.value.toUpperCase().inspect()=0A= ); break;=0A= case '!=3D': conditions.push(value + ' !=3D ' + = attribute.value.inspect()); break;=0A= case '':=0A= case undefined: conditions.push(value + ' !=3D null'); break;=0A= default: throw 'Unknown operator ' + attribute.operator = + ' in selector';=0A= }=0A= });=0A= }=0A= =0A= return conditions.join(' && ');=0A= },=0A= =0A= compileMatcher: function() {=0A= this.match =3D new Function('element', 'if (!element.tagName) return = false; \=0A= return ' + this.buildMatchExpression());=0A= },=0A= =0A= findElements: function(scope) {=0A= var element;=0A= =0A= if (element =3D $(this.params.id))=0A= if (this.match(element))=0A= if (!scope || Element.childOf(element, scope))=0A= return [element];=0A= =0A= scope =3D (scope || = document).getElementsByTagName(this.params.tagName || '*');=0A= =0A= var results =3D [];=0A= for (var i =3D 0; i < scope.length; i++)=0A= if (this.match(element =3D scope[i]))=0A= results.push(Element.extend(element));=0A= =0A= return results;=0A= },=0A= =0A= toString: function() {=0A= return this.expression;=0A= }=0A= }=0A= =0A= function $$() {=0A= return $A(arguments).map(function(expression) {=0A= return expression.strip().split(/\s+/).inject([null], = function(results, expr) {=0A= var selector =3D new Selector(expr);=0A= return results.map(selector.findElements.bind(selector)).flatten();=0A= });=0A= }).flatten();=0A= }=0A= var Field =3D {=0A= clear: function() {=0A= for (var i =3D 0; i < arguments.length; i++)=0A= $(arguments[i]).value =3D '';=0A= },=0A= =0A= focus: function(element) {=0A= $(element).focus();=0A= },=0A= =0A= present: function() {=0A= for (var i =3D 0; i < arguments.length; i++)=0A= if ($(arguments[i]).value =3D=3D '') return false;=0A= return true;=0A= },=0A= =0A= select: function(element) {=0A= $(element).select();=0A= },=0A= =0A= activate: function(element) {=0A= element =3D $(element);=0A= element.focus();=0A= if (element.select)=0A= element.select();=0A= }=0A= }=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= var Form =3D {=0A= serialize: function(form) {=0A= var elements =3D Form.getElements($(form));=0A= var queryComponents =3D new Array();=0A= =0A= for (var i =3D 0; i < elements.length; i++) {=0A= var queryComponent =3D Form.Element.serialize(elements[i]);=0A= if (queryComponent)=0A= queryComponents.push(queryComponent);=0A= }=0A= =0A= return queryComponents.join('&');=0A= },=0A= =0A= getElements: function(form) {=0A= form =3D $(form);=0A= var elements =3D new Array();=0A= =0A= for (var tagName in Form.Element.Serializers) {=0A= var tagElements =3D form.getElementsByTagName(tagName);=0A= for (var j =3D 0; j < tagElements.length; j++)=0A= elements.push(tagElements[j]);=0A= }=0A= return elements;=0A= },=0A= =0A= getInputs: function(form, typeName, name) {=0A= form =3D $(form);=0A= var inputs =3D form.getElementsByTagName('input');=0A= =0A= if (!typeName && !name)=0A= return inputs;=0A= =0A= var matchingInputs =3D new Array();=0A= for (var i =3D 0; i < inputs.length; i++) {=0A= var input =3D inputs[i];=0A= if ((typeName && input.type !=3D typeName) ||=0A= (name && input.name !=3D name))=0A= continue;=0A= matchingInputs.push(input);=0A= }=0A= =0A= return matchingInputs;=0A= },=0A= =0A= disable: function(form) {=0A= var elements =3D Form.getElements(form);=0A= for (var i =3D 0; i < elements.length; i++) {=0A= var element =3D elements[i];=0A= element.blur();=0A= element.disabled =3D 'true';=0A= }=0A= },=0A= =0A= enable: function(form) {=0A= var elements =3D Form.getElements(form);=0A= for (var i =3D 0; i < elements.length; i++) {=0A= var element =3D elements[i];=0A= element.disabled =3D '';=0A= }=0A= },=0A= =0A= findFirstElement: function(form) {=0A= return Form.getElements(form).find(function(element) {=0A= return element.type !=3D 'hidden' && !element.disabled &&=0A= ['input', 'select', = 'textarea'].include(element.tagName.toLowerCase());=0A= });=0A= },=0A= =0A= focusFirstElement: function(form) {=0A= Field.activate(Form.findFirstElement(form));=0A= },=0A= =0A= reset: function(form) {=0A= $(form).reset();=0A= }=0A= }=0A= =0A= Form.Element =3D {=0A= serialize: function(element) {=0A= element =3D $(element);=0A= var method =3D element.tagName.toLowerCase();=0A= var parameter =3D Form.Element.Serializers[method](element);=0A= =0A= if (parameter) {=0A= var key =3D encodeURIComponent(parameter[0]);=0A= if (key.length =3D=3D 0) return;=0A= =0A= if (parameter[1].constructor !=3D Array)=0A= parameter[1] =3D [parameter[1]];=0A= =0A= return parameter[1].map(function(value) {=0A= return key + '=3D' + encodeURIComponent(value);=0A= }).join('&');=0A= }=0A= },=0A= =0A= getValue: function(element) {=0A= element =3D $(element);=0A= var method =3D element.tagName.toLowerCase();=0A= var parameter =3D Form.Element.Serializers[method](element);=0A= =0A= if (parameter)=0A= return parameter[1];=0A= }=0A= }=0A= =0A= Form.Element.Serializers =3D {=0A= input: function(element) {=0A= switch (element.type.toLowerCase()) {=0A= case 'submit':=0A= case 'hidden':=0A= case 'password':=0A= case 'text':=0A= return Form.Element.Serializers.textarea(element);=0A= case 'checkbox':=0A= case 'radio':=0A= return Form.Element.Serializers.inputSelector(element);=0A= }=0A= return false;=0A= },=0A= =0A= inputSelector: function(element) {=0A= if (element.checked)=0A= return [element.name, element.value];=0A= },=0A= =0A= textarea: function(element) {=0A= return [element.name, element.value];=0A= },=0A= =0A= select: function(element) {=0A= return Form.Element.Serializers[element.type =3D=3D 'select-one' ?=0A= 'selectOne' : 'selectMany'](element);=0A= },=0A= =0A= selectOne: function(element) {=0A= var value =3D '', opt, index =3D element.selectedIndex;=0A= if (index >=3D 0) {=0A= opt =3D element.options[index];=0A= value =3D opt.value || opt.text;=0A= }=0A= return [element.name, value];=0A= },=0A= =0A= selectMany: function(element) {=0A= var value =3D [];=0A= for (var i =3D 0; i < element.length; i++) {=0A= var opt =3D element.options[i];=0A= if (opt.selected)=0A= value.push(opt.value || opt.text);=0A= }=0A= return [element.name, value];=0A= }=0A= }=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= var $F =3D Form.Element.getValue;=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= Abstract.TimedObserver =3D function() {}=0A= Abstract.TimedObserver.prototype =3D {=0A= initialize: function(element, frequency, callback) {=0A= this.frequency =3D frequency;=0A= this.element =3D $(element);=0A= this.callback =3D callback;=0A= =0A= this.lastValue =3D this.getValue();=0A= this.registerCallback();=0A= },=0A= =0A= registerCallback: function() {=0A= setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);=0A= },=0A= =0A= onTimerEvent: function() {=0A= var value =3D this.getValue();=0A= if (this.lastValue !=3D value) {=0A= this.callback(this.element, value);=0A= this.lastValue =3D value;=0A= }=0A= }=0A= }=0A= =0A= Form.Element.Observer =3D Class.create();=0A= Form.Element.Observer.prototype =3D Object.extend(new = Abstract.TimedObserver(), {=0A= getValue: function() {=0A= return Form.Element.getValue(this.element);=0A= }=0A= });=0A= =0A= Form.Observer =3D Class.create();=0A= Form.Observer.prototype =3D Object.extend(new Abstract.TimedObserver(), {=0A= getValue: function() {=0A= return Form.serialize(this.element);=0A= }=0A= });=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= Abstract.EventObserver =3D function() {}=0A= Abstract.EventObserver.prototype =3D {=0A= initialize: function(element, callback) {=0A= this.element =3D $(element);=0A= this.callback =3D callback;=0A= =0A= this.lastValue =3D this.getValue();=0A= if (this.element.tagName.toLowerCase() =3D=3D 'form')=0A= this.registerFormCallbacks();=0A= else=0A= this.registerCallback(this.element);=0A= },=0A= =0A= onElementEvent: function() {=0A= var value =3D this.getValue();=0A= if (this.lastValue !=3D value) {=0A= this.callback(this.element, value);=0A= this.lastValue =3D value;=0A= }=0A= },=0A= =0A= registerFormCallbacks: function() {=0A= var elements =3D Form.getElements(this.element);=0A= for (var i =3D 0; i < elements.length; i++)=0A= this.registerCallback(elements[i]);=0A= },=0A= =0A= registerCallback: function(element) {=0A= if (element.type) {=0A= switch (element.type.toLowerCase()) {=0A= case 'checkbox':=0A= case 'radio':=0A= Event.observe(element, 'click', = this.onElementEvent.bind(this));=0A= break;=0A= case 'password':=0A= case 'text':=0A= case 'textarea':=0A= case 'select-one':=0A= case 'select-multiple':=0A= Event.observe(element, 'change', = this.onElementEvent.bind(this));=0A= break;=0A= }=0A= }=0A= }=0A= }=0A= =0A= Form.Element.EventObserver =3D Class.create();=0A= Form.Element.EventObserver.prototype =3D Object.extend(new = Abstract.EventObserver(), {=0A= getValue: function() {=0A= return Form.Element.getValue(this.element);=0A= }=0A= });=0A= =0A= Form.EventObserver =3D Class.create();=0A= Form.EventObserver.prototype =3D Object.extend(new = Abstract.EventObserver(), {=0A= getValue: function() {=0A= return Form.serialize(this.element);=0A= }=0A= });=0A= if (!window.Event) {=0A= var Event =3D new Object();=0A= }=0A= =0A= Object.extend(Event, {=0A= KEY_BACKSPACE: 8,=0A= KEY_TAB: 9,=0A= KEY_RETURN: 13,=0A= KEY_ESC: 27,=0A= KEY_LEFT: 37,=0A= KEY_UP: 38,=0A= KEY_RIGHT: 39,=0A= KEY_DOWN: 40,=0A= KEY_DELETE: 46,=0A= =0A= element: function(event) {=0A= return event.target || event.srcElement;=0A= },=0A= =0A= isLeftClick: function(event) {=0A= return (((event.which) && (event.which =3D=3D 1)) ||=0A= ((event.button) && (event.button =3D=3D 1)));=0A= },=0A= =0A= pointerX: function(event) {=0A= return event.pageX || (event.clientX +=0A= (document.documentElement.scrollLeft || document.body.scrollLeft));=0A= },=0A= =0A= pointerY: function(event) {=0A= return event.pageY || (event.clientY +=0A= (document.documentElement.scrollTop || document.body.scrollTop));=0A= },=0A= =0A= stop: function(event) {=0A= if (event.preventDefault) {=0A= event.preventDefault();=0A= event.stopPropagation();=0A= } else {=0A= event.returnValue =3D false;=0A= event.cancelBubble =3D true;=0A= }=0A= },=0A= =0A= // find the first node with the given tagName, starting from the=0A= // node the event was triggered on; traverses the DOM upwards=0A= findElement: function(event, tagName) {=0A= var element =3D Event.element(event);=0A= while (element.parentNode && (!element.tagName ||=0A= (element.tagName.toUpperCase() !=3D tagName.toUpperCase())))=0A= element =3D element.parentNode;=0A= return element;=0A= },=0A= =0A= observers: false,=0A= =0A= _observeAndCache: function(element, name, observer, useCapture) {=0A= if (!this.observers) this.observers =3D [];=0A= if (element.addEventListener) {=0A= this.observers.push([element, name, observer, useCapture]);=0A= element.addEventListener(name, observer, useCapture);=0A= } else if (element.attachEvent) {=0A= this.observers.push([element, name, observer, useCapture]);=0A= element.attachEvent('on' + name, observer);=0A= }=0A= },=0A= =0A= unloadCache: function() {=0A= if (!Event.observers) return;=0A= for (var i =3D 0; i < Event.observers.length; i++) {=0A= Event.stopObserving.apply(this, Event.observers[i]);=0A= Event.observers[i][0] =3D null;=0A= }=0A= Event.observers =3D false;=0A= },=0A= =0A= observe: function(element, name, observer, useCapture) {=0A= var element =3D $(element);=0A= useCapture =3D useCapture || false;=0A= =0A= if (name =3D=3D 'keypress' &&=0A= (navigator.appVersion.match(/Konqueror|Safari|KHTML/)=0A= || element.attachEvent))=0A= name =3D 'keydown';=0A= =0A= this._observeAndCache(element, name, observer, useCapture);=0A= },=0A= =0A= stopObserving: function(element, name, observer, useCapture) {=0A= var element =3D $(element);=0A= useCapture =3D useCapture || false;=0A= =0A= if (name =3D=3D 'keypress' &&=0A= (navigator.appVersion.match(/Konqueror|Safari|KHTML/)=0A= || element.detachEvent))=0A= name =3D 'keydown';=0A= =0A= if (element.removeEventListener) {=0A= element.removeEventListener(name, observer, useCapture);=0A= } else if (element.detachEvent) {=0A= element.detachEvent('on' + name, observer);=0A= }=0A= }=0A= });=0A= =0A= /* prevent memory leaks in IE */=0A= if (navigator.appVersion.match(/\bMSIE\b/))=0A= Event.observe(window, 'unload', Event.unloadCache, false);=0A= var Position =3D {=0A= // set to true if needed, warning: firefox performance problems=0A= // NOT neeeded for page scrolling, only if draggable contained in=0A= // scrollable elements=0A= includeScrollOffsets: false,=0A= =0A= // must be called before calling withinIncludingScrolloffset, every = time the=0A= // page is scrolled=0A= prepare: function() {=0A= this.deltaX =3D window.pageXOffset=0A= || document.documentElement.scrollLeft=0A= || document.body.scrollLeft=0A= || 0;=0A= this.deltaY =3D window.pageYOffset=0A= || document.documentElement.scrollTop=0A= || document.body.scrollTop=0A= || 0;=0A= },=0A= =0A= realOffset: function(element) {=0A= var valueT =3D 0, valueL =3D 0;=0A= do {=0A= valueT +=3D element.scrollTop || 0;=0A= valueL +=3D element.scrollLeft || 0;=0A= element =3D element.parentNode;=0A= } while (element);=0A= return [valueL, valueT];=0A= },=0A= =0A= cumulativeOffset: function(element) {=0A= var valueT =3D 0, valueL =3D 0;=0A= do {=0A= valueT +=3D element.offsetTop || 0;=0A= valueL +=3D element.offsetLeft || 0;=0A= element =3D element.offsetParent;=0A= } while (element);=0A= return [valueL, valueT];=0A= },=0A= =0A= positionedOffset: function(element) {=0A= var valueT =3D 0, valueL =3D 0;=0A= do {=0A= valueT +=3D element.offsetTop || 0;=0A= valueL +=3D element.offsetLeft || 0;=0A= element =3D element.offsetParent;=0A= if (element) {=0A= p =3D Element.getStyle(element, 'position');=0A= if (p =3D=3D 'relative' || p =3D=3D 'absolute') break;=0A= }=0A= } while (element);=0A= return [valueL, valueT];=0A= },=0A= =0A= offsetParent: function(element) {=0A= if (element.offsetParent) return element.offsetParent;=0A= if (element =3D=3D document.body) return element;=0A= =0A= while ((element =3D element.parentNode) && element !=3D = document.body)=0A= if (Element.getStyle(element, 'position') !=3D 'static')=0A= return element;=0A= =0A= return document.body;=0A= },=0A= =0A= // caches x/y coordinate pair to use with overlap=0A= within: function(element, x, y) {=0A= if (this.includeScrollOffsets)=0A= return this.withinIncludingScrolloffsets(element, x, y);=0A= this.xcomp =3D x;=0A= this.ycomp =3D y;=0A= this.offset =3D this.cumulativeOffset(element);=0A= =0A= return (y >=3D this.offset[1] &&=0A= y < this.offset[1] + element.offsetHeight &&=0A= x >=3D this.offset[0] &&=0A= x < this.offset[0] + element.offsetWidth);=0A= },=0A= =0A= withinIncludingScrolloffsets: function(element, x, y) {=0A= var offsetcache =3D this.realOffset(element);=0A= =0A= this.xcomp =3D x + offsetcache[0] - this.deltaX;=0A= this.ycomp =3D y + offsetcache[1] - this.deltaY;=0A= this.offset =3D this.cumulativeOffset(element);=0A= =0A= return (this.ycomp >=3D this.offset[1] &&=0A= this.ycomp < this.offset[1] + element.offsetHeight &&=0A= this.xcomp >=3D this.offset[0] &&=0A= this.xcomp < this.offset[0] + element.offsetWidth);=0A= },=0A= =0A= // within must be called directly before=0A= overlap: function(mode, element) {=0A= if (!mode) return 0;=0A= if (mode =3D=3D 'vertical')=0A= return ((this.offset[1] + element.offsetHeight) - this.ycomp) /=0A= element.offsetHeight;=0A= if (mode =3D=3D 'horizontal')=0A= return ((this.offset[0] + element.offsetWidth) - this.xcomp) /=0A= element.offsetWidth;=0A= },=0A= =0A= clone: function(source, target) {=0A= source =3D $(source);=0A= target =3D $(target);=0A= target.style.position =3D 'absolute';=0A= var offsets =3D this.cumulativeOffset(source);=0A= target.style.top =3D offsets[1] + 'px';=0A= target.style.left =3D offsets[0] + 'px';=0A= target.style.width =3D source.offsetWidth + 'px';=0A= target.style.height =3D source.offsetHeight + 'px';=0A= },=0A= =0A= page: function(forElement) {=0A= var valueT =3D 0, valueL =3D 0;=0A= =0A= var element =3D forElement;=0A= do {=0A= valueT +=3D element.offsetTop || 0;=0A= valueL +=3D element.offsetLeft || 0;=0A= =0A= // Safari fix=0A= if (element.offsetParent=3D=3Ddocument.body)=0A= if (Element.getStyle(element,'position')=3D=3D'absolute') break;=0A= =0A= } while (element =3D element.offsetParent);=0A= =0A= element =3D forElement;=0A= do {=0A= valueT -=3D element.scrollTop || 0;=0A= valueL -=3D element.scrollLeft || 0;=0A= } while (element =3D element.parentNode);=0A= =0A= return [valueL, valueT];=0A= },=0A= =0A= clone: function(source, target) {=0A= var options =3D Object.extend({=0A= setLeft: true,=0A= setTop: true,=0A= setWidth: true,=0A= setHeight: true,=0A= offsetTop: 0,=0A= offsetLeft: 0=0A= }, arguments[2] || {})=0A= =0A= // find page position of source=0A= source =3D $(source);=0A= var p =3D Position.page(source);=0A= =0A= // find coordinate system to use=0A= target =3D $(target);=0A= var delta =3D [0, 0];=0A= var parent =3D null;=0A= // delta [0,0] will do fine with position: fixed elements,=0A= // position:absolute needs offsetParent deltas=0A= if (Element.getStyle(target,'position') =3D=3D 'absolute') {=0A= parent =3D Position.offsetParent(target);=0A= delta =3D Position.page(parent);=0A= }=0A= =0A= // correct by body offsets (fixes Safari)=0A= if (parent =3D=3D document.body) {=0A= delta[0] -=3D document.body.offsetLeft;=0A= delta[1] -=3D document.body.offsetTop;=0A= }=0A= =0A= // set position=0A= if(options.setLeft) target.style.left =3D (p[0] - delta[0] + = options.offsetLeft) + 'px';=0A= if(options.setTop) target.style.top =3D (p[1] - delta[1] + = options.offsetTop) + 'px';=0A= if(options.setWidth) target.style.width =3D source.offsetWidth + = 'px';=0A= if(options.setHeight) target.style.height =3D source.offsetHeight + = 'px';=0A= },=0A= =0A= absolutize: function(element) {=0A= element =3D $(element);=0A= if (element.style.position =3D=3D 'absolute') return;=0A= Position.prepare();=0A= =0A= var offsets =3D Position.positionedOffset(element);=0A= var top =3D offsets[1];=0A= var left =3D offsets[0];=0A= var width =3D element.clientWidth;=0A= var height =3D element.clientHeight;=0A= =0A= element._originalLeft =3D left - parseFloat(element.style.left || = 0);=0A= element._originalTop =3D top - parseFloat(element.style.top || = 0);=0A= element._originalWidth =3D element.style.width;=0A= element._originalHeight =3D element.style.height;=0A= =0A= element.style.position =3D 'absolute';=0A= element.style.top =3D top + 'px';;=0A= element.style.left =3D left + 'px';;=0A= element.style.width =3D width + 'px';;=0A= element.style.height =3D height + 'px';;=0A= },=0A= =0A= relativize: function(element) {=0A= element =3D $(element);=0A= if (element.style.position =3D=3D 'relative') return;=0A= Position.prepare();=0A= =0A= element.style.position =3D 'relative';=0A= var top =3D parseFloat(element.style.top || 0) - = (element._originalTop || 0);=0A= var left =3D parseFloat(element.style.left || 0) - = (element._originalLeft || 0);=0A= =0A= element.style.top =3D top + 'px';=0A= element.style.left =3D left + 'px';=0A= element.style.height =3D element._originalHeight;=0A= element.style.width =3D element._originalWidth;=0A= }=0A= }=0A= =0A= // Safari returns margins on body which is incorrect if the child is = absolutely=0A= // positioned. For performance reasons, redefine = Position.cumulativeOffset for=0A= // KHTML/WebKit only.=0A= if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {=0A= Position.cumulativeOffset =3D function(element) {=0A= var valueT =3D 0, valueL =3D 0;=0A= do {=0A= valueT +=3D element.offsetTop || 0;=0A= valueL +=3D element.offsetLeft || 0;=0A= if (element.offsetParent =3D=3D document.body)=0A= if (Element.getStyle(element, 'position') =3D=3D 'absolute') = break;=0A= =0A= element =3D element.offsetParent;=0A= } while (element);=0A= =0A= return [valueL, valueT];=0A= }=0A= } ------=_NextPart_000_0061_01CA09FF.878F8200 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://www.admissions.caltech.edu/javascripts/effects.js?1170291493 // Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, = http://mir.aculo.us)=0A= // Contributors:=0A= // Justin Palmer (http://encytemedia.com/)=0A= // Mark Pilgrim (http://diveintomark.org/)=0A= // Martin Bialasinki=0A= // =0A= // See scriptaculous.js for full license. =0A= =0A= // converts rgb() and #xxx to #xxxxxx format, =0A= // returns self (or first argument) if not convertable =0A= String.prototype.parseColor =3D function() { =0A= var color =3D '#'; =0A= if(this.slice(0,4) =3D=3D 'rgb(') { =0A= var cols =3D this.slice(4,this.length-1).split(','); =0A= var i=3D0; do { color +=3D parseInt(cols[i]).toColorPart() } while = (++i<3); =0A= } else { =0A= if(this.slice(0,1) =3D=3D '#') { =0A= if(this.length=3D=3D4) for(var i=3D1;i<4;i++) color +=3D = (this.charAt(i) + this.charAt(i)).toLowerCase(); =0A= if(this.length=3D=3D7) color =3D this.toLowerCase(); =0A= } =0A= } =0A= return(color.length=3D=3D7 ? color : (arguments[0] || this)); =0A= }=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= Element.collectTextNodes =3D function(element) { =0A= return $A($(element).childNodes).collect( function(node) {=0A= return (node.nodeType=3D=3D3 ? node.nodeValue : =0A= (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));=0A= }).flatten().join('');=0A= }=0A= =0A= Element.collectTextNodesIgnoreClass =3D function(element, className) { =0A= return $A($(element).childNodes).collect( function(node) {=0A= return (node.nodeType=3D=3D3 ? node.nodeValue : =0A= ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? =0A= Element.collectTextNodesIgnoreClass(node, className) : ''));=0A= }).flatten().join('');=0A= }=0A= =0A= Element.setContentZoom =3D function(element, percent) {=0A= element =3D $(element); =0A= Element.setStyle(element, {fontSize: (percent/100) + 'em'}); =0A= if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);=0A= }=0A= =0A= Element.getOpacity =3D function(element){ =0A= var opacity;=0A= if (opacity =3D Element.getStyle(element, 'opacity')) =0A= return parseFloat(opacity); =0A= if (opacity =3D (Element.getStyle(element, 'filter') || = '').match(/alpha\(opacity=3D(.*)\)/)) =0A= if(opacity[1]) return parseFloat(opacity[1]) / 100; =0A= return 1.0; =0A= }=0A= =0A= Element.setOpacity =3D function(element, value){ =0A= element=3D $(element); =0A= if (value =3D=3D 1){=0A= Element.setStyle(element, { opacity: =0A= (/Gecko/.test(navigator.userAgent) && = !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? =0A= 0.999999 : null });=0A= if(/MSIE/.test(navigator.userAgent)) =0A= Element.setStyle(element, {filter: = Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')}); =0A= } else { =0A= if(value < 0.00001) value =3D 0; =0A= Element.setStyle(element, {opacity: value});=0A= if(/MSIE/.test(navigator.userAgent)) =0A= Element.setStyle(element, =0A= { filter: = Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') +=0A= 'alpha(opacity=3D'+value*100+')' }); =0A= }=0A= } =0A= =0A= Element.getInlineOpacity =3D function(element){ =0A= return $(element).style.opacity || '';=0A= } =0A= =0A= Element.childrenWithClassName =3D function(element, className, = findFirst) {=0A= var classNameRegExp =3D new RegExp("(^|\\s)" + className + "(\\s|$)");=0A= var results =3D $A($(element).getElementsByTagName('*'))[findFirst ? = 'detect' : 'select']( function(c) { =0A= return (c.className && c.className.match(classNameRegExp));=0A= });=0A= if(!results) results =3D [];=0A= return results;=0A= }=0A= =0A= Element.forceRerendering =3D function(element) {=0A= try {=0A= element =3D $(element);=0A= var n =3D document.createTextNode(' ');=0A= element.appendChild(n);=0A= element.removeChild(n);=0A= } catch(e) { }=0A= };=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= Array.prototype.call =3D function() {=0A= var args =3D arguments;=0A= this.each(function(f){ f.apply(this, args) });=0A= }=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= var Effect =3D {=0A= tagifyText: function(element) {=0A= var tagifyStyle =3D 'position:relative';=0A= if(/MSIE/.test(navigator.userAgent)) tagifyStyle +=3D ';zoom:1';=0A= element =3D $(element);=0A= $A(element.childNodes).each( function(child) {=0A= if(child.nodeType=3D=3D3) {=0A= child.nodeValue.toArray().each( function(character) {=0A= element.insertBefore(=0A= Builder.node('span',{style: tagifyStyle},=0A= character =3D=3D ' ' ? String.fromCharCode(160) : = character), =0A= child);=0A= });=0A= Element.remove(child);=0A= }=0A= });=0A= },=0A= multiple: function(element, effect) {=0A= var elements;=0A= if(((typeof element =3D=3D 'object') || =0A= (typeof element =3D=3D 'function')) && =0A= (element.length))=0A= elements =3D element;=0A= else=0A= elements =3D $(element).childNodes;=0A= =0A= var options =3D Object.extend({=0A= speed: 0.1,=0A= delay: 0.0=0A= }, arguments[2] || {});=0A= var masterDelay =3D options.delay;=0A= =0A= $A(elements).each( function(element, index) {=0A= new effect(element, Object.extend(options, { delay: index * = options.speed + masterDelay }));=0A= });=0A= },=0A= PAIRS: {=0A= 'slide': ['SlideDown','SlideUp'],=0A= 'blind': ['BlindDown','BlindUp'],=0A= 'appear': ['Appear','Fade']=0A= },=0A= toggle: function(element, effect) {=0A= element =3D $(element);=0A= effect =3D (effect || 'appear').toLowerCase();=0A= var options =3D Object.extend({=0A= queue: { position:'end', scope:(element.id || 'global'), limit: 1 }=0A= }, arguments[2] || {});=0A= Effect[element.visible() ? =0A= Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, = options);=0A= }=0A= };=0A= =0A= var Effect2 =3D Effect; // deprecated=0A= =0A= /* ------------- transitions ------------- */=0A= =0A= Effect.Transitions =3D {}=0A= =0A= Effect.Transitions.linear =3D function(pos) {=0A= return pos;=0A= }=0A= Effect.Transitions.sinoidal =3D function(pos) {=0A= return (-Math.cos(pos*Math.PI)/2) + 0.5;=0A= }=0A= Effect.Transitions.reverse =3D function(pos) {=0A= return 1-pos;=0A= }=0A= Effect.Transitions.flicker =3D function(pos) {=0A= return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;=0A= }=0A= Effect.Transitions.wobble =3D function(pos) {=0A= return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;=0A= }=0A= Effect.Transitions.pulse =3D function(pos) {=0A= return (Math.floor(pos*10) % 2 =3D=3D 0 ? =0A= (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)));=0A= }=0A= Effect.Transitions.none =3D function(pos) {=0A= return 0;=0A= }=0A= Effect.Transitions.full =3D function(pos) {=0A= return 1;=0A= }=0A= =0A= /* ------------- core effects ------------- */=0A= =0A= Effect.ScopedQueue =3D Class.create();=0A= Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {=0A= initialize: function() {=0A= this.effects =3D [];=0A= this.interval =3D null;=0A= },=0A= _each: function(iterator) {=0A= this.effects._each(iterator);=0A= },=0A= add: function(effect) {=0A= var timestamp =3D new Date().getTime();=0A= =0A= var position =3D (typeof effect.options.queue =3D=3D 'string') ? =0A= effect.options.queue : effect.options.queue.position;=0A= =0A= switch(position) {=0A= case 'front':=0A= // move unstarted effects after this effect =0A= this.effects.findAll(function(e){ return e.state=3D=3D'idle' = }).each( function(e) {=0A= e.startOn +=3D effect.finishOn;=0A= e.finishOn +=3D effect.finishOn;=0A= });=0A= break;=0A= case 'end':=0A= // start effect after last queued effect has finished=0A= timestamp =3D this.effects.pluck('finishOn').max() || timestamp;=0A= break;=0A= }=0A= =0A= effect.startOn +=3D timestamp;=0A= effect.finishOn +=3D timestamp;=0A= =0A= if(!effect.options.queue.limit || (this.effects.length < = effect.options.queue.limit))=0A= this.effects.push(effect);=0A= =0A= if(!this.interval) =0A= this.interval =3D setInterval(this.loop.bind(this), 40);=0A= },=0A= remove: function(effect) {=0A= this.effects =3D this.effects.reject(function(e) { return = e=3D=3Deffect });=0A= if(this.effects.length =3D=3D 0) {=0A= clearInterval(this.interval);=0A= this.interval =3D null;=0A= }=0A= },=0A= loop: function() {=0A= var timePos =3D new Date().getTime();=0A= this.effects.invoke('loop', timePos);=0A= }=0A= });=0A= =0A= Effect.Queues =3D {=0A= instances: $H(),=0A= get: function(queueName) {=0A= if(typeof queueName !=3D 'string') return queueName;=0A= =0A= if(!this.instances[queueName])=0A= this.instances[queueName] =3D new Effect.ScopedQueue();=0A= =0A= return this.instances[queueName];=0A= }=0A= }=0A= Effect.Queue =3D Effect.Queues.get('global');=0A= =0A= Effect.DefaultOptions =3D {=0A= transition: Effect.Transitions.sinoidal,=0A= duration: 1.0, // seconds=0A= fps: 25.0, // max. 25fps due to Effect.Queue implementation=0A= sync: false, // true for combining=0A= from: 0.0,=0A= to: 1.0,=0A= delay: 0.0,=0A= queue: 'parallel'=0A= }=0A= =0A= Effect.Base =3D function() {};=0A= Effect.Base.prototype =3D {=0A= position: null,=0A= start: function(options) {=0A= this.options =3D = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});=0A= this.currentFrame =3D 0;=0A= this.state =3D 'idle';=0A= this.startOn =3D this.options.delay*1000;=0A= this.finishOn =3D this.startOn + (this.options.duration*1000);=0A= this.event('beforeStart');=0A= if(!this.options.sync)=0A= Effect.Queues.get(typeof this.options.queue =3D=3D 'string' ? =0A= 'global' : this.options.queue.scope).add(this);=0A= },=0A= loop: function(timePos) {=0A= if(timePos >=3D this.startOn) {=0A= if(timePos >=3D this.finishOn) {=0A= this.render(1.0);=0A= this.cancel();=0A= this.event('beforeFinish');=0A= if(this.finish) this.finish(); =0A= this.event('afterFinish');=0A= return; =0A= }=0A= var pos =3D (timePos - this.startOn) / (this.finishOn - = this.startOn);=0A= var frame =3D Math.round(pos * this.options.fps * = this.options.duration);=0A= if(frame > this.currentFrame) {=0A= this.render(pos);=0A= this.currentFrame =3D frame;=0A= }=0A= }=0A= },=0A= render: function(pos) {=0A= if(this.state =3D=3D 'idle') {=0A= this.state =3D 'running';=0A= this.event('beforeSetup');=0A= if(this.setup) this.setup();=0A= this.event('afterSetup');=0A= }=0A= if(this.state =3D=3D 'running') {=0A= if(this.options.transition) pos =3D this.options.transition(pos);=0A= pos *=3D (this.options.to-this.options.from);=0A= pos +=3D this.options.from;=0A= this.position =3D pos;=0A= this.event('beforeUpdate');=0A= if(this.update) this.update(pos);=0A= this.event('afterUpdate');=0A= }=0A= },=0A= cancel: function() {=0A= if(!this.options.sync)=0A= Effect.Queues.get(typeof this.options.queue =3D=3D 'string' ? =0A= 'global' : this.options.queue.scope).remove(this);=0A= this.state =3D 'finished';=0A= },=0A= event: function(eventName) {=0A= if(this.options[eventName + 'Internal']) this.options[eventName + = 'Internal'](this);=0A= if(this.options[eventName]) this.options[eventName](this);=0A= },=0A= inspect: function() {=0A= return '#';=0A= }=0A= }=0A= =0A= Effect.Parallel =3D Class.create();=0A= Object.extend(Object.extend(Effect.Parallel.prototype, = Effect.Base.prototype), {=0A= initialize: function(effects) {=0A= this.effects =3D effects || [];=0A= this.start(arguments[1]);=0A= },=0A= update: function(position) {=0A= this.effects.invoke('render', position);=0A= },=0A= finish: function(position) {=0A= this.effects.each( function(effect) {=0A= effect.render(1.0);=0A= effect.cancel();=0A= effect.event('beforeFinish');=0A= if(effect.finish) effect.finish(position);=0A= effect.event('afterFinish');=0A= });=0A= }=0A= });=0A= =0A= Effect.Opacity =3D Class.create();=0A= Object.extend(Object.extend(Effect.Opacity.prototype, = Effect.Base.prototype), {=0A= initialize: function(element) {=0A= this.element =3D $(element);=0A= // make this work on IE on elements without 'layout'=0A= if(/MSIE/.test(navigator.userAgent) && (!this.element.hasLayout))=0A= this.element.setStyle({zoom: 1});=0A= var options =3D Object.extend({=0A= from: this.element.getOpacity() || 0.0,=0A= to: 1.0=0A= }, arguments[1] || {});=0A= this.start(options);=0A= },=0A= update: function(position) {=0A= this.element.setOpacity(position);=0A= }=0A= });=0A= =0A= Effect.Move =3D Class.create();=0A= Object.extend(Object.extend(Effect.Move.prototype, = Effect.Base.prototype), {=0A= initialize: function(element) {=0A= this.element =3D $(element);=0A= var options =3D Object.extend({=0A= x: 0,=0A= y: 0,=0A= mode: 'relative'=0A= }, arguments[1] || {});=0A= this.start(options);=0A= },=0A= setup: function() {=0A= // Bug in Opera: Opera returns the "real" position of a static = element or=0A= // relative element that does not have top/left explicitly set.=0A= // =3D=3D> Always set top and left for position relative elements in = your stylesheets =0A= // (to 0 if you do not need them) =0A= this.element.makePositioned();=0A= this.originalLeft =3D parseFloat(this.element.getStyle('left') || = '0');=0A= this.originalTop =3D parseFloat(this.element.getStyle('top') || = '0');=0A= if(this.options.mode =3D=3D 'absolute') {=0A= // absolute movement, so we need to calc deltaX and deltaY=0A= this.options.x =3D this.options.x - this.originalLeft;=0A= this.options.y =3D this.options.y - this.originalTop;=0A= }=0A= },=0A= update: function(position) {=0A= this.element.setStyle({=0A= left: this.options.x * position + this.originalLeft + 'px',=0A= top: this.options.y * position + this.originalTop + 'px'=0A= });=0A= }=0A= });=0A= =0A= // for backwards compatibility=0A= Effect.MoveBy =3D function(element, toTop, toLeft) {=0A= return new Effect.Move(element, =0A= Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));=0A= };=0A= =0A= Effect.Scale =3D Class.create();=0A= Object.extend(Object.extend(Effect.Scale.prototype, = Effect.Base.prototype), {=0A= initialize: function(element, percent) {=0A= this.element =3D $(element)=0A= var options =3D Object.extend({=0A= scaleX: true,=0A= scaleY: true,=0A= scaleContent: true,=0A= scaleFromCenter: false,=0A= scaleMode: 'box', // 'box' or 'contents' or {} with = provided values=0A= scaleFrom: 100.0,=0A= scaleTo: percent=0A= }, arguments[2] || {});=0A= this.start(options);=0A= },=0A= setup: function() {=0A= this.restoreAfterFinish =3D this.options.restoreAfterFinish || false;=0A= this.elementPositioning =3D this.element.getStyle('position');=0A= =0A= this.originalStyle =3D {};=0A= ['top','left','width','height','fontSize'].each( function(k) {=0A= this.originalStyle[k] =3D this.element.style[k];=0A= }.bind(this));=0A= =0A= this.originalTop =3D this.element.offsetTop;=0A= this.originalLeft =3D this.element.offsetLeft;=0A= =0A= var fontSize =3D this.element.getStyle('font-size') || '100%';=0A= ['em','px','%'].each( function(fontSizeType) {=0A= if(fontSize.indexOf(fontSizeType)>0) {=0A= this.fontSize =3D parseFloat(fontSize);=0A= this.fontSizeType =3D fontSizeType;=0A= }=0A= }.bind(this));=0A= =0A= this.factor =3D (this.options.scaleTo - this.options.scaleFrom)/100;=0A= =0A= this.dims =3D null;=0A= if(this.options.scaleMode=3D=3D'box')=0A= this.dims =3D [this.element.offsetHeight, = this.element.offsetWidth];=0A= if(/^content/.test(this.options.scaleMode))=0A= this.dims =3D [this.element.scrollHeight, = this.element.scrollWidth];=0A= if(!this.dims)=0A= this.dims =3D [this.options.scaleMode.originalHeight,=0A= this.options.scaleMode.originalWidth];=0A= },=0A= update: function(position) {=0A= var currentScale =3D (this.options.scaleFrom/100.0) + (this.factor * = position);=0A= if(this.options.scaleContent && this.fontSize)=0A= this.element.setStyle({fontSize: this.fontSize * currentScale + = this.fontSizeType });=0A= this.setDimensions(this.dims[0] * currentScale, this.dims[1] * = currentScale);=0A= },=0A= finish: function(position) {=0A= if (this.restoreAfterFinish) = this.element.setStyle(this.originalStyle);=0A= },=0A= setDimensions: function(height, width) {=0A= var d =3D {};=0A= if(this.options.scaleX) d.width =3D width + 'px';=0A= if(this.options.scaleY) d.height =3D height + 'px';=0A= if(this.options.scaleFromCenter) {=0A= var topd =3D (height - this.dims[0])/2;=0A= var leftd =3D (width - this.dims[1])/2;=0A= if(this.elementPositioning =3D=3D 'absolute') {=0A= if(this.options.scaleY) d.top =3D this.originalTop-topd + 'px';=0A= if(this.options.scaleX) d.left =3D this.originalLeft-leftd + = 'px';=0A= } else {=0A= if(this.options.scaleY) d.top =3D -topd + 'px';=0A= if(this.options.scaleX) d.left =3D -leftd + 'px';=0A= }=0A= }=0A= this.element.setStyle(d);=0A= }=0A= });=0A= =0A= Effect.Highlight =3D Class.create();=0A= Object.extend(Object.extend(Effect.Highlight.prototype, = Effect.Base.prototype), {=0A= initialize: function(element) {=0A= this.element =3D $(element);=0A= var options =3D Object.extend({ startcolor: '#ffff99' }, = arguments[1] || {});=0A= this.start(options);=0A= },=0A= setup: function() {=0A= // Prevent executing on elements not in the layout flow=0A= if(this.element.getStyle('display')=3D=3D'none') { this.cancel(); = return; }=0A= // Disable background image during the effect=0A= this.oldStyle =3D {=0A= backgroundImage: this.element.getStyle('background-image') };=0A= this.element.setStyle({backgroundImage: 'none'});=0A= if(!this.options.endcolor)=0A= this.options.endcolor =3D = this.element.getStyle('background-color').parseColor('#ffffff');=0A= if(!this.options.restorecolor)=0A= this.options.restorecolor =3D = this.element.getStyle('background-color');=0A= // init color calculations=0A= this._base =3D $R(0,2).map(function(i){ return = parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));=0A= this._delta =3D $R(0,2).map(function(i){ return = parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] = }.bind(this));=0A= },=0A= update: function(position) {=0A= this.element.setStyle({backgroundColor: = $R(0,2).inject('#',function(m,v,i){=0A= return = m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); = }.bind(this)) });=0A= },=0A= finish: function() {=0A= this.element.setStyle(Object.extend(this.oldStyle, {=0A= backgroundColor: this.options.restorecolor=0A= }));=0A= }=0A= });=0A= =0A= Effect.ScrollTo =3D Class.create();=0A= Object.extend(Object.extend(Effect.ScrollTo.prototype, = Effect.Base.prototype), {=0A= initialize: function(element) {=0A= this.element =3D $(element);=0A= this.start(arguments[1] || {});=0A= },=0A= setup: function() {=0A= Position.prepare();=0A= var offsets =3D Position.cumulativeOffset(this.element);=0A= if(this.options.offset) offsets[1] +=3D this.options.offset;=0A= var max =3D window.innerHeight ? =0A= window.height - window.innerHeight :=0A= document.body.scrollHeight - =0A= (document.documentElement.clientHeight ? =0A= document.documentElement.clientHeight : = document.body.clientHeight);=0A= this.scrollStart =3D Position.deltaY;=0A= this.delta =3D (offsets[1] > max ? max : offsets[1]) - = this.scrollStart;=0A= },=0A= update: function(position) {=0A= Position.prepare();=0A= window.scrollTo(Position.deltaX, =0A= this.scrollStart + (position*this.delta));=0A= }=0A= });=0A= =0A= /* ------------- combination effects ------------- */=0A= =0A= Effect.Fade =3D function(element) {=0A= element =3D $(element);=0A= var oldOpacity =3D element.getInlineOpacity();=0A= var options =3D Object.extend({=0A= from: element.getOpacity() || 1.0,=0A= to: 0.0,=0A= afterFinishInternal: function(effect) { =0A= if(effect.options.to!=3D0) return;=0A= effect.element.hide();=0A= effect.element.setStyle({opacity: oldOpacity}); =0A= }}, arguments[1] || {});=0A= return new Effect.Opacity(element,options);=0A= }=0A= =0A= Effect.Appear =3D function(element) {=0A= element =3D $(element);=0A= var options =3D Object.extend({=0A= from: (element.getStyle('display') =3D=3D 'none' ? 0.0 : = element.getOpacity() || 0.0),=0A= to: 1.0,=0A= // force Safari to render floated elements properly=0A= afterFinishInternal: function(effect) {=0A= effect.element.forceRerendering();=0A= },=0A= beforeSetup: function(effect) {=0A= effect.element.setOpacity(effect.options.from);=0A= effect.element.show(); =0A= }}, arguments[1] || {});=0A= return new Effect.Opacity(element,options);=0A= }=0A= =0A= Effect.Puff =3D function(element) {=0A= element =3D $(element);=0A= var oldStyle =3D { opacity: element.getInlineOpacity(), position: = element.getStyle('position') };=0A= return new Effect.Parallel(=0A= [ new Effect.Scale(element, 200, =0A= { sync: true, scaleFromCenter: true, scaleContent: true, = restoreAfterFinish: true }), =0A= new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], =0A= Object.extend({ duration: 1.0, =0A= beforeSetupInternal: function(effect) {=0A= effect.effects[0].element.setStyle({position: 'absolute'}); },=0A= afterFinishInternal: function(effect) {=0A= effect.effects[0].element.hide();=0A= effect.effects[0].element.setStyle(oldStyle); }=0A= }, arguments[1] || {})=0A= );=0A= }=0A= =0A= Effect.BlindUp =3D function(element) {=0A= element =3D $(element);=0A= element.makeClipping();=0A= return new Effect.Scale(element, 0, =0A= Object.extend({ scaleContent: false, =0A= scaleX: false, =0A= restoreAfterFinish: true,=0A= afterFinishInternal: function(effect) {=0A= effect.element.hide();=0A= effect.element.undoClipping();=0A= } =0A= }, arguments[1] || {})=0A= );=0A= }=0A= =0A= Effect.BlindDown =3D function(element) {=0A= element =3D $(element);=0A= var elementDimensions =3D element.getDimensions();=0A= return new Effect.Scale(element, 100, =0A= Object.extend({ scaleContent: false, =0A= scaleX: false,=0A= scaleFrom: 0,=0A= scaleMode: {originalHeight: elementDimensions.height, = originalWidth: elementDimensions.width},=0A= restoreAfterFinish: true,=0A= afterSetup: function(effect) {=0A= effect.element.makeClipping();=0A= effect.element.setStyle({height: '0px'});=0A= effect.element.show(); =0A= }, =0A= afterFinishInternal: function(effect) {=0A= effect.element.undoClipping();=0A= }=0A= }, arguments[1] || {})=0A= );=0A= }=0A= =0A= Effect.SwitchOff =3D function(element) {=0A= element =3D $(element);=0A= var oldOpacity =3D element.getInlineOpacity();=0A= return new Effect.Appear(element, { =0A= duration: 0.4,=0A= from: 0,=0A= transition: Effect.Transitions.flicker,=0A= afterFinishInternal: function(effect) {=0A= new Effect.Scale(effect.element, 1, { =0A= duration: 0.3, scaleFromCenter: true,=0A= scaleX: false, scaleContent: false, restoreAfterFinish: true,=0A= beforeSetup: function(effect) { =0A= effect.element.makePositioned();=0A= effect.element.makeClipping();=0A= },=0A= afterFinishInternal: function(effect) {=0A= effect.element.hide();=0A= effect.element.undoClipping();=0A= effect.element.undoPositioned();=0A= effect.element.setStyle({opacity: oldOpacity});=0A= }=0A= })=0A= }=0A= });=0A= }=0A= =0A= Effect.DropOut =3D function(element) {=0A= element =3D $(element);=0A= var oldStyle =3D {=0A= top: element.getStyle('top'),=0A= left: element.getStyle('left'),=0A= opacity: element.getInlineOpacity() };=0A= return new Effect.Parallel(=0A= [ new Effect.Move(element, {x: 0, y: 100, sync: true }), =0A= new Effect.Opacity(element, { sync: true, to: 0.0 }) ],=0A= Object.extend(=0A= { duration: 0.5,=0A= beforeSetup: function(effect) {=0A= effect.effects[0].element.makePositioned(); =0A= },=0A= afterFinishInternal: function(effect) {=0A= effect.effects[0].element.hide();=0A= effect.effects[0].element.undoPositioned();=0A= effect.effects[0].element.setStyle(oldStyle);=0A= } =0A= }, arguments[1] || {}));=0A= }=0A= =0A= Effect.Shake =3D function(element) {=0A= element =3D $(element);=0A= var oldStyle =3D {=0A= top: element.getStyle('top'),=0A= left: element.getStyle('left') };=0A= return new Effect.Move(element, =0A= { x: 20, y: 0, duration: 0.05, afterFinishInternal: = function(effect) {=0A= new Effect.Move(effect.element,=0A= { x: -40, y: 0, duration: 0.1, afterFinishInternal: = function(effect) {=0A= new Effect.Move(effect.element,=0A= { x: 40, y: 0, duration: 0.1, afterFinishInternal: = function(effect) {=0A= new Effect.Move(effect.element,=0A= { x: -40, y: 0, duration: 0.1, afterFinishInternal: = function(effect) {=0A= new Effect.Move(effect.element,=0A= { x: 40, y: 0, duration: 0.1, afterFinishInternal: = function(effect) {=0A= new Effect.Move(effect.element,=0A= { x: -20, y: 0, duration: 0.05, afterFinishInternal: = function(effect) {=0A= effect.element.undoPositioned();=0A= effect.element.setStyle(oldStyle);=0A= }}) }}) }}) }}) }}) }});=0A= }=0A= =0A= Effect.SlideDown =3D function(element) {=0A= element =3D $(element);=0A= element.cleanWhitespace();=0A= // SlideDown need to have the content of the element wrapped in a = container element with fixed height!=0A= var oldInnerBottom =3D $(element.firstChild).getStyle('bottom');=0A= var elementDimensions =3D element.getDimensions();=0A= return new Effect.Scale(element, 100, Object.extend({ =0A= scaleContent: false, =0A= scaleX: false, =0A= scaleFrom: 0,=0A= scaleMode: {originalHeight: elementDimensions.height, originalWidth: = elementDimensions.width},=0A= restoreAfterFinish: true,=0A= afterSetup: function(effect) {=0A= effect.element.makePositioned();=0A= effect.element.firstChild.makePositioned();=0A= if(window.opera) effect.element.setStyle({top: ''});=0A= effect.element.makeClipping();=0A= effect.element.setStyle({height: '0px'});=0A= effect.element.show(); },=0A= afterUpdateInternal: function(effect) {=0A= effect.element.firstChild.setStyle({bottom:=0A= (effect.dims[0] - effect.element.clientHeight) + 'px' }); =0A= },=0A= afterFinishInternal: function(effect) {=0A= effect.element.undoClipping(); =0A= // IE will crash if child is undoPositioned first=0A= if(/MSIE/.test(navigator.userAgent)){=0A= effect.element.undoPositioned();=0A= effect.element.firstChild.undoPositioned();=0A= }else{=0A= effect.element.firstChild.undoPositioned();=0A= effect.element.undoPositioned();=0A= }=0A= effect.element.firstChild.setStyle({bottom: oldInnerBottom}); }=0A= }, arguments[1] || {})=0A= );=0A= }=0A= =0A= Effect.SlideUp =3D function(element) {=0A= element =3D $(element);=0A= element.cleanWhitespace();=0A= var oldInnerBottom =3D $(element.firstChild).getStyle('bottom');=0A= return new Effect.Scale(element, 0, =0A= Object.extend({ scaleContent: false, =0A= scaleX: false, =0A= scaleMode: 'box',=0A= scaleFrom: 100,=0A= restoreAfterFinish: true,=0A= beforeStartInternal: function(effect) {=0A= effect.element.makePositioned();=0A= effect.element.firstChild.makePositioned();=0A= if(window.opera) effect.element.setStyle({top: ''});=0A= effect.element.makeClipping();=0A= effect.element.show(); }, =0A= afterUpdateInternal: function(effect) {=0A= effect.element.firstChild.setStyle({bottom:=0A= (effect.dims[0] - effect.element.clientHeight) + 'px' }); },=0A= afterFinishInternal: function(effect) {=0A= effect.element.hide();=0A= effect.element.undoClipping();=0A= effect.element.firstChild.undoPositioned();=0A= effect.element.undoPositioned();=0A= effect.element.setStyle({bottom: oldInnerBottom}); }=0A= }, arguments[1] || {})=0A= );=0A= }=0A= =0A= // Bug in opera makes the TD containing this element expand for a = instance after finish =0A= Effect.Squish =3D function(element) {=0A= return new Effect.Scale(element, window.opera ? 1 : 0, =0A= { restoreAfterFinish: true,=0A= beforeSetup: function(effect) {=0A= effect.element.makeClipping(effect.element); }, =0A= afterFinishInternal: function(effect) {=0A= effect.element.hide(effect.element); =0A= effect.element.undoClipping(effect.element); }=0A= });=0A= }=0A= =0A= Effect.Grow =3D function(element) {=0A= element =3D $(element);=0A= var options =3D Object.extend({=0A= direction: 'center',=0A= moveTransition: Effect.Transitions.sinoidal,=0A= scaleTransition: Effect.Transitions.sinoidal,=0A= opacityTransition: Effect.Transitions.full=0A= }, arguments[1] || {});=0A= var oldStyle =3D {=0A= top: element.style.top,=0A= left: element.style.left,=0A= height: element.style.height,=0A= width: element.style.width,=0A= opacity: element.getInlineOpacity() };=0A= =0A= var dims =3D element.getDimensions(); =0A= var initialMoveX, initialMoveY;=0A= var moveX, moveY;=0A= =0A= switch (options.direction) {=0A= case 'top-left':=0A= initialMoveX =3D initialMoveY =3D moveX =3D moveY =3D 0; =0A= break;=0A= case 'top-right':=0A= initialMoveX =3D dims.width;=0A= initialMoveY =3D moveY =3D 0;=0A= moveX =3D -dims.width;=0A= break;=0A= case 'bottom-left':=0A= initialMoveX =3D moveX =3D 0;=0A= initialMoveY =3D dims.height;=0A= moveY =3D -dims.height;=0A= break;=0A= case 'bottom-right':=0A= initialMoveX =3D dims.width;=0A= initialMoveY =3D dims.height;=0A= moveX =3D -dims.width;=0A= moveY =3D -dims.height;=0A= break;=0A= case 'center':=0A= initialMoveX =3D dims.width / 2;=0A= initialMoveY =3D dims.height / 2;=0A= moveX =3D -dims.width / 2;=0A= moveY =3D -dims.height / 2;=0A= break;=0A= }=0A= =0A= return new Effect.Move(element, {=0A= x: initialMoveX,=0A= y: initialMoveY,=0A= duration: 0.01, =0A= beforeSetup: function(effect) {=0A= effect.element.hide();=0A= effect.element.makeClipping();=0A= effect.element.makePositioned();=0A= },=0A= afterFinishInternal: function(effect) {=0A= new Effect.Parallel(=0A= [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, = from: 0.0, transition: options.opacityTransition }),=0A= new Effect.Move(effect.element, { x: moveX, y: moveY, sync: = true, transition: options.moveTransition }),=0A= new Effect.Scale(effect.element, 100, {=0A= scaleMode: { originalHeight: dims.height, originalWidth: = dims.width }, =0A= sync: true, scaleFrom: window.opera ? 1 : 0, transition: = options.scaleTransition, restoreAfterFinish: true})=0A= ], Object.extend({=0A= beforeSetup: function(effect) {=0A= effect.effects[0].element.setStyle({height: '0px'});=0A= effect.effects[0].element.show(); =0A= },=0A= afterFinishInternal: function(effect) {=0A= effect.effects[0].element.undoClipping();=0A= effect.effects[0].element.undoPositioned();=0A= effect.effects[0].element.setStyle(oldStyle); =0A= }=0A= }, options)=0A= )=0A= }=0A= });=0A= }=0A= =0A= Effect.Shrink =3D function(element) {=0A= element =3D $(element);=0A= var options =3D Object.extend({=0A= direction: 'center',=0A= moveTransition: Effect.Transitions.sinoidal,=0A= scaleTransition: Effect.Transitions.sinoidal,=0A= opacityTransition: Effect.Transitions.none=0A= }, arguments[1] || {});=0A= var oldStyle =3D {=0A= top: element.style.top,=0A= left: element.style.left,=0A= height: element.style.height,=0A= width: element.style.width,=0A= opacity: element.getInlineOpacity() };=0A= =0A= var dims =3D element.getDimensions();=0A= var moveX, moveY;=0A= =0A= switch (options.direction) {=0A= case 'top-left':=0A= moveX =3D moveY =3D 0;=0A= break;=0A= case 'top-right':=0A= moveX =3D dims.width;=0A= moveY =3D 0;=0A= break;=0A= case 'bottom-left':=0A= moveX =3D 0;=0A= moveY =3D dims.height;=0A= break;=0A= case 'bottom-right':=0A= moveX =3D dims.width;=0A= moveY =3D dims.height;=0A= break;=0A= case 'center': =0A= moveX =3D dims.width / 2;=0A= moveY =3D dims.height / 2;=0A= break;=0A= }=0A= =0A= return new Effect.Parallel(=0A= [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, = transition: options.opacityTransition }),=0A= new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, = transition: options.scaleTransition, restoreAfterFinish: true}),=0A= new Effect.Move(element, { x: moveX, y: moveY, sync: true, = transition: options.moveTransition })=0A= ], Object.extend({ =0A= beforeStartInternal: function(effect) {=0A= effect.effects[0].element.makePositioned();=0A= effect.effects[0].element.makeClipping(); },=0A= afterFinishInternal: function(effect) {=0A= effect.effects[0].element.hide();=0A= effect.effects[0].element.undoClipping();=0A= effect.effects[0].element.undoPositioned();=0A= effect.effects[0].element.setStyle(oldStyle); }=0A= }, options)=0A= );=0A= }=0A= =0A= Effect.Pulsate =3D function(element) {=0A= element =3D $(element);=0A= var options =3D arguments[1] || {};=0A= var oldOpacity =3D element.getInlineOpacity();=0A= var transition =3D options.transition || Effect.Transitions.sinoidal;=0A= var reverser =3D function(pos){ return = transition(1-Effect.Transitions.pulse(pos)) };=0A= reverser.bind(transition);=0A= return new Effect.Opacity(element, =0A= Object.extend(Object.extend({ duration: 3.0, from: 0,=0A= afterFinishInternal: function(effect) { = effect.element.setStyle({opacity: oldOpacity}); }=0A= }, options), {transition: reverser}));=0A= }=0A= =0A= Effect.Fold =3D function(element) {=0A= element =3D $(element);=0A= var oldStyle =3D {=0A= top: element.style.top,=0A= left: element.style.left,=0A= width: element.style.width,=0A= height: element.style.height };=0A= Element.makeClipping(element);=0A= return new Effect.Scale(element, 5, Object.extend({ =0A= scaleContent: false,=0A= scaleX: false,=0A= afterFinishInternal: function(effect) {=0A= new Effect.Scale(element, 1, { =0A= scaleContent: false, =0A= scaleY: false,=0A= afterFinishInternal: function(effect) {=0A= effect.element.hide();=0A= effect.element.undoClipping(); =0A= effect.element.setStyle(oldStyle);=0A= } });=0A= }}, arguments[1] || {}));=0A= };=0A= =0A= ['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setCont= entZoom',=0A= = 'collectTextNodes','collectTextNodesIgnoreClass','childrenWithClassName']= .each( =0A= function(f) { Element.Methods[f] =3D Element[f]; }=0A= );=0A= =0A= Element.Methods.visualEffect =3D function(element, effect, options) {=0A= s =3D effect.gsub(/_/, '-').camelize();=0A= effect_class =3D s.charAt(0).toUpperCase() + s.substring(1);=0A= new Effect[effect_class](element, options);=0A= return $(element);=0A= };=0A= =0A= Element.addMethods(); ------=_NextPart_000_0061_01CA09FF.878F8200 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://www.admissions.caltech.edu/javascripts/dragdrop.js?1170291493 // Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, = http://mir.aculo.us)=0A= // Copyright (c) 2005 Sammi Williams (http://www.oriontransfer.co.nz, = sammi@oriontransfer.co.nz)=0A= // =0A= // See scriptaculous.js for full license.=0A= =0A= /* Returns true if child is contained within element */=0A= Element.isParent =3D function(child, element) {=0A= if (!child.parentNode || child =3D=3D element) return false;=0A= =0A= if (child.parentNode =3D=3D element) return true;=0A= =0A= return arguments.callee (child.parentNode, element);=0A= }=0A= =0A= Element.findChildren =3D function(element, onlyClasses, recursive, = tagName) { =0A= if(!element.hasChildNodes()) return null;=0A= var elements =3D [];=0A= $A(element.childNodes).each( function(e) {=0A= if(e.tagName && e.tagName=3D=3DtagName &&=0A= (!onlyClasses || (Element.hasClassName(e, onlyClasses))))=0A= elements.push(e);=0A= if(recursive) {=0A= var grandchildren =3D Element.findChildren(e, onlyClasses, = recursive, tagName);=0A= if(grandchildren) elements.push(grandchildren);=0A= }=0A= });=0A= =0A= return (elements.length>0 ? elements.flatten() : []);=0A= }=0A= =0A= Element.offsetSize =3D function (element, type) {=0A= if (type =3D=3D 'vertical' || type =3D=3D 'height')=0A= return element.offsetHeight;=0A= else=0A= return element.offsetWidth;=0A= }=0A= =0A= var Droppables =3D {=0A= drops: [],=0A= =0A= remove: function(element) {=0A= this.drops =3D this.drops.reject(function(d) { return = d.element=3D=3D$(element) });=0A= },=0A= =0A= add: function(element) {=0A= element =3D $(element);=0A= var options =3D Object.extend({=0A= greedy: true,=0A= hoverclass: null,=0A= tree: false=0A= }, arguments[1] || {});=0A= =0A= // cache containers=0A= if(options.containment) {=0A= options._containers =3D [];=0A= var containment =3D options.containment;=0A= if((typeof containment =3D=3D 'object') && =0A= (containment.constructor =3D=3D Array)) {=0A= containment.each( function(c) { options._containers.push($(c)) });=0A= } else {=0A= options._containers.push($(containment));=0A= }=0A= }=0A= =0A= if(options.accept) options.accept =3D [options.accept].flatten();=0A= =0A= Element.makePositioned(element); // fix IE=0A= options.element =3D element;=0A= =0A= this.drops.push(options);=0A= },=0A= =0A= findDeepestChild: function(drops) {=0A= deepest =3D drops[0];=0A= =0A= for (i =3D 1; i < drops.length; ++i) {=0A= if (Element.isParent(drops[i].element, deepest.element))=0A= deepest =3D drops[i];=0A= }=0A= =0A= return deepest;=0A= },=0A= =0A= isContained: function(element, drop) {=0A= var parentNode =3D element.parentNode;=0A= return drop._containers.detect(function(c) { return parentNode =3D=3D = c });=0A= },=0A= =0A= isAffected: function(point, element, drop) {=0A= return (=0A= (drop.element!=3Delement) &&=0A= // ((!drop._containers) ||=0A= // this.isContained(element, drop)) &&=0A= ((!drop.accept) ||=0A= (Element.classNames(element).detect( =0A= function(v) { return drop.accept.include(v) } ) )) &&=0A= Position.within(drop.element, point[0], point[1]) );=0A= },=0A= =0A= deactivate: function(drop) {=0A= if(drop.hoverclass)=0A= Element.removeClassName(drop.element, drop.hoverclass);=0A= this.last_active =3D null;=0A= },=0A= =0A= activate: function(drop) {=0A= if(drop.hoverclass)=0A= Element.addClassName(drop.element, drop.hoverclass);=0A= this.last_active =3D drop;=0A= },=0A= =0A= show: function(point, element) {=0A= var affected =3D Array();=0A= if(!this.drops.length) return;=0A= =0A= if(this.last_active) this.deactivate(this.last_active);=0A= this.drops.each( function(drop) {=0A= if(Droppables.isAffected(point, element, drop))=0A= affected.push(drop);=0A= });=0A= =0A= if (affected.length) {=0A= drop =3D Droppables.findDeepestChild (affected);=0A= Position.within(drop.element, point[0], point[1]);=0A= if(drop.onHover)=0A= drop.onHover(element, drop.element, Position.overlap(drop.overlap, = drop.element));=0A= Droppables.activate(drop);=0A= }=0A= },=0A= =0A= fire: function(event, element) {=0A= if(!this.last_active) return;=0A= Position.prepare();=0A= =0A= if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], = element, this.last_active))=0A= if (this.last_active.onDrop) =0A= this.last_active.onDrop(element, this.last_active.element, event);=0A= },=0A= =0A= reset: function() {=0A= if(this.last_active)=0A= this.deactivate(this.last_active);=0A= }=0A= }=0A= =0A= var Draggables =3D {=0A= drags: [],=0A= observers: [],=0A= =0A= register: function(draggable) {=0A= if(this.drags.length =3D=3D 0) {=0A= this.eventMouseUp =3D this.endDrag.bindAsEventListener(this);=0A= this.eventMouseMove =3D this.updateDrag.bindAsEventListener(this);=0A= this.eventKeypress =3D this.keyPress.bindAsEventListener(this);=0A= =0A= Event.observe(document, "mouseup", this.eventMouseUp);=0A= Event.observe(document, "mousemove", this.eventMouseMove);=0A= Event.observe(document, "keypress", this.eventKeypress);=0A= }=0A= this.drags.push(draggable);=0A= },=0A= =0A= unregister: function(draggable) {=0A= this.drags =3D this.drags.reject(function(d) { return d=3D=3Ddraggable = });=0A= if(this.drags.length =3D=3D 0) {=0A= Event.stopObserving(document, "mouseup", this.eventMouseUp);=0A= Event.stopObserving(document, "mousemove", this.eventMouseMove);=0A= Event.stopObserving(document, "keypress", this.eventKeypress);=0A= }=0A= },=0A= =0A= activate: function(draggable) {=0A= window.focus(); // allows keypress events if window isn't currently = focused, fails for Safari=0A= this.activeDraggable =3D draggable;=0A= },=0A= =0A= deactivate: function() {=0A= this.activeDraggable =3D null;=0A= },=0A= =0A= updateDrag: function(event) {=0A= if(!this.activeDraggable) return;=0A= var pointer =3D [Event.pointerX(event), Event.pointerY(event)];=0A= // Mozilla-based browsers fire successive mousemove events with=0A= // the same coordinates, prevent needless redrawing (moz bug?)=0A= if(this._lastPointer && (this._lastPointer.inspect() =3D=3D = pointer.inspect())) return;=0A= this._lastPointer =3D pointer;=0A= this.activeDraggable.updateDrag(event, pointer);=0A= },=0A= =0A= endDrag: function(event) {=0A= if(!this.activeDraggable) return;=0A= this._lastPointer =3D null;=0A= this.activeDraggable.endDrag(event);=0A= this.activeDraggable =3D null;=0A= },=0A= =0A= keyPress: function(event) {=0A= if(this.activeDraggable)=0A= this.activeDraggable.keyPress(event);=0A= },=0A= =0A= addObserver: function(observer) {=0A= this.observers.push(observer);=0A= this._cacheObserverCallbacks();=0A= },=0A= =0A= removeObserver: function(element) { // element instead of observer = fixes mem leaks=0A= this.observers =3D this.observers.reject( function(o) { return = o.element=3D=3Delement });=0A= this._cacheObserverCallbacks();=0A= },=0A= =0A= notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', = 'onDrag'=0A= if(this[eventName+'Count'] > 0)=0A= this.observers.each( function(o) {=0A= if(o[eventName]) o[eventName](eventName, draggable, event);=0A= });=0A= },=0A= =0A= _cacheObserverCallbacks: function() {=0A= ['onStart','onEnd','onDrag'].each( function(eventName) {=0A= Draggables[eventName+'Count'] =3D Draggables.observers.select(=0A= function(o) { return o[eventName]; }=0A= ).length;=0A= });=0A= }=0A= }=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= var Draggable =3D Class.create();=0A= Draggable.prototype =3D {=0A= initialize: function(element) {=0A= var options =3D Object.extend({=0A= handle: false,=0A= starteffect: function(element) { =0A= new Effect.Opacity(element, {duration:0.2, from:1.0, to:0.7}); =0A= },=0A= reverteffect: function(element, top_offset, left_offset) {=0A= var dur =3D = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;=0A= element._revert =3D new Effect.Move(element, { x: -left_offset, y: = -top_offset, duration: dur});=0A= },=0A= endeffect: function(element) { =0A= new Effect.Opacity(element, {duration:0.2, from:0.7, to:1.0}); =0A= },=0A= zindex: 1000,=0A= revert: false,=0A= scroll: false,=0A= scrollSensitivity: 20,=0A= scrollSpeed: 15,=0A= snap: false // false, or xy or [x,y] or function(x,y){ return [x,y] }=0A= }, arguments[1] || {});=0A= =0A= this.element =3D $(element);=0A= =0A= if(options.handle && (typeof options.handle =3D=3D 'string'))=0A= this.handle =3D Element.childrenWithClassName(this.element, = options.handle)[0]; =0A= if(!this.handle) this.handle =3D $(options.handle);=0A= if(!this.handle) this.handle =3D this.element;=0A= =0A= if(options.scroll) options.scroll =3D $(options.scroll);=0A= =0A= Element.makePositioned(this.element); // fix IE =0A= =0A= this.delta =3D this.currentDelta();=0A= this.options =3D options;=0A= this.dragging =3D false; =0A= =0A= this.eventMouseDown =3D this.initDrag.bindAsEventListener(this);=0A= Event.observe(this.handle, "mousedown", this.eventMouseDown);=0A= =0A= Draggables.register(this);=0A= },=0A= =0A= destroy: function() {=0A= Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);=0A= Draggables.unregister(this);=0A= },=0A= =0A= currentDelta: function() {=0A= return([=0A= parseInt(Element.getStyle(this.element,'left') || '0'),=0A= parseInt(Element.getStyle(this.element,'top') || '0')]);=0A= },=0A= =0A= initDrag: function(event) {=0A= if(Event.isLeftClick(event)) { =0A= // abort on form elements, fixes a Firefox issue=0A= var src =3D Event.element(event);=0A= if(src.tagName && (=0A= src.tagName=3D=3D'INPUT' ||=0A= src.tagName=3D=3D'SELECT' ||=0A= src.tagName=3D=3D'OPTION' ||=0A= src.tagName=3D=3D'BUTTON' ||=0A= src.tagName=3D=3D'TEXTAREA')) return;=0A= =0A= if(this.element._revert) {=0A= this.element._revert.cancel();=0A= this.element._revert =3D null;=0A= }=0A= =0A= var pointer =3D [Event.pointerX(event), Event.pointerY(event)];=0A= var pos =3D Position.cumulativeOffset(this.element);=0A= this.offset =3D [0,1].map( function(i) { return (pointer[i] - pos[i]) = });=0A= =0A= Draggables.activate(this);=0A= Event.stop(event);=0A= }=0A= },=0A= =0A= startDrag: function(event) {=0A= this.dragging =3D true;=0A= =0A= if(this.options.zindex) {=0A= this.originalZ =3D parseInt(Element.getStyle(this.element,'z-index') = || 0);=0A= this.element.style.zIndex =3D this.options.zindex;=0A= }=0A= =0A= if(this.options.ghosting) {=0A= this._clone =3D this.element.cloneNode(true);=0A= Position.absolutize(this.element);=0A= this.element.parentNode.insertBefore(this._clone, this.element);=0A= }=0A= =0A= if(this.options.scroll) {=0A= this.originalScrollLeft =3D this.options.scroll.scrollLeft;=0A= this.originalScrollTop =3D this.options.scroll.scrollTop;=0A= }=0A= =0A= Draggables.notify('onStart', this, event);=0A= if(this.options.starteffect) this.options.starteffect(this.element);=0A= },=0A= =0A= updateDrag: function(event, pointer) {=0A= if(!this.dragging) this.startDrag(event);=0A= Position.prepare();=0A= Droppables.show(pointer, this.element);=0A= Draggables.notify('onDrag', this, event);=0A= this.draw(pointer);=0A= if(this.options.change) this.options.change(this);=0A= =0A= if(this.options.scroll) {=0A= //if(this.scrollInterval) this.scroll();=0A= this.stopScrolling();=0A= var p =3D Position.page(this.options.scroll);=0A= p[0] +=3D this.options.scroll.scrollLeft;=0A= p[1] +=3D this.options.scroll.scrollTop;=0A= p.push(p[0]+this.options.scroll.offsetWidth);=0A= p.push(p[1]+this.options.scroll.offsetHeight);=0A= var speed =3D [0,0];=0A= if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] =3D = pointer[0]-(p[0]+this.options.scrollSensitivity);=0A= if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] =3D = pointer[1]-(p[1]+this.options.scrollSensitivity);=0A= if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] =3D = pointer[0]-(p[2]-this.options.scrollSensitivity);=0A= if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] =3D = pointer[1]-(p[3]-this.options.scrollSensitivity);=0A= this.startScrolling(speed);=0A= }=0A= =0A= // fix AppleWebKit rendering=0A= if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);=0A= =0A= Event.stop(event);=0A= },=0A= =0A= finishDrag: function(event, success) {=0A= this.dragging =3D false;=0A= =0A= if(this.options.ghosting) {=0A= Position.relativize(this.element);=0A= Element.remove(this._clone);=0A= this._clone =3D null;=0A= }=0A= =0A= if(success) Droppables.fire(event, this.element);=0A= Draggables.notify('onEnd', this, event);=0A= =0A= var revert =3D this.options.revert;=0A= if(revert && typeof revert =3D=3D 'function') revert =3D = revert(this.element);=0A= =0A= var d =3D this.currentDelta();=0A= if(revert && this.options.reverteffect) {=0A= this.options.reverteffect(this.element, =0A= d[1]-this.delta[1], d[0]-this.delta[0]);=0A= } else {=0A= this.delta =3D d;=0A= }=0A= =0A= if(this.options.zindex)=0A= this.element.style.zIndex =3D this.originalZ;=0A= =0A= if(this.options.endeffect) =0A= this.options.endeffect(this.element);=0A= =0A= Draggables.deactivate(this);=0A= Droppables.reset();=0A= },=0A= =0A= keyPress: function(event) {=0A= if(!event.keyCode=3D=3DEvent.KEY_ESC) return;=0A= this.finishDrag(event, false);=0A= Event.stop(event);=0A= },=0A= =0A= endDrag: function(event) {=0A= if(!this.dragging) return;=0A= this.stopScrolling();=0A= this.finishDrag(event, true);=0A= Event.stop(event);=0A= },=0A= =0A= draw: function(point) {=0A= var pos =3D Position.cumulativeOffset(this.element);=0A= var d =3D this.currentDelta();=0A= pos[0] -=3D d[0]; pos[1] -=3D d[1];=0A= =0A= if(this.options.scroll) {=0A= pos[0] -=3D this.options.scroll.scrollLeft-this.originalScrollLeft;=0A= pos[1] -=3D this.options.scroll.scrollTop-this.originalScrollTop;=0A= }=0A= =0A= var p =3D [0,1].map(function(i){ =0A= return (point[i]-pos[i]-this.offset[i]) =0A= }.bind(this));=0A= =0A= if(this.options.snap) {=0A= if(typeof this.options.snap =3D=3D 'function') {=0A= p =3D this.options.snap(p[0],p[1]);=0A= } else {=0A= if(this.options.snap instanceof Array) {=0A= p =3D p.map( function(v, i) {=0A= return Math.round(v/this.options.snap[i])*this.options.snap[i] = }.bind(this))=0A= } else {=0A= p =3D p.map( function(v) {=0A= return Math.round(v/this.options.snap)*this.options.snap = }.bind(this))=0A= }=0A= }}=0A= =0A= var style =3D this.element.style;=0A= if((!this.options.constraint) || = (this.options.constraint=3D=3D'horizontal'))=0A= style.left =3D p[0] + "px";=0A= if((!this.options.constraint) || = (this.options.constraint=3D=3D'vertical'))=0A= style.top =3D p[1] + "px";=0A= if(style.visibility=3D=3D"hidden") style.visibility =3D ""; // fix = gecko rendering=0A= },=0A= =0A= stopScrolling: function() {=0A= if(this.scrollInterval) {=0A= clearInterval(this.scrollInterval);=0A= this.scrollInterval =3D null;=0A= }=0A= },=0A= =0A= startScrolling: function(speed) {=0A= this.scrollSpeed =3D = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];=0A= this.lastScrolled =3D new Date();=0A= this.scrollInterval =3D setInterval(this.scroll.bind(this), 10);=0A= },=0A= =0A= scroll: function() {=0A= var current =3D new Date();=0A= var delta =3D current - this.lastScrolled;=0A= this.lastScrolled =3D current;=0A= this.options.scroll.scrollLeft +=3D this.scrollSpeed[0] * delta / 1000;=0A= this.options.scroll.scrollTop +=3D this.scrollSpeed[1] * delta / 1000;=0A= =0A= Position.prepare();=0A= Droppables.show(Draggables._lastPointer, this.element);=0A= Draggables.notify('onDrag', this);=0A= this.draw(Draggables._lastPointer); =0A= =0A= if(this.options.change) this.options.change(this);=0A= }=0A= }=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= var SortableObserver =3D Class.create();=0A= SortableObserver.prototype =3D {=0A= initialize: function(element, observer) {=0A= this.element =3D $(element);=0A= this.observer =3D observer;=0A= this.lastValue =3D Sortable.serialize(this.element);=0A= },=0A= =0A= onStart: function() {=0A= this.lastValue =3D Sortable.serialize(this.element);=0A= },=0A= =0A= onEnd: function() {=0A= Sortable.unmark();=0A= if(this.lastValue !=3D Sortable.serialize(this.element))=0A= this.observer(this.element)=0A= }=0A= }=0A= =0A= var Sortable =3D {=0A= sortables: {},=0A= =0A= _findRootElement: function(element) {=0A= =0A= while (element.tagName !=3D "BODY") { =0A= =0A= if (element.id && this.sortables[element.id] !=3D null) =0A= return element;=0A= =0A= element =3D element.parentNode;=0A= }=0A= =0A= return null;=0A= },=0A= =0A= setOptions: function(element, options) {=0A= this.sortables[element.id] =3D options;=0A= },=0A= =0A= options: function(element) {=0A= /* Optimized by Sammi Williams 15 Feb */=0A= element =3D Sortable._findRootElement($(element));=0A= if (element)=0A= return Sortable.sortables[element.id];=0A= return null;=0A= },=0A= =0A= destroy: function(element){=0A= /* Optimized by Sammi Williams 15 Feb */=0A= var s =3D Sortable.options(element);=0A= =0A= if (s !=3D null) {=0A= Draggables.removeObserver(s.element);=0A= s.droppables.each(function(d){ Droppables.remove(d) });=0A= s.draggables.invoke('destroy');=0A= =0A= delete Sortable.sortables[element.id];=0A= }=0A= },=0A= =0A= create: function(element) { =0A= element =3D $(element);=0A= var options =3D Object.extend({ =0A= element: element,=0A= tag: 'li', // assumes li children, override with = tag: 'tagname'=0A= dropOnEmpty: false,=0A= tree: false,=0A= treeTag: 'ul',=0A= overlap: 'vertical', // one of 'vertical', 'horizontal'=0A= constraint: 'vertical', // one of 'vertical', 'horizontal', false=0A= containment: element, // also takes array of elements (or = id's); or false=0A= handle: false, // or a CSS class=0A= only: false,=0A= hoverclass: null,=0A= ghosting: false,=0A= scroll: false,=0A= format: /^[^_]*_(.*)$/,=0A= onChange: Prototype.emptyFunction,=0A= onUpdate: Prototype.emptyFunction=0A= }, arguments[1] || {});=0A= =0A= // clear any old sortable with same element=0A= this.destroy(element);=0A= =0A= // build options for the draggables=0A= var options_for_draggable =3D {=0A= revert: true,=0A= scroll: options.scroll,=0A= ghosting: options.ghosting,=0A= constraint: options.constraint,=0A= handle: options.handle };=0A= =0A= if(options.starteffect)=0A= options_for_draggable.starteffect =3D options.starteffect;=0A= =0A= if(options.reverteffect)=0A= options_for_draggable.reverteffect =3D options.reverteffect;=0A= else=0A= if(options.ghosting) options_for_draggable.reverteffect =3D = function(element) {=0A= element.style.top =3D 0;=0A= element.style.left =3D 0;=0A= };=0A= =0A= if(options.endeffect)=0A= options_for_draggable.endeffect =3D options.endeffect;=0A= =0A= if(options.zindex)=0A= options_for_draggable.zindex =3D options.zindex;=0A= =0A= // build options for the droppables =0A= var options_for_droppable =3D {=0A= overlap: options.overlap,=0A= containment: options.containment,=0A= hoverclass: options.hoverclass,=0A= onHover: Sortable.onHover,=0A= greedy: !options.dropOnEmpty=0A= }=0A= =0A= // fix for gecko engine=0A= Element.cleanWhitespace(element); =0A= =0A= options.draggables =3D [];=0A= options.droppables =3D [];=0A= =0A= // make it so=0A= var options_for_tree =3D {=0A= onHover: Sortable.onEmptyHover,=0A= overlap: options.overlap,=0A= containment: options.containment,=0A= hoverclass: options.hoverclass=0A= }=0A= =0A= // drop on empty handling=0A= if(options.dropOnEmpty || options.tree) {=0A= Droppables.add(element, options_for_tree);=0A= options.droppables.push(element);=0A= }=0A= =0A= (this.findElements(element, options) || []).each( function(e) {=0A= // handles are per-draggable=0A= var handle =3D options.handle ? =0A= Element.childrenWithClassName(e, options.handle)[0] : e; =0A= options.draggables.push(=0A= new Draggable(e, Object.extend(options_for_draggable, { handle: = handle })));=0A= Droppables.add(e, options_for_droppable);=0A= options.droppables.push(e); =0A= });=0A= =0A= if (options.tree) {=0A= (Sortable.findTreeElements(element, options) || []).each( function = (e) {=0A= Droppables.add(e, options_for_tree);=0A= options.droppables.push(e);=0A= });=0A= }=0A= =0A= // keep reference=0A= Sortable.setOptions(element, options);=0A= =0A= // for onupdate=0A= Draggables.addObserver(new SortableObserver(element, = options.onUpdate));=0A= },=0A= =0A= /* Convenience functions - return all suitable-for-sortable elements in = a guaranteed order */=0A= findElements: function(element, options) {=0A= return Element.findChildren (element, options.only, options.tree ? = true : false, options.tag.toUpperCase());=0A= },=0A= =0A= findTreeElements: function(element, options) {=0A= return Element.findChildren (element, options.only, options.tree ? = true : false, options.treeTag.toUpperCase());=0A= },=0A= =0A= onHover: function(element, dropon, overlap) {=0A= /* Cannot drop on itself - avoids some DOM exceptions */=0A= if (Element.isParent(dropon, element)) return;=0A= =0A= if (overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {=0A= return;=0A= } else if(overlap>0.5) {=0A= Sortable.mark(dropon, 'before');=0A= if(dropon.previousSibling !=3D element) {=0A= var oldParentNode =3D element.parentNode;=0A= element.style.visibility =3D "hidden"; // fix gecko rendering=0A= dropon.parentNode.insertBefore(element, dropon);=0A= if(dropon.parentNode!=3DoldParentNode) =0A= Sortable.options(oldParentNode).onChange(element);=0A= Sortable.options(dropon.parentNode).onChange(element);=0A= }=0A= } else {=0A= Sortable.mark(dropon, 'after');=0A= var nextElement =3D dropon.nextSibling || null;=0A= if(nextElement !=3D element) {=0A= var oldParentNode =3D element.parentNode;=0A= element.style.visibility =3D "hidden"; // fix gecko rendering=0A= dropon.parentNode.insertBefore(element, nextElement);=0A= if(dropon.parentNode!=3DoldParentNode) =0A= Sortable.options(oldParentNode).onChange(element);=0A= Sortable.options(dropon.parentNode).onChange(element);=0A= }=0A= }=0A= },=0A= =0A= onEmptyHover: function(element, dropon, overlap) {=0A= var oldParentNode =3D element.parentNode;=0A= =0A= var droponOptions =3D Sortable.options(dropon);=0A= =0A= if(!Element.isParent (dropon, element)) {=0A= var index;=0A= =0A= var children =3D Sortable.findElements (dropon, {tag: = droponOptions.tag});=0A= var child =3D null;=0A= =0A= if (children) {=0A= var offset =3D Element.offsetSize (dropon, droponOptions.overlap) * = (1.0 - overlap);=0A= =0A= for (index =3D 0; index < children.length; index +=3D 1) {=0A= if (offset - Element.offsetSize (children[index], = droponOptions.overlap) >=3D 0) {=0A= offset -=3D Element.offsetSize (children[index], = droponOptions.overlap);=0A= } else if (offset - (Element.offsetSize (children[index], = droponOptions.overlap) / 2) >=3D 0) {=0A= child =3D index + 1 < children.length ? children[index + 1] : null;=0A= break;=0A= } else {=0A= child =3D children[index];=0A= break;=0A= }=0A= }=0A= }=0A= =0A= dropon.insertBefore(element, child);=0A= =0A= Sortable.options(oldParentNode).onChange(element);=0A= droponOptions.onChange(element);=0A= }=0A= },=0A= =0A= unmark: function() {=0A= if(Sortable._marker) Element.hide(Sortable._marker);=0A= },=0A= =0A= mark: function(dropon, position) {=0A= // mark on ghosting only=0A= var sortable =3D Sortable.options(dropon.parentNode);=0A= if(sortable && !sortable.ghosting) return; =0A= =0A= if(!Sortable._marker) {=0A= Sortable._marker =3D $('dropmarker') || document.createElement('DIV');=0A= Element.hide(Sortable._marker);=0A= Element.addClassName(Sortable._marker, 'dropmarker');=0A= Sortable._marker.style.position =3D 'absolute';=0A= = document.getElementsByTagName("body").item(0).appendChild(Sortable._marke= r);=0A= } =0A= var offsets =3D Position.cumulativeOffset(dropon);=0A= Sortable._marker.style.left =3D offsets[0] + 'px';=0A= Sortable._marker.style.top =3D offsets[1] + 'px';=0A= =0A= if(position=3D=3D'after')=0A= if(sortable.overlap =3D=3D 'horizontal') =0A= Sortable._marker.style.left =3D (offsets[0]+dropon.clientWidth) + = 'px';=0A= else=0A= Sortable._marker.style.top =3D (offsets[1]+dropon.clientHeight) + = 'px';=0A= =0A= Element.show(Sortable._marker);=0A= },=0A= =0A= sequence: function(element) {=0A= element =3D $(element);=0A= var sortableOptions =3D this.options(element);=0A= var options =3D Object.extend({=0A= tag: sortableOptions.tag,=0A= only: sortableOptions.only,=0A= name: element.id,=0A= format: sortableOptions.format=0A= }, arguments[1] || {});=0A= return $(this.findElements(element, options) || []).map( = function(item) {=0A= return item.id.match(options.format) ? = item.id.match(options.format)[1] : '';=0A= });=0A= },=0A= =0A= _tree: function(element, options, parent) {=0A= var children =3D Sortable.findElements(element, options) || [];=0A= =0A= for (var i =3D 0; i < children.length; ++i) {=0A= var match =3D children[i].id.match(options.format);=0A= =0A= if (!match) continue;=0A= =0A= var child =3D {=0A= id: encodeURIComponent(match ? match[1] : null),=0A= element: element,=0A= parent: parent,=0A= children: new Array,=0A= position: parent.children.length,=0A= container: Sortable._findChildrenElement(children[i], = options.treeTag.toUpperCase())=0A= }=0A= =0A= /* Get the element containing the children and recurse over it */=0A= if (child.container)=0A= arguments.callee(child.container, options, child)=0A= =0A= parent.children.push (child);=0A= }=0A= =0A= return parent; =0A= },=0A= =0A= /* Finds the first element of the given tag type within a parent = element.=0A= Used for finding the first LI[ST] within a L[IST]I[TEM].*/=0A= _findChildrenElement: function (element, containerTag) {=0A= if (element && element.hasChildNodes)=0A= for (var i =3D 0; i < element.childNodes.length; ++i)=0A= if (element.childNodes[i].tagName =3D=3D containerTag)=0A= return element.childNodes[i];=0A= =0A= return null;=0A= },=0A= =0A= tree: function(element) {=0A= element =3D $(element);=0A= var sortableOptions =3D this.options(element);=0A= var options =3D Object.extend({=0A= tag: sortableOptions.tag,=0A= treeTag: sortableOptions.treeTag,=0A= only: sortableOptions.only,=0A= name: element.id,=0A= format: sortableOptions.format=0A= }, arguments[1] || {});=0A= =0A= var root =3D {=0A= id: null,=0A= parent: null,=0A= children: new Array,=0A= container: element,=0A= position: 0=0A= }=0A= =0A= return Sortable._tree (element, options, root);=0A= },=0A= =0A= /* Construct a [i] index for a particular node */=0A= _constructIndex: function(node) {=0A= var index =3D '';=0A= do {=0A= if (node.id) index =3D '[' + node.position + ']' + index;=0A= } while ((node =3D node.parent) !=3D null);=0A= return index;=0A= },=0A= =0A= serialize: function(element) {=0A= element =3D $(element);=0A= var options =3D Sortable.options (element);=0A= =0A= if (options.tree) {=0A= return Sortable.tree(element, arguments[1]).children.map( function = (item) {=0A= return [encodeURIComponent(element.id) + = Sortable._constructIndex(item) + "[id]=3D" + = encodeURIComponent(item.id)].concat = (item.children.map(arguments.callee));=0A= }).flatten().join('&');=0A= } else {=0A= return Sortable.sequence(element, arguments[1]).map( function(item) {=0A= return encodeURIComponent(element.id) + "[]=3D" + = encodeURIComponent(item);=0A= }).join('&');=0A= }=0A= }=0A= }=0A= ------=_NextPart_000_0061_01CA09FF.878F8200 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://www.admissions.caltech.edu/javascripts/controls.js?1170291493 // Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, = http://mir.aculo.us)=0A= // (c) 2005 Ivan Krstic (http://blogs.law.harvard.edu/ivan)=0A= // (c) 2005 Jon Tirsen (http://www.tirsen.com)=0A= // Contributors:=0A= // Richard Livsey=0A= // Rahul Bhargava=0A= // Rob Wills=0A= // =0A= // See scriptaculous.js for full license.=0A= =0A= // Autocompleter.Base handles all the autocompletion functionality =0A= // that's independent of the data source for autocompletion. This=0A= // includes drawing the autocompletion menu, observing keyboard=0A= // and mouse events, and similar.=0A= //=0A= // Specific autocompleters need to provide, at the very least, =0A= // a getUpdatedChoices function that will be invoked every time=0A= // the text inside the monitored textbox changes. This method =0A= // should get the text for which to provide autocompletion by=0A= // invoking this.getToken(), NOT by directly accessing=0A= // this.element.value. This is to allow incremental tokenized=0A= // autocompletion. Specific auto-completion logic (AJAX, etc)=0A= // belongs in getUpdatedChoices.=0A= //=0A= // Tokenized incremental autocompletion is enabled automatically=0A= // when an autocompleter is instantiated with the 'tokens' option=0A= // in the options parameter, e.g.:=0A= // new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });=0A= // will incrementally autocomplete with a comma as the token.=0A= // Additionally, ',' in the above example can be replaced with=0A= // a token array, e.g. { tokens: [',', '\n'] } which=0A= // enables autocompletion on multiple tokens. This is most =0A= // useful when one of the tokens is \n (a newline), as it =0A= // allows smart autocompletion after linebreaks.=0A= =0A= var Autocompleter =3D {}=0A= Autocompleter.Base =3D function() {};=0A= Autocompleter.Base.prototype =3D {=0A= baseInitialize: function(element, update, options) {=0A= this.element =3D $(element); =0A= this.update =3D $(update); =0A= this.hasFocus =3D false; =0A= this.changed =3D false; =0A= this.active =3D false; =0A= this.index =3D 0; =0A= this.entryCount =3D 0;=0A= =0A= if (this.setOptions)=0A= this.setOptions(options);=0A= else=0A= this.options =3D options || {};=0A= =0A= this.options.paramName =3D this.options.paramName || = this.element.name;=0A= this.options.tokens =3D this.options.tokens || [];=0A= this.options.frequency =3D this.options.frequency || 0.4;=0A= this.options.minChars =3D this.options.minChars || 1;=0A= this.options.onShow =3D this.options.onShow || =0A= function(element, update){ =0A= if(!update.style.position || = update.style.position=3D=3D'absolute') {=0A= update.style.position =3D 'absolute';=0A= Position.clone(element, update, {setHeight: false, offsetTop: = element.offsetHeight});=0A= }=0A= Effect.Appear(update,{duration:0.15});=0A= };=0A= this.options.onHide =3D this.options.onHide || =0A= function(element, update){ new Effect.Fade(update,{duration:0.15}) };=0A= =0A= if (typeof(this.options.tokens) =3D=3D 'string') =0A= this.options.tokens =3D new Array(this.options.tokens);=0A= =0A= this.observer =3D null;=0A= =0A= this.element.setAttribute('autocomplete','off');=0A= =0A= Element.hide(this.update);=0A= =0A= Event.observe(this.element, "blur", = this.onBlur.bindAsEventListener(this));=0A= Event.observe(this.element, "keypress", = this.onKeyPress.bindAsEventListener(this));=0A= },=0A= =0A= show: function() {=0A= if(Element.getStyle(this.update, 'display')=3D=3D'none') = this.options.onShow(this.element, this.update);=0A= if(!this.iefix && =0A= (navigator.appVersion.indexOf('MSIE')>0) &&=0A= (navigator.userAgent.indexOf('Opera')<0) &&=0A= (Element.getStyle(this.update, 'position')=3D=3D'absolute')) {=0A= new Insertion.After(this.update, =0A= '');=0A= this.iefix =3D $(this.update.id+'_iefix');=0A= }=0A= if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);=0A= },=0A= =0A= fixIEOverlapping: function() {=0A= Position.clone(this.update, this.iefix);=0A= this.iefix.style.zIndex =3D 1;=0A= this.update.style.zIndex =3D 2;=0A= Element.show(this.iefix);=0A= },=0A= =0A= hide: function() {=0A= this.stopIndicator();=0A= if(Element.getStyle(this.update, 'display')!=3D'none') = this.options.onHide(this.element, this.update);=0A= if(this.iefix) Element.hide(this.iefix);=0A= },=0A= =0A= startIndicator: function() {=0A= if(this.options.indicator) Element.show(this.options.indicator);=0A= },=0A= =0A= stopIndicator: function() {=0A= if(this.options.indicator) Element.hide(this.options.indicator);=0A= },=0A= =0A= onKeyPress: function(event) {=0A= if(this.active)=0A= switch(event.keyCode) {=0A= case Event.KEY_TAB:=0A= case Event.KEY_RETURN:=0A= this.selectEntry();=0A= Event.stop(event);=0A= case Event.KEY_ESC:=0A= this.hide();=0A= this.active =3D false;=0A= Event.stop(event);=0A= return;=0A= case Event.KEY_LEFT:=0A= case Event.KEY_RIGHT:=0A= return;=0A= case Event.KEY_UP:=0A= this.markPrevious();=0A= this.render();=0A= if(navigator.appVersion.indexOf('AppleWebKit')>0) = Event.stop(event);=0A= return;=0A= case Event.KEY_DOWN:=0A= this.markNext();=0A= this.render();=0A= if(navigator.appVersion.indexOf('AppleWebKit')>0) = Event.stop(event);=0A= return;=0A= }=0A= else =0A= if(event.keyCode=3D=3DEvent.KEY_TAB || = event.keyCode=3D=3DEvent.KEY_RETURN || =0A= (navigator.appVersion.indexOf('AppleWebKit') > 0 && = event.keyCode =3D=3D 0)) return;=0A= =0A= this.changed =3D true;=0A= this.hasFocus =3D true;=0A= =0A= if(this.observer) clearTimeout(this.observer);=0A= this.observer =3D =0A= setTimeout(this.onObserverEvent.bind(this), = this.options.frequency*1000);=0A= },=0A= =0A= activate: function() {=0A= this.changed =3D false;=0A= this.hasFocus =3D true;=0A= this.getUpdatedChoices();=0A= },=0A= =0A= onHover: function(event) {=0A= var element =3D Event.findElement(event, 'LI');=0A= if(this.index !=3D element.autocompleteIndex) =0A= {=0A= this.index =3D element.autocompleteIndex;=0A= this.render();=0A= }=0A= Event.stop(event);=0A= },=0A= =0A= onClick: function(event) {=0A= var element =3D Event.findElement(event, 'LI');=0A= this.index =3D element.autocompleteIndex;=0A= this.selectEntry();=0A= this.hide();=0A= },=0A= =0A= onBlur: function(event) {=0A= // needed to make click events working=0A= setTimeout(this.hide.bind(this), 250);=0A= this.hasFocus =3D false;=0A= this.active =3D false; =0A= }, =0A= =0A= render: function() {=0A= if(this.entryCount > 0) {=0A= for (var i =3D 0; i < this.entryCount; i++)=0A= this.index=3D=3Di ? =0A= Element.addClassName(this.getEntry(i),"selected") : =0A= Element.removeClassName(this.getEntry(i),"selected");=0A= =0A= if(this.hasFocus) { =0A= this.show();=0A= this.active =3D true;=0A= }=0A= } else {=0A= this.active =3D false;=0A= this.hide();=0A= }=0A= },=0A= =0A= markPrevious: function() {=0A= if(this.index > 0) this.index--=0A= else this.index =3D this.entryCount-1;=0A= },=0A= =0A= markNext: function() {=0A= if(this.index < this.entryCount-1) this.index++=0A= else this.index =3D 0;=0A= },=0A= =0A= getEntry: function(index) {=0A= return this.update.firstChild.childNodes[index];=0A= },=0A= =0A= getCurrentEntry: function() {=0A= return this.getEntry(this.index);=0A= },=0A= =0A= selectEntry: function() {=0A= this.active =3D false;=0A= this.updateElement(this.getCurrentEntry());=0A= },=0A= =0A= updateElement: function(selectedElement) {=0A= if (this.options.updateElement) {=0A= this.options.updateElement(selectedElement);=0A= return;=0A= }=0A= var value =3D '';=0A= if (this.options.select) {=0A= var nodes =3D document.getElementsByClassName(this.options.select, = selectedElement) || [];=0A= if(nodes.length>0) value =3D Element.collectTextNodes(nodes[0], = this.options.select);=0A= } else=0A= value =3D Element.collectTextNodesIgnoreClass(selectedElement, = 'informal');=0A= =0A= var lastTokenPos =3D this.findLastToken();=0A= if (lastTokenPos !=3D -1) {=0A= var newValue =3D this.element.value.substr(0, lastTokenPos + 1);=0A= var whitespace =3D this.element.value.substr(lastTokenPos + = 1).match(/^\s+/);=0A= if (whitespace)=0A= newValue +=3D whitespace[0];=0A= this.element.value =3D newValue + value;=0A= } else {=0A= this.element.value =3D value;=0A= }=0A= this.element.focus();=0A= =0A= if (this.options.afterUpdateElement)=0A= this.options.afterUpdateElement(this.element, selectedElement);=0A= },=0A= =0A= updateChoices: function(choices) {=0A= if(!this.changed && this.hasFocus) {=0A= this.update.innerHTML =3D choices;=0A= Element.cleanWhitespace(this.update);=0A= Element.cleanWhitespace(this.update.firstChild);=0A= =0A= if(this.update.firstChild && this.update.firstChild.childNodes) {=0A= this.entryCount =3D =0A= this.update.firstChild.childNodes.length;=0A= for (var i =3D 0; i < this.entryCount; i++) {=0A= var entry =3D this.getEntry(i);=0A= entry.autocompleteIndex =3D i;=0A= this.addObservers(entry);=0A= }=0A= } else { =0A= this.entryCount =3D 0;=0A= }=0A= =0A= this.stopIndicator();=0A= =0A= this.index =3D 0;=0A= this.render();=0A= }=0A= },=0A= =0A= addObservers: function(element) {=0A= Event.observe(element, "mouseover", = this.onHover.bindAsEventListener(this));=0A= Event.observe(element, "click", = this.onClick.bindAsEventListener(this));=0A= },=0A= =0A= onObserverEvent: function() {=0A= this.changed =3D false; =0A= if(this.getToken().length>=3Dthis.options.minChars) {=0A= this.startIndicator();=0A= this.getUpdatedChoices();=0A= } else {=0A= this.active =3D false;=0A= this.hide();=0A= }=0A= },=0A= =0A= getToken: function() {=0A= var tokenPos =3D this.findLastToken();=0A= if (tokenPos !=3D -1)=0A= var ret =3D this.element.value.substr(tokenPos + = 1).replace(/^\s+/,'').replace(/\s+$/,'');=0A= else=0A= var ret =3D this.element.value;=0A= =0A= return /\n/.test(ret) ? '' : ret;=0A= },=0A= =0A= findLastToken: function() {=0A= var lastTokenPos =3D -1;=0A= =0A= for (var i=3D0; i lastTokenPos)=0A= lastTokenPos =3D thisTokenPos;=0A= }=0A= return lastTokenPos;=0A= }=0A= }=0A= =0A= Ajax.Autocompleter =3D Class.create();=0A= Object.extend(Object.extend(Ajax.Autocompleter.prototype, = Autocompleter.Base.prototype), {=0A= initialize: function(element, update, url, options) {=0A= this.baseInitialize(element, update, options);=0A= this.options.asynchronous =3D true;=0A= this.options.onComplete =3D this.onComplete.bind(this);=0A= this.options.defaultParams =3D this.options.parameters || null;=0A= this.url =3D url;=0A= },=0A= =0A= getUpdatedChoices: function() {=0A= entry =3D encodeURIComponent(this.options.paramName) + '=3D' + =0A= encodeURIComponent(this.getToken());=0A= =0A= this.options.parameters =3D this.options.callback ?=0A= this.options.callback(this.element, entry) : entry;=0A= =0A= if(this.options.defaultParams) =0A= this.options.parameters +=3D '&' + this.options.defaultParams;=0A= =0A= new Ajax.Request(this.url, this.options);=0A= },=0A= =0A= onComplete: function(request) {=0A= this.updateChoices(request.responseText);=0A= }=0A= =0A= });=0A= =0A= // The local array autocompleter. Used when you'd prefer to=0A= // inject an array of autocompletion options into the page, rather=0A= // than sending out Ajax queries, which can be quite slow sometimes.=0A= //=0A= // The constructor takes four parameters. The first two are, as usual,=0A= // the id of the monitored textbox, and id of the autocompletion menu.=0A= // The third is the array you want to autocomplete from, and the fourth=0A= // is the options block.=0A= //=0A= // Extra local autocompletion options:=0A= // - choices - How many autocompletion choices to offer=0A= //=0A= // - partialSearch - If false, the autocompleter will match entered=0A= // text only at the beginning of strings in the =0A= // autocomplete array. Defaults to true, which will=0A= // match text at the beginning of any *word* in the=0A= // strings in the autocomplete array. If you want to=0A= // search anywhere in the string, additionally set=0A= // the option fullSearch to true (default: off).=0A= //=0A= // - fullSsearch - Search anywhere in autocomplete array strings.=0A= //=0A= // - partialChars - How many characters to enter before triggering=0A= // a partial match (unlike minChars, which defines=0A= // how many characters are required to do any match=0A= // at all). Defaults to 2.=0A= //=0A= // - ignoreCase - Whether to ignore case when autocompleting.=0A= // Defaults to true.=0A= //=0A= // It's possible to pass in a custom function as the 'selector' =0A= // option, if you prefer to write your own autocompletion logic.=0A= // In that case, the other options above will not apply unless=0A= // you support them.=0A= =0A= Autocompleter.Local =3D Class.create();=0A= Autocompleter.Local.prototype =3D Object.extend(new = Autocompleter.Base(), {=0A= initialize: function(element, update, array, options) {=0A= this.baseInitialize(element, update, options);=0A= this.options.array =3D array;=0A= },=0A= =0A= getUpdatedChoices: function() {=0A= this.updateChoices(this.options.selector(this));=0A= },=0A= =0A= setOptions: function(options) {=0A= this.options =3D Object.extend({=0A= choices: 10,=0A= partialSearch: true,=0A= partialChars: 2,=0A= ignoreCase: true,=0A= fullSearch: false,=0A= selector: function(instance) {=0A= var ret =3D []; // Beginning matches=0A= var partial =3D []; // Inside matches=0A= var entry =3D instance.getToken();=0A= var count =3D 0;=0A= =0A= for (var i =3D 0; i < instance.options.array.length && =0A= ret.length < instance.options.choices ; i++) { =0A= =0A= var elem =3D instance.options.array[i];=0A= var foundPos =3D instance.options.ignoreCase ? =0A= elem.toLowerCase().indexOf(entry.toLowerCase()) : =0A= elem.indexOf(entry);=0A= =0A= while (foundPos !=3D -1) {=0A= if (foundPos =3D=3D 0 && elem.length !=3D entry.length) { =0A= ret.push("
  • " + elem.substr(0, entry.length) + = "" + =0A= elem.substr(entry.length) + "
  • ");=0A= break;=0A= } else if (entry.length >=3D instance.options.partialChars = && =0A= instance.options.partialSearch && foundPos !=3D -1) {=0A= if (instance.options.fullSearch || = /\s/.test(elem.substr(foundPos-1,1))) {=0A= partial.push("
  • " + elem.substr(0, foundPos) + = "" +=0A= elem.substr(foundPos, entry.length) + "" + = elem.substr(=0A= foundPos + entry.length) + "
  • ");=0A= break;=0A= }=0A= }=0A= =0A= foundPos =3D instance.options.ignoreCase ? =0A= elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + = 1) : =0A= elem.indexOf(entry, foundPos + 1);=0A= =0A= }=0A= }=0A= if (partial.length)=0A= ret =3D ret.concat(partial.slice(0, instance.options.choices - = ret.length))=0A= return "
      " + ret.join('') + "
    ";=0A= }=0A= }, options || {});=0A= }=0A= });=0A= =0A= // AJAX in-place editor=0A= //=0A= // see documentation on = http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor=0A= =0A= // Use this if you notice weird scrolling problems on some browsers,=0A= // the DOM might be a bit confused when this gets called so do this=0A= // waits 1 ms (with setTimeout) until it does the activation=0A= Field.scrollFreeActivate =3D function(field) {=0A= setTimeout(function() {=0A= Field.activate(field);=0A= }, 1);=0A= }=0A= =0A= Ajax.InPlaceEditor =3D Class.create();=0A= Ajax.InPlaceEditor.defaultHighlightColor =3D "#FFFF99";=0A= Ajax.InPlaceEditor.prototype =3D {=0A= initialize: function(element, url, options) {=0A= this.url =3D url;=0A= this.element =3D $(element);=0A= =0A= this.options =3D Object.extend({=0A= okButton: true,=0A= okText: "ok",=0A= cancelLink: true,=0A= cancelText: "cancel",=0A= savingText: "Saving...",=0A= clickToEditText: "Click to edit",=0A= okText: "ok",=0A= rows: 1,=0A= onComplete: function(transport, element) {=0A= new Effect.Highlight(element, {startcolor: = this.options.highlightcolor});=0A= },=0A= onFailure: function(transport) {=0A= alert("Error communicating with the server: " + = transport.responseText.stripTags());=0A= },=0A= callback: function(form) {=0A= return Form.serialize(form);=0A= },=0A= handleLineBreaks: true,=0A= loadingText: 'Loading...',=0A= savingClassName: 'inplaceeditor-saving',=0A= loadingClassName: 'inplaceeditor-loading',=0A= formClassName: 'inplaceeditor-form',=0A= highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,=0A= highlightendcolor: "#FFFFFF",=0A= externalControl: null,=0A= submitOnBlur: false,=0A= ajaxOptions: {},=0A= evalScripts: false=0A= }, options || {});=0A= =0A= if(!this.options.formId && this.element.id) {=0A= this.options.formId =3D this.element.id + "-inplaceeditor";=0A= if ($(this.options.formId)) {=0A= // there's already a form with that name, don't specify an id=0A= this.options.formId =3D null;=0A= }=0A= }=0A= =0A= if (this.options.externalControl) {=0A= this.options.externalControl =3D $(this.options.externalControl);=0A= }=0A= =0A= this.originalBackground =3D Element.getStyle(this.element, = 'background-color');=0A= if (!this.originalBackground) {=0A= this.originalBackground =3D "transparent";=0A= }=0A= =0A= this.element.title =3D this.options.clickToEditText;=0A= =0A= this.onclickListener =3D = this.enterEditMode.bindAsEventListener(this);=0A= this.mouseoverListener =3D this.enterHover.bindAsEventListener(this);=0A= this.mouseoutListener =3D this.leaveHover.bindAsEventListener(this);=0A= Event.observe(this.element, 'click', this.onclickListener);=0A= Event.observe(this.element, 'mouseover', this.mouseoverListener);=0A= Event.observe(this.element, 'mouseout', this.mouseoutListener);=0A= if (this.options.externalControl) {=0A= Event.observe(this.options.externalControl, 'click', = this.onclickListener);=0A= Event.observe(this.options.externalControl, 'mouseover', = this.mouseoverListener);=0A= Event.observe(this.options.externalControl, 'mouseout', = this.mouseoutListener);=0A= }=0A= },=0A= enterEditMode: function(evt) {=0A= if (this.saving) return;=0A= if (this.editing) return;=0A= this.editing =3D true;=0A= this.onEnterEditMode();=0A= if (this.options.externalControl) {=0A= Element.hide(this.options.externalControl);=0A= }=0A= Element.hide(this.element);=0A= this.createForm();=0A= this.element.parentNode.insertBefore(this.form, this.element);=0A= Field.scrollFreeActivate(this.editField);=0A= // stop the event to avoid a page refresh in Safari=0A= if (evt) {=0A= Event.stop(evt);=0A= }=0A= return false;=0A= },=0A= createForm: function() {=0A= this.form =3D document.createElement("form");=0A= this.form.id =3D this.options.formId;=0A= Element.addClassName(this.form, this.options.formClassName)=0A= this.form.onsubmit =3D this.onSubmit.bind(this);=0A= =0A= this.createEditField();=0A= =0A= if (this.options.textarea) {=0A= var br =3D document.createElement("br");=0A= this.form.appendChild(br);=0A= }=0A= =0A= if (this.options.okButton) {=0A= okButton =3D document.createElement("input");=0A= okButton.type =3D "submit";=0A= okButton.value =3D this.options.okText;=0A= okButton.className =3D 'editor_ok_button';=0A= this.form.appendChild(okButton);=0A= }=0A= =0A= if (this.options.cancelLink) {=0A= cancelLink =3D document.createElement("a");=0A= cancelLink.href =3D "#";=0A= = cancelLink.appendChild(document.createTextNode(this.options.cancelText));=0A= cancelLink.onclick =3D this.onclickCancel.bind(this);=0A= cancelLink.className =3D 'editor_cancel'; =0A= this.form.appendChild(cancelLink);=0A= }=0A= },=0A= hasHTMLLineBreaks: function(string) {=0A= if (!this.options.handleLineBreaks) return false;=0A= return string.match(/
    /i);=0A= },=0A= convertHTMLLineBreaks: function(string) {=0A= return string.replace(/
    /gi, "\n").replace(//gi, = "\n").replace(/<\/p>/gi, "\n").replace(/

    /gi, "");=0A= },=0A= createEditField: function() {=0A= var text;=0A= if(this.options.loadTextURL) {=0A= text =3D this.options.loadingText;=0A= } else {=0A= text =3D this.getText();=0A= }=0A= =0A= var obj =3D this;=0A= =0A= if (this.options.rows =3D=3D 1 && !this.hasHTMLLineBreaks(text)) {=0A= this.options.textarea =3D false;=0A= var textField =3D document.createElement("input");=0A= textField.obj =3D this;=0A= textField.type =3D "text";=0A= textField.name =3D "value";=0A= textField.value =3D text;=0A= textField.style.backgroundColor =3D this.options.highlightcolor;=0A= textField.className =3D 'editor_field';=0A= var size =3D this.options.size || this.options.cols || 0;=0A= if (size !=3D 0) textField.size =3D size;=0A= if (this.options.submitOnBlur)=0A= textField.onblur =3D this.onSubmit.bind(this);=0A= this.editField =3D textField;=0A= } else {=0A= this.options.textarea =3D true;=0A= var textArea =3D document.createElement("textarea");=0A= textArea.obj =3D this;=0A= textArea.name =3D "value";=0A= textArea.value =3D this.convertHTMLLineBreaks(text);=0A= textArea.rows =3D this.options.rows;=0A= textArea.cols =3D this.options.cols || 40;=0A= textArea.className =3D 'editor_field'; =0A= if (this.options.submitOnBlur)=0A= textArea.onblur =3D this.onSubmit.bind(this);=0A= this.editField =3D textArea;=0A= }=0A= =0A= if(this.options.loadTextURL) {=0A= this.loadExternalText();=0A= }=0A= this.form.appendChild(this.editField);=0A= },=0A= getText: function() {=0A= return this.element.innerHTML;=0A= },=0A= loadExternalText: function() {=0A= Element.addClassName(this.form, this.options.loadingClassName);=0A= this.editField.disabled =3D true;=0A= new Ajax.Request(=0A= this.options.loadTextURL,=0A= Object.extend({=0A= asynchronous: true,=0A= onComplete: this.onLoadedExternalText.bind(this)=0A= }, this.options.ajaxOptions)=0A= );=0A= },=0A= onLoadedExternalText: function(transport) {=0A= Element.removeClassName(this.form, this.options.loadingClassName);=0A= this.editField.disabled =3D false;=0A= this.editField.value =3D transport.responseText.stripTags();=0A= },=0A= onclickCancel: function() {=0A= this.onComplete();=0A= this.leaveEditMode();=0A= return false;=0A= },=0A= onFailure: function(transport) {=0A= this.options.onFailure(transport);=0A= if (this.oldInnerHTML) {=0A= this.element.innerHTML =3D this.oldInnerHTML;=0A= this.oldInnerHTML =3D null;=0A= }=0A= return false;=0A= },=0A= onSubmit: function() {=0A= // onLoading resets these so we need to save them away for the Ajax = call=0A= var form =3D this.form;=0A= var value =3D this.editField.value;=0A= =0A= // do this first, sometimes the ajax call returns before we get a = chance to switch on Saving...=0A= // which means this will actually switch on Saving... *after* we've = left edit mode causing Saving...=0A= // to be displayed indefinitely=0A= this.onLoading();=0A= =0A= if (this.options.evalScripts) {=0A= new Ajax.Request(=0A= this.url, Object.extend({=0A= parameters: this.options.callback(form, value),=0A= onComplete: this.onComplete.bind(this),=0A= onFailure: this.onFailure.bind(this),=0A= asynchronous:true, =0A= evalScripts:true=0A= }, this.options.ajaxOptions));=0A= } else {=0A= new Ajax.Updater(=0A= { success: this.element,=0A= // don't update on failure (this could be an option)=0A= failure: null }, =0A= this.url, Object.extend({=0A= parameters: this.options.callback(form, value),=0A= onComplete: this.onComplete.bind(this),=0A= onFailure: this.onFailure.bind(this)=0A= }, this.options.ajaxOptions));=0A= }=0A= // stop the event to avoid a page refresh in Safari=0A= if (arguments.length > 1) {=0A= Event.stop(arguments[0]);=0A= }=0A= return false;=0A= },=0A= onLoading: function() {=0A= this.saving =3D true;=0A= this.removeForm();=0A= this.leaveHover();=0A= this.showSaving();=0A= },=0A= showSaving: function() {=0A= this.oldInnerHTML =3D this.element.innerHTML;=0A= this.element.innerHTML =3D this.options.savingText;=0A= Element.addClassName(this.element, this.options.savingClassName);=0A= this.element.style.backgroundColor =3D this.originalBackground;=0A= Element.show(this.element);=0A= },=0A= removeForm: function() {=0A= if(this.form) {=0A= if (this.form.parentNode) Element.remove(this.form);=0A= this.form =3D null;=0A= }=0A= },=0A= enterHover: function() {=0A= if (this.saving) return;=0A= this.element.style.backgroundColor =3D this.options.highlightcolor;=0A= if (this.effect) {=0A= this.effect.cancel();=0A= }=0A= Element.addClassName(this.element, this.options.hoverClassName)=0A= },=0A= leaveHover: function() {=0A= if (this.options.backgroundColor) {=0A= this.element.style.backgroundColor =3D this.oldBackground;=0A= }=0A= Element.removeClassName(this.element, this.options.hoverClassName)=0A= if (this.saving) return;=0A= this.effect =3D new Effect.Highlight(this.element, {=0A= startcolor: this.options.highlightcolor,=0A= endcolor: this.options.highlightendcolor,=0A= restorecolor: this.originalBackground=0A= });=0A= },=0A= leaveEditMode: function() {=0A= Element.removeClassName(this.element, this.options.savingClassName);=0A= this.removeForm();=0A= this.leaveHover();=0A= this.element.style.backgroundColor =3D this.originalBackground;=0A= Element.show(this.element);=0A= if (this.options.externalControl) {=0A= Element.show(this.options.externalControl);=0A= }=0A= this.editing =3D false;=0A= this.saving =3D false;=0A= this.oldInnerHTML =3D null;=0A= this.onLeaveEditMode();=0A= },=0A= onComplete: function(transport) {=0A= this.leaveEditMode();=0A= this.options.onComplete.bind(this)(transport, this.element);=0A= },=0A= onEnterEditMode: function() {},=0A= onLeaveEditMode: function() {},=0A= dispose: function() {=0A= if (this.oldInnerHTML) {=0A= this.element.innerHTML =3D this.oldInnerHTML;=0A= }=0A= this.leaveEditMode();=0A= Event.stopObserving(this.element, 'click', this.onclickListener);=0A= Event.stopObserving(this.element, 'mouseover', = this.mouseoverListener);=0A= Event.stopObserving(this.element, 'mouseout', this.mouseoutListener);=0A= if (this.options.externalControl) {=0A= Event.stopObserving(this.options.externalControl, 'click', = this.onclickListener);=0A= Event.stopObserving(this.options.externalControl, 'mouseover', = this.mouseoverListener);=0A= Event.stopObserving(this.options.externalControl, 'mouseout', = this.mouseoutListener);=0A= }=0A= }=0A= };=0A= =0A= Ajax.InPlaceCollectionEditor =3D Class.create();=0A= Object.extend(Ajax.InPlaceCollectionEditor.prototype, = Ajax.InPlaceEditor.prototype);=0A= Object.extend(Ajax.InPlaceCollectionEditor.prototype, {=0A= createEditField: function() {=0A= if (!this.cached_selectTag) {=0A= var selectTag =3D document.createElement("select");=0A= var collection =3D this.options.collection || [];=0A= var optionTag;=0A= collection.each(function(e,i) {=0A= optionTag =3D document.createElement("option");=0A= optionTag.value =3D (e instanceof Array) ? e[0] : e;=0A= if(this.options.value=3D=3DoptionTag.value) optionTag.selected = =3D true;=0A= optionTag.appendChild(document.createTextNode((e instanceof = Array) ? e[1] : e));=0A= selectTag.appendChild(optionTag);=0A= }.bind(this));=0A= this.cached_selectTag =3D selectTag;=0A= }=0A= =0A= this.editField =3D this.cached_selectTag;=0A= if(this.options.loadTextURL) this.loadExternalText();=0A= this.form.appendChild(this.editField);=0A= this.options.callback =3D function(form, value) {=0A= return "value=3D" + encodeURIComponent(value);=0A= }=0A= }=0A= });=0A= =0A= // Delayed observer, like Form.Element.Observer, =0A= // but waits for delay after last key input=0A= // Ideal for live-search fields=0A= =0A= Form.Element.DelayedObserver =3D Class.create();=0A= Form.Element.DelayedObserver.prototype =3D {=0A= initialize: function(element, delay, callback) {=0A= this.delay =3D delay || 0.5;=0A= this.element =3D $(element);=0A= this.callback =3D callback;=0A= this.timer =3D null;=0A= this.lastValue =3D $F(this.element); =0A= = Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListen= er(this));=0A= },=0A= delayedListener: function(event) {=0A= if(this.lastValue =3D=3D $F(this.element)) return;=0A= if(this.timer) clearTimeout(this.timer);=0A= this.timer =3D setTimeout(this.onTimerEvent.bind(this), this.delay * = 1000);=0A= this.lastValue =3D $F(this.element);=0A= },=0A= onTimerEvent: function() {=0A= this.timer =3D null;=0A= this.callback(this.element, $F(this.element));=0A= }=0A= };=0A= ------=_NextPart_000_0061_01CA09FF.878F8200 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://www.admissions.caltech.edu/javascripts/application.js?1243905981 // Place your application-specific JavaScript functions and classes here=0A= // This file is automatically included by javascript_include_tag = :defaults=0A= =0A= function popup(mylink, windowname) {=0A= if (! window.focus)return true;=0A= var href;=0A= if (typeof(mylink) =3D=3D 'string')=0A= href=3Dmylink;=0A= else=0A= href=3Dmylink.href;=0A= window.open(href, windowname, = 'width=3D360,height=3D320,scrollbars=3Dyes');=0A= return false;=0A= }=0A= ------=_NextPart_000_0061_01CA09FF.878F8200--